[ http://issues.apache.org/jira/browse/DERBY1139?page=comments#action_12374318 ]
Matthias Ohlemeyer commented on DERBY1139:

Looking at the "MultiplicationProblem" above where a SQLException is thrown I think a minimal
requirement for DECIMAL arithmetic could be:
"If the exact value of an arithmetic calcuation does not fit into the result type (NUMERIC(x.,y)),
an Exception should be thrown."
This would at least make it possible to prevent false results either as presented to the user
or stored in the database; it would be especially necessary to apply this rule to the division
operator (see above).
It still does not make DECIMAL arithmetic any better on Derby though  I still think that
an overhaul to make it more intuitive and user friendly is urgently necessary.
> Division operator may give wrong results with NUMERIC operands
> 
>
> Key: DERBY1139
> URL: http://issues.apache.org/jira/browse/DERBY1139
> Project: Derby
> Type: Bug
> Components: SQL
> Versions: 10.1.2.1
> Reporter: Matthias Ohlemeyer
> Priority: Critical
>
> The division operator '/' may give wrong results when used with NUMRERIC operands.
> Example (copied from ij):
> CREATE TABLE t (d1 DOUBLE, d2 DOUBLE, n1 NUMERIC(31,11), n2
> NUMERIC(31,11));
> INSERT INTO t VALUES (1.5, 2.5, 1.5, 2.5);
> SELECT d1/d2, n1/n2, n1*(1.0/n2) FROM t;
> 1 2 3
> 
> 0.6 0 0.600000000000000000000000000000
> 1 row selected
> The result in column 2 should not be zero, but 0.6.
> It seems there is something wrong with the calculation of the scale. Hint from Satheesh
Bandaram:
> If you look at NumericTypeCompiler code, which calculates the scale and precision of
operation result type, the comments and the code doesn't seem to match. (getScale() method):
> NumericTypeCompiler.java
> else if (TypeCompiler.DIVIDE_OP.equals(operator))
> {
> /*
> ** Take max left scale + right precision  right scale + 1,
> ** or 4, whichever is biggest
> */
> LanguageConnectionContext lcc = (LanguageConnectionContext)
> (ContextService.getContext(LanguageConnectionContext.CONTEXT_ID));
> // Scale: 31  left precision + left scale  right scale
> val = Math.max(NumberDataValue.MAX_DECIMAL_PRECISION_SCALE  lprec + lscale
 rscale, 0);
> }
> Here val is returning zero for scale, it seems.

This message is automatically generated by JIRA.

If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa

For more information on JIRA, see:
http://www.atlassian.com/software/jira
