[
https://issues.apache.org/jira/browse/DRILL-6401?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16472739#comment-16472739
]
ASF GitHub Bot commented on DRILL-6401:
---------------------------------------
amansinha100 closed pull request #1254: DRILL-6401: Precision for decimal data
types may be lost for the caseā¦
URL: https://github.com/apache/drill/pull/1254
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
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 fd791dd7f3..2cd60688c5 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 LogicalExpression visitLiteral(RexLiteral literal) {
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 52c47230e0..e55425e948 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 @@ private LogicalExpression
getValueExpressionFromConst(ValueHolder holder, TypePr
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 29e9c05197..2ef809aaef 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 static LogicalExpression getDecimal38(BigDecimal i) {
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 MajorType getMajorType() {
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 MajorType getMajorType() {
return MajorType
.newBuilder()
.setMinorType(MinorType.VARDECIMAL)
- .setScale(bigDecimal.scale())
- .setPrecision(bigDecimal.precision())
+ .setScale(scale)
+ .setPrecision(precision)
.setMode(DataMode.REQUIRED)
.build();
}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Precision for decimal data types may be lost for the case when cast with
> literal is used
> ----------------------------------------------------------------------------------------
>
> Key: DRILL-6401
> URL: https://issues.apache.org/jira/browse/DRILL-6401
> Project: Apache Drill
> Issue Type: Bug
> Reporter: Volodymyr Vysotskyi
> Assignee: Volodymyr Vysotskyi
> Priority: Major
> Labels: ready-to-commit
> Fix For: 1.14.0
>
>
> For the case when cast with decimal literal is used and literal has less
> precision than specified in the casting type:
> {code:sql}
> SELECT cast('999.99' as decimal(9, 4)) decimal_9_4
> {code}
> the precision in column metadata is incorrect: 7, but should be 9.
> Test which has the similar check
> {{PreparedStatementTest.testQueryMetadataInPreparedStatement}} is failed when
> it is ran separately.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)