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] [Work logged] (PIG-5328) expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid
Date Thu, 25 Jan 2018 17:22:00 GMT

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