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));
+ }
}