You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@olingo.apache.org by "Alexandre Boudnik (JIRA)" <ji...@apache.org> on 2015/10/02 22:56:32 UTC

[jira] [Resolved] (OLINGO-788) Numbers having more than 17 digits in mantissa can't be parsed

     [ https://issues.apache.org/jira/browse/OLINGO-788?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alexandre Boudnik resolved OLINGO-788.
--------------------------------------
    Resolution: Fixed

relaxed patterns in EdmDouble and EdmSingle. Same changes have been made for one of my customers and deployed in production for about 6 months already.

> Numbers having more than 17 digits in mantissa can't be parsed
> --------------------------------------------------------------
>
>                 Key: OLINGO-788
>                 URL: https://issues.apache.org/jira/browse/OLINGO-788
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata4-commons
>    Affects Versions: (Java) V4 4.0.0-beta-03, (Java) V4 4.0.0
>         Environment: any OS
>            Reporter: Alexandre Boudnik
>            Assignee: Alexandre Boudnik
>            Priority: Critical
>              Labels: easyfix
>             Fix For: (Java) V4 4.1.0
>
>         Attachments: OLINGO-788.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> The regex in {{lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDouble.java}} is too strict and thus it prevents parsing numbers having move than 17 digits before or after decimal point even they are just denormalized and have less then 17 meaningful digits, like 0.000001234567890123456 or 1234567890123456000000.0
> Take in mind that http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/abnf/odata-abnf-construction-rules.txt does not contain the following definitions (no limitations there):
> {code}
> decimalValue = [SIGN] 1*DIGIT ["." 1*DIGIT]
> doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits)
> singleValue = doubleValue                                       ; IEEE 754 binary32 floating-point number (6-9 decimal digits)
> nanInfinity = 'NaN' / '-INF' / 'INF'
> {code}
> As I understand, regex in {{EdmDouble}} is used to prevent exception when the literal get parsed by {{new BigDecimal(String)}}. In not normalized literals zeroes may surround the significant digits. The maximum number of those can’t exceed 17 (9 for {{EdmSingle}}), and decimal point symbol could be either within the sequence of them or not. It makes impossible to perform format check using one regex.
> If number of significant digits in literal will exceed the capacity of {{double}} it would be checked by comparing of parsed {{BigDecimal}} and {{double}} value extracted from it. Same is for {{float}}.
> For formal point of view we do not have need to restrict literals by normalized decimal values, and thus regex for {{EdmDouble}} and {{EdmSingle}} should be relaxed.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)