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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new d84ab1a16b3 Refactor number conversion methods to use SQLUtils for 
improved accuracy (#37241)
d84ab1a16b3 is described below

commit d84ab1a16b37d96abd07e7d41a67d6040b117576
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Dec 1 19:30:53 2025 +0800

    Refactor number conversion methods to use SQLUtils for improved accuracy 
(#37241)
    
    * Refactor number conversion methods to use SQLUtils for improved accuracy
    
    * Refactor number conversion methods to use SQLUtils for improved accuracy
    
    * Refactor number conversion methods to use SQLUtils for improved accuracy
---
 .../sql/parser/statement/core/util/SQLUtils.java   | 35 +++++++++++++++-------
 .../value/literal/impl/NumberLiteralValue.java     | 14 ++-------
 2 files changed, 26 insertions(+), 23 deletions(-)

diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java
index db3d53939e9..aec0a9ba813 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java
@@ -57,6 +57,14 @@ public final class SQLUtils {
     
     private static final String EXCLUDED_CHARACTERS = "[]'\"";
     
+    private static final BigInteger INTEGER_MIN = 
BigInteger.valueOf(Integer.MIN_VALUE);
+    
+    private static final BigInteger INTEGER_MAX = 
BigInteger.valueOf(Integer.MAX_VALUE);
+    
+    private static final BigInteger LONG_MIN = 
BigInteger.valueOf(Long.MIN_VALUE);
+    
+    private static final BigInteger LONG_MAX = 
BigInteger.valueOf(Long.MAX_VALUE);
+    
     /**
      * Get exactly number value and type.
      *
@@ -66,21 +74,26 @@ public final class SQLUtils {
      */
     public static Number getExactlyNumber(final String value, final int radix) 
{
         try {
-            return getBigInteger(value, radix);
+            return getExactlyNumber(new BigInteger(value, radix));
         } catch (final NumberFormatException ex) {
             return new BigDecimal(value);
         }
     }
     
-    private static Number getBigInteger(final String value, final int radix) {
-        BigInteger result = new BigInteger(value, radix);
-        if (result.compareTo(new 
BigInteger(String.valueOf(Integer.MIN_VALUE))) >= 0 && result.compareTo(new 
BigInteger(String.valueOf(Integer.MAX_VALUE))) <= 0) {
-            return result.intValue();
+    /**
+     * Get exactly number.
+     *
+     * @param value to be converted value
+     * @return converted value
+     */
+    public static Number getExactlyNumber(final BigInteger value) {
+        if (value.compareTo(INTEGER_MIN) >= 0 && value.compareTo(INTEGER_MAX) 
<= 0) {
+            return value.intValue();
         }
-        if (result.compareTo(new BigInteger(String.valueOf(Long.MIN_VALUE))) 
>= 0 && result.compareTo(new BigInteger(String.valueOf(Long.MAX_VALUE))) <= 0) {
-            return result.longValue();
+        if (value.compareTo(LONG_MIN) >= 0 && value.compareTo(LONG_MAX) <= 0) {
+            return value.longValue();
         }
-        return result;
+        return value;
     }
     
     /**
@@ -246,10 +259,10 @@ public final class SQLUtils {
     /**
      * Create literal expression.
      *
-     * @param astNode    AST node
+     * @param astNode AST node
      * @param startIndex start index
-     * @param stopIndex  stop index
-     * @param text       text
+     * @param stopIndex stop index
+     * @param text text
      * @return literal expression segment
      */
     public static ExpressionSegment createLiteralExpression(final ASTNode 
astNode, final int startIndex, final int stopIndex, final String text) {
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/literal/impl/NumberLiteralValue.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/literal/impl/NumberLiteralValue.java
index 45e0de35a3d..9fb3b48567a 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/literal/impl/NumberLiteralValue.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/literal/impl/NumberLiteralValue.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl;
 
 import lombok.Getter;
+import org.apache.shardingsphere.sql.parser.statement.core.util.SQLUtils;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.literal.LiteralValue;
 
 import java.math.BigDecimal;
@@ -37,21 +38,10 @@ public final class NumberLiteralValue implements 
LiteralValue<Number> {
     
     private Number getNumber(final String value) {
         try {
-            return getBigInteger(value);
+            return SQLUtils.getExactlyNumber(new BigInteger(value));
         } catch (final NumberFormatException ex) {
             // TODO make sure with double and float
             return new BigDecimal(value);
         }
     }
-    
-    private static Number getBigInteger(final String value) {
-        BigInteger result = new BigInteger(value);
-        if (result.compareTo(new 
BigInteger(String.valueOf(Integer.MIN_VALUE))) >= 0 && result.compareTo(new 
BigInteger(String.valueOf(Integer.MAX_VALUE))) <= 0) {
-            return result.intValue();
-        }
-        if (result.compareTo(new BigInteger(String.valueOf(Long.MIN_VALUE))) 
>= 0 && result.compareTo(new BigInteger(String.valueOf(Long.MAX_VALUE))) <= 0) {
-            return result.longValue();
-        }
-        return result;
-    }
 }

Reply via email to