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;
- }
}