diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java index e4a9824..2eb48fb 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java @@ -125,20 +125,21 @@ public static void setNullDataEntriesDouble( 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 static void setNullAndDivBy0DataEntriesDouble( 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 static void propagateNullsColCol(ColumnVector inputColVector1, 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];