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

jackietien 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 06537dc2fd0 correct metadata "modified" flags and related logic 
(#17172)
06537dc2fd0 is described below

commit 06537dc2fd0f618cf737dccb85def5e53be70729
Author: shuwenwei <[email protected]>
AuthorDate: Mon Feb 9 15:58:18 2026 +0800

    correct metadata "modified" flags and related logic (#17172)
---
 .../db/it/schema/IoTDBAlterTimeSeriesTypeIT.java   |   6 +-
 .../execution/operator/source/FileLoaderUtils.java |  80 ++++---------
 .../execution/operator/source/SeriesScanUtil.java  |  47 +-------
 .../schemaregion/utils/ResourceByPathUtils.java    |   6 +-
 .../read/reader/chunk/MemAlignedChunkReader.java   |   7 ++
 .../read/reader/chunk/MemAlignedPageReader.java    |   9 +-
 .../read/reader/chunk/MemChunkReader.java          |   7 ++
 .../read/reader/chunk/MemPageReader.java           |   9 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     | 126 ++++++---------------
 pom.xml                                            |   2 +-
 10 files changed, 89 insertions(+), 210 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterTimeSeriesTypeIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterTimeSeriesTypeIT.java
index 3effc3a8b83..e5fa5ca59a7 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterTimeSeriesTypeIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterTimeSeriesTypeIT.java
@@ -26,8 +26,8 @@ import org.apache.iotdb.isession.ISession;
 import org.apache.iotdb.isession.SessionDataSet;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
-import org.apache.iotdb.itbase.category.TableClusterIT;
-import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
 import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.StatementExecutionException;
 
@@ -87,7 +87,7 @@ import static org.junit.Assert.fail;
 
 @SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(IoTDBTestRunner.class)
-@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
+@Category({LocalStandaloneIT.class, ClusterIT.class})
 public class IoTDBAlterTimeSeriesTypeIT {
 
   private static final Logger log = 
LoggerFactory.getLogger(IoTDBAlterTimeSeriesTypeIT.class);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/FileLoaderUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/FileLoaderUtils.java
index 9b341dc9971..3eff3b9a53f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/FileLoaderUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/FileLoaderUtils.java
@@ -40,7 +40,6 @@ import org.apache.iotdb.db.utils.ModificationUtils;
 import org.apache.iotdb.db.utils.SchemaUtils;
 
 import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
 import org.apache.tsfile.file.metadata.AbstractAlignedTimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.AlignedTimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.IChunkMetadata;
@@ -113,13 +112,11 @@ public class FileLoaderUtils {
                     context.isDebug(),
                     context);
         if (timeSeriesMetadata != null) {
-          SchemaUtils.changeMetadataModified(timeSeriesMetadata, 
seriesPath.getSeriesType());
           long t2 = System.nanoTime();
           List<ModEntry> pathModifications =
               context.getPathModifications(
                   resource, seriesPath.getDeviceId(), 
seriesPath.getMeasurement());
-          timeSeriesMetadata.setModified(
-              timeSeriesMetadata.isModified() || !pathModifications.isEmpty());
+          timeSeriesMetadata.setModified(!pathModifications.isEmpty());
           timeSeriesMetadata.setChunkMetadataLoader(
               new DiskChunkMetadataLoader(resource, context, globalTimeFilter, 
pathModifications));
           int modificationCount = pathModifications.size();
@@ -141,13 +138,14 @@ public class FileLoaderUtils {
         timeSeriesMetadata =
             (TimeseriesMetadata) resource.getTimeSeriesMetadata(seriesPath, 
globalTimeFilter);
         if (timeSeriesMetadata != null) {
-          SchemaUtils.changeMetadataModified(timeSeriesMetadata, 
seriesPath.getSeriesType());
           timeSeriesMetadata.setChunkMetadataLoader(
               new MemChunkMetadataLoader(resource, seriesPath, context, 
globalTimeFilter));
         }
       }
 
       if (timeSeriesMetadata != null) {
+        SchemaUtils.changeTimeseriesMetadataModified(
+            timeSeriesMetadata, seriesPath.getSeriesType());
         if (timeSeriesMetadata.getStatistics().getStartTime()
             > timeSeriesMetadata.getStatistics().getEndTime()) {
           return null;
@@ -209,15 +207,12 @@ public class FileLoaderUtils {
         alignedTimeSeriesMetadata =
             loadAlignedTimeSeriesMetadataFromDisk(
                 resource, alignedPath, context, globalTimeFilter, 
ignoreAllNullRows);
-        SchemaUtils.changeAlignedMetadataModified(alignedTimeSeriesMetadata, 
targetDataTypeList);
       } else { // if the tsfile is unclosed, we just get it directly from 
TsFileResource
         loadFromMem = true;
         alignedTimeSeriesMetadata =
             (AbstractAlignedTimeSeriesMetadata)
                 resource.getTimeSeriesMetadata(alignedPath, globalTimeFilter);
         if (alignedTimeSeriesMetadata != null) {
-          SchemaUtils.changeAlignedMetadataModified(alignedTimeSeriesMetadata, 
targetDataTypeList);
-
           alignedTimeSeriesMetadata.setChunkMetadataLoader(
               new MemAlignedChunkMetadataLoader(
                   resource, alignedPath, context, globalTimeFilter, 
ignoreAllNullRows));
@@ -226,6 +221,8 @@ public class FileLoaderUtils {
       }
 
       if (alignedTimeSeriesMetadata != null) {
+        SchemaUtils.changeAlignedTimeseriesMetadataModified(
+            alignedTimeSeriesMetadata, targetDataTypeList);
         if 
(alignedTimeSeriesMetadata.getTimeseriesMetadata().getStatistics().getStartTime()
             > 
alignedTimeSeriesMetadata.getTimeseriesMetadata().getStatistics().getEndTime()) 
{
           return null;
@@ -320,25 +317,18 @@ public class FileLoaderUtils {
             new ArrayList<>(valueMeasurementList.size());
         // if all the queried aligned sensors does not exist, we will return 
null
         boolean exist = false;
-        int i = 0;
-        for (String valueMeasurement : valueMeasurementList) {
+        for (String measurement : valueMeasurementList) {
           TimeseriesMetadata valueColumn =
               cache.get(
                   filePath,
-                  new TimeSeriesMetadataCacheKey(
-                      resource.getTsFileID(), deviceId, valueMeasurement),
+                  new TimeSeriesMetadataCacheKey(resource.getTsFileID(), 
deviceId, measurement),
                   allSensors,
                   context.ignoreNotExistsDevice()
                       || resource.getTimeIndexType() == 
ITimeIndex.FILE_TIME_INDEX_TYPE,
                   isDebug,
                   context);
           exist = (exist || (valueColumn != null));
-          if (valueColumn != null) {
-            SchemaUtils.changeAlignedMetadataModified(
-                valueColumn, alignedPath.getSchemaList().get(i).getType());
-          }
           valueTimeSeriesMetadataList.add(valueColumn);
-          i++;
         }
         if (!ignoreAllNullRows || exist) {
           alignedTimeSeriesMetadata =
@@ -458,55 +448,23 @@ public class FileLoaderUtils {
    *     IOException will be thrown
    */
   public static List<IPageReader> loadPageReaderList(
-      IChunkMetadata chunkMetaData,
-      Filter globalTimeFilter,
-      boolean isAligned,
-      List<TSDataType> targetDataTypeList)
+      IChunkMetadata chunkMetaData, Filter globalTimeFilter, List<TSDataType> 
targetDataTypeList)
       throws IOException {
     checkArgument(chunkMetaData != null, "Can't init null chunkMeta");
 
+    IChunkLoader chunkLoader = chunkMetaData.getChunkLoader();
     IChunkReader chunkReader;
-    boolean isModified = false;
-    if (isAligned) {
-      AbstractAlignedChunkMetadata alignedChunkMetadata =
-          (AbstractAlignedChunkMetadata) chunkMetaData;
-      for (int i = 0; i < 
alignedChunkMetadata.getValueChunkMetadataList().size(); i++) {
-        if (alignedChunkMetadata.getValueChunkMetadataList().get(i) != null) {
-          if (!SchemaUtils.isUsingSameStatistics(
-                  
alignedChunkMetadata.getValueChunkMetadataList().get(i).getDataType(),
-                  targetDataTypeList.get(i))
-              && 
!SchemaUtils.canUseStatisticsAfterAlter(targetDataTypeList.get(i))) {
-            isModified = true;
-            
alignedChunkMetadata.getValueChunkMetadataList().get(i).setModified(true);
-          }
-        }
-      }
-      IChunkLoader chunkLoader = alignedChunkMetadata.getChunkLoader();
-      chunkReader = chunkLoader.getChunkReader(alignedChunkMetadata, 
globalTimeFilter);
-    } else {
-      if (!SchemaUtils.isUsingSameStatistics(chunkMetaData.getDataType(), 
targetDataTypeList.get(0))
-          && 
!SchemaUtils.canUseStatisticsAfterAlter(targetDataTypeList.get(0))) {
-        isModified = true;
-        chunkMetaData.setModified(true);
-      }
-      IChunkLoader chunkLoader = chunkMetaData.getChunkLoader();
-      try {
-        chunkReader = chunkLoader.getChunkReader(chunkMetaData, 
globalTimeFilter);
-      } catch (ChunkTypeInconsistentException e) {
-        // if the chunk in tsfile is a value chunk of aligned series, we 
should skip all data of
-        // this chunk.
-        return Collections.emptyList();
-      }
+    try {
+      chunkReader = chunkLoader.getChunkReader(chunkMetaData, 
globalTimeFilter);
+    } catch (ChunkTypeInconsistentException e) {
+      // if the chunk in tsfile is a value chunk of aligned series but 
registered series is
+      // non-aligned, we should skip all data of this chunk.
+      return Collections.emptyList();
     }
-
-    return isModified
-        ? chunkReader.loadPageReaderList().stream()
-            .peek(
-                iPageReader -> {
-                  iPageReader.setModified(true);
-                })
-            .collect(Collectors.toList())
-        : chunkReader.loadPageReaderList();
+    if (chunkMetaData.isDataTypeModifiedAndCannotUseStatistics()) {
+      chunkReader.markDataTypeModifiedAndCannotUseStatistics();
+    }
+    return chunkReader.loadPageReaderList();
   }
 
   /**
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
index 1e1cffba5ff..5e7111bf09c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
@@ -45,8 +45,6 @@ import 
org.apache.iotdb.db.utils.datastructure.MemPointIterator;
 import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
-import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IMetadata;
@@ -453,15 +451,6 @@ public class SeriesScanUtil implements Accountable {
             
orderUtils.getOverlapCheckTime(firstChunkMetadata.getStatistics()));
         unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(
             
orderUtils.getOverlapCheckTime(firstChunkMetadata.getStatistics()), false);
-        if (isAligned) {
-          SchemaUtils.changeAlignedMetadataModified(
-              (AbstractAlignedChunkMetadata) firstChunkMetadata,
-              firstChunkMetadata.getDataType(),
-              getTsDataTypeList());
-        } else {
-          SchemaUtils.changeMetadataModified(
-              firstChunkMetadata, firstChunkMetadata.getDataType(), dataType);
-        }
         if (firstChunkMetadata.equals(cachedChunkMetadata.peek())) {
           firstChunkMetadata = cachedChunkMetadata.poll();
           break;
@@ -489,45 +478,13 @@ public class SeriesScanUtil implements Accountable {
 
     if (init && firstChunkMetadata == null && !cachedChunkMetadata.isEmpty()) {
       firstChunkMetadata = cachedChunkMetadata.poll();
-      if (isAligned) {
-        SchemaUtils.changeAlignedMetadataModified(
-            (AbstractAlignedChunkMetadata) firstChunkMetadata,
-            firstChunkMetadata.getDataType(),
-            getTsDataTypeList());
-      } else {
-        SchemaUtils.changeMetadataModified(
-            firstChunkMetadata, firstChunkMetadata.getDataType(), dataType);
-      }
     }
   }
 
   protected void unpackOneTimeSeriesMetadata(ITimeSeriesMetadata 
timeSeriesMetadata) {
     List<IChunkMetadata> chunkMetadataList =
         FileLoaderUtils.loadChunkMetadataList(timeSeriesMetadata);
-    chunkMetadataList.forEach(
-        chunkMetadata -> {
-          if (chunkMetadata instanceof AbstractAlignedChunkMetadata) {
-            AbstractAlignedChunkMetadata alignedChunkMetadata =
-                (AbstractAlignedChunkMetadata) chunkMetadata;
-            for (int i = 0; i < 
alignedChunkMetadata.getValueChunkMetadataList().size(); i++) {
-              if ((alignedChunkMetadata.getValueChunkMetadataList().get(i) != 
null)
-                  && !SchemaUtils.isUsingSameStatistics(
-                      
alignedChunkMetadata.getValueChunkMetadataList().get(i).getDataType(),
-                      getTsDataTypeList().get(i))
-                  && 
!SchemaUtils.canUseStatisticsAfterAlter(getTsDataTypeList().get(i))) {
-                
alignedChunkMetadata.getValueChunkMetadataList().get(i).setModified(true);
-              }
-            }
-            chunkMetadata = alignedChunkMetadata;
-          } else if (chunkMetadata instanceof ChunkMetadata) {
-            if (!SchemaUtils.isUsingSameStatistics(
-                    chunkMetadata.getDataType(), getTsDataTypeList().get(0))
-                && 
!SchemaUtils.canUseStatisticsAfterAlter(getTsDataTypeList().get(0))) {
-              chunkMetadata.setModified(true);
-            }
-          }
-          chunkMetadata.setSeq(timeSeriesMetadata.isSeq());
-        });
+    chunkMetadataList.forEach(chunkMetadata -> 
chunkMetadata.setSeq(timeSeriesMetadata.isSeq()));
 
     cachedChunkMetadata.addAll(chunkMetadataList);
   }
@@ -704,7 +661,7 @@ public class SeriesScanUtil implements Accountable {
     }
     List<IPageReader> pageReaderList =
         FileLoaderUtils.loadPageReaderList(
-            chunkMetaData, scanOptions.getGlobalTimeFilter(), isAligned, 
getTsDataTypeList());
+            chunkMetaData, scanOptions.getGlobalTimeFilter(), 
getTsDataTypeList());
 
     // init TsBlockBuilder for each page reader
     pageReaderList.forEach(p -> p.initTsBlockBuilder(getTsDataTypeList()));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
index 690cea9f03b..adb76d9bbdd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
@@ -364,7 +364,7 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
       TSDataType targetDataType = measurementMap.get(measurement);
       if (valueChunkMetadata.getDataType() != targetDataType) {
         
SchemaUtils.rewriteAlignedChunkMetadataStatistics(alignedChunkMetadata, i, 
targetDataType);
-        alignedChunkMetadata.setModified(true);
+        alignedChunkMetadata.setDataTypeModifiedAndCannotUseStatistics(true);
       }
     }
   }
@@ -571,7 +571,7 @@ class MeasurementResourceByPathUtils extends 
ResourceByPathUtils {
           return null;
         }
         chunkMetadataList.set(index, chunkMetadata);
-        chunkMetadata.setModified(true);
+        chunkMetadata.setDataTypeModifiedAndCannotUseStatistics(true);
       }
       if (!useFakeStatistics) {
         if (chunkMetadata != null && 
targetDataType.isCompatible(chunkMetadata.getDataType())) {
@@ -597,7 +597,7 @@ class MeasurementResourceByPathUtils extends 
ResourceByPathUtils {
             return null;
           }
           memChunk.setChunkMetadata(rewritedChunkMetadata);
-          memChunk.getChunkMetaData().setModified(true);
+          
memChunk.getChunkMetaData().setDataTypeModifiedAndCannotUseStatistics(true);
         }
         if (useFakeStatistics) {
           memChunk.initChunkMetaFromTVListsWithFakeStatistics();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
index 093ae9cc327..c85dcef9ace 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
@@ -85,6 +85,13 @@ public class MemAlignedChunkReader implements IChunkReader {
     // Do nothing because mem chunk reader will not open files
   }
 
+  @Override
+  public void markDataTypeModifiedAndCannotUseStatistics() {
+    for (IPageReader iPageReader : pageReaderList) {
+      iPageReader.setModified(true);
+    }
+  }
+
   @Override
   public List<IPageReader> loadPageReaderList() {
     return this.pageReaderList;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
index a299684a49c..758721f9a05 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
@@ -60,6 +60,9 @@ public class MemAlignedPageReader implements IPageReader {
   private Filter recordFilter;
   private PaginationController paginationController = 
UNLIMITED_PAGINATION_CONTROLLER;
 
+  // data type is modified in query and statistics cannot be used
+  private boolean modified;
+
   private TsBlockBuilder builder;
 
   public MemAlignedPageReader(
@@ -214,11 +217,13 @@ public class MemAlignedPageReader implements IPageReader {
 
   @Override
   public boolean isModified() {
-    return false;
+    return modified;
   }
 
   @Override
-  public void setModified(boolean modified) {}
+  public void setModified(boolean modified) {
+    this.modified = modified;
+  }
 
   @Override
   public void initTsBlockBuilder(List<TSDataType> dataTypes) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkReader.java
index 4b21d87d114..8cee8b970c5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkReader.java
@@ -129,6 +129,13 @@ public class MemChunkReader implements IChunkReader, 
IPointReader {
     // Do nothing because mem chunk reader will not open files
   }
 
+  @Override
+  public void markDataTypeModifiedAndCannotUseStatistics() {
+    for (IPageReader pageReader : this.pageReaderList) {
+      pageReader.setModified(true);
+    }
+  }
+
   @Override
   public List<IPageReader> loadPageReaderList() {
     return this.pageReaderList;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java
index e7427ef87d8..0f656a96f69 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java
@@ -57,6 +57,9 @@ public class MemPageReader implements IPageReader {
 
   private PaginationController paginationController = 
UNLIMITED_PAGINATION_CONTROLLER;
 
+  // data type is modified in query and statistics cannot be used
+  private boolean modified;
+
   public MemPageReader(
       Supplier<TsBlock> tsBlockSupplier,
       int pageIndex,
@@ -223,11 +226,13 @@ public class MemPageReader implements IPageReader {
 
   @Override
   public boolean isModified() {
-    return false;
+    return modified;
   }
 
   @Override
-  public void setModified(boolean modified) {}
+  public void setModified(boolean modified) {
+    this.modified = modified;
+  }
 
   @Override
   public void initTsBlockBuilder(List<TSDataType> dataTypes) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
index 6044b2331d1..281b1be2b35 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
@@ -40,6 +40,8 @@ import org.apache.tsfile.utils.Binary;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nullable;
+
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collections;
@@ -314,120 +316,58 @@ public class SchemaUtils {
         dataTypeColumnClassMap.get(originalDataType), 
dataTypeColumnClassMap.get(dataType));
   }
 
-  public static boolean isUsingSameStatistics(TSDataType originalDataType, 
TSDataType dataType) {
-    if (originalDataType == dataType) {
-      return true;
-    }
-    if (!dataTypeColumnStatisticsClassMap.containsKey(originalDataType)
-        || !dataTypeColumnStatisticsClassMap.containsKey(dataType)) {
-      return false;
-    }
-    return Objects.equals(
-        dataTypeColumnStatisticsClassMap.get(originalDataType),
-        dataTypeColumnStatisticsClassMap.get(dataType));
-  }
-
-  public static boolean canUseStatisticsAfterAlter(TSDataType dataType) {
-    return !canNotUseStatisticAfterAlterClassSet.contains(dataType);
-  }
-
-  public static void changeMetadataModified(
-      TimeseriesMetadata timeseriesMetadata, TSDataType targetDataType) {
+  public static void changeTimeseriesMetadataModified(
+      @Nullable TimeseriesMetadata timeseriesMetadata, TSDataType 
targetDataType) {
     if (timeseriesMetadata == null) {
       return;
     }
-    if (!SchemaUtils.isUsingSameStatistics(timeseriesMetadata.getTsDataType(), 
targetDataType)
-        && !SchemaUtils.canUseStatisticsAfterAlter(targetDataType)) {
-      timeseriesMetadata.setModified(true);
-      List<IChunkMetadata> chunkMetadataList = 
timeseriesMetadata.getChunkMetadataList();
-      if (chunkMetadataList != null) {
-        for (IChunkMetadata chunkMetadata : chunkMetadataList) {
-          if (chunkMetadata != null) {
-            chunkMetadata.setModified(true);
-          }
-        }
-      }
+    if (!SchemaUtils.canUseStatisticsAfterAlter(
+        timeseriesMetadata.getTsDataType(), targetDataType)) {
+      timeseriesMetadata.setDataTypeModifiedAndCannotUseStatistics(true);
     }
   }
 
-  public static void changeAlignedMetadataModified(
-      AbstractAlignedTimeSeriesMetadata alignedTimeSeriesMetadata,
+  public static void changeAlignedTimeseriesMetadataModified(
+      @Nullable AbstractAlignedTimeSeriesMetadata alignedTimeSeriesMetadata,
       List<TSDataType> targetDataTypeList) {
     if (alignedTimeSeriesMetadata == null) {
       return;
     }
-
-    int i = 0;
-    for (TimeseriesMetadata timeseriesMetadata :
-        alignedTimeSeriesMetadata.getValueTimeseriesMetadataList()) {
-      if ((timeseriesMetadata != null)
-          && !SchemaUtils.isUsingSameStatistics(
-              timeseriesMetadata.getTsDataType(), targetDataTypeList.get(i))
-          && 
!SchemaUtils.canUseStatisticsAfterAlter(targetDataTypeList.get(i))) {
-        timeseriesMetadata.setModified(true);
-        alignedTimeSeriesMetadata.setModified(true);
-        List<IChunkMetadata> chunkMetadataList = 
timeseriesMetadata.getChunkMetadataList();
-        if (chunkMetadataList != null) {
-          for (IChunkMetadata chunkMetadata : chunkMetadataList) {
-            if (chunkMetadata != null) {
-              chunkMetadata.setModified(true);
-            }
-          }
-        }
+    for (int i = 0; i < 
alignedTimeSeriesMetadata.getValueTimeseriesMetadataList().size(); i++) {
+      TimeseriesMetadata valueTimeseriesMetadata =
+          alignedTimeSeriesMetadata.getValueTimeseriesMetadataList().get(i);
+      if (valueTimeseriesMetadata != null
+          && !SchemaUtils.canUseStatisticsAfterAlter(
+              valueTimeseriesMetadata.getTsDataType(), 
targetDataTypeList.get(i))) {
+        
alignedTimeSeriesMetadata.setDataTypeModifiedAndCannotUseStatistics(true);
+        return;
       }
-      i++;
     }
   }
 
-  public static void changeAlignedMetadataModified(
-      TimeseriesMetadata timeseriesMetadata, TSDataType targetDataType) {
-    if (timeseriesMetadata == null) {
-      return;
-    }
-
-    if (!SchemaUtils.isUsingSameStatistics(timeseriesMetadata.getTsDataType(), 
targetDataType)
-        && !SchemaUtils.canUseStatisticsAfterAlter(targetDataType)) {
-      timeseriesMetadata.setModified(true);
-      List<IChunkMetadata> chunkMetadataList = 
timeseriesMetadata.getChunkMetadataList();
-      if (chunkMetadataList != null) {
-        for (IChunkMetadata chunkMetadata : chunkMetadataList) {
-          if (chunkMetadata != null) {
-            chunkMetadata.setModified(true);
-          }
-        }
-      }
+  public static boolean canUseStatisticsAfterAlter(
+      TSDataType originalDataType, TSDataType targetDataType) {
+    if (isUsingSameStatistics(originalDataType, targetDataType)) {
+      return true;
     }
+    return canUseStatisticsAfterAlter(targetDataType);
   }
 
-  public static void changeMetadataModified(
-      IChunkMetadata chunkMetadata, TSDataType sourceDataType, TSDataType 
targetDataType) {
-    if (chunkMetadata == null) {
-      return;
+  private static boolean isUsingSameStatistics(TSDataType originalDataType, 
TSDataType dataType) {
+    if (originalDataType == dataType) {
+      return true;
     }
-    if (!SchemaUtils.isUsingSameStatistics(sourceDataType, targetDataType)
-        && !SchemaUtils.canUseStatisticsAfterAlter(targetDataType)) {
-      chunkMetadata.setModified(true);
+    if (!dataTypeColumnStatisticsClassMap.containsKey(originalDataType)
+        || !dataTypeColumnStatisticsClassMap.containsKey(dataType)) {
+      return false;
     }
+    return Objects.equals(
+        dataTypeColumnStatisticsClassMap.get(originalDataType),
+        dataTypeColumnStatisticsClassMap.get(dataType));
   }
 
-  public static void changeAlignedMetadataModified(
-      AbstractAlignedChunkMetadata chunkMetadata,
-      TSDataType sourceDataType,
-      List<TSDataType> targetDataTypeList) {
-    if (chunkMetadata == null) {
-      return;
-    }
-    int i = 0;
-    for (IChunkMetadata iChunkMetadata : 
chunkMetadata.getValueChunkMetadataList()) {
-      if ((iChunkMetadata != null)
-          && !SchemaUtils.isUsingSameStatistics(
-              iChunkMetadata.getDataType(), targetDataTypeList.get(i))
-          && 
!SchemaUtils.canUseStatisticsAfterAlter(targetDataTypeList.get(i))) {
-        iChunkMetadata.setModified(true);
-        chunkMetadata.setModified(true);
-      }
-      i++;
-    }
+  private static boolean canUseStatisticsAfterAlter(TSDataType dataType) {
+    return !canNotUseStatisticAfterAlterClassSet.contains(dataType);
   }
 
   public static void rewriteAlignedChunkMetadataStatistics(
diff --git a/pom.xml b/pom.xml
index 9be2fa2359a..99ba9725ca6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -173,7 +173,7 @@
         <thrift.version>0.14.1</thrift.version>
         <xz.version>1.9</xz.version>
         <zstd-jni.version>1.5.6-3</zstd-jni.version>
-        <tsfile.version>2.2.1-260203-SNAPSHOT</tsfile.version>
+        <tsfile.version>2.2.1-260206-SNAPSHOT</tsfile.version>
     </properties>
     <!--
     if we claim dependencies in dependencyManagement, then we do not claim

Reply via email to