[ 
https://issues.apache.org/jira/browse/PIG-5328?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Howard updated PIG-5328:
--------------------------------
    Environment: pig source HEAD as of Jan 2018 ... probably goes all the way 
back to initial implementation of BigDecimal support  (was: pig source HEAD as 
of Jan 2017 ... probably goes all the way back to initial implementation of 
BigDecimal support)

> expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid
> --------------------------------------------------------------------
>
>                 Key: PIG-5328
>                 URL: https://issues.apache.org/jira/browse/PIG-5328
>             Project: Pig
>          Issue Type: Bug
>          Components: impl
>    Affects Versions: 0.16.0, 0.17.0
>         Environment: pig source HEAD as of Jan 2018 ... probably goes all the 
> way back to initial implementation of BigDecimal support
>            Reporter: Michael Howard
>            Priority: Major
>   Original Estimate: 0.25h
>  Remaining Estimate: 0.25h
>
> Divide.equalsZero(DataType.BIGDECIMAL) is flawed in that it uses an invalid 
> test for == ZERO in the case of BigDecimal. 
>  
> ./physicalLayer/expressionOperators/Divide.java tests the divisor for zero in 
> order to avoid DivideByZero.
> The test is performed using a method equalsZero(...)
> Divide.equalsZero() is given 'protected' access, but I could not find other 
> references ... should be 'private'
> equalsZero() implementation dispatches on dataType to type-specific 
> predicates ... the BigDecimal implementation is incorrect 
> The method BigDecimal.equals(other) is intended to be used for object 
> equality, not numerical equality. (Their justification is that equals() is 
> used in hash-table lookups in java Collections.) BigDecimal numbers are not 
> normalized and scale is an important attribute. Scale is included in 
> BigDecimal.equals(). The values "0" and "0.00" have different scales and are 
> not considered "equals()"
> Comparisons for numeric equality need to be done using compareTo()
> In the special case of comparing to zero, BigDecimal.signum() is the best. 
> The current code is
> {{     case DataType.BIGDECIMAL:}}
> {{            return BigDecimal.ZERO.equals((BigDecimal) a);}}
> needs to be changed to
> {{     case DataType.BIGDECIMAL:}}
> {{            return ((BigDecimal) a).signum() == 0;}}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to