Prasanth Jayachandran created HIVE-12735:
--------------------------------------------
Summary: Constant folding for WHEN/CASE expression does not set
return type correctly
Key: HIVE-12735
URL: https://issues.apache.org/jira/browse/HIVE-12735
Project: Hive
Issue Type: Bug
Components: Logical Optimizer
Affects Versions: 1.3.0, 2.0.0, 2.1.0
Reporter: Prasanth Jayachandran
Assignee: Prasanth Jayachandran
For the following query
{code}
SELECT IF ( ( (CASE WHEN bool0 THEN 1 WHEN NOT bool0 THEN 0 END) = (CASE WHEN
TRUE THEN 1 WHEN NOT TRUE THEN 0 END) ), key0, IF ( ( (CASE WHEN bool0 THEN 1
WHEN NOT bool0 THEN 0 END) = (CASE WHEN FALSE THEN 1 WHEN NOT FALSE THEN 0 END)
), key1, key2 ) ) FROM src_orc;
{code}
the expression gets constant folded to
{code}
if(CASE WHEN (bool0) THEN (true) WHEN ((not bool0)) THEN (false) END, key0,
if(CASE WHEN (bool0) THEN (false) WHEN ((not bool0)) THEN (true) END, key1,
key2)) (type: string)
{code}
however, the GenericUDFWhen and GenericUDFCase expression retain the original
return type (int) instead of the folded return type (boolean). This can cause
ClassCastException for the above query when vectorization is enabled.
Following is the exception
{code}
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating
if(CASE WHEN (bool0) THEN (true) WHEN ((not bool0)) THEN (false) END, key0,
if(CASE WHEN (bool0) THEN (false) WHEN ((not bool0)) THEN (true) END, key1,
key2))
at
org.apache.hadoop.hive.ql.exec.vector.VectorSelectOperator.process(VectorSelectOperator.java:126)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:852)
at
org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:114)
at
org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:168)
at
org.apache.hadoop.hive.ql.exec.vector.VectorMapOperator.process(VectorMapOperator.java:45)
... 18 more
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.BooleanWritable
cannot be cast to org.apache.hadoop.io.IntWritable
at
org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableIntObjectInspector.get(WritableIntObjectInspector.java:36)
at
org.apache.hadoop.hive.ql.exec.vector.udf.VectorUDFAdaptor.setOutputCol(VectorUDFAdaptor.java:262)
at
org.apache.hadoop.hive.ql.exec.vector.udf.VectorUDFAdaptor.setResult(VectorUDFAdaptor.java:210)
at
org.apache.hadoop.hive.ql.exec.vector.udf.VectorUDFAdaptor.evaluate(VectorUDFAdaptor.java:140)
at
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression.evaluateChildren(VectorExpression.java:121)
at
org.apache.hadoop.hive.ql.exec.vector.expressions.IfExprStringGroupColumnStringGroupColumn.evaluate(IfExprStringGroupColumnStringGroupColumn.java:54)
at
org.apache.hadoop.hive.ql.exec.vector.VectorSelectOperator.process(VectorSelectOperator.java:123)
... 22 more
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)