You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by am...@apache.org on 2018/05/11 22:07:43 UTC
[drill] 04/04: DRILL-6401: Precision for decimal data types may be
lost for the case when cast with literal is used
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 <vv...@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
amansinha@apache.org.