diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java index 56312d9a58..29a5c45f0f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java @@ -19,15 +19,18 @@ import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedBatchUtil; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +/** + * CASE WHEN ... THEN ... ELSE NULL END + */ public class IfExprColumnNull extends IfExprConditionalFilter { private static final long serialVersionUID = 1L; - public IfExprColumnNull(int arg1Column, int arg2Column, int outputColumn) { - super(arg1Column, arg2Column, -1, outputColumn); + public IfExprColumnNull(int whenColumn, int thenColumn, int outputColumn) { + super(whenColumn, thenColumn, -1, outputColumn); } public IfExprColumnNull() { @@ -40,58 +43,53 @@ public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { super.evaluateIfConditionalExpr(batch, childExpressions); } - final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; - final ColumnVector arg2ColVector = batch.cols[arg2Column]; + final LongColumnVector whenColVector = (LongColumnVector) batch.cols[arg1Column]; + final ColumnVector thenColVector = batch.cols[arg2Column]; final ColumnVector outputColVector = batch.cols[outputColumnNum]; final int[] sel = batch.selected; final int n = batch.size; - final boolean[] null1 = arg1ColVector.isNull; - final long[] vector1 = arg1ColVector.vector; - final boolean[] isNull = outputColVector.isNull; + final boolean[] whenNull = whenColVector.isNull; + final long[] whenVector = whenColVector.vector; if (n == 0) { return; } - arg2ColVector.flatten(batch.selectedInUse, sel, n); + thenColVector.flatten(batch.selectedInUse, sel, n); - if (arg1ColVector.isRepeating) { - if (!null1[0] && vector1[0] == 1) { - outputColVector.setElement(0, 0, arg2ColVector); + if (whenColVector.isRepeating) { + if (!whenNull[0] && whenVector[0] == 1) { + outputColVector.setElement(0, 0, thenColVector); } else { - outputColVector.noNulls = false; - isNull[0] = true; + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, 0); } return; } if (batch.selectedInUse) { for (int j = 0; j < n; j++) { int i = sel[j]; - if (!null1[0] && vector1[i] == 1) { - outputColVector.setElement(i, i, arg2ColVector); + if (!whenNull[i] && whenVector[i] == 1) { + outputColVector.setElement(i, i, thenColVector); } else { - outputColVector.noNulls = false; - isNull[i] = true; + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, i); } } } else { for (int i = 0; i < n; i++) { - if (!null1[0] && vector1[i] == 1) { - outputColVector.setElement(i, i, arg2ColVector); + if (!whenNull[i] && whenVector[i] == 1) { + outputColVector.setElement(i, i, thenColVector); } else { - outputColVector.noNulls = false; - isNull[i] = true; + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, i); } } } - arg2ColVector.unFlatten(); + thenColVector.unFlatten(); } @Override public String vectorExpressionParameters() { return getColumnParamString(0, arg1Column) + ", " + getColumnParamString(1, arg2Column) + ", null"; } - } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java index 99185a0fdf..a595f1877c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java @@ -19,15 +19,18 @@ import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedBatchUtil; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +/** + * CASE ... WHEN ... THEN NULL ... END + */ public class IfExprNullColumn extends IfExprConditionalFilter { private static final long serialVersionUID = 1L; - public IfExprNullColumn(int arg1Column, int arg2Column, int outputColumn) { - super(arg1Column, -1, arg2Column, outputColumn); + public IfExprNullColumn(int whenColumn, int elseColumn, int outputColumn) { + super(whenColumn, -1, elseColumn, outputColumn); } public IfExprNullColumn() { @@ -41,58 +44,53 @@ public void evaluate(VectorizedRowBatch batch) { super.evaluateIfConditionalExpr(batch, childExpressions); } - final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; - final ColumnVector arg2ColVector = batch.cols[arg2Column]; + final LongColumnVector whenColVector = (LongColumnVector) batch.cols[arg1Column]; + final ColumnVector elseColVector = batch.cols[arg2Column]; final ColumnVector outputColVector = batch.cols[outputColumnNum]; final int[] sel = batch.selected; final int n = batch.size; - final boolean[] null1 = arg1ColVector.isNull; - final long[] vector1 = arg1ColVector.vector; - final boolean[] isNull = outputColVector.isNull; + final boolean[] whenNull = whenColVector.isNull; + final long[] whenVector = whenColVector.vector; if (n == 0) { return; } - arg2ColVector.flatten(batch.selectedInUse, sel, n); + elseColVector.flatten(batch.selectedInUse, sel, n); - if (arg1ColVector.isRepeating) { - if (!null1[0] && vector1[0] == 1) { - outputColVector.noNulls = false; - isNull[0] = true; + if (whenColVector.isRepeating) { + if (!whenNull[0] && whenVector[0] == 1) { + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, 0); } else { - outputColVector.setElement(0, 0, arg2ColVector); + outputColVector.setElement(0, 0, elseColVector); } return; } if (batch.selectedInUse) { for (int j = 0; j < n; j++) { int i = sel[j]; - if (!null1[0] && vector1[i] == 1) { - outputColVector.noNulls = false; - isNull[i] = true; + if (!whenNull[i] && whenVector[i] == 1) { + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, i); } else { - outputColVector.setElement(i, i, arg2ColVector); + outputColVector.setElement(i, i, elseColVector); } } } else { for (int i = 0; i < n; i++) { - if (!null1[0] && vector1[i] == 1) { - outputColVector.noNulls = false; - isNull[i] = true; + if (!whenNull[i] && whenVector[i] == 1) { + VectorizedBatchUtil.setNullColIsNullValue(outputColVector, i); } else { - outputColVector.setElement(i, i, arg2ColVector); + outputColVector.setElement(i, i, elseColVector); } } } - arg2ColVector.unFlatten(); + elseColVector.unFlatten(); } @Override public String vectorExpressionParameters() { return getColumnParamString(0, arg1Column) + ", null, col "+ arg2Column; } - }