From 6a1e16ce3f830c43600e0b93141caeca21e785fd Mon Sep 17 00:00:00 2001 From: Jesus Camacho Rodriguez Date: Thu, 4 Aug 2016 10:38:59 +0100 Subject: [PATCH] [CALCITE-1344] Incorrect inferred precision when BigDecimal value is less than 1 --- .../java/org/apache/calcite/rex/RexBuilder.java | 11 +++++++++-- .../org/apache/calcite/test/RexTransformerTest.java | 13 +++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) 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 a062ba5d583a..73ef60d87f36 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java @@ -887,8 +887,15 @@ public RexLiteral makeExactLiteral(BigDecimal bd) { } } else { int precision = bd.unscaledValue().abs().toString().length(); - relType = - typeFactory.createSqlType(SqlTypeName.DECIMAL, precision, scale); + if (precision > scale) { + // bd is greater than or equal to 1 + relType = + typeFactory.createSqlType(SqlTypeName.DECIMAL, precision, scale); + } else { + // bd is less than 1 + relType = + typeFactory.createSqlType(SqlTypeName.DECIMAL, scale + 1, scale); + } } return makeExactLiteral(bd, relType); } 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 0f88f0c7e517..fce70c11b0ea 100644 --- a/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexTransformerTest.java @@ -319,7 +319,10 @@ private RexNode isTrue(RexNode node) { /** Test case for * [CALCITE-814] - * RexBuilder reverses precision and scale of DECIMAL literal. */ + * RexBuilder reverses precision and scale of DECIMAL literal + * and + * [CALCITE-1344] + * Incorrect inferred precision when BigDecimal value is less than 1. */ @Test public void testExactLiteral() { final RexLiteral literal = rexBuilder.makeExactLiteral(new BigDecimal("-1234.56")); @@ -336,8 +339,14 @@ private RexNode isTrue(RexNode node) { final RexLiteral literal3 = rexBuilder.makeExactLiteral(new BigDecimal("0.0123456")); assertThat(literal3.getType().getFullTypeString(), - is("DECIMAL(6, 7) NOT NULL")); + is("DECIMAL(8, 7) NOT NULL")); assertThat(literal3.getValue().toString(), is("0.0123456")); + + final RexLiteral literal4 = + rexBuilder.makeExactLiteral(new BigDecimal("0.01234560")); + assertThat(literal4.getType().getFullTypeString(), + is("DECIMAL(9, 8) NOT NULL")); + assertThat(literal4.getValue().toString(), is("0.01234560")); } /** Test case for