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

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


The following commit(s) were added to refs/heads/dev/1.1 by this push:
     new cfc88196 [to dev/1.1] Tablet.serialize() may throw an exception due to 
null values in the Date column (#330)
cfc88196 is described below

commit cfc8819619136acbb413ba1c8f549b3705fc682e
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 11 11:55:29 2024 +0800

    [to dev/1.1] Tablet.serialize() may throw an exception due to null values 
in the Date column (#330)
    
    * Tablet.serialize() may throw an exception due to null values in the Date 
column
    
    * fix ut
---
 .../java/org/apache/tsfile/utils/DateUtils.java    |  1 +
 .../org/apache/tsfile/write/record/Tablet.java     |  6 ++++-
 .../org/apache/tsfile/write/record/TabletTest.java | 26 ++++++++++++++++++++++
 3 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/java/tsfile/src/main/java/org/apache/tsfile/utils/DateUtils.java 
b/java/tsfile/src/main/java/org/apache/tsfile/utils/DateUtils.java
index 2254f26b..cfe575d1 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/utils/DateUtils.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/utils/DateUtils.java
@@ -28,6 +28,7 @@ import java.time.format.DateTimeParseException;
 
 public class DateUtils {
   private static final DateTimeFormatter DATE_FORMATTER = 
DateTimeFormatter.ofPattern("yyyy-MM-dd");
+  public static final int EMPTY_DATE_INT = 10000101;
 
   public static String formatDate(int date) {
     return date / 10000
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
index d88a4ab9..9bd8d88f 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
@@ -470,7 +470,11 @@ public class Tablet {
         case DATE:
           LocalDate[] dateValues = (LocalDate[]) column;
           for (int j = 0; j < rowSize; j++) {
-            
ReadWriteIOUtils.write(DateUtils.parseDateExpressionToInt(dateValues[j]), 
stream);
+            ReadWriteIOUtils.write(
+                dateValues[j] == null
+                    ? DateUtils.EMPTY_DATE_INT
+                    : DateUtils.parseDateExpressionToInt(dateValues[j]),
+                stream);
           }
           break;
         case INT64:
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/write/record/TabletTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/write/record/TabletTest.java
index 07412e8d..27193c49 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/write/record/TabletTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/write/record/TabletTest.java
@@ -24,9 +24,12 @@ import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.utils.BitMap;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 
+import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -107,4 +110,27 @@ public class TabletTest {
       fail();
     }
   }
+
+  @Test
+  public void testSerializeDateColumnWithNullValue() throws IOException {
+    final List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+    measurementSchemas.add(new MeasurementSchema("s1", TSDataType.DATE, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s2", TSDataType.DATE, 
TSEncoding.PLAIN));
+    Tablet tablet = new Tablet("root.testsg.d1", measurementSchemas);
+    tablet.addTimestamp(0, 0);
+    tablet.addValue("s1", 0, LocalDate.now());
+    tablet.addValue("s2", 0, null);
+    tablet.addTimestamp(1, 1);
+    tablet.addValue("s1", 1, null);
+    tablet.addValue("s2", 1, LocalDate.now());
+    tablet.rowSize = 2;
+    ByteBuffer serialized = tablet.serialize();
+    Tablet deserializeTablet = Tablet.deserialize(serialized);
+    Assert.assertEquals(
+        ((LocalDate[]) tablet.values[0])[0], ((LocalDate[]) 
deserializeTablet.values[0])[0]);
+    Assert.assertTrue(deserializeTablet.bitMaps[1].isMarked(0));
+    Assert.assertEquals(
+        ((LocalDate[]) tablet.values[1])[1], ((LocalDate[]) 
deserializeTablet.values[1])[1]);
+    Assert.assertTrue(deserializeTablet.bitMaps[0].isMarked(1));
+  }
 }

Reply via email to