Skip to content

Commit

Permalink
Mondrian: fix divide by zero behavior when
Browse files Browse the repository at this point in the history
NullDenominatorProducesNull is set.

[git-p4: depot-paths = "//open/mondrian/": change = 9960]
  • Loading branch information
Rushan Chen committed Oct 5, 2007
1 parent 5df7e00 commit 06d86f7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
5 changes: 3 additions & 2 deletions src/main/mondrian/olap/fun/BuiltinFunTable.java
Expand Up @@ -1562,6 +1562,7 @@ public double evaluateDouble(Evaluator evaluator) {
if (v0 == DoubleNull) {
return DoubleNull;
} else if (v1 == DoubleNull) {
// Null only in denominator returns Infinity.
return Double.POSITIVE_INFINITY;
} else {
return v0 / v1;
Expand All @@ -1573,9 +1574,9 @@ public double evaluateDouble(Evaluator evaluator) {
public double evaluateDouble(Evaluator evaluator) {
final double v0 = calc0.evaluateDouble(evaluator);
final double v1 = calc1.evaluateDouble(evaluator);
// Null in numerator always returns DoubleNull.
// Null in numerator or denominator returns DoubleNull.
//
if (v0 == DoubleNull || v1 == DoubleNull || v1 == 0.0) {
if (v0 == DoubleNull || v1 == DoubleNull) {
return DoubleNull;
} else {
return v0 / v1;
Expand Down
19 changes: 10 additions & 9 deletions testsrc/main/mondrian/olap/fun/FunctionTest.java
Expand Up @@ -258,13 +258,6 @@ public void testNullValue() {
"Row #22: \n"));
}


public void testNullInDivision() {
assertExprReturns("NULL/1", "");
assertExprReturns("NULL/NULL", "");
assertExprReturns("1/NULL", "Infinity");
}

public void testNullInMultiplication() {
assertExprReturns("NULL*1", "");
assertExprReturns("1*NULL", "");
Expand Down Expand Up @@ -4465,13 +4458,21 @@ public void testDivide() {
assertExprReturns("0 / 0", "NaN");
assertExprReturns("-3 / (2 - 2)", "-Infinity");

assertExprReturns("NULL/1", "");
assertExprReturns("NULL/NULL", "");
assertExprReturns("1/NULL", "Infinity");

// when NullOrZeroDenominatorProducesNull is set to true
MondrianProperties.instance().NullDenominatorProducesNull.set(true);

assertExprReturns("-2 / " + NullNumericExpr, "");
assertExprReturns("0 / 0", "");
assertExprReturns("-3 / (2 - 2)", "");
assertExprReturns("0 / 0", "NaN");
assertExprReturns("-3 / (2 - 2)", "-Infinity");

assertExprReturns("NULL/1", "");
assertExprReturns("NULL/NULL", "");
assertExprReturns("1/NULL", "");

} finally {
MondrianProperties.instance().NullDenominatorProducesNull.
set(origNullDenominatorProducesNull);
Expand Down

0 comments on commit 06d86f7

Please sign in to comment.