This is an automated email from the ASF dual-hosted git repository. justinchen pushed a commit to branch UserDefineTime-TsFile in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 73eb9e3f95ade715ba5a35143d8247acfff474a2 Author: Caideyipi <[email protected]> AuthorDate: Wed Jan 21 17:09:54 2026 +0800 partial --- .../analyze/load/LoadTsFileTableSchemaCache.java | 10 +++++++++- .../planner/plan/node/load/LoadSingleTsFileNode.java | 4 ++++ .../plan/relational/metadata/Metadata.java | 20 +++++++++++--------- .../plan/relational/metadata/TableMetadataImpl.java | 4 ++-- .../metadata/fetcher/TableHeaderSchemaValidator.java | 15 ++++++--------- .../plan/relational/analyzer/AnalyzerTest.java | 4 ++-- .../plan/relational/analyzer/TSBSMetadata.java | 4 ++-- .../plan/relational/analyzer/TestMetadata.java | 4 ++-- .../plan/statement/InsertStatementTest.java | 6 +++--- .../apache/iotdb/commons/schema/table/TsTable.java | 2 +- 10 files changed, 42 insertions(+), 31 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java index 690a18dbd46..84dec4eca01 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java @@ -111,6 +111,7 @@ public class LoadTsFileTableSchemaCache { private long currentTimeIndexMemoryUsageSizeInBytes = 0; private int currentBatchDevicesCount = 0; + private boolean needDecode4DifferentTimeColumn; public LoadTsFileTableSchemaCache( final Metadata metadata, final MPPQueryContext context, final boolean needToCreateDatabase) @@ -298,7 +299,9 @@ public class LoadTsFileTableSchemaCache { org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema.fromTsFileTableSchema( tableName, schema); final TableSchema realSchema = - metadata.validateTableHeaderSchema(database, fileSchema, context, true, true).orElse(null); + metadata + .validateTableHeaderSchema4TsFile(database, fileSchema, context, true, true) + .orElse(null); if (Objects.isNull(realSchema)) { throw new LoadAnalyzeException( String.format( @@ -308,6 +311,10 @@ public class LoadTsFileTableSchemaCache { verifyTableDataTypeAndGenerateTagColumnMapper(fileSchema, realSchema); } + public boolean isNeedDecode4DifferentTimeColumn() { + return needDecode4DifferentTimeColumn; + } + private void autoCreateTableDatabaseIfAbsent(final String database) throws LoadAnalyzeException { validateDatabaseName(database); if (DataNodeTableCache.getInstance().isDatabaseExist(database)) { @@ -449,6 +456,7 @@ public class LoadTsFileTableSchemaCache { currentBatchTable2Devices = null; tableTagColumnMapper = null; + needDecode4DifferentTimeColumn = false; } private void clearDevices() { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadSingleTsFileNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadSingleTsFileNode.java index 604fda6e1e8..79db4f10785 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadSingleTsFileNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadSingleTsFileNode.java @@ -89,6 +89,10 @@ public class LoadSingleTsFileNode extends WritePlanNode { public boolean needDecodeTsFile( Function<List<Pair<IDeviceID, TTimePartitionSlot>>, List<TRegionReplicaSet>> partitionFetcher) { + if (needDecodeTsFile) { + return true; + } + List<Pair<IDeviceID, TTimePartitionSlot>> slotList = new ArrayList<>(); resource .getDevices() diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java index db706d4980c..7c0b6aae877 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java @@ -102,28 +102,30 @@ public interface Metadata { * <p>When table or column is missing, this method will execute auto creation if the user have * corresponding authority. * - * <p>When using SQL, the columnSchemaList could be null and there won't be any validation. + * <p>When using SQL, the columnSchemaList could be {@code null} and there won't be any + * validation. * - * <p>When the input dataType or category of one column is null, the column won't be auto created. + * <p>When the input dataType or category of one column is {@code null}, the column won't be auto + * created. * * <p>The caller need to recheck the dataType of measurement columns to decide whether to do * partial insert * - * @param isStrictIdColumn if true, when the table already exists, the id columns in the existing - * table should be the prefix of those in the input tableSchema, or input id columns be the - * prefix of existing id columns. + * @param isStrictTagColumn if {@code true}, when the table already exists, the tag columns in the + * existing table should be the prefix of those in the input tableSchema, or input tag columns + * be the prefix of existing tag columns. * @return If table doesn't exist and the user have no authority to create table, Optional.empty() * will be returned. The returned table may not include all the columns * in @param{tableSchema}, if the user have no authority to alter table. - * @throws SemanticException if column category mismatch or data types of id or attribute column - * are not STRING or Category, Type of any missing ColumnSchema is null + * @throws SemanticException if column category mismatch or data types of tag or attribute column + * are not STRING or Category, Type of any missing ColumnSchema is {@code null} */ - Optional<TableSchema> validateTableHeaderSchema( + Optional<TableSchema> validateTableHeaderSchema4TsFile( final String database, final TableSchema tableSchema, final MPPQueryContext context, final boolean allowCreateTable, - final boolean isStrictIdColumn) + final boolean isStrictTagColumn) throws LoadAnalyzeTableColumnDisorderException; void validateInsertNodeMeasurements( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java index 5df442d4d32..3e8bbf12890 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java @@ -1396,7 +1396,7 @@ public class TableMetadataImpl implements Metadata { } @Override - public Optional<TableSchema> validateTableHeaderSchema( + public Optional<TableSchema> validateTableHeaderSchema4TsFile( String database, TableSchema tableSchema, MPPQueryContext context, @@ -1404,7 +1404,7 @@ public class TableMetadataImpl implements Metadata { boolean isStrictTagColumn) throws LoadAnalyzeTableColumnDisorderException { return TableHeaderSchemaValidator.getInstance() - .validateTableHeaderSchema( + .validateTableHeaderSchema4TsFile( database, tableSchema, context, allowCreateTable, isStrictTagColumn); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java index 5bdf6aec2a0..846dceeca2d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java @@ -93,7 +93,7 @@ public class TableHeaderSchemaValidator { return TableHeaderSchemaValidatorHolder.INSTANCE; } - public Optional<TableSchema> validateTableHeaderSchema( + public Optional<TableSchema> validateTableHeaderSchema4TsFile( final String database, final TableSchema tableSchema, final MPPQueryContext context, @@ -136,8 +136,7 @@ public class TableHeaderSchemaValidator { } else { DataNodeTreeViewSchemaUtils.checkTableInWrite(database, table); // If table with this name already exists and isStrictTagColumn is true, make sure the - // existing - // id columns are the prefix of the incoming tag columns, or vice versa + // existing tag columns are a prefix of the incoming tag columns, or vice versa if (isStrictTagColumn) { final List<TsTableColumnSchema> realTagColumns = table.getTagColumnSchemaList(); final List<ColumnSchema> incomingTagColumns = tableSchema.getTagColumns(); @@ -572,12 +571,10 @@ public class TableHeaderSchemaValidator { final ListenableFuture<ConfigTaskResult> future = task.execute(configTaskExecutor); final ConfigTaskResult result = future.get(); if (result.getStatusCode().getStatusCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new RuntimeException( - new IoTDBException( - String.format( - "Auto add table column failed: %s.%s", - database, measurementInfo.getTableName()), - result.getStatusCode().getStatusCode())); + throw new IoTDBRuntimeException( + String.format( + "Auto add table column failed: %s.%s", database, measurementInfo.getTableName()), + result.getStatusCode().getStatusCode()); } DataNodeSchemaLockManager.getInstance() .takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION_TABLE); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index 6666c180c5e..c789490bb10 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -1058,12 +1058,12 @@ public class AnalyzerTest { DataNodeTableCache.getInstance().commitUpdateTable(database, table, null); return new TestMetadata() { @Override - public Optional<TableSchema> validateTableHeaderSchema( + public Optional<TableSchema> validateTableHeaderSchema4TsFile( String database, TableSchema schema, MPPQueryContext context, boolean allowCreateTable, - boolean isStrictIdColumn) { + boolean isStrictTagColumn) { TableSchema tableSchema = StatementTestUtils.genTableSchema(); assertEquals(tableSchema, schema); return Optional.of(tableSchema); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java index 79c03156097..48dd9409d63 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java @@ -342,12 +342,12 @@ public class TSBSMetadata implements Metadata { } @Override - public Optional<TableSchema> validateTableHeaderSchema( + public Optional<TableSchema> validateTableHeaderSchema4TsFile( String database, TableSchema tableSchema, MPPQueryContext context, boolean allowCreateTable, - boolean isStrictIdColumn) { + boolean isStrictTagColumn) { throw new UnsupportedOperationException(); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java index 4b1d18944b7..551dbc5a961 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java @@ -481,12 +481,12 @@ public class TestMetadata implements Metadata { } @Override - public Optional<TableSchema> validateTableHeaderSchema( + public Optional<TableSchema> validateTableHeaderSchema4TsFile( final String database, final TableSchema tableSchema, final MPPQueryContext context, final boolean allowCreateTable, - final boolean isStrictIdColumn) { + final boolean isStrictTagColumn) { throw new UnsupportedOperationException(); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/InsertStatementTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/InsertStatementTest.java index 81a9d88d3d3..cb23ee0ec04 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/InsertStatementTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/InsertStatementTest.java @@ -100,7 +100,7 @@ public class InsertStatementTest { DataNodeTableCache.getInstance().preUpdateTable("test", tsTable, null); DataNodeTableCache.getInstance().commitUpdateTable("test", "table1", null); - when(metadata.validateTableHeaderSchema( + when(metadata.validateTableHeaderSchema4TsFile( any(String.class), any(TableSchema.class), any(MPPQueryContext.class), @@ -252,7 +252,7 @@ public class InsertStatementTest { DataNodeTableCache.getInstance().preUpdateTable("test", tsTable, null); DataNodeTableCache.getInstance().commitUpdateTable("test", "table1", null); - when(metadata.validateTableHeaderSchema( + when(metadata.validateTableHeaderSchema4TsFile( any(String.class), any(TableSchema.class), any(MPPQueryContext.class), @@ -287,7 +287,7 @@ public class InsertStatementTest { DataNodeTableCache.getInstance().preUpdateTable("test", tsTable, null); DataNodeTableCache.getInstance().commitUpdateTable("test", "table1", null); - when(metadata.validateTableHeaderSchema( + when(metadata.validateTableHeaderSchema4TsFile( any(String.class), any(TableSchema.class), any(MPPQueryContext.class), diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsTable.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsTable.java index 61b00d060bd..df3bbc045e5 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsTable.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsTable.java @@ -69,7 +69,7 @@ public class TsTable { "When there are object fields, the %s %s shall not be '.', '..' or contain './', '.\\'."; protected String tableName; - private Map<String, TsTableColumnSchema> columnSchemaMap = new LinkedHashMap<>(); + private final Map<String, TsTableColumnSchema> columnSchemaMap = new LinkedHashMap<>(); private final Map<String, Integer> tagColumnIndexMap = new HashMap<>(); private final Map<String, Integer> idColumnIndexMap = new HashMap<>();
