diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java index 488f277f2e..b803c386c9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java @@ -2140,7 +2140,7 @@ private VectorExpression getGenericUdfVectorExpression(GenericUDF udf, // Coalesce is a special case because it can take variable number of arguments. // Nvl is a specialization of the Coalesce. - ve = getCoalesceExpression(childExpr, returnType); + ve = getCoalesceExpression(childExpr, mode, returnType); } else if (udf instanceof GenericUDFElt) { // Elt is a special case because it can take variable number of arguments. @@ -2211,7 +2211,8 @@ private void freeNonColumns(VectorExpression[] vectorChildren) { } } - private VectorExpression getCoalesceExpression(List childExpr, TypeInfo returnType) + private VectorExpression getCoalesceExpression(List childExpr, + VectorExpressionDescriptor.Mode mode, TypeInfo returnType) throws HiveException { int[] inputColumns = new int[childExpr.size()]; VectorExpression[] vectorChildren = @@ -2239,7 +2240,33 @@ private VectorExpression getCoalesceExpression(List childExpr, Typ vectorCoalesce.setOutputDataTypePhysicalVariation(DataTypePhysicalVariation.NONE); freeNonColumns(vectorChildren); - return vectorCoalesce; + + boolean isFilter = false; // Assume. + if (mode == VectorExpressionDescriptor.Mode.FILTER) { + + // Is output type a BOOLEAN? + if (returnType.getCategory() == Category.PRIMITIVE && + ((PrimitiveTypeInfo) returnType).getPrimitiveCategory() == PrimitiveCategory.BOOLEAN) { + isFilter = true; + } else { + return null; + } + } + + if (isFilter) { + + // Wrap the PROJECTION IF expression output with a filter. + SelectColumnIsTrue filterVectorExpr = new SelectColumnIsTrue(vectorCoalesce.getOutputColumnNum()); + + filterVectorExpr.setChildExpressions(new VectorExpression[] {vectorCoalesce}); + + filterVectorExpr.setInputTypeInfos(vectorCoalesce.getOutputTypeInfo()); + filterVectorExpr.setInputDataTypePhysicalVariations(vectorCoalesce.getOutputDataTypePhysicalVariation()); + + return filterVectorExpr; + } else { + return vectorCoalesce; + } } private VectorExpression getEltExpression(List childExpr, TypeInfo returnType)