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 2015/07/24 10:59:25 UTC
incubator-calcite git commit: [CALCITE-814] RexBuilder reverses
precision and scale of DECIMAL literal
Repository: incubator-calcite
Updated Branches:
refs/heads/master c818d50bb -> 67ea045ca
[CALCITE-814] RexBuilder reverses precision and scale of DECIMAL literal
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/67ea045c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/67ea045c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/67ea045c
Branch: refs/heads/master
Commit: 67ea045ca65083aed9feb803da8d467286c93800
Parents: c818d50
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Jul 24 00:45:50 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jul 24 01:28:44 2015 -0700
----------------------------------------------------------------------
.../java/org/apache/calcite/rex/RexBuilder.java | 5 +--
.../apache/calcite/test/RexTransformerTest.java | 41 ++++++++++++++++++--
2 files changed, 40 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/67ea045c/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 ce716c8..872ae7d 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -842,10 +842,9 @@ public class RexBuilder {
relType = typeFactory.createSqlType(SqlTypeName.BIGINT);
}
} else {
- int precision = bd.unscaledValue().toString().length();
+ int precision = bd.unscaledValue().abs().toString().length();
relType =
- typeFactory.createSqlType(
- SqlTypeName.DECIMAL, scale, precision);
+ typeFactory.createSqlType(SqlTypeName.DECIMAL, precision, scale);
}
return makeExactLiteral(bd, relType);
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/67ea045c/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java b/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
index 8f8f799..2242f9c 100644
--- a/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java
@@ -22,15 +22,21 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexTransformer;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.type.SqlTypeName;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import java.math.BigDecimal;
+
+import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -51,8 +57,7 @@ public class RexTransformerTest {
//~ Methods ----------------------------------------------------------------
- @Before
- public void setUp() {
+ @Before public void setUp() {
typeFactory = new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
rexBuilder = new RexBuilder(typeFactory);
boolRelDataType = typeFactory.createSqlType(SqlTypeName.BOOLEAN);
@@ -70,6 +75,13 @@ public class RexTransformerTest {
falseRex = rexBuilder.makeLiteral(false);
}
+ @After public void testDown() {
+ typeFactory = null;
+ rexBuilder = null;
+ boolRelDataType = null;
+ x = y = z = trueRex = falseRex = null;
+ }
+
void check(
Boolean encapsulateType,
RexNode node,
@@ -135,7 +147,7 @@ public class RexTransformerTest {
/**
* the or operator should pass through unchanged since e.g. x OR y should
* return true if x=null and y=true if it was transformed into something
- * like (x ISNOTNULL) AND (y ISNOTNULL) AND (x OR y) an incorrect result
+ * like (x IS NOT NULL) AND (y IS NOT NULL) AND (x OR y) an incorrect result
* could be produced
*/
@Test public void testOrUnchanged() {
@@ -317,6 +329,29 @@ public class RexTransformerTest {
and,
"AND(AND(AND(IS NOT NULL($0), IS NOT NULL($1)), =($0, $1)), AND(IS NOT NULL($2), >(false, $2)))");
}
+
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-814">[CALCITE-814]
+ * RexBuilder reverses precision and scale of DECIMAL literal</a>. */
+ @Test public void testExactLiteral() {
+ final RexLiteral literal =
+ rexBuilder.makeExactLiteral(new BigDecimal("-1234.56"));
+ assertThat(literal.getType().getFullTypeString(),
+ is("DECIMAL(6, 2) NOT NULL"));
+ assertThat(literal.getValue().toString(), is("-1234.56"));
+
+ final RexLiteral literal2 =
+ rexBuilder.makeExactLiteral(new BigDecimal("1234.56"));
+ assertThat(literal2.getType().getFullTypeString(),
+ is("DECIMAL(6, 2) NOT NULL"));
+ assertThat(literal2.getValue().toString(), is("1234.56"));
+
+ final RexLiteral literal3 =
+ rexBuilder.makeExactLiteral(new BigDecimal("0.0123456"));
+ assertThat(literal3.getType().getFullTypeString(),
+ is("DECIMAL(6, 7) NOT NULL"));
+ assertThat(literal3.getValue().toString(), is("0.0123456"));
+ }
}
// End RexTransformerTest.java