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: