[ 
https://issues.apache.org/jira/browse/HIVE-10313?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14500118#comment-14500118
 ] 

Chaoyu Tang commented on HIVE-10313:
------------------------------------

[~xuefuz] I ran into this problem in coding when I tried to do a conversion 
between decimals. For example, if I convert the value of ExprNodeConstantDesc 
parsed from a decimal 1111.22BD (typeinfo decimal(6,2)) to a decimal (10,4). I 
saw the ClassCastException error:
{code}
ERROR ql.Driver: FAILED: ClassCastException java.lang.String cannot be cast to 
org.apache.hadoop.hive.common.type.HiveDecimal
java.lang.ClassCastException: java.lang.String cannot be cast to 
org.apache.hadoop.hive.common.type.HiveDecimal
    at 
org.apache.hadoop.hive.serde2.objectinspector.primitive.JavaHiveDecimalObjectInspector.getPrimitiveJavaObject(JavaHiveDecimalObjectInspector.java:55)
    at 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.getHiveDecimal(PrimitiveObjectInspectorUtils.java:1001)
    at 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter$HiveDecimalConverter.convert(PrimitiveObjectInspectorConverter.java:349I
...
{code}
Tracing down to TypeCheckProcFactory.NumExprProcessor, I saw the 
ExprNodeConstantDesc was created with typeInfo (of decimal) but value is 
actually of type String. But as I understand the API 
ExprNodeConstantDesc(TypeInfo typeInfo, Object value), the typeInfo should 
reflect and interpret the type of value object.

> Literal Decimal ExprNodeConstantDesc should contain value of HiveDecimal 
> instead of String
> ------------------------------------------------------------------------------------------
>
>                 Key: HIVE-10313
>                 URL: https://issues.apache.org/jira/browse/HIVE-10313
>             Project: Hive
>          Issue Type: Bug
>          Components: Query Processor
>    Affects Versions: 1.0.0
>            Reporter: Chaoyu Tang
>            Assignee: Chaoyu Tang
>             Fix For: 1.2.0
>
>         Attachments: HIVE-10313.1.patch, HIVE-10313.patch
>
>
> In TyepCheckProcFactory.NumExprProcessor, the ExprNodeConstantDesc is created 
> from strVal:
> {code}
> else if (expr.getText().endsWith("BD")) {
>           // Literal decimal
>           String strVal = expr.getText().substring(0, expr.getText().length() 
> - 2);
>           HiveDecimal hd = HiveDecimal.create(strVal);
>           int prec = 1;
>           int scale = 0;
>           if (hd != null) {
>             prec = hd.precision();
>             scale = hd.scale();
>           }
>           DecimalTypeInfo typeInfo = TypeInfoFactory.getDecimalTypeInfo(prec, 
> scale);
>           return new ExprNodeConstantDesc(typeInfo, strVal);
>         } 
> {code}
> It should use HiveDecmal:
> return new ExprNodeConstantDesc(typeInfo, hd);



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to