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