[1/6] impala git commit: IMPALA-6405: Error when string to decimal cast overflows
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 HechtTested-by: Impala Public Jenkins Reviewed-on: http://gerrit.cloudera.org:8080/9530 Reviewed-by: Taras Bobrovytsky 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 Authored: Wed Jan 17 20:32:11 2018 -0800 Committer: Lars Volker Committed: Mon Mar 12 23:28:52 2018 + -- 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(123 as decimal(38, 0)) as timestamp); TYPES TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP,
impala git commit: IMPALA-6405: Error when string to decimal cast overflows
Repository: impala Updated Branches: refs/heads/master 5f2f445e7 -> b0027575c 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. We also add a warning if there is an underflow. 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 HechtTested-by: Impala Public Jenkins Project: http://git-wip-us.apache.org/repos/asf/impala/repo Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/b0027575 Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/b0027575 Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/b0027575 Branch: refs/heads/master Commit: b0027575cbce7002ff867750e955ff3ecd3b1bcd Parents: 5f2f445 Author: Taras Bobrovytsky Authored: Wed Jan 17 20:32:11 2018 -0800 Committer: Impala Public Jenkins Committed: Tue Mar 6 03:29:47 2018 + -- be/src/exprs/decimal-operators-ir.cc| 26 +++ be/src/exprs/expr-test.cc | 3 +- .../rewrite/RemoveRedundantStringCast.java | 3 +- .../queries/QueryTest/decimal-exprs.test| 33 tests/query_test/test_decimal_casting.py| 7 + 5 files changed, 57 insertions(+), 15 deletions(-) -- http://git-wip-us.apache.org/repos/asf/impala/blob/b0027575/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/b0027575/be/src/exprs/expr-test.cc -- diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc index 71f91c8..0b9a2e1 100644 --- a/be/src/exprs/expr-test.cc +++ b/be/src/exprs/expr-test.cc @@ -7973,8 +7973,7 @@ TEST_F(ExprTest, DecimalOverflowCastsDecimalV2) { TestError("cast(9.9 as decimal(29, 1))"); // Tests converting a non-trivial empty string to a decimal (IMPALA-1566). - TestIsNull("cast(regexp_replace('','a','b') as decimal(15,2))", - ColumnType::CreateDecimalType(15,2)); + TestError("cast(regexp_replace('','a','b') as decimal(15,2))"); executor_->PopExecOption(); } http://git-wip-us.apache.org/repos/asf/impala/blob/b0027575/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() &&