diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java index 61e50ff1fe..ede3475310 100644 --- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java +++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java @@ -1598,6 +1598,14 @@ public class DataTypeUtils { } public static boolean isIntegerTypeCompatible(final Object value) { + if (value instanceof Number) { + try { + Math.toIntExact(((Number) value).longValue()); + return true; + } catch (ArithmeticException ae) { + return false; + } + } return isNumberTypeCompatible(value, s -> isIntegral(s, Integer.MIN_VALUE, Integer.MAX_VALUE)); } diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java index c89e6562e2..a4936094bc 100644 --- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java +++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java @@ -429,6 +429,22 @@ public class TestDataTypeUtils { assertFalse(DataTypeUtils.isCompatibleDataType(new Long[]{1L, 2L}, dataType)); } + @Test + public void testIsCompatibleDataTypeInteger() { + final DataType dataType = RecordFieldType.INT.getDataType(); + assertTrue(DataTypeUtils.isCompatibleDataType(new Integer("1234567"), dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType("1234567", dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(new BigInteger("12345678901234567890"), dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(1234567890123456789L, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(1, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType((short) 1, dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType("12345678901234567890", dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(3.1f, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(3.0, dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType("1234567XYZ", dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(new Long[]{1L, 2L}, dataType)); + } + @Test public void testIsCompatibleDataTypeArrayDifferentElementTypes() { Object[] array = new Object[]{"2", 1};