Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
-
ghx-label-7
Description
ExprRewriter enter infinite loop when run following query with nested Case statement:
select case case '' when 'abc' then t4.string_col end when 'none' then 'Total' end as fcol from functional.alltypes as t4 limit 1;
jstack shows Impala enter infinite loop in ExprRewriter functions:
"Thread-16" #39 prio=5 os_prio=0 tid=0x000000000e188000 nid=0x90ec8 runnable [0x00007fa8b3d23000] java.lang.Thread.State: RUNNABLE at org.apache.impala.service.FeSupport.NativeEvalExprsWithoutRow(Native Method) at org.apache.impala.service.FeSupport.EvalExprsWithoutRowBounded(FeSupport.java:261) at org.apache.impala.service.FeSupport.EvalExprWithoutRowBounded(FeSupport.java:205) at org.apache.impala.analysis.LiteralExpr.createBounded(LiteralExpr.java:214) at org.apache.impala.rewrite.FoldConstantsRule.apply(FoldConstantsRule.java:68) at org.apache.impala.rewrite.ExprRewriter.applyRuleBottomUp(ExprRewriter.java:85) at org.apache.impala.rewrite.ExprRewriter.applyRuleRepeatedly(ExprRewriter.java:71) at org.apache.impala.rewrite.ExprRewriter.rewrite(ExprRewriter.java:55) at org.apache.impala.rewrite.SimplifyConditionalsRule.simplifyCaseExpr(SimplifyConditionalsRule.java:240) at org.apache.impala.rewrite.SimplifyConditionalsRule.apply(SimplifyConditionalsRule.java:71) at org.apache.impala.rewrite.ExprRewriter.applyRuleBottomUp(ExprRewriter.java:85) at org.apache.impala.rewrite.ExprRewriter.applyRuleRepeatedly(ExprRewriter.java:71) at org.apache.impala.rewrite.ExprRewriter.rewrite(ExprRewriter.java:55) at org.apache.impala.analysis.SelectList.rewriteExprs(SelectList.java:100) at org.apache.impala.analysis.SelectStmt.rewriteExprs(SelectStmt.java:1517) at org.apache.impala.analysis.AnalysisContext.analyze(AnalysisContext.java:585) at org.apache.impala.analysis.AnalysisContext.analyzeAndAuthorize(AnalysisContext.java:492) at org.apache.impala.service.Frontend.doCreateExecRequest(Frontend.java:2397) at org.apache.impala.service.Frontend.getTExecRequest(Frontend.java:2144) at org.apache.impala.service.Frontend.createExecRequest(Frontend.java:1913) at org.apache.impala.service.JniFrontend.createExecRequest(JniFrontend.java:169)
The issue does not happen if a matching value is found for the inner 'case' statement, or adding 'else' for the inner 'case' statement.