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

jiangtian pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9ae9b270 Long.MAX_VALUE may cause npe in SingleDeviceTsBlockReader 
(#338)
9ae9b270 is described below

commit 9ae9b2703270aa7f20838cfe317f110a55715419
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 18 16:38:57 2024 +0800

    Long.MAX_VALUE may cause npe in SingleDeviceTsBlockReader (#338)
---
 .../reader/block/SingleDeviceTsBlockReader.java    |  8 +--
 .../apache/tsfile/read/query/ResultSetTest.java    | 71 ++++++++++++++++++++++
 2 files changed, 75 insertions(+), 4 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/block/SingleDeviceTsBlockReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/block/SingleDeviceTsBlockReader.java
index 6c7a43b6..6b6d2501 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/block/SingleDeviceTsBlockReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/block/SingleDeviceTsBlockReader.java
@@ -59,7 +59,7 @@ public class SingleDeviceTsBlockReader implements 
TsBlockReader {
   private final Map<String, MeasurementColumnContext> measureColumnContextMap;
   private final Map<String, IdColumnContext> idColumnContextMap;
 
-  private long nextTime;
+  private Long nextTime;
 
   public SingleDeviceTsBlockReader(
       DeviceQueryTask task,
@@ -142,7 +142,7 @@ public class SingleDeviceTsBlockReader implements 
TsBlockReader {
     }
 
     currentBlock.reset();
-    nextTime = Long.MAX_VALUE;
+    nextTime = null;
     List<MeasurementColumnContext> minTimeColumns = new ArrayList<>();
 
     while (currentBlock.getPositionCount() < blockSize) {
@@ -150,7 +150,7 @@ public class SingleDeviceTsBlockReader implements 
TsBlockReader {
       for (Entry<String, MeasurementColumnContext> entry : 
measureColumnContextMap.entrySet()) {
         final BatchData batchData = entry.getValue().currentBatch;
         final long currentTime = batchData.currentTime();
-        if (nextTime > currentTime) {
+        if (nextTime == null || nextTime > currentTime) {
           nextTime = currentTime;
           minTimeColumns.clear();
           minTimeColumns.add(entry.getValue());
@@ -161,7 +161,7 @@ public class SingleDeviceTsBlockReader implements 
TsBlockReader {
 
       try {
         fillMeasurements(minTimeColumns);
-        nextTime = Long.MAX_VALUE;
+        nextTime = null;
       } catch (IOException e) {
         LOGGER.error("Cannot fill measurements", e);
         return false;
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/read/query/ResultSetTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/read/query/ResultSetTest.java
index 6ab9dad1..8233a701 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/read/query/ResultSetTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/read/query/ResultSetTest.java
@@ -138,6 +138,77 @@ public class ResultSetTest {
     }
   }
 
+  @Test
+  public void testQueryWithMaxValue() throws Exception {
+    TableSchema tableSchema =
+        new TableSchema(
+            "t1",
+            Arrays.asList(
+                new MeasurementSchema("id1", TSDataType.STRING),
+                new MeasurementSchema("id2", TSDataType.STRING),
+                new MeasurementSchema("s1", TSDataType.BOOLEAN),
+                new MeasurementSchema("s2", TSDataType.BOOLEAN)),
+            Arrays.asList(
+                Tablet.ColumnCategory.ID,
+                Tablet.ColumnCategory.ID,
+                Tablet.ColumnCategory.MEASUREMENT,
+                Tablet.ColumnCategory.MEASUREMENT));
+    Tablet tablet =
+        new Tablet(
+            Arrays.asList("id1", "id2", "s1", "s2"),
+            Arrays.asList(
+                TSDataType.STRING, TSDataType.STRING, TSDataType.BOOLEAN, 
TSDataType.BOOLEAN),
+            1024);
+    tablet.addTimestamp(0, Long.MAX_VALUE - 1);
+    tablet.addValue("id1", 0, "id_field1");
+    tablet.addValue("id2", 0, "id_field2");
+    tablet.addValue("s1", 0, true);
+    tablet.addValue("s2", 0, false);
+
+    tablet.addTimestamp(1, Long.MAX_VALUE);
+    tablet.addValue("id1", 1, "id_field1");
+    tablet.addValue("id2", 1, "id_field2");
+    tablet.addValue("s1", 1, true);
+    tablet.addValue("s2", 1, false);
+    try (ITsFileWriter writer =
+        new 
TsFileWriterBuilder().file(tsfile).tableSchema(tableSchema).build()) {
+      writer.write(tablet);
+    }
+
+    try (DeviceTableModelReader tsFileReader = new 
DeviceTableModelReader(tsfile);
+        ResultSet resultSet =
+            tsFileReader.query(
+                "T1", Arrays.asList("id1", "id2", "S2", "S1"), 0, 
Long.MAX_VALUE); ) {
+      // id1 id2 s2 s1
+      ResultSetMetadata resultSetMetadata = resultSet.getMetadata();
+      // Time id1 id2 s2 s1
+      Assert.assertEquals("Time", resultSetMetadata.getColumnName(1));
+      Assert.assertEquals(TSDataType.INT64, 
resultSetMetadata.getColumnType(1));
+      Assert.assertEquals("id1", resultSetMetadata.getColumnName(2));
+      Assert.assertEquals(TSDataType.STRING, 
resultSetMetadata.getColumnType(2));
+      Assert.assertEquals("id2", resultSetMetadata.getColumnName(3));
+      Assert.assertEquals(TSDataType.STRING, 
resultSetMetadata.getColumnType(3));
+      Assert.assertEquals("S2", resultSetMetadata.getColumnName(4));
+      Assert.assertEquals(TSDataType.BOOLEAN, 
resultSetMetadata.getColumnType(4));
+      Assert.assertEquals("S1", resultSetMetadata.getColumnName(5));
+      Assert.assertEquals(TSDataType.BOOLEAN, 
resultSetMetadata.getColumnType(5));
+
+      Assert.assertTrue(resultSet.next());
+      Assert.assertEquals(Long.MAX_VALUE - 1, resultSet.getLong(1));
+      Assert.assertEquals("id_field1", resultSet.getString(2));
+      Assert.assertEquals("id_field2", resultSet.getString(3));
+      Assert.assertFalse(resultSet.getBoolean(4));
+      Assert.assertTrue(resultSet.getBoolean(5));
+
+      Assert.assertTrue(resultSet.next());
+      Assert.assertEquals(Long.MAX_VALUE, resultSet.getLong(1));
+      Assert.assertEquals("id_field1", resultSet.getString(2));
+      Assert.assertEquals("id_field2", resultSet.getString(3));
+      Assert.assertFalse(resultSet.getBoolean(4));
+      Assert.assertTrue(resultSet.getBoolean(5));
+    }
+  }
+
   @Test
   public void testQueryTableWithPartialNullValueInChunk() throws Exception {
     TableSchema tableSchema =

Reply via email to