This is an automated email from the ASF dual-hosted git repository. joemcdonnell pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/impala.git
commit 5184a0891d4f81083066e260f3fce04ba85c31e0 Author: prozsa <[email protected]> AuthorDate: Fri May 5 14:34:08 2023 +0200 IMPALA-12042: Fix invalid casts in set operations calculation This patch adds an additional type check for every expression listed in set operations, avoiding invalid casts. For example: values (true), (123), (111.0) produced an invalid cast from BOOLEAN to DECIMAL(4,1), now, the additional check detects the incompatibility before creating the cast expressions. Test: - test case added to AnalyzeStmtsTest.java Change-Id: I02df42c67deda37b7f71db267dc761778a9caa2b Reviewed-on: http://gerrit.cloudera.org:8080/19790 Reviewed-by: Impala Public Jenkins <[email protected]> Tested-by: Impala Public Jenkins <[email protected]> --- fe/src/main/java/org/apache/impala/analysis/Analyzer.java | 4 ++++ fe/src/test/java/org/apache/impala/analysis/AnalyzeStmtsTest.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/fe/src/main/java/org/apache/impala/analysis/Analyzer.java b/fe/src/main/java/org/apache/impala/analysis/Analyzer.java index d99ad68fe..b8d537487 100644 --- a/fe/src/main/java/org/apache/impala/analysis/Analyzer.java +++ b/fe/src/main/java/org/apache/impala/analysis/Analyzer.java @@ -3313,6 +3313,10 @@ public class Analyzer { } // Now that we've found a compatible type, add implicit casts if necessary. for (int j = 0; j < exprLists.size(); ++j) { + // Checking compatibility with every expression + Type commonType = getCompatibleType(compatibleType, + widestExprs.get(i), exprLists.get(j).get(i)); + Preconditions.checkState(commonType.equals(compatibleType)); if (!exprLists.get(j).get(i).getType().equals(compatibleType)) { Expr castExpr = exprLists.get(j).get(i).castTo(compatibleType); exprLists.get(j).set(i, castExpr); diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeStmtsTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeStmtsTest.java index 4e5aaba8f..bc06cb19e 100644 --- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeStmtsTest.java +++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeStmtsTest.java @@ -3558,6 +3558,11 @@ public class AnalyzeStmtsTest extends AnalyzerTest { "Target table 'functional.alltypes' is incompatible with source expressions.\n" + "Expression ''a'' (type: STRING) is not compatible with column 'tinyint_col'" + " (type: TINYINT)"); + // Regression test for IMPALA-12042: Transitive compatibility is not + // allowed (boolean -> tinyint -> decimal(4,1)) + AnalysisError("values (true), (123), (111.0)", + "Incompatible return types 'DECIMAL(4,1)' and 'BOOLEAN'" + + " of exprs '111.0' and 'TRUE'"); } @Test
