Jackie-Jiang commented on code in PR #18940:
URL: https://github.com/apache/pinot/pull/18940#discussion_r3547187082


##########
pinot-spi/src/main/java/org/apache/pinot/spi/utils/PinotDataType.java:
##########
@@ -834,12 +834,22 @@ public Long toInternal(Object value) {
   STRING {
     @Override
     public int toInt(Object value) {
-      return Integer.parseInt(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Integer.parseInt(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).intValue();
+      }

Review Comment:
   Valid concern — the `BigDecimal` fallback would silently wrap on overflow 
instead of throwing (e.g. `"2147483648"` / `"9223372036854775808"`). Rather 
than add range checks, I dropped the `PinotDataType` change entirely: 
`STRING`/`JSON` `toInt`/`toLong` stay strict and keep throwing, including on 
out-of-range values — a non-integer string cast to an integral type should 
throw, consistent with SQL semantics. The `dateTimeConvert` regression is now 
fixed at its source: string epoch inputs route through the pre-existing 
`DateTimeFormatSpec.fromFormatToMillis(String)` `BigDecimal` path, so this file 
is no longer part of the PR.



##########
pinot-spi/src/main/java/org/apache/pinot/spi/utils/PinotDataType.java:
##########
@@ -834,12 +834,22 @@ public Long toInternal(Object value) {
   STRING {
     @Override
     public int toInt(Object value) {
-      return Integer.parseInt(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Integer.parseInt(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).intValue();
+      }
     }
 
     @Override
     public long toLong(Object value) {
-      return Long.parseLong(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Long.parseLong(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).longValue();
+      }

Review Comment:
   Valid concern — the `BigDecimal` fallback would silently wrap on overflow 
instead of throwing (e.g. `"2147483648"` / `"9223372036854775808"`). Rather 
than add range checks, I dropped the `PinotDataType` change entirely: 
`STRING`/`JSON` `toInt`/`toLong` stay strict and keep throwing, including on 
out-of-range values — a non-integer string cast to an integral type should 
throw, consistent with SQL semantics. The `dateTimeConvert` regression is now 
fixed at its source: string epoch inputs route through the pre-existing 
`DateTimeFormatSpec.fromFormatToMillis(String)` `BigDecimal` path, so this file 
is no longer part of the PR.



##########
pinot-spi/src/main/java/org/apache/pinot/spi/utils/PinotDataType.java:
##########
@@ -894,12 +904,22 @@ public String convert(Object value, PinotDataType 
sourceType) {
   JSON {
     @Override
     public int toInt(Object value) {
-      return Integer.parseInt(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Integer.parseInt(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).intValue();
+      }

Review Comment:
   Valid concern — the `BigDecimal` fallback would silently wrap on overflow 
instead of throwing (e.g. `"2147483648"` / `"9223372036854775808"`). Rather 
than add range checks, I dropped the `PinotDataType` change entirely: 
`STRING`/`JSON` `toInt`/`toLong` stay strict and keep throwing, including on 
out-of-range values — a non-integer string cast to an integral type should 
throw, consistent with SQL semantics. The `dateTimeConvert` regression is now 
fixed at its source: string epoch inputs route through the pre-existing 
`DateTimeFormatSpec.fromFormatToMillis(String)` `BigDecimal` path, so this file 
is no longer part of the PR.



##########
pinot-spi/src/main/java/org/apache/pinot/spi/utils/PinotDataType.java:
##########
@@ -894,12 +904,22 @@ public String convert(Object value, PinotDataType 
sourceType) {
   JSON {
     @Override
     public int toInt(Object value) {
-      return Integer.parseInt(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Integer.parseInt(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).intValue();
+      }
     }
 
     @Override
     public long toLong(Object value) {
-      return Long.parseLong(value.toString().trim());
+      String trimmedStr = value.toString().trim();
+      try {
+        return Long.parseLong(trimmedStr);
+      } catch (NumberFormatException e) {
+        return new BigDecimal(trimmedStr).longValue();
+      }

Review Comment:
   Valid concern — the `BigDecimal` fallback would silently wrap on overflow 
instead of throwing (e.g. `"2147483648"` / `"9223372036854775808"`). Rather 
than add range checks, I dropped the `PinotDataType` change entirely: 
`STRING`/`JSON` `toInt`/`toLong` stay strict and keep throwing, including on 
out-of-range values — a non-integer string cast to an integral type should 
throw, consistent with SQL semantics. The `dateTimeConvert` regression is now 
fixed at its source: string epoch inputs route through the pre-existing 
`DateTimeFormatSpec.fromFormatToMillis(String)` `BigDecimal` path, so this file 
is no longer part of the PR.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to