Skip to content

Commit 4f4fd7b

Browse files
authored
[fix] fix get seatunnel row size npe issue (#6681)
1 parent 6296d0c commit 4f4fd7b

File tree

2 files changed

+68
-35
lines changed

2 files changed

+68
-35
lines changed

seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java

+26-20
Original file line numberDiff line numberDiff line change
@@ -171,29 +171,39 @@ private int getBytesForArray(Object v, BasicType<?> dataType) {
171171
case STRING:
172172
int s = 0;
173173
for (String i : ((String[]) v)) {
174-
s += i.length();
174+
s += i == null ? 0 : i.length();
175175
}
176176
return s;
177177
case BOOLEAN:
178-
return ((Boolean[]) v).length;
178+
return getArrayNotNullSize((Boolean[]) v);
179179
case TINYINT:
180-
return ((Byte[]) v).length;
180+
return getArrayNotNullSize((Byte[]) v);
181181
case SMALLINT:
182-
return ((Short[]) v).length * 2;
182+
return getArrayNotNullSize((Short[]) v) * 2;
183183
case INT:
184-
return ((Integer[]) v).length * 4;
184+
return getArrayNotNullSize((Integer[]) v) * 4;
185185
case FLOAT:
186-
return ((Float[]) v).length * 4;
186+
return getArrayNotNullSize((Float[]) v) * 4;
187187
case BIGINT:
188-
return ((Long[]) v).length * 8;
188+
return getArrayNotNullSize((Long[]) v) * 8;
189189
case DOUBLE:
190-
return ((Double[]) v).length * 8;
190+
return getArrayNotNullSize((Double[]) v) * 8;
191191
case NULL:
192192
default:
193193
return 0;
194194
}
195195
}
196196

197+
private int getArrayNotNullSize(Object[] values) {
198+
int c = 0;
199+
for (Object value : values) {
200+
if (value != null) {
201+
c++;
202+
}
203+
}
204+
return c;
205+
}
206+
197207
public int getBytesSize() {
198208
if (size == 0) {
199209
int s = 0;
@@ -235,25 +245,21 @@ private int getBytesForValue(Object v) {
235245
case "LocalDateTime":
236246
return 48;
237247
case "String[]":
238-
int s = 0;
239-
for (String i : ((String[]) v)) {
240-
s += i.length();
241-
}
242-
return s;
248+
return getBytesForArray(v, BasicType.STRING_TYPE);
243249
case "Boolean[]":
244-
return ((Boolean[]) v).length;
250+
return getBytesForArray(v, BasicType.BOOLEAN_TYPE);
245251
case "Byte[]":
246-
return ((Byte[]) v).length;
252+
return getBytesForArray(v, BasicType.BYTE_TYPE);
247253
case "Short[]":
248-
return ((Short[]) v).length * 2;
254+
return getBytesForArray(v, BasicType.SHORT_TYPE);
249255
case "Integer[]":
250-
return ((Integer[]) v).length * 4;
256+
return getBytesForArray(v, BasicType.INT_TYPE);
251257
case "Long[]":
252-
return ((Long[]) v).length * 8;
258+
return getBytesForArray(v, BasicType.LONG_TYPE);
253259
case "Float[]":
254-
return ((Float[]) v).length * 4;
260+
return getBytesForArray(v, BasicType.FLOAT_TYPE);
255261
case "Double[]":
256-
return ((Double[]) v).length * 8;
262+
return getBytesForArray(v, BasicType.DOUBLE_TYPE);
257263
case "HashMap":
258264
case "LinkedHashMap":
259265
int size = 0;

seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java

+42-15
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,40 @@ void testForRowSize() {
5151
1L,
5252
map,
5353
new BigDecimal("3333.333"),
54-
new String[] {"test2", "test", "3333.333"}
54+
new String[] {"test2", "test", "3333.333"},
55+
new Integer[] {1, 2, 3},
56+
new Long[] {1L, 2L, 3L},
57+
new Double[] {1D, 2D},
58+
new Float[] {1F, 2F},
59+
new Boolean[] {Boolean.TRUE, Boolean.FALSE},
60+
new Byte[] {1, 2, 3, 4},
61+
new Short[] {Short.parseShort("1")}
62+
});
63+
64+
SeaTunnelRow row2 =
65+
new SeaTunnelRow(
66+
new Object[] {
67+
1,
68+
"test",
69+
1L,
70+
map,
71+
new BigDecimal("3333.333"),
72+
new String[] {"test2", "test", "3333.333", null},
73+
new Integer[] {1, 2, 3, null},
74+
new Long[] {1L, 2L, 3L, null},
75+
new Double[] {1D, 2D, null},
76+
new Float[] {1F, 2F, null},
77+
new Boolean[] {Boolean.TRUE, Boolean.FALSE, null},
78+
new Byte[] {1, 2, 3, 4, null},
79+
new Short[] {Short.parseShort("1"), null}
5580
});
5681

5782
SeaTunnelRowType rowType =
5883
new SeaTunnelRowType(
59-
new String[] {"f0", "f1", "f2", "f3", "f4", "f5"},
84+
new String[] {
85+
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
86+
"f11", "f12"
87+
},
6088
new SeaTunnelDataType<?>[] {
6189
BasicType.INT_TYPE,
6290
BasicType.STRING_TYPE,
@@ -72,22 +100,21 @@ void testForRowSize() {
72100
new DecimalType(10, 3)
73101
})),
74102
new DecimalType(10, 3),
75-
ArrayType.STRING_ARRAY_TYPE
103+
ArrayType.STRING_ARRAY_TYPE,
104+
ArrayType.INT_ARRAY_TYPE,
105+
ArrayType.LONG_ARRAY_TYPE,
106+
ArrayType.DOUBLE_ARRAY_TYPE,
107+
ArrayType.FLOAT_ARRAY_TYPE,
108+
ArrayType.BOOLEAN_ARRAY_TYPE,
109+
ArrayType.BYTE_ARRAY_TYPE,
110+
ArrayType.SHORT_ARRAY_TYPE
76111
});
77112

78-
Assertions.assertEquals(181, row.getBytesSize(rowType));
113+
Assertions.assertEquals(249, row.getBytesSize(rowType));
114+
Assertions.assertEquals(249, row.getBytesSize());
79115

80-
SeaTunnelRow row2 =
81-
new SeaTunnelRow(
82-
new Object[] {
83-
1,
84-
"test",
85-
1L,
86-
map,
87-
new BigDecimal("3333.333"),
88-
new String[] {"test2", "test", "3333.333"}
89-
});
90-
Assertions.assertEquals(181, row2.getBytesSize());
116+
Assertions.assertEquals(249, row2.getBytesSize(rowType));
117+
Assertions.assertEquals(249, row2.getBytesSize());
91118
}
92119

93120
@Test

0 commit comments

Comments
 (0)