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.