I don't think maxLength is usable on anything but string and hexBinary.

For integers you can use maxInclusive or maxExclusive.
________________________________
From: Steve Lawrence <slawre...@apache.org>
Sent: Thursday, June 18, 2020 9:10 AM
To: users@daffodil.apache.org <users@daffodil.apache.org>
Subject: Re: java.lang.ArithmeticException: Overflow

Thanks for the contribution! I've taken a look and made a few comments
in the PR. I think the totalDigits logic is actually much more
complicated than I originally thought it would be.

Regarding the release, I'm not personally against a patch release, but
keep in mind that the Daffodil release process is fairly slow. We need
to start a DISCUSS thread on the dev mailing list which must remain open
for at least 72 hours and until discussions die down. We then must
create the release and start a VOTE thread on the dev list. The VOTE
takes a minimum of 72 hours. If that passes, we must then start a VOTE
on the incubator mailing list, which also takes a minimum of 72 hours,
but in my experience takes more like a week. And then the jars take
about a day or so to sync to maven repositories. So the whole process
generally takes about 2 weeks.

Depending on how soon you're trying to get a release out, it might make
sense to see if we can come up with an alternative to totalDigits.

Looking at the schema, to me it looks like the numeric1-10 and
numeric1-18 simple types that have this totalDigits issue are used for
fields that imply they are unsigned integer types rather than decimal
(e.g. NumberOfSegmentsInAMessage, NumberOfSecuritySegments,
LengthOfDataInOctetsOfBits). Is that the case? Are these fields allowed
to have decimal points? If not, rather than using an xs:decimal base you
could use an xs:unsignedInteger base and then use the maxLength
restriction rather than totalDigits. As far as I'm aware maxLength
doesn't have the same issue as totalDigits.

On 6/17/20 4:01 PM, Claude Mamo wrote:
> I gave it a go Steve and opened a PR: 
> https://github.com/apache/incubator-daffodil/pull/387. Assuming it's merged, 
> can we have patch release for this? We are preparing to release the EDI 
> cartridge for Smooks 2 (https://github.com/smooks/smooks-edi-cartridge) but 
> there are many places in our generated EDIFACT schemas with totalDigits > 9.
>
> Claude
>
> On 2020/06/09 11:41:20, Steve Lawrence <slawre...@apache.org> wrote:
>> Looks like total digits is just plain broken for anything greater than
>> or equal to 10, which is pretty bad. Looking at the code I *think* the
>> totalDigits check will always succeed if the value being validated is
>> negative, regardless of the number of digits.
>>
>> I've created DAFFODIL-2349 [1] to track this issue.
>>
>> If you (or anyone else) is interested in getting involved in Daffodil
>> development, this would be a good one to get your feet wet. The fix
>> should be pretty self-contained to one file/function.
>>
>> Unfortunately, I'm not sure if there's a good workaround using just
>> restrictions.
>>
>> Best I can come up with is have an inputValueCalc that strips out a
>> negative sign and decimal place, and then restrict that to a length of
>> 10, e.g.
>>
>>   <xs:element name="unscaled" dfdl:inputValueCalc="{
>>     fn:concat(
>>       fn:substring-before(xs:string(fn:abs(../value)), '.'),
>>       fn:substring-after(xs:string(../value), '.')
>>     )
>>   }">
>>   <xs:simpleType>
>>     <xs:restriction base="xs:string">
>>       <x:length value="10"/>
>>     </xs:restriction>
>>   </xs:simpleType>
>> </xs:element>
>>
>> That's pretty terrible though. Maybe someone else can come up with a
>> better workaround?
>>
>> [1] https://issues.apache.org/jira/browse/DAFFODIL-2349
>>
>>
>> On 6/9/20 2:29 AM, Claude Mamo wrote:
>>> Hello Daffodil team,
>>>
>>> Not sure if what I'm getting is expected behaviour. I have a facet defined 
>>> as follows:
>>>
>>> ```
>>>     <xsd:simpleType dfdl:textNumberPattern="#.#" name="numeric1-10">
>>>         <xsd:restriction base="xsd:decimal">
>>>             <xsd:totalDigits value="10"/>
>>>         </xsd:restriction>
>>>     </xsd:simpleType>
>>> ```
>>>
>>> When attempting to parse a file with full validation turned on, Daffodil 
>>> 2.6 throws an exception saying:
>>>
>>> ```
>>> org.apache.daffodil.exceptions.Abort:
>>> Invariant broken. Exception thrown with mark not returned: 
>>> java.lang.ArithmeticException: Overflow
>>> StackTrace:
>>> java.lang.ArithmeticException: Overflow
>>>         at java.math.BigDecimal.intValueExact(BigDecimal.java:3180)
>>>         at 
>>> org.apache.daffodil.processors.SimpleTypeRuntimeData.checkTotalDigits(RuntimeData.scala:526)
>>>         at 
>>> org.apache.daffodil.processors.SimpleTypeRuntimeData.$anonfun$executeFacetCheck$8(RuntimeData.scala:431)
>>>         at 
>>> org.apache.daffodil.processors.SimpleTypeRuntimeData.$anonfun$executeFacetCheck$8$adapted(RuntimeData.scala:427)
>>> ```
>>>
>>> Should I create a bug report? Any suitable alternatives to "totalDigits"?
>>>
>>> Claude
>>>
>>>
>>>
>>
>>

Reply via email to