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

jiangtian pushed a commit to branch force_ci/alter_column_datatype
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/force_ci/alter_column_datatype 
by this push:
     new 831a3dfae9d disable altering from TEXT to STRING & add aggregation 
support
831a3dfae9d is described below

commit 831a3dfae9d2ce69b09bc9bba1e81cdf6d06586d
Author: Tian Jiang <[email protected]>
AuthorDate: Mon Jan 13 13:33:01 2025 +0800

    disable altering from TEXT to STRING & add aggregation support
---
 .../it/schema/IoTDBAlterColumnTypeIT.java          | 23 +++++++++++++--
 .../confignode/persistence/schema/ConfigMTree.java |  3 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  2 +-
 .../execution/exchange/SharedTsBlockQueue.java     | 15 ++++++++++
 .../exchange/source/LocalSourceHandle.java         | 15 ++++++++++
 .../execution/operator/source/SeriesScanUtil.java  | 18 ++++++++++++
 .../relational/aggregation/ExtremeAccumulator.java | 16 +++++-----
 .../relational/aggregation/FirstAccumulator.java   | 11 ++++---
 .../relational/aggregation/FirstByAccumulator.java |  8 ++---
 .../relational/aggregation/LastAccumulator.java    | 12 +++++---
 .../relational/aggregation/LastByAccumulator.java  |  8 ++---
 .../relational/aggregation/MaxAccumulator.java     |  8 ++---
 .../relational/aggregation/MinAccumulator.java     |  8 ++---
 .../read/reader/chunk/MemAlignedPageReader.java    | 19 +++++++++++-
 .../reader/chunk/MemAlignedChunkLoaderTest.java    |  2 +-
 .../read/reader/chunk/MemChunkLoaderTest.java      | 12 ++++----
 .../apache/iotdb/commons/utils/MetadataUtils.java  | 34 ++++++++++++++++++++++
 17 files changed, 170 insertions(+), 44 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBAlterColumnTypeIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBAlterColumnTypeIT.java
index 737b9c46af5..873e951d4af 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBAlterColumnTypeIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBAlterColumnTypeIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.relational.it.schema;
 
+import org.apache.iotdb.commons.utils.MetadataUtils;
 import org.apache.iotdb.isession.ITableSession;
 import org.apache.iotdb.isession.SessionDataSet;
 import org.apache.iotdb.it.env.EnvFactory;
@@ -71,6 +72,9 @@ public class IoTDBAlterColumnTypeIT {
     typesToTest.remove(TSDataType.VECTOR);
     typesToTest.remove(TSDataType.UNKNOWN);
 
+    //    doWriteAndAlter(TSDataType.INT32, TSDataType.FLOAT, false);
+    //    doWriteAndAlter(TSDataType.INT32, TSDataType.FLOAT, true);
+
     for (TSDataType from : typesToTest) {
       for (TSDataType to : typesToTest) {
         System.out.printf("testing %s to %s%n", from, to);
@@ -104,7 +108,7 @@ public class IoTDBAlterColumnTypeIT {
       }
 
       // alter the type to "to"
-      boolean isCompatible = to.isCompatible(from);
+      boolean isCompatible = MetadataUtils.canAlter(from, to);
       if (isCompatible) {
         session.executeNonQueryStatement(
             "ALTER TABLE write_and_alter_column_type ALTER COLUMN s1 SET DATA 
TYPE " + to);
@@ -170,6 +174,21 @@ public class IoTDBAlterColumnTypeIT {
         assertEquals(genValue(newType, 2).toString(), 
rec.getFields().get(1).toString());
       }
 
+      dataSet =
+          session.executeQueryStatement(
+              "select min(s1),max(s1),first(s1),last(s1) from 
write_and_alter_column_type");
+      rec = dataSet.next();
+      for (int i = 0; i < 4; i++) {
+        if (newType == TSDataType.BLOB) {
+          assertEquals(genValue(newType, i % 2 + 1), 
rec.getFields().get(i).getBinaryV());
+        } else if (newType == TSDataType.DATE) {
+          assertEquals(genValue(newType, i % 2 + 1), 
rec.getFields().get(i).getDateV());
+        } else {
+          assertEquals(genValue(newType, i % 2 + 1).toString(), 
rec.getFields().get(i).toString());
+        }
+      }
+      assertFalse(dataSet.hasNext());
+
       session.executeNonQueryStatement("DROP TABLE 
write_and_alter_column_type");
     }
   }
@@ -198,7 +217,7 @@ public class IoTDBAlterColumnTypeIT {
           "CREATE TABLE IF NOT EXISTS just_alter_column_type (s1 " + from + 
")");
 
       // alter the type to "to"
-      boolean isCompatible = to.isCompatible(from);
+      boolean isCompatible = MetadataUtils.canAlter(from, to);
       if (isCompatible) {
         session.executeNonQueryStatement(
             "ALTER TABLE just_alter_column_type ALTER COLUMN s1 SET DATA TYPE 
" + to);
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 5c6babfea32..958e9ec00d5 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
@@ -32,6 +32,7 @@ import org.apache.iotdb.commons.schema.table.TableNodeStatus;
 import org.apache.iotdb.commons.schema.table.TsTable;
 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;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.commons.utils.ThriftConfigNodeSerDeUtils;
 import org.apache.iotdb.confignode.persistence.schema.mnode.IConfigMNode;
@@ -882,7 +883,7 @@ public class ConfigMTree {
     if (columnSchema.getColumnCategory() != TsTableColumnCategory.FIELD) {
       throw new SemanticException("Can only alter datatype of FIELD columns");
     }
-    if (!dataType.isCompatible(columnSchema.getDataType())) {
+    if (!MetadataUtils.canAlter(columnSchema.getDataType(), dataType)) {
       throw new SemanticException(
           String.format(
               "New type %s is not compatible with the existing one %s",
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 08ec1372910..ba68a0eb23b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -638,7 +638,7 @@ public class IoTDBConfig {
   private long cacheFileReaderClearPeriod = 100000;
 
   /** the max executing time of query in ms. Unit: millisecond */
-  private long queryTimeoutThreshold = 60000;
+  private long queryTimeoutThreshold = 60000000;
 
   /** the max time to live of a session in ms. Unit: millisecond */
   private int sessionTimeoutThreshold = 0;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java
index b3b94f66282..91029d2a414 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java
@@ -29,7 +29,9 @@ import org.apache.iotdb.mpp.rpc.thrift.TFragmentInstanceId;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import org.apache.commons.lang3.Validate;
+import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.utils.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -214,6 +216,19 @@ public class SharedTsBlockQueue {
    * the returned future of last invocation completes.
    */
   public ListenableFuture<Void> add(TsBlock tsBlock) {
+    StringBuilder tsBlockBuilder = new StringBuilder();
+    for (Column column : tsBlock.getAllColumns()) {
+      tsBlockBuilder.append("[");
+      for (int i = 0; i < column.getPositionCount(); i++) {
+        if (column instanceof TimeColumn) {
+          tsBlockBuilder.append(column.getLong(i)).append(",");
+        } else {
+          tsBlockBuilder.append(column.getTsPrimitiveType(i)).append(",");
+        }
+      }
+      tsBlockBuilder.append("] ");
+    }
+    LOGGER.warn("[addTsBlock] TsBlock:{}", tsBlockBuilder);
     if (closed) {
       // queue may have been closed
       return immediateVoidFuture();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/source/LocalSourceHandle.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/source/LocalSourceHandle.java
index 4da89f72d07..8bf9d75bacc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/source/LocalSourceHandle.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/source/LocalSourceHandle.java
@@ -29,7 +29,9 @@ import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.apache.commons.lang3.Validate;
+import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.read.common.block.column.TsBlockSerde;
 import org.apache.tsfile.utils.RamUsageEstimator;
 import org.slf4j.Logger;
@@ -141,6 +143,19 @@ public class LocalSourceHandle implements ISourceHandle {
   @Override
   public ByteBuffer getSerializedTsBlock() throws IoTDBException {
     TsBlock tsBlock = receive();
+    StringBuilder tsBlockBuilder = new StringBuilder();
+    for (Column column : tsBlock.getAllColumns()) {
+      tsBlockBuilder.append("[");
+      for (int i = 0; i < column.getPositionCount(); i++) {
+        if (column instanceof TimeColumn) {
+          tsBlockBuilder.append(column.getLong(i)).append(",");
+        } else {
+          tsBlockBuilder.append(column.getTsPrimitiveType(i)).append(",");
+        }
+      }
+      tsBlockBuilder.append("] ");
+    }
+    LOGGER.warn("[GetSerializedTsBlock] TsBlock:{}", tsBlockBuilder);
     if (tsBlock != null) {
       long startTime = System.nanoTime();
       try {
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 00f16bdcf29..178839b5ac0 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
@@ -35,6 +35,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.read.reader.common.MergeRead
 import 
org.apache.iotdb.db.storageengine.dataregion.read.reader.common.PriorityMergeReader;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
+import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.AbstractAlignedTimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.IChunkMetadata;
@@ -47,6 +48,7 @@ import org.apache.tsfile.read.TimeValuePair;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.tsfile.read.common.block.TsBlockUtil;
+import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.read.filter.basic.Filter;
 import org.apache.tsfile.read.reader.IPageReader;
 import org.apache.tsfile.read.reader.IPointReader;
@@ -57,6 +59,8 @@ import org.apache.tsfile.utils.Accountable;
 import org.apache.tsfile.utils.RamUsageEstimator;
 import org.apache.tsfile.utils.TsPrimitiveType;
 import org.apache.tsfile.write.UnSupportedDataTypeException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.Serializable;
@@ -75,6 +79,7 @@ import static 
org.apache.iotdb.db.queryengine.metric.SeriesScanCostMetricSet.BUI
 
 public class SeriesScanUtil implements Accountable {
 
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(SeriesScanUtil.class);
   protected final FragmentInstanceContext context;
 
   // The path of the target series which will be scanned.
@@ -1300,6 +1305,19 @@ public class SeriesScanUtil implements Accountable {
         if (!ascending) {
           tsBlock.reverse();
         }
+        StringBuilder tsBlockBuilder = new StringBuilder();
+        for (Column column : tsBlock.getAllColumns()) {
+          tsBlockBuilder.append("[");
+          for (int i = 0; i < column.getPositionCount(); i++) {
+            if (column instanceof TimeColumn) {
+              tsBlockBuilder.append(column.getLong(i)).append(",");
+            } else {
+              tsBlockBuilder.append(column.getTsPrimitiveType(i)).append(",");
+            }
+          }
+          tsBlockBuilder.append("] ");
+        }
+        LOGGER.warn("[getAllSatisfiedPageData] TsBlock:{}", tsBlockBuilder);
         return tsBlock;
       } finally {
         long time = System.nanoTime() - startTime;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/ExtremeAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/ExtremeAccumulator.java
index cdcd08295b6..592ccaf4a9b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/ExtremeAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/ExtremeAccumulator.java
@@ -118,20 +118,20 @@ public class ExtremeAccumulator implements 
TableAccumulator {
 
     switch (seriesDataType) {
       case INT32:
-        updateIntResult((int) statistics[0].getMaxValue());
-        updateIntResult((int) statistics[0].getMinValue());
+        updateIntResult(((Number) statistics[0].getMaxValue()).intValue());
+        updateIntResult(((Number) statistics[0].getMinValue()).intValue());
         break;
       case INT64:
-        updateLongResult((long) statistics[0].getMaxValue());
-        updateLongResult((long) statistics[0].getMinValue());
+        updateLongResult(((Number) statistics[0].getMaxValue()).longValue());
+        updateLongResult(((Number) statistics[0].getMinValue()).longValue());
         break;
       case FLOAT:
-        updateFloatResult((float) statistics[0].getMaxValue());
-        updateFloatResult((float) statistics[0].getMinValue());
+        updateFloatResult(((Number) statistics[0].getMaxValue()).floatValue());
+        updateFloatResult(((Number) statistics[0].getMinValue()).floatValue());
         break;
       case DOUBLE:
-        updateDoubleResult((double) statistics[0].getMaxValue());
-        updateDoubleResult((double) statistics[0].getMinValue());
+        updateDoubleResult(((Number) 
statistics[0].getMaxValue()).doubleValue());
+        updateDoubleResult(((Number) 
statistics[0].getMinValue()).doubleValue());
         break;
       case TEXT:
       case STRING:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java
index 8b364c58fbe..13503401b96 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java
@@ -207,20 +207,23 @@ public class FirstAccumulator implements TableAccumulator 
{
     switch (seriesDataType) {
       case INT32:
       case DATE:
-        updateIntFirstValue((int) statistics[0].getFirstValue(), 
statistics[0].getStartTime());
+        updateIntFirstValue(
+            ((Number) statistics[0].getFirstValue()).intValue(), 
statistics[0].getStartTime());
         break;
       case INT64:
-        updateLongFirstValue((long) statistics[0].getFirstValue(), 
statistics[0].getStartTime());
+        updateLongFirstValue(
+            ((Number) statistics[0].getFirstValue()).longValue(), 
statistics[0].getStartTime());
         break;
       case TIMESTAMP:
         updateLongFirstValue(statistics[0].getStartTime(), 
statistics[0].getStartTime());
         break;
       case FLOAT:
-        updateFloatFirstValue((float) statistics[0].getFirstValue(), 
statistics[0].getStartTime());
+        updateFloatFirstValue(
+            ((Number) statistics[0].getFirstValue()).floatValue(), 
statistics[0].getStartTime());
         break;
       case DOUBLE:
         updateDoubleFirstValue(
-            (double) statistics[0].getFirstValue(), 
statistics[0].getStartTime());
+            ((Number) statistics[0].getFirstValue()).doubleValue(), 
statistics[0].getStartTime());
         break;
       case TEXT:
       case BLOB:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java
index 096091ccdb2..184bb31b074 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java
@@ -263,17 +263,17 @@ public class FirstByAccumulator implements 
TableAccumulator {
           switch (xDataType) {
             case INT32:
             case DATE:
-              xResult.setInt((int) xStatistics.getFirstValue());
+              xResult.setInt(((Number) 
xStatistics.getFirstValue()).intValue());
               break;
             case INT64:
             case TIMESTAMP:
-              xResult.setLong((long) xStatistics.getFirstValue());
+              xResult.setLong(((Number) 
xStatistics.getFirstValue()).longValue());
               break;
             case FLOAT:
-              xResult.setFloat((float) statistics[0].getFirstValue());
+              xResult.setFloat(((Number) 
statistics[0].getFirstValue()).floatValue());
               break;
             case DOUBLE:
-              xResult.setDouble((double) statistics[0].getFirstValue());
+              xResult.setDouble(((Number) 
statistics[0].getFirstValue()).doubleValue());
               break;
             case TEXT:
             case BLOB:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java
index f5c2addd3ca..4160eba8d1d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java
@@ -226,19 +226,23 @@ public class LastAccumulator implements TableAccumulator {
     switch (seriesDataType) {
       case INT32:
       case DATE:
-        updateIntLastValue((int) statistics[0].getLastValue(), 
statistics[0].getEndTime());
+        updateIntLastValue(
+            ((Number) statistics[0].getLastValue()).intValue(), 
statistics[0].getEndTime());
         break;
       case INT64:
-        updateLongLastValue((long) statistics[0].getLastValue(), 
statistics[0].getEndTime());
+        updateLongLastValue(
+            ((Number) statistics[0].getLastValue()).longValue(), 
statistics[0].getEndTime());
         break;
       case TIMESTAMP:
         updateLongLastValue(statistics[0].getEndTime(), 
statistics[0].getEndTime());
         break;
       case FLOAT:
-        updateFloatLastValue((float) statistics[0].getLastValue(), 
statistics[0].getEndTime());
+        updateFloatLastValue(
+            ((Number) statistics[0].getLastValue()).floatValue(), 
statistics[0].getEndTime());
         break;
       case DOUBLE:
-        updateDoubleLastValue((double) statistics[0].getLastValue(), 
statistics[0].getEndTime());
+        updateDoubleLastValue(
+            ((Number) statistics[0].getLastValue()).doubleValue(), 
statistics[0].getEndTime());
         break;
       case TEXT:
       case BLOB:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java
index 0db645d270b..10705984742 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java
@@ -287,17 +287,17 @@ public class LastByAccumulator implements 
TableAccumulator {
           switch (xDataType) {
             case INT32:
             case DATE:
-              xResult.setInt((int) xStatistics.getLastValue());
+              xResult.setInt(((Number) xStatistics.getLastValue()).intValue());
               break;
             case INT64:
             case TIMESTAMP:
-              xResult.setLong((long) xStatistics.getLastValue());
+              xResult.setLong(((Number) 
xStatistics.getLastValue()).longValue());
               break;
             case FLOAT:
-              xResult.setFloat((float) statistics[0].getLastValue());
+              xResult.setFloat(((Number) 
statistics[0].getLastValue()).floatValue());
               break;
             case DOUBLE:
-              xResult.setDouble((double) statistics[0].getLastValue());
+              xResult.setDouble(((Number) 
statistics[0].getLastValue()).doubleValue());
               break;
             case TEXT:
             case BLOB:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MaxAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MaxAccumulator.java
index 1d07fab3809..9853650610f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MaxAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MaxAccumulator.java
@@ -206,19 +206,19 @@ public class MaxAccumulator implements TableAccumulator {
     switch (seriesDataType) {
       case INT32:
       case DATE:
-        updateIntMaxValue((int) statistics[0].getMaxValue());
+        updateIntMaxValue(((Number) statistics[0].getMaxValue()).intValue());
         break;
       case INT64:
-        updateLongMaxValue((long) statistics[0].getMaxValue());
+        updateLongMaxValue(((Number) statistics[0].getMaxValue()).longValue());
         break;
       case TIMESTAMP:
         updateLongMaxValue(statistics[0].getEndTime());
         break;
       case FLOAT:
-        updateFloatMaxValue((float) statistics[0].getMaxValue());
+        updateFloatMaxValue(((Number) 
statistics[0].getMaxValue()).floatValue());
         break;
       case DOUBLE:
-        updateDoubleMaxValue((double) statistics[0].getMaxValue());
+        updateDoubleMaxValue(((Number) 
statistics[0].getMaxValue()).doubleValue());
         break;
       case TEXT:
       case BLOB:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MinAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MinAccumulator.java
index 7f86d73f783..d73d3001c19 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MinAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/MinAccumulator.java
@@ -206,19 +206,19 @@ public class MinAccumulator implements TableAccumulator {
     switch (seriesDataType) {
       case INT32:
       case DATE:
-        updateIntMinValue((int) statistics[0].getMinValue());
+        updateIntMinValue(((Number) statistics[0].getMinValue()).intValue());
         break;
       case INT64:
-        updateLongMinValue((long) statistics[0].getMinValue());
+        updateLongMinValue(((Number) statistics[0].getMinValue()).longValue());
         break;
       case TIMESTAMP:
         updateLongMinValue(statistics[0].getStartTime());
         break;
       case FLOAT:
-        updateFloatMinValue((float) statistics[0].getMinValue());
+        updateFloatMinValue(((Number) 
statistics[0].getMinValue()).floatValue());
         break;
       case DOUBLE:
-        updateDoubleMinValue((double) statistics[0].getMinValue());
+        updateDoubleMinValue(((Number) 
statistics[0].getMinValue()).doubleValue());
         break;
       case TEXT:
       case BLOB:
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 473cd7366c3..37bcc7c6a5d 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
@@ -28,11 +28,14 @@ import org.apache.tsfile.read.common.BatchData;
 import org.apache.tsfile.read.common.BatchDataFactory;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.read.filter.basic.Filter;
 import org.apache.tsfile.read.filter.factory.FilterFactory;
 import org.apache.tsfile.read.reader.IPageReader;
 import org.apache.tsfile.read.reader.series.PaginationController;
 import org.apache.tsfile.utils.TsPrimitiveType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.Serializable;
@@ -96,10 +99,24 @@ public class MemAlignedPageReader implements IPageReader {
 
     // build value column
     buildValueColumns(satisfyInfo, readEndIndex);
-
+    StringBuilder tsBlockBuilder = new StringBuilder();
+    for (Column column : tsBlock.getAllColumns()) {
+      tsBlockBuilder.append("[");
+      for (int i = 0; i < column.getPositionCount(); i++) {
+        if (column instanceof TimeColumn) {
+          tsBlockBuilder.append(column.getLong(i)).append(",");
+        } else {
+          tsBlockBuilder.append(column.getTsPrimitiveType(i)).append(",");
+        }
+      }
+      tsBlockBuilder.append("] ");
+    }
+    LOGGER.warn("[memAlignedPageReader] TsBlock:{}", tsBlockBuilder);
     return builder.build();
   }
 
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(MemAlignedPageReader.class);
+
   private boolean[] buildSatisfyInfoArray() {
     if (recordFilter == null || recordFilter.allSatisfy(this)) {
       boolean[] satisfyInfo = new boolean[tsBlock.getPositionCount()];
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
index e94a75f55a7..3ab77538b1f 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
@@ -82,7 +82,7 @@ public class MemAlignedChunkLoaderTest {
     Mockito.when(statistics6.hasNullValue(2)).thenReturn(true);
 
     Statistics timeStatistics = Mockito.mock(Statistics.class);
-    Mockito.when(timeStatistics.getCount()).thenReturn(2L);
+    Mockito.when(timeStatistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(timeStatistics);
     
Mockito.when(chunkMetadata1.getTimeStatistics()).thenReturn(timeStatistics);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java
index a9bdc453d7a..af91f1ddebc 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java
@@ -67,7 +67,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.BOOLEAN);
@@ -135,7 +135,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.INT32);
@@ -203,7 +203,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.INT64);
@@ -271,7 +271,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.FLOAT);
@@ -339,7 +339,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.DOUBLE);
@@ -407,7 +407,7 @@ public class MemChunkLoaderTest {
     Mockito.when(chunk.getChunkMetaData()).thenReturn(chunkMetadata1);
     Mockito.when(chunk.getPointReader()).thenReturn(null);
     Statistics statistics = Mockito.mock(Statistics.class);
-    Mockito.when(statistics.getCount()).thenReturn(2L);
+    Mockito.when(statistics.getCount()).thenReturn(2);
 
     Mockito.when(chunkMetadata1.getStatistics()).thenReturn(statistics);
     Mockito.when(chunkMetadata1.getDataType()).thenReturn(TSDataType.TEXT);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/MetadataUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/MetadataUtils.java
new file mode 100644
index 00000000000..17a1d3feebe
--- /dev/null
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/MetadataUtils.java
@@ -0,0 +1,34 @@
+/*
+ * 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.commons.utils;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.statistics.Statistics;
+
+public class MetadataUtils {
+
+  private MetadataUtils() {
+    // util class
+  }
+
+  public static boolean canAlter(TSDataType from, TSDataType to) {
+    return Statistics.canMerge(from, to);
+  }
+}

Reply via email to