PIG-5328: expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid (michaelthoward via knoguchi)
git-svn-id: https://svn.apache.org/repos/asf/pig/trunk@1822370 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index 3421b59..f7053ad 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -63,6 +63,7 @@
OPTIMIZATIONS
BUG FIXES
+PIG-5328: expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid (michaelthoward via knoguchi)
PIG-5320: TestCubeOperator#testRollupBasic is flaky on Spark 2.2 (nkollar via szita)
diff --git a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/Divide.java b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/Divide.java
index f8d78b1..d691a6d 100644
--- a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/Divide.java
+++ b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/Divide.java
@@ -110,7 +110,7 @@
case DataType.BIGINTEGER:
return BigInteger.ZERO.equals((BigInteger) a);
case DataType.BIGDECIMAL:
- return BigDecimal.ZERO.equals((BigDecimal) a);
+ return ((BigDecimal) a).signum() == 0;
default:
throw new ExecException("Called on unsupported Number class " + DataType.findTypeName(dataType));
}
diff --git a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java
index a4abd6e..3ceedfc 100644
--- a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java
+++ b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java
@@ -468,7 +468,7 @@
BigDecimal bd = null;
Result res = in.getNextBigDecimal();
if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
- res.result = Boolean.valueOf(!BigDecimal.ZERO.equals((BigDecimal)res.result));
+ res.result = Boolean.valueOf(((BigDecimal)res.result).signum() != 0);
}
return res;
}
@@ -1431,7 +1431,7 @@
result = Boolean.valueOf(!BigInteger.ZERO.equals((BigInteger)obj));
break;
case DataType.BIGDECIMAL:
- result = Boolean.valueOf(!BigDecimal.ZERO.equals((BigDecimal)obj));
+ result = Boolean.valueOf(((BigDecimal)obj).signum() != 0);
break;
default:
throw new ExecException("Cannot convert "+ obj + " to " + fs, 1120, PigException.INPUT);
diff --git a/src/org/apache/pig/data/DataType.java b/src/org/apache/pig/data/DataType.java
index 9ef0d04..dd49f62 100644
--- a/src/org/apache/pig/data/DataType.java
+++ b/src/org/apache/pig/data/DataType.java
@@ -662,7 +662,7 @@
case BIGINTEGER:
return Boolean.valueOf(!BigInteger.ZERO.equals(((BigInteger) o)));
case BIGDECIMAL:
- return Boolean.valueOf(!BigDecimal.ZERO.equals(((BigDecimal) o)));
+ return Boolean.valueOf(((BigDecimal) o).signum() != 0);
case FLOAT:
return Boolean.valueOf(((Float) o).floatValue() != 0.0F);
case DOUBLE:
diff --git a/test/org/apache/pig/test/TestDivide.java b/test/org/apache/pig/test/TestDivide.java
index 6cd27d2..624d9de 100644
--- a/test/org/apache/pig/test/TestDivide.java
+++ b/test/org/apache/pig/test/TestDivide.java
@@ -274,10 +274,13 @@
resf = op.getNextBigDecimal();
assertEquals(null, (BigDecimal)resf.result);
// test divide by 0
- lt.setValue(inpf1);
- rt.setValue(new BigDecimal(0.0f,mc));
- resf = op.getNextBigDecimal();
- assertEquals(null, (BigDecimal)resf.result);
+ String[] zeroStrings = new String[] { "0", "-0", "0.0", "-0.0", "0.000000", "-0.000000" };
+ for (String zeroString : zeroStrings) {
+ lt.setValue(inpf1);
+ rt.setValue(new BigDecimal(zeroString));
+ resf = op.getNextBigDecimal();
+ assertEquals(null, (BigDecimal)resf.result);
+ }
break;
}
case DataType.DATETIME: