HIVE-12315: Fix Vectorized double divide by zero (Gopal V, reviewed by Matt McCline)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/973268bb Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/973268bb Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/973268bb Branch: refs/heads/master-fixed Commit: 973268bb88bbe1e30721580744dae1e668f6b944 Parents: e542f7f Author: Gopal V <[email protected]> Authored: Thu Nov 5 17:16:46 2015 -0800 Committer: Gopal V <[email protected]> Committed: Thu Nov 5 17:16:46 2015 -0800 ---------------------------------------------------------------------- .../ql/exec/vector/expressions/NullUtil.java | 21 ++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/973268bb/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java index e4a9824..2eb48fb 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java @@ -125,20 +125,21 @@ public class NullUtil { public static void setNullAndDivBy0DataEntriesDouble( DoubleColumnVector v, boolean selectedInUse, int[] sel, int n, LongColumnVector denoms) { assert v.isRepeating || !denoms.isRepeating; + final boolean realNulls = !v.noNulls; v.noNulls = false; long[] vector = denoms.vector; - if (v.isRepeating && (v.isNull[0] = (v.isNull[0] || vector[0] == 0))) { + if (v.isRepeating && (v.isNull[0] = ((realNulls && v.isNull[0]) || vector[0] == 0))) { v.vector[0] = DoubleColumnVector.NULL_VALUE; } else if (selectedInUse) { for (int j = 0; j != n; j++) { int i = sel[j]; - if (v.isNull[i] = (v.isNull[i] || vector[i] == 0)) { + if (v.isNull[i] = ((realNulls && v.isNull[i]) || vector[i] == 0)) { v.vector[i] = DoubleColumnVector.NULL_VALUE; } } } else { for (int i = 0; i != n; i++) { - if (v.isNull[i] = (v.isNull[i] || vector[i] == 0)) { + if (v.isNull[i] = ((realNulls && v.isNull[i]) || vector[i] == 0)) { v.vector[i] = DoubleColumnVector.NULL_VALUE; } } @@ -152,20 +153,21 @@ public class NullUtil { public static void setNullAndDivBy0DataEntriesDouble( DoubleColumnVector v, boolean selectedInUse, int[] sel, int n, DoubleColumnVector denoms) { assert v.isRepeating || !denoms.isRepeating; + final boolean realNulls = !v.noNulls; v.noNulls = false; double[] vector = denoms.vector; - if (v.isRepeating && (v.isNull[0] = (v.isNull[0] || vector[0] == 0))) { + if (v.isRepeating && (v.isNull[0] = ((realNulls && v.isNull[0]) || vector[0] == 0))) { v.vector[0] = DoubleColumnVector.NULL_VALUE; } else if (selectedInUse) { for (int j = 0; j != n; j++) { int i = sel[j]; - if (v.isNull[i] = (v.isNull[i] || vector[i] == 0)) { + if (v.isNull[i] = ((realNulls && v.isNull[i]) || vector[i] == 0)) { v.vector[i] = DoubleColumnVector.NULL_VALUE; } } } else { for (int i = 0; i != n; i++) { - if (v.isNull[i] = (v.isNull[i] || vector[i] == 0)) { + if (v.isNull[i] = ((realNulls && v.isNull[i]) || vector[i] == 0)) { v.vector[i] = DoubleColumnVector.NULL_VALUE; } } @@ -235,6 +237,13 @@ public class NullUtil { outputColVector.noNulls = inputColVector1.noNulls && inputColVector2.noNulls; + if (outputColVector.noNulls) { + // the inputs might not always have isNull initialized for + // inputColVector1.isNull[i] || inputColVector2.isNull[i] to be valid + Arrays.fill(outputColVector.isNull, false); + return; + } + if (inputColVector1.noNulls && !inputColVector2.noNulls) { if (inputColVector2.isRepeating) { outputColVector.isNull[0] = inputColVector2.isNull[0];
