From 3edc9099bcd1b2e962c83575bbb38155b77b780e Mon Sep 17 00:00:00 2001 From: Thomas Tauber-Marshall Date: Mon, 6 Feb 2017 12:46:18 -0800 Subject: [PATCH] IMPALA-4849: IllegalStateException from rewritten CASE expr In SelectList.reset(), we call reset() on each select list item's expr. reset() is supposed to remove implicit casts, by returning the reset expr with implicit cast exprs removed from the tree. Previously SelectList.reset() ignored the return value of the calls to Expr.reset(), meaning that if the top-most expr of the select list item is an implicit cast, it won't actually get removed, which causes problems with analysis since implicit casts are always treated as pre-analyzed. The solution is to set the select list item's exprs to the return value of reset(). Testing: - Added a regression test to exprs.test Change-Id: I16ff88716b185e1d72d2bc603a42bd06c60ec18e Reviewed-on: http://gerrit.cloudera.org:8080/5917 Reviewed-by: Alex Behm Tested-by: Impala Public Jenkins --- .../org/apache/impala/analysis/SelectList.java | 2 +- .../functional-query/queries/QueryTest/exprs.test | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/fe/src/main/java/org/apache/impala/analysis/SelectList.java b/fe/src/main/java/org/apache/impala/analysis/SelectList.java index d7f12ff94..1e7780e3e 100644 --- a/fe/src/main/java/org/apache/impala/analysis/SelectList.java +++ b/fe/src/main/java/org/apache/impala/analysis/SelectList.java @@ -103,7 +103,7 @@ public class SelectList { public void reset() { for (SelectListItem item: items_) { - if (!item.isStar()) item.getExpr().reset(); + if (!item.isStar()) item.setExpr(item.getExpr().reset()); } } } diff --git a/testdata/workloads/functional-query/queries/QueryTest/exprs.test b/testdata/workloads/functional-query/queries/QueryTest/exprs.test index 3b2383eb9..d611884c1 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/exprs.test +++ b/testdata/workloads/functional-query/queries/QueryTest/exprs.test @@ -2692,3 +2692,18 @@ where id = case when false then 0 when 1 = 1 then 1 else 2 end ---- TYPES INT,TINYINT ==== +---- QUERY +# IMPALA-4849: verify that DISTINCT with a CASE that is rewritten analyzes correctly. +select distinct case when true then id else 0 end from functional.alltypestiny +---- RESULTS +0 +1 +2 +3 +4 +5 +6 +7 +---- TYPES +INT +==== \ No newline at end of file