Repository: impala
Updated Branches:
  refs/heads/2.x 0ba181e5b -> 6d3fdee3f


IMPALA-6405: Error when string to decimal cast overflows

Before this patch, when there was an error when converting a string to
a decimal, a NULL was returned. In this patch, we change this behavior
so that an error is returned if decimal_v2 is enabled.

The reasoning is that we want stricter behavior in decimal_v2.

Testing:
- Added some EE tests.
- Ran an exhaustive build, which passed.

Change-Id: Icffccac1c1c2361447ae4b0de9b6c2ec7de071db
Reviewed-on: http://gerrit.cloudera.org:8080/9339
Reviewed-by: Dan Hecht <dhe...@cloudera.com>
Tested-by: Impala Public Jenkins
Reviewed-on: http://gerrit.cloudera.org:8080/9530
Reviewed-by: Taras Bobrovytsky <tbobrovyt...@cloudera.com>


Project: http://git-wip-us.apache.org/repos/asf/impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/95d509fa
Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/95d509fa
Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/95d509fa

Branch: refs/heads/2.x
Commit: 95d509faeddaf2552d90530b9f111ed3adfebfda
Parents: 0ba181e
Author: Taras Bobrovytsky <tbobrovyt...@cloudera.com>
Authored: Wed Jan 17 20:32:11 2018 -0800
Committer: Lars Volker <l...@cloudera.com>
Committed: Mon Mar 12 23:28:52 2018 +0000

----------------------------------------------------------------------
 be/src/exprs/decimal-operators-ir.cc            | 26 +++++++++++----
 .../rewrite/RemoveRedundantStringCast.java      |  3 +-
 .../queries/QueryTest/decimal-exprs.test        | 33 ++++++++++++++++++++
 3 files changed, 55 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/impala/blob/95d509fa/be/src/exprs/decimal-operators-ir.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/decimal-operators-ir.cc 
b/be/src/exprs/decimal-operators-ir.cc
index fd0c404..0bde566 100644
--- a/be/src/exprs/decimal-operators-ir.cc
+++ b/be/src/exprs/decimal-operators-ir.cc
@@ -561,13 +561,27 @@ IR_ALWAYS_INLINE DecimalVal 
DecimalOperators::CastToDecimalVal(
       DCHECK(false);
       return DecimalVal::null();
   }
-  // Like all the cast functions, we return the truncated value on underflow 
and NULL
-  // on overflow.
-  // TODO: log warning on underflow.
-  if (result == StringParser::PARSE_SUCCESS || result == 
StringParser::PARSE_UNDERFLOW) {
-    return dv;
+
+  if (UNLIKELY(result == StringParser::PARSE_FAILURE)) {
+    if (is_decimal_v2) {
+      ctx->SetError("String to Decimal parse failed");
+    } else {
+      ctx->AddWarning("String to Decimal parse failed");
+    }
+    return DecimalVal::null();
+  }
+
+  if (UNLIKELY(result == StringParser::PARSE_OVERFLOW)) {
+    if (is_decimal_v2) {
+      ctx->SetError("String to Decimal cast overflowed");
+    } else {
+      ctx->AddWarning("String to Decimal cast overflowed");
+    }
+    return DecimalVal::null();
   }
-  return DecimalVal::null();
+
+  DCHECK(result == StringParser::PARSE_SUCCESS || 
StringParser::PARSE_UNDERFLOW);
+  return dv;
 }
 
 StringVal DecimalOperators::CastToStringVal(

http://git-wip-us.apache.org/repos/asf/impala/blob/95d509fa/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java 
b/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
index 40ab0fa..d305f27 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
@@ -82,7 +82,8 @@ public class RemoveRedundantStringCast implements 
ExprRewriteRule {
         analyzer.getQueryCtx());
     // Need to trim() while comparing char(n) types as conversion might add 
trailing
     // spaces to the 'resultOfReverseCast'.
-    if (!resultOfReverseCast.isNullLiteral() &&
+    if (resultOfReverseCast != null &&
+        !resultOfReverseCast.isNullLiteral() &&
         resultOfReverseCast.getStringValue().trim()
             .equals(literalExpr.getStringValue().trim())) {
       return new BinaryPredicate(op, castExprChild,

http://git-wip-us.apache.org/repos/asf/impala/blob/95d509fa/testdata/workloads/functional-query/queries/QueryTest/decimal-exprs.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-query/queries/QueryTest/decimal-exprs.test 
b/testdata/workloads/functional-query/queries/QueryTest/decimal-exprs.test
index be75c23..41441e5 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/decimal-exprs.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/decimal-exprs.test
@@ -454,3 +454,36 @@ cast(cast(12333333333 as decimal(38, 0)) as timestamp);
 ---- TYPES
 TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, 
TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP
 ====
+---- QUERY
+# IMPALA-6405: String to Decimal conversion errors
+set decimal_v2=false;
+select cast("abc" as decimal(5, 2));
+---- RESULTS
+NULL
+---- TYPES
+DECIMAL
+---- ERRORS
+UDF WARNING: String to Decimal parse failed
+====
+---- QUERY
+set decimal_v2=true;
+select cast("abc" as decimal(5, 2));
+---- CATCH
+UDF ERROR: String to Decimal parse failed
+====
+---- QUERY
+set decimal_v2=false;
+select cast("1234.5" as decimal(5, 2));
+---- RESULTS
+NULL
+---- TYPES
+DECIMAL
+---- ERRORS
+UDF WARNING: String to Decimal cast overflowed
+====
+---- QUERY
+set decimal_v2=true;
+select cast("1234.5" as decimal(5, 2));
+---- CATCH
+UDF ERROR: String to Decimal cast overflowed
+====

Reply via email to