Skip to content

Commit 854f1dc

Browse files
authored
Fix NPE when encoding continous nulls in Tablets (#16107)
1 parent e5f8a19 commit 854f1dc

File tree

2 files changed

+98
-161
lines changed

2 files changed

+98
-161
lines changed

integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionCompressedIT.java

Lines changed: 74 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.iotdb.rpc.StatementExecutionException;
2828
import org.apache.iotdb.session.TableSessionBuilder;
2929

30+
import org.apache.tsfile.enums.ColumnCategory;
3031
import org.apache.tsfile.enums.TSDataType;
3132
import org.apache.tsfile.file.metadata.enums.CompressionType;
3233
import org.apache.tsfile.file.metadata.enums.TSEncoding;
@@ -43,16 +44,13 @@
4344

4445
import java.time.LocalDate;
4546
import java.util.ArrayList;
47+
import java.util.Arrays;
4648
import java.util.List;
4749
import java.util.stream.Collectors;
4850

4951
public class IoTDBSessionCompressedIT {
5052

51-
private static ITableSession session1;
52-
private static ITableSession session2;
53-
private static ITableSession session3;
54-
private static ITableSession session4;
55-
private static ITableSession session5;
53+
private static List<ITableSession> sessions;
5654

5755
@BeforeClass
5856
public static void setUpClass() throws IoTDBConnectionException {
@@ -62,8 +60,7 @@ public static void setUpClass() throws IoTDBConnectionException {
6260
EnvFactory.getEnv().getDataNodeWrapperList().stream()
6361
.map(DataNodeWrapper::getIpAndPortString)
6462
.collect(Collectors.toList());
65-
// List<String> nodeUrls = Collections.singletonList("127.0.0.1:6667");
66-
session1 =
63+
ITableSession session1 =
6764
new TableSessionBuilder()
6865
.nodeUrls(nodeUrls)
6966
.username(CommonDescriptor.getInstance().getConfig().getAdminName())
@@ -83,7 +80,7 @@ public static void setUpClass() throws IoTDBConnectionException {
8380
.withDateEncoding(TSEncoding.PLAIN)
8481
.withTimeStampEncoding(TSEncoding.PLAIN)
8582
.build();
86-
session2 =
83+
ITableSession session2 =
8784
new TableSessionBuilder()
8885
.nodeUrls(nodeUrls)
8986
.username(CommonDescriptor.getInstance().getConfig().getAdminName())
@@ -103,7 +100,7 @@ public static void setUpClass() throws IoTDBConnectionException {
103100
.withDateEncoding(TSEncoding.PLAIN)
104101
.withTimeStampEncoding(TSEncoding.SPRINTZ)
105102
.build();
106-
session3 =
103+
ITableSession session3 =
107104
new TableSessionBuilder()
108105
.nodeUrls(nodeUrls)
109106
.username(CommonDescriptor.getInstance().getConfig().getAdminName())
@@ -123,7 +120,7 @@ public static void setUpClass() throws IoTDBConnectionException {
123120
.withDateEncoding(TSEncoding.RLE)
124121
.withTimeStampEncoding(TSEncoding.RLE)
125122
.build();
126-
session4 =
123+
ITableSession session4 =
127124
new TableSessionBuilder()
128125
.nodeUrls(nodeUrls)
129126
.username(CommonDescriptor.getInstance().getConfig().getAdminName())
@@ -143,7 +140,7 @@ public static void setUpClass() throws IoTDBConnectionException {
143140
.withDateEncoding(TSEncoding.RLE)
144141
.withTimeStampEncoding(TSEncoding.ZIGZAG)
145142
.build();
146-
session5 =
143+
ITableSession session5 =
147144
new TableSessionBuilder()
148145
.nodeUrls(nodeUrls)
149146
.username(CommonDescriptor.getInstance().getConfig().getAdminName())
@@ -153,26 +150,55 @@ public static void setUpClass() throws IoTDBConnectionException {
153150
.enableAutoFetch(false)
154151
.enableCompaction(false)
155152
.build();
153+
sessions = Arrays.asList(session1, session2, session3, session4, session5);
156154
}
157155

158156
@AfterClass
159157
public static void tearDownClass() throws IoTDBConnectionException {
160-
if (session1 != null) {
161-
session1.close();
158+
for (ITableSession session : sessions) {
159+
session.close();
162160
}
163-
if (session2 != null) {
164-
session2.close();
161+
EnvFactory.getEnv().cleanClusterEnvironment();
162+
}
163+
164+
@Test
165+
public void testAllNullColumn() throws IoTDBConnectionException, StatementExecutionException {
166+
Tablet tablet =
167+
new Tablet(
168+
"t1",
169+
Arrays.asList("tag1", "attr1", "s1"),
170+
Arrays.asList(TSDataType.STRING, TSDataType.STRING, TSDataType.DATE),
171+
Arrays.asList(ColumnCategory.TAG, ColumnCategory.ATTRIBUTE, ColumnCategory.FIELD),
172+
100);
173+
for (int i = 0; i < 10; i++) {
174+
tablet.addTimestamp(i, i);
175+
tablet.addValue("tag1", i, "d1");
176+
tablet.addValue("attr1", i, "blue");
165177
}
166-
if (session3 != null) {
167-
session3.close();
178+
for (ITableSession session : sessions) {
179+
session.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS test");
180+
session.executeNonQueryStatement("USE test");
181+
session.insert(tablet);
168182
}
169-
if (session4 != null) {
170-
session4.close();
183+
}
184+
185+
@Test
186+
public void testAllNull() throws IoTDBConnectionException, StatementExecutionException {
187+
Tablet tablet =
188+
new Tablet(
189+
"t1",
190+
Arrays.asList("tag1", "attr1", "s1"),
191+
Arrays.asList(TSDataType.STRING, TSDataType.STRING, TSDataType.DATE),
192+
Arrays.asList(ColumnCategory.TAG, ColumnCategory.ATTRIBUTE, ColumnCategory.FIELD),
193+
100);
194+
for (int i = 0; i < 10; i++) {
195+
tablet.addTimestamp(i, i);
171196
}
172-
if (session5 != null) {
173-
session5.close();
197+
for (ITableSession session : sessions) {
198+
session.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS test");
199+
session.executeNonQueryStatement("USE test");
200+
session.insert(tablet);
174201
}
175-
EnvFactory.getEnv().cleanClusterEnvironment();
176202
}
177203

178204
@Test
@@ -273,91 +299,36 @@ public void testRpcCompressed() throws IoTDBConnectionException, StatementExecut
273299
String tableName = "table_13";
274300
Tablet tablet = new Tablet(tableName, schemas, timestamp, values, partBitMap, 4);
275301

276-
session1.executeNonQueryStatement("create database IF NOT EXISTS dbTest_0");
277-
session1.executeNonQueryStatement("use dbTest_0");
278-
session2.executeNonQueryStatement("use dbTest_0");
279-
session3.executeNonQueryStatement("use dbTest_0");
280-
session4.executeNonQueryStatement("use dbTest_0");
281-
session5.executeNonQueryStatement("use dbTest_0");
302+
sessions.get(0).executeNonQueryStatement("create database IF NOT EXISTS dbTest_0");
303+
for (ITableSession session : sessions) {
304+
session.executeNonQueryStatement("use dbTest_0");
305+
}
282306

283307
// 1. insert
284-
session1.insert(tablet);
285-
session2.insert(tablet);
286-
session3.insert(tablet);
287-
session4.insert(tablet);
288-
session5.insert(tablet);
308+
for (ITableSession session : sessions) {
309+
session.insert(tablet);
310+
}
289311

290312
// 2. assert
291-
SessionDataSet sessionDataSet1 =
292-
session1.executeQueryStatement("select * from dbTest_0." + tableName);
293-
SessionDataSet sessionDataSet2 =
294-
session2.executeQueryStatement("select * from dbTest_0." + tableName);
295-
SessionDataSet sessionDataSet3 =
296-
session3.executeQueryStatement("select * from dbTest_0." + tableName);
297-
SessionDataSet sessionDataSet4 =
298-
session4.executeQueryStatement("select * from dbTest_0." + tableName);
299-
SessionDataSet sessionDataSet5 =
300-
session5.executeQueryStatement("select * from dbTest_0." + tableName);
301-
302-
if (sessionDataSet1.hasNext()) {
303-
RowRecord next = sessionDataSet1.next();
304-
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
305-
Assert.assertEquals(1, next.getFields().get(1).getIntV());
306-
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
307-
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
308-
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
309-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
310-
Assert.assertEquals(true, next.getFields().get(6).getBoolV());
311-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
312-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
313-
}
314-
if (sessionDataSet2.hasNext()) {
315-
RowRecord next = sessionDataSet2.next();
316-
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
317-
Assert.assertEquals(1, next.getFields().get(1).getIntV());
318-
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
319-
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
320-
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
321-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
322-
Assert.assertEquals(true, next.getFields().get(6).getBoolV());
323-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
324-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
325-
}
326-
if (sessionDataSet3.hasNext()) {
327-
RowRecord next = sessionDataSet3.next();
328-
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
329-
Assert.assertEquals(1, next.getFields().get(1).getIntV());
330-
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
331-
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
332-
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
333-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
334-
Assert.assertEquals(true, next.getFields().get(6).getBoolV());
335-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
336-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
337-
}
338-
if (sessionDataSet4.hasNext()) {
339-
RowRecord next = sessionDataSet4.next();
340-
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
341-
Assert.assertEquals(1, next.getFields().get(1).getIntV());
342-
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
343-
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
344-
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
345-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
346-
Assert.assertEquals(true, next.getFields().get(6).getBoolV());
347-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
348-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
349-
}
350-
if (sessionDataSet5.hasNext()) {
351-
RowRecord next = sessionDataSet5.next();
352-
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
353-
Assert.assertEquals(1, next.getFields().get(1).getIntV());
354-
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
355-
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
356-
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
357-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
358-
Assert.assertEquals(true, next.getFields().get(6).getBoolV());
359-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
360-
Assert.assertEquals(new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
313+
for (ITableSession session : sessions) {
314+
try (SessionDataSet sessionDataSet =
315+
session.executeQueryStatement("select * from dbTest_0." + tableName)) {
316+
if (sessionDataSet.hasNext()) {
317+
RowRecord next = sessionDataSet.next();
318+
Assert.assertEquals(3L, next.getFields().get(0).getLongV());
319+
Assert.assertEquals(1, next.getFields().get(1).getIntV());
320+
Assert.assertEquals(1L, next.getFields().get(2).getLongV());
321+
Assert.assertEquals(1.1f, next.getFields().get(3).getFloatV(), 0.01);
322+
Assert.assertEquals(0.707, next.getFields().get(4).getDoubleV(), 0.01);
323+
Assert.assertEquals(
324+
new Binary(new byte[] {(byte) 32}), next.getFields().get(5).getBinaryV());
325+
Assert.assertTrue(next.getFields().get(6).getBoolV());
326+
Assert.assertEquals(
327+
new Binary(new byte[] {(byte) 32}), next.getFields().get(7).getBinaryV());
328+
Assert.assertEquals(
329+
new Binary(new byte[] {(byte) 32}), next.getFields().get(8).getBinaryV());
330+
}
331+
}
361332
}
362333
}
363334
}

0 commit comments

Comments
 (0)