[ https://issues.apache.org/jira/browse/PIG-5328?focusedWorklogId=67992&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-67992 ]
Michael Howard logged work on PIG-5328: --------------------------------------- Author: Michael Howard Created on: 25/Jan/18 17:21 Start Date: 25/Jan/18 17:20 Worklog Time Spent: 2h Work Description: I don't contribute frequently, so most time was spent figuring out how to make the patch Issue Time Tracking ------------------- Worklog Id: (was: 67992) Time Spent: 2h Remaining Estimate: 0h (was: 0.25h) > 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 > Assignee: Michael Howard > Priority: Major > Attachments: patchPig5328-take01.patch > > Original Estimate: 0.25h > Time Spent: 2h > Remaining Estimate: 0h > > 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)