This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch rc/1.3.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rc/1.3.3 by this push:
new 3d949e17077 Pipe: Fixed the NPE in TsFileInsertionScanDataContainer
when there are null values in parts of the alignedChunkData (#13306) (#13314)
3d949e17077 is described below
commit 3d949e17077c6f613b866b8b4377f088eb55be72
Author: Caideyipi <[email protected]>
AuthorDate: Tue Aug 27 17:15:02 2024 +0800
Pipe: Fixed the NPE in TsFileInsertionScanDataContainer when there are null
values in parts of the alignedChunkData (#13306) (#13314)
---
.../scan/TsFileInsertionScanDataContainer.java | 10 ++++--
.../event/TsFileInsertionDataContainerTest.java | 37 ++++++++++++++++++++++
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/container/scan/TsFileInsertionScanDataContainer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/container/scan/TsFileInsertionScanDataContainer.java
index 61206afe0ea..699e16e000f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/container/scan/TsFileInsertionScanDataContainer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/container/scan/TsFileInsertionScanDataContainer.java
@@ -42,6 +42,7 @@ import org.apache.tsfile.read.reader.IChunkReader;
import org.apache.tsfile.read.reader.chunk.AlignedChunkReader;
import org.apache.tsfile.read.reader.chunk.ChunkReader;
import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.utils.BitMap;
import org.apache.tsfile.utils.DateUtils;
import org.apache.tsfile.utils.TsPrimitiveType;
import org.apache.tsfile.write.UnSupportedDataTypeException;
@@ -185,7 +186,7 @@ public class TsFileInsertionScanDataContainer extends
TsFileInsertionDataContain
final int rowIndex = tablet.rowSize;
tablet.addTimestamp(rowIndex, data.currentTime());
- putValueToColumns(data, tablet.values, rowIndex);
+ putValueToColumns(data, tablet.values, tablet.bitMaps, rowIndex);
tablet.rowSize++;
}
@@ -229,11 +230,16 @@ public class TsFileInsertionScanDataContainer extends
TsFileInsertionDataContain
} while (!data.hasCurrent());
}
- private void putValueToColumns(final BatchData data, final Object[] columns,
final int rowIndex) {
+ private void putValueToColumns(
+ final BatchData data, final Object[] columns, final BitMap[] bitMaps,
final int rowIndex) {
final TSDataType type = data.getDataType();
if (type == TSDataType.VECTOR) {
for (int i = 0; i < columns.length; ++i) {
final TsPrimitiveType primitiveType = data.getVector()[i];
+ if (Objects.isNull(primitiveType)) {
+ bitMaps[i].mark(rowIndex);
+ continue;
+ }
switch (primitiveType.getDataType()) {
case BOOLEAN:
((boolean[]) columns[i])[rowIndex] = primitiveType.getBoolean();
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/event/TsFileInsertionDataContainerTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/event/TsFileInsertionDataContainerTest.java
index 8e6ecbd80b7..da49f31cdad 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/event/TsFileInsertionDataContainerTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/event/TsFileInsertionDataContainerTest.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.db.pipe.event;
+import org.apache.iotdb.commons.exception.IllegalPathException;
+import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.pipe.pattern.IoTDBPipePattern;
import org.apache.iotdb.commons.pipe.pattern.PipePattern;
import org.apache.iotdb.commons.pipe.pattern.PrefixPipePattern;
@@ -31,6 +33,8 @@ import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
import org.apache.iotdb.pipe.api.access.Row;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.write.WriteProcessException;
import org.apache.tsfile.file.metadata.PlainDeviceID;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
@@ -39,6 +43,9 @@ import org.apache.tsfile.read.common.Path;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.utils.Pair;
import org.apache.tsfile.utils.TsFileGeneratorUtils;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.MeasurementSchema;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
@@ -47,8 +54,10 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@@ -101,6 +110,9 @@ public class TsFileInsertionDataContainerTest {
// Test empty chunk
testMixedTsFileWithEmptyChunk(isQuery);
+ // Test partial null value
+ testPartialNullValue(isQuery);
+
// Test the combinations of pipe and tsFile settings
final Set<Integer> deviceNumbers = new HashSet<>();
deviceNumbers.add(1);
@@ -508,6 +520,31 @@ public class TsFileInsertionDataContainerTest {
resource = null;
}
+ private void testPartialNullValue(final boolean isQuery)
+ throws IOException, WriteProcessException, IllegalPathException {
+ alignedTsFile = new File("0-0-2-0.tsfile");
+
+ final List<MeasurementSchema> schemaList = new ArrayList<>();
+ schemaList.add(new MeasurementSchema("s1", TSDataType.INT32));
+ schemaList.add(new MeasurementSchema("s2", TSDataType.INT64));
+
+ final Tablet t = new Tablet("root.sg.d", schemaList, 1024);
+ t.rowSize = 2;
+ t.addTimestamp(0, 1000);
+ t.addTimestamp(1, 2000);
+ t.addValue("s1", 0, 2);
+ t.addValue("s2", 0, null);
+ t.addValue("s1", 1, null);
+ t.addValue("s2", 1, 2L);
+
+ try (final TsFileWriter writer = new TsFileWriter(alignedTsFile)) {
+ writer.registerAlignedTimeseries(new PartialPath("root.sg.d"),
schemaList);
+ writer.writeAligned(t);
+ }
+ testTsFilePointNum(
+ alignedTsFile, new PrefixPipePattern("root"), Long.MIN_VALUE,
Long.MAX_VALUE, isQuery, 2);
+ }
+
private void testTsFilePointNum(
final File tsFile,
final PipePattern pattern,