pig-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Howard (JIRA)" <j...@apache.org>
Subject [jira] [Created] (PIG-5328) expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid
Date Wed, 17 Jan 2018 19:22:01 GMT
Michael Howard created PIG-5328:

             Summary: 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.17.0, 0.16.0
         Environment: pig source HEAD as of Jan 2017 ... prob goes all the way back to initial
implementation of BigDecimal support
            Reporter: Michael Howard

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

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

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

View raw message