This is an automated email from the ASF dual-hosted git repository. amansinha pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/drill.git
commit 16659ab30fd9fca5af39edd22aaab36409a50930 Author: Volodymyr Vysotskyi <vvo...@gmail.com> AuthorDate: Thu May 10 17:06:28 2018 +0300 DRILL-6401: Precision for decimal data types may be lost for the case when cast with literal is used close apache/drill#1254 --- .../apache/drill/exec/planner/logical/DrillOptiq.java | 4 +++- .../drill/exec/store/parquet/ParquetFilterBuilder.java | 4 +++- .../apache/drill/common/expression/ValueExpressions.java | 16 ++++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java index fd791dd..2cd6068 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java @@ -550,7 +550,9 @@ public class DrillOptiq { literal.getType().getScale(), literal.getType().getPrecision())); } - return ValueExpressions.getVarDecimal((BigDecimal) literal.getValue()); + return ValueExpressions.getVarDecimal((BigDecimal) literal.getValue(), + literal.getType().getPrecision(), + literal.getType().getScale()); } double dbl = ((BigDecimal) literal.getValue()).doubleValue(); logger.warn("Converting exact decimal into approximate decimal.\n" + diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetFilterBuilder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetFilterBuilder.java index 52c4723..e55425e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetFilterBuilder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetFilterBuilder.java @@ -181,7 +181,9 @@ public class ParquetFilterBuilder extends AbstractExprVisitor<LogicalExpression, VarDecimalHolder decimalHolder = (VarDecimalHolder) holder; return ValueExpressions.getVarDecimal( DecimalUtility.getBigDecimalFromDrillBuf(decimalHolder.buffer, - decimalHolder.start, decimalHolder.end - decimalHolder.start, decimalHolder.scale)); + decimalHolder.start, decimalHolder.end - decimalHolder.start, decimalHolder.scale), + decimalHolder.precision, + decimalHolder.scale); case DATE: return ValueExpressions.getDate(((DateHolder) holder).value); case TIMESTAMP: diff --git a/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java b/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java index 29e9c05..2ef809a 100644 --- a/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java +++ b/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java @@ -110,8 +110,8 @@ public class ValueExpressions { return new Decimal38Expression(i, ExpressionPosition.UNKNOWN); } - public static LogicalExpression getVarDecimal(BigDecimal i) { - return new VarDecimalExpression(i, ExpressionPosition.UNKNOWN); + public static LogicalExpression getVarDecimal(BigDecimal input, int precision, int scale) { + return new VarDecimalExpression(input, precision, scale, ExpressionPosition.UNKNOWN); } public static LogicalExpression getNumericExpression(String sign, String s, ExpressionPosition ep) { @@ -403,11 +403,15 @@ public class ValueExpressions { public static class VarDecimalExpression extends LogicalExpressionBase { - private BigDecimal bigDecimal; + private final BigDecimal bigDecimal; + private final int precision; + private final int scale; - public VarDecimalExpression(BigDecimal input, ExpressionPosition pos) { + public VarDecimalExpression(BigDecimal input, int precision, int scale, ExpressionPosition pos) { super(pos); this.bigDecimal = input; + this.precision = precision; + this.scale = scale; } public BigDecimal getBigDecimal() { @@ -419,8 +423,8 @@ public class ValueExpressions { return MajorType .newBuilder() .setMinorType(MinorType.VARDECIMAL) - .setScale(bigDecimal.scale()) - .setPrecision(bigDecimal.precision()) + .setScale(scale) + .setPrecision(precision) .setMode(DataMode.REQUIRED) .build(); } -- To stop receiving notification emails like this one, please contact amansi...@apache.org.