@@ -290,7 +290,7 @@ protected T _deserializeFromString(JsonParser p, DeserializationContext ctxt)
290290 if (inst .canCreateFromLong ()) {
291291 if (ctxt .findCoercionAction (LogicalType .Integer , Long .class ,
292292 CoercionInputShape .String ) == CoercionAction .TryConvert ) {
293- return (T ) inst .createFromLong (ctxt , _parseLongPrimitive (ctxt , value ));
293+ return (T ) inst .createFromLong (ctxt , _parseLongPrimitive (p , ctxt , value ));
294294 }
295295 }
296296 if (inst .canCreateFromBoolean ()) {
@@ -773,12 +773,39 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
773773 _verifyNullForPrimitiveCoercion (ctxt , text );
774774 return 0 ;
775775 }
776- return _parseIntPrimitive (ctxt , text );
776+ return _parseIntPrimitive (p , ctxt , text );
777+ }
778+
779+ /**
780+ * @since 2.20
781+ */
782+ protected int _parseIntPrimitive (JsonParser p , DeserializationContext ctxt ,
783+ String text ) throws IOException
784+ {
785+ try {
786+ if (text .length () > 9 ) {
787+ p .streamReadConstraints ().validateIntegerLength (text .length ());
788+ long l = NumberInput .parseLong (text );
789+ if (_intOverflow (l )) {
790+ Number v = (Number ) ctxt .handleWeirdStringValue (Integer .TYPE , text ,
791+ "Overflow: numeric value (%s) out of range of int (%d -%d)" ,
792+ text , Integer .MIN_VALUE , Integer .MAX_VALUE );
793+ return _nonNullNumber (v ).intValue ();
794+ }
795+ return (int ) l ;
796+ }
797+ return NumberInput .parseInt (text );
798+ } catch (IllegalArgumentException iae ) {
799+ Number v = (Number ) ctxt .handleWeirdStringValue (Integer .TYPE , text ,
800+ "not a valid `int` value" );
801+ return _nonNullNumber (v ).intValue ();
802+ }
777803 }
778804
779805 /**
780806 * @since 2.9
781807 */
808+ @ Deprecated // since 2.20, use method variant that takes JsonParser
782809 protected final int _parseIntPrimitive (DeserializationContext ctxt , String text ) throws IOException
783810 {
784811 try {
@@ -851,12 +878,37 @@ protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt,
851878 if (_checkTextualNull (ctxt , text )) {
852879 return (Integer ) getNullValue (ctxt );
853880 }
854- return _parseInteger (ctxt , text );
881+ return _parseInteger (p , ctxt , text );
882+ }
883+
884+ /**
885+ * @since 2.20
886+ */
887+ protected Integer _parseInteger (JsonParser p , DeserializationContext ctxt ,
888+ String text ) throws IOException
889+ {
890+ try {
891+ if (text .length () > 9 ) {
892+ p .streamReadConstraints ().validateIntegerLength (text .length ());
893+ long l = NumberInput .parseLong (text );
894+ if (_intOverflow (l )) {
895+ return (Integer ) ctxt .handleWeirdStringValue (Integer .class , text ,
896+ "Overflow: numeric value (%s) out of range of `java.lang.Integer` (%d -%d)" ,
897+ text , Integer .MIN_VALUE , Integer .MAX_VALUE );
898+ }
899+ return Integer .valueOf ((int ) l );
900+ }
901+ return NumberInput .parseInt (text );
902+ } catch (IllegalArgumentException iae ) {
903+ return (Integer ) ctxt .handleWeirdStringValue (Integer .class , text ,
904+ "not a valid `java.lang.Integer` value" );
905+ }
855906 }
856907
857908 /**
858909 * @since 2.14
859910 */
911+ @ Deprecated // since 2.20, use method variant that takes JsonParser
860912 protected final Integer _parseInteger (DeserializationContext ctxt , String text ) throws IOException
861913 {
862914 try {
@@ -936,12 +988,30 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
936988 _verifyNullForPrimitiveCoercion (ctxt , text );
937989 return 0L ;
938990 }
939- return _parseLongPrimitive (ctxt , text );
991+ return _parseLongPrimitive (p , ctxt , text );
992+ }
993+
994+ /**
995+ * @since 2.20
996+ */
997+ protected long _parseLongPrimitive (JsonParser p , DeserializationContext ctxt ,
998+ String text ) throws IOException
999+ {
1000+ p .streamReadConstraints ().validateIntegerLength (text .length ());
1001+ try {
1002+ return NumberInput .parseLong (text );
1003+ } catch (IllegalArgumentException iae ) { }
1004+ {
1005+ Number v = (Number ) ctxt .handleWeirdStringValue (Long .TYPE , text ,
1006+ "not a valid `long` value" );
1007+ return _nonNullNumber (v ).longValue ();
1008+ }
9401009 }
9411010
9421011 /**
9431012 * @since 2.9
9441013 */
1014+ @ Deprecated // since 2.20, use method variant that takes JsonParser
9451015 protected final long _parseLongPrimitive (DeserializationContext ctxt , String text ) throws IOException
9461016 {
9471017 _streamReadConstraints (ctxt ).validateIntegerLength (text .length ());
@@ -1006,12 +1076,27 @@ protected final Long _parseLong(JsonParser p, DeserializationContext ctxt,
10061076 return (Long ) getNullValue (ctxt );
10071077 }
10081078 // let's allow Strings to be converted too
1009- return _parseLong (ctxt , text );
1079+ return _parseLong (p , ctxt , text );
1080+ }
1081+
1082+ /**
1083+ * @since 2.20
1084+ */
1085+ protected Long _parseLong (JsonParser p , DeserializationContext ctxt ,
1086+ String text ) throws IOException
1087+ {
1088+ p .streamReadConstraints ().validateIntegerLength (text .length ());
1089+ try {
1090+ return NumberInput .parseLong (text );
1091+ } catch (IllegalArgumentException iae ) { }
1092+ return (Long ) ctxt .handleWeirdStringValue (Long .class , text ,
1093+ "not a valid `java.lang.Long` value" );
10101094 }
10111095
10121096 /**
10131097 * @since 2.14
10141098 */
1099+ @ Deprecated // since 2.20, use method variant that takes JsonParser
10151100 protected final Long _parseLong (DeserializationContext ctxt , String text ) throws IOException
10161101 {
10171102 _streamReadConstraints (ctxt ).validateIntegerLength (text .length ());
0 commit comments