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