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

Reply via email to