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 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)