[
https://issues.apache.org/jira/browse/PIG-5328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16331038#comment-16331038
]
Michael Howard commented on PIG-5328:
-------------------------------------
> Let us know if you need help in preparing a patch.
I may well need some help ... will be my first time submitting a patch in many
years.
Will advise if I get stuck.
> 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
> 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)