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

wanghailin pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new 4f4fd7b858 [fix] fix get seatunnel row size npe issue (#6681)
4f4fd7b858 is described below

commit 4f4fd7b85839fcf8bea3de2b4b60b4c7c83dd857
Author: Jarvis <[email protected]>
AuthorDate: Thu Apr 11 21:12:47 2024 +0800

    [fix] fix get seatunnel row size npe issue (#6681)
---
 .../seatunnel/api/table/type/SeaTunnelRow.java     | 46 +++++++++--------
 .../seatunnel/api/table/type/SeaTunnelRowTest.java | 57 ++++++++++++++++------
 2 files changed, 68 insertions(+), 35 deletions(-)

diff --git 
a/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java
 
b/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java
index 4e8fae514c..bb0e49e18f 100644
--- 
a/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java
+++ 
b/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java
@@ -171,29 +171,39 @@ public final class SeaTunnelRow implements Serializable {
             case STRING:
                 int s = 0;
                 for (String i : ((String[]) v)) {
-                    s += i.length();
+                    s += i == null ? 0 : i.length();
                 }
                 return s;
             case BOOLEAN:
-                return ((Boolean[]) v).length;
+                return getArrayNotNullSize((Boolean[]) v);
             case TINYINT:
-                return ((Byte[]) v).length;
+                return getArrayNotNullSize((Byte[]) v);
             case SMALLINT:
-                return ((Short[]) v).length * 2;
+                return getArrayNotNullSize((Short[]) v) * 2;
             case INT:
-                return ((Integer[]) v).length * 4;
+                return getArrayNotNullSize((Integer[]) v) * 4;
             case FLOAT:
-                return ((Float[]) v).length * 4;
+                return getArrayNotNullSize((Float[]) v) * 4;
             case BIGINT:
-                return ((Long[]) v).length * 8;
+                return getArrayNotNullSize((Long[]) v) * 8;
             case DOUBLE:
-                return ((Double[]) v).length * 8;
+                return getArrayNotNullSize((Double[]) v) * 8;
             case NULL:
             default:
                 return 0;
         }
     }
 
+    private int getArrayNotNullSize(Object[] values) {
+        int c = 0;
+        for (Object value : values) {
+            if (value != null) {
+                c++;
+            }
+        }
+        return c;
+    }
+
     public int getBytesSize() {
         if (size == 0) {
             int s = 0;
@@ -235,25 +245,21 @@ public final class SeaTunnelRow implements Serializable {
             case "LocalDateTime":
                 return 48;
             case "String[]":
-                int s = 0;
-                for (String i : ((String[]) v)) {
-                    s += i.length();
-                }
-                return s;
+                return getBytesForArray(v, BasicType.STRING_TYPE);
             case "Boolean[]":
-                return ((Boolean[]) v).length;
+                return getBytesForArray(v, BasicType.BOOLEAN_TYPE);
             case "Byte[]":
-                return ((Byte[]) v).length;
+                return getBytesForArray(v, BasicType.BYTE_TYPE);
             case "Short[]":
-                return ((Short[]) v).length * 2;
+                return getBytesForArray(v, BasicType.SHORT_TYPE);
             case "Integer[]":
-                return ((Integer[]) v).length * 4;
+                return getBytesForArray(v, BasicType.INT_TYPE);
             case "Long[]":
-                return ((Long[]) v).length * 8;
+                return getBytesForArray(v, BasicType.LONG_TYPE);
             case "Float[]":
-                return ((Float[]) v).length * 4;
+                return getBytesForArray(v, BasicType.FLOAT_TYPE);
             case "Double[]":
-                return ((Double[]) v).length * 8;
+                return getBytesForArray(v, BasicType.DOUBLE_TYPE);
             case "HashMap":
             case "LinkedHashMap":
                 int size = 0;
diff --git 
a/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
 
b/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
index d275625762..448185b8cb 100644
--- 
a/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
+++ 
b/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
@@ -51,12 +51,40 @@ public class SeaTunnelRowTest {
                             1L,
                             map,
                             new BigDecimal("3333.333"),
-                            new String[] {"test2", "test", "3333.333"}
+                            new String[] {"test2", "test", "3333.333"},
+                            new Integer[] {1, 2, 3},
+                            new Long[] {1L, 2L, 3L},
+                            new Double[] {1D, 2D},
+                            new Float[] {1F, 2F},
+                            new Boolean[] {Boolean.TRUE, Boolean.FALSE},
+                            new Byte[] {1, 2, 3, 4},
+                            new Short[] {Short.parseShort("1")}
+                        });
+
+        SeaTunnelRow row2 =
+                new SeaTunnelRow(
+                        new Object[] {
+                            1,
+                            "test",
+                            1L,
+                            map,
+                            new BigDecimal("3333.333"),
+                            new String[] {"test2", "test", "3333.333", null},
+                            new Integer[] {1, 2, 3, null},
+                            new Long[] {1L, 2L, 3L, null},
+                            new Double[] {1D, 2D, null},
+                            new Float[] {1F, 2F, null},
+                            new Boolean[] {Boolean.TRUE, Boolean.FALSE, null},
+                            new Byte[] {1, 2, 3, 4, null},
+                            new Short[] {Short.parseShort("1"), null}
                         });
 
         SeaTunnelRowType rowType =
                 new SeaTunnelRowType(
-                        new String[] {"f0", "f1", "f2", "f3", "f4", "f5"},
+                        new String[] {
+                            "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 
"f8", "f9", "f10",
+                            "f11", "f12"
+                        },
                         new SeaTunnelDataType<?>[] {
                             BasicType.INT_TYPE,
                             BasicType.STRING_TYPE,
@@ -72,22 +100,21 @@ public class SeaTunnelRowTest {
                                                 new DecimalType(10, 3)
                                             })),
                             new DecimalType(10, 3),
-                            ArrayType.STRING_ARRAY_TYPE
+                            ArrayType.STRING_ARRAY_TYPE,
+                            ArrayType.INT_ARRAY_TYPE,
+                            ArrayType.LONG_ARRAY_TYPE,
+                            ArrayType.DOUBLE_ARRAY_TYPE,
+                            ArrayType.FLOAT_ARRAY_TYPE,
+                            ArrayType.BOOLEAN_ARRAY_TYPE,
+                            ArrayType.BYTE_ARRAY_TYPE,
+                            ArrayType.SHORT_ARRAY_TYPE
                         });
 
-        Assertions.assertEquals(181, row.getBytesSize(rowType));
+        Assertions.assertEquals(249, row.getBytesSize(rowType));
+        Assertions.assertEquals(249, row.getBytesSize());
 
-        SeaTunnelRow row2 =
-                new SeaTunnelRow(
-                        new Object[] {
-                            1,
-                            "test",
-                            1L,
-                            map,
-                            new BigDecimal("3333.333"),
-                            new String[] {"test2", "test", "3333.333"}
-                        });
-        Assertions.assertEquals(181, row2.getBytesSize());
+        Assertions.assertEquals(249, row2.getBytesSize(rowType));
+        Assertions.assertEquals(249, row2.getBytesSize());
     }
 
     @Test

Reply via email to