From 24b963a8e76c723c0c979c5b305b326977edd612 Mon Sep 17 00:00:00 2001 From: Shaurya Vardhan Singh Chauhan Date: Thu, 26 Feb 2026 00:59:54 +0530 Subject: [PATCH 1/3] [IOTDB-16539] Fix ClassCastException in ElasticSerializableTVList for M4 queries --- .../tv/ElasticSerializableTVList.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableTVList.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableTVList.java index f0d4e3dd174eb..790e5cedaf517 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableTVList.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableTVList.java @@ -25,6 +25,7 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.read.common.block.column.TimeColumn; import org.apache.tsfile.utils.Binary; import java.io.IOException; @@ -183,16 +184,16 @@ public void putColumn(Column timeColumn, Column valueColumn) throws IOException consumed = total; if (begin == 0) { // No need to copy if the columns do not split - insertedTimeColumn = timeColumn; + insertedTimeColumn = ensureTimeColumn(timeColumn); insertedValueColumn = valueColumn; } else { - insertedTimeColumn = timeColumn.getRegionCopy(begin, consumed); + insertedTimeColumn = ensureTimeColumn(timeColumn.getRegionCopy(begin, consumed)); insertedValueColumn = valueColumn.getRegionCopy(begin, consumed); } } else { consumed = internalTVListCapacity - pointCount % internalTVListCapacity; // Construct sub-regions - insertedTimeColumn = timeColumn.getRegionCopy(begin, consumed); + insertedTimeColumn = ensureTimeColumn(timeColumn.getRegionCopy(begin, consumed)); insertedValueColumn = valueColumn.getRegionCopy(begin, consumed); } @@ -284,4 +285,15 @@ public SerializableTVList get(int targetIndex) throws IOException { return internalTVList.get(targetIndex); } } + + private Column ensureTimeColumn(Column column) { + if (column instanceof TimeColumn) { + return column; + } + long[] times = new long[column.getPositionCount()]; + for (int i = 0; i < times.length; i++) { + times[i] = column.getLong(i); + } + return new TimeColumn(column.getPositionCount(), times); + } } From 1fbbe5002e1262ed73e3345b66c3a82bcfa2fc13 Mon Sep 17 00:00:00 2001 From: Shaurya Vardhan Singh Chauhan Date: Tue, 3 Mar 2026 23:26:46 +0530 Subject: [PATCH 2/3] Add regression test for LongColumn as timestamp in ElasticSerializableTVList --- .../ElasticSerializableTVListTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java index 148d34f54d679..3f75619b46733 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java @@ -181,4 +181,27 @@ private String generateStringByLength(int length) { } return stringBuilder.toString(); } + @Test + public void testLongColumnAsTimeColumn() { + ElasticSerializableTVList list = ElasticSerializableTVList.newElasticSerializableTVList( + TSDataType.INT64, + TSDataType.DOUBLE, + "test_query", + "test_device", + 0); + + long[] timestamps = new long[] {1, 2, 3}; + double[] values = new double[] {10.0, 20.0, 30.0}; + org.apache.tsfile.block.column.Column timeColumn = + new org.apache.tsfile.read.common.block.column.LongColumn(3, java.util.Optional.empty(), timestamps); + org.apache.tsfile.block.column.Column valueColumn = + new org.apache.tsfile.read.common.block.column.DoubleColumn(3, java.util.Optional.empty(), values); + + try { + list.putColumn(timeColumn, valueColumn); + assertEquals(3, list.size()); + } catch (IOException e) { + fail(e.toString()); + } + } } From b08740d846c0e5dd8c754d3295d6098c75fffdbb Mon Sep 17 00:00:00 2001 From: Shaurya Vardhan Singh Chauhan Date: Wed, 4 Mar 2026 00:12:09 +0530 Subject: [PATCH 3/3] Add regression test for LongColumn as timestamp in ElasticSerializableTVList --- .../ElasticSerializableTVListTest.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java index 3f75619b46733..3fee4108a1943 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/transformation/datastructure/ElasticSerializableTVListTest.java @@ -181,27 +181,25 @@ private String generateStringByLength(int length) { } return stringBuilder.toString(); } - @Test - public void testLongColumnAsTimeColumn() { - ElasticSerializableTVList list = ElasticSerializableTVList.newElasticSerializableTVList( - TSDataType.INT64, - TSDataType.DOUBLE, - "test_query", - "test_device", - 0); - - long[] timestamps = new long[] {1, 2, 3}; - double[] values = new double[] {10.0, 20.0, 30.0}; - org.apache.tsfile.block.column.Column timeColumn = - new org.apache.tsfile.read.common.block.column.LongColumn(3, java.util.Optional.empty(), timestamps); - org.apache.tsfile.block.column.Column valueColumn = - new org.apache.tsfile.read.common.block.column.DoubleColumn(3, java.util.Optional.empty(), values); - - try { - list.putColumn(timeColumn, valueColumn); - assertEquals(3, list.size()); - } catch (IOException e) { - fail(e.toString()); - } + + @Test + public void testLongColumnAsTimeColumn() { + tvList = ElasticSerializableTVList.construct(TSDataType.DOUBLE, "test_query", 1024 * 1024, 100); + + long[] timestamps = new long[] {1, 2, 3}; + double[] values = new double[] {10.0, 20.0, 30.0}; + + org.apache.tsfile.read.common.block.column.TimeColumn timeColumn = + new org.apache.tsfile.read.common.block.column.TimeColumn(3, timestamps); + org.apache.tsfile.read.common.block.column.DoubleColumn valueColumn = + new org.apache.tsfile.read.common.block.column.DoubleColumn( + 3, java.util.Optional.empty(), values); + + try { + tvList.putColumn(timeColumn, valueColumn); + assertEquals(3, tvList.size()); + } catch (IOException e) { + fail(e.toString()); } + } }