You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2018/12/04 07:07:10 UTC
[2/4] calcite git commit: [CALCITE-2684] RexBuilder gives
AssertionError when creating integer literal larger than 2^63 (Ruben Quesada
Lopez)
[CALCITE-2684] RexBuilder gives AssertionError when creating integer literal larger than 2^63 (Ruben Quesada Lopez)
Close apache/calcite#928
For [CALCITE-2701]:
Close apache/calcite#935
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/0ad68c31
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/0ad68c31
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/0ad68c31
Branch: refs/heads/master
Commit: 0ad68c3194c7bca24dfd21302418636730274312
Parents: dfb29f7
Author: rubenada <ru...@gmail.com>
Authored: Mon Nov 19 16:46:02 2018 +0100
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Dec 3 19:16:15 2018 -0800
----------------------------------------------------------------------
.../java/org/apache/calcite/rex/RexBuilder.java | 12 +++++++---
.../org/apache/calcite/rex/RexBuilderTest.java | 24 ++++++++++++++++++++
2 files changed, 33 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/0ad68c31/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
index d346ec7..696b63b 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -78,6 +78,14 @@ public class RexBuilder {
public static final SqlSpecialOperator GET_OPERATOR =
new SqlSpecialOperator("_get", SqlKind.OTHER_FUNCTION);
+ /** The smallest valid {@code int} value, as a {@link BigDecimal}. */
+ private static final BigDecimal INT_MIN =
+ BigDecimal.valueOf(Integer.MIN_VALUE);
+
+ /** The largest valid {@code int} value, as a {@link BigDecimal}. */
+ private static final BigDecimal INT_MAX =
+ BigDecimal.valueOf(Integer.MAX_VALUE);
+
//~ Instance fields --------------------------------------------------------
protected final RelDataTypeFactory typeFactory;
@@ -928,12 +936,10 @@ public class RexBuilder {
public RexLiteral makeExactLiteral(BigDecimal bd) {
RelDataType relType;
int scale = bd.scale();
- long l = bd.unscaledValue().longValue();
assert scale >= 0;
assert scale <= typeFactory.getTypeSystem().getMaxNumericScale() : scale;
- assert BigDecimal.valueOf(l, scale).equals(bd);
if (scale == 0) {
- if ((l >= Integer.MIN_VALUE) && (l <= Integer.MAX_VALUE)) {
+ if (bd.compareTo(INT_MIN) >= 0 && bd.compareTo(INT_MAX) <= 0) {
relType = typeFactory.createSqlType(SqlTypeName.INTEGER);
} else {
relType = typeFactory.createSqlType(SqlTypeName.BIGINT);
http://git-wip-us.apache.org/repos/asf/calcite/blob/0ad68c31/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java b/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
index 1445e95..7475044 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
@@ -32,6 +32,7 @@ import org.apache.calcite.util.Util;
import org.junit.Test;
+import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;
import java.util.TimeZone;
@@ -539,6 +540,29 @@ public class RexBuilderTest {
assertEquals("_UTF8'foobar'", literal.toString());
}
+ /** Tests {@link RexBuilder#makeExactLiteral(java.math.BigDecimal)}. */
+ @Test public void testBigDecimalLiteral() {
+ final RelDataTypeFactory typeFactory =
+ new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
+ final RexBuilder builder = new RexBuilder(typeFactory);
+ checkBigDecimalLiteral(builder, "25");
+ checkBigDecimalLiteral(builder, "9.9");
+ checkBigDecimalLiteral(builder, "0");
+ checkBigDecimalLiteral(builder, "-75.5");
+ checkBigDecimalLiteral(builder, "10000000");
+ checkBigDecimalLiteral(builder, "100000.111111111111111111");
+ checkBigDecimalLiteral(builder, "-100000.111111111111111111");
+ checkBigDecimalLiteral(builder, "73786976294838206464"); // 2^66
+ checkBigDecimalLiteral(builder, "-73786976294838206464");
+ }
+
+ private void checkBigDecimalLiteral(RexBuilder builder, String val) {
+ final RexLiteral literal = builder.makeExactLiteral(new BigDecimal(val));
+ assertThat("builder.makeExactLiteral(new BigDecimal(" + val
+ + ")).getValueAs(BigDecimal.class).toString()",
+ literal.getValueAs(BigDecimal.class).toString(), is(val));
+ }
+
}
// End RexBuilderTest.java