You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/09/05 17:59:50 UTC

svn commit: r1622729 [1/8] - in /hive/trunk: ant/src/org/apache/hadoop/hive/ant/ ql/src/gen/vectorization/ExpressionTemplates/ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ ql/src/java...

Author: hashutosh
Date: Fri Sep  5 15:59:47 2014
New Revision: 1622729

URL: http://svn.apache.org/r1622729
Log:
HIVE-5760 : Add vectorized support for CHAR/VARCHAR data types (Matt McCline via Jason Dere)

Added:
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareTruncStringScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringScalarCompareStringGroupColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterTruncStringColumnBetween.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterTruncStringScalarCompareStringGroupColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareTruncStringScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringScalarCompareStringGroupColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/TruncStringScalarCompareStringGroupColumn.txt
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/AggregateDefinition.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastBooleanToCharViaLongToChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastBooleanToVarCharViaLongToVarChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToVarChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDecimalToChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDecimalToVarChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastLongToChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastLongToVarChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastStringGroupToChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastStringGroupToVarChar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CharScalarConcatStringGroupCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprCharScalarStringGroupColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprCharScalarStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnVarCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarVarCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprVarCharScalarStringGroupColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprVarCharScalarStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringGroupColConcatCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringGroupColConcatStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringGroupColConcatVarCharScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringGroupConcatColCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringScalarConcatStringGroupCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/TruncStringOutput.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VarCharScalarConcatStringGroupCol.java
    hive/trunk/ql/src/test/queries/clientpositive/vector_char_2.q
    hive/trunk/ql/src/test/queries/clientpositive/vector_char_simple.q
    hive/trunk/ql/src/test/queries/clientpositive/vector_varchar_simple.q
    hive/trunk/ql/src/test/results/clientpositive/tez/vector_char_2.q.out
    hive/trunk/ql/src/test/results/clientpositive/tez/vector_char_simple.q.out
    hive/trunk/ql/src/test/results/clientpositive/tez/vector_varchar_simple.q.out
    hive/trunk/ql/src/test/results/clientpositive/vector_char_2.q.out
    hive/trunk/ql/src/test/results/clientpositive/vector_char_simple.q.out
    hive/trunk/ql/src/test/results/clientpositive/vector_varchar_simple.q.out
Removed:
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnCompareScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringScalarCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringColumnCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringColumnCompareScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/StringScalarCompareColumn.txt
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringColumnStringColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringColumnStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringConcatColCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringConcatColScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringConcatScalarCol.java
Modified:
    hive/trunk/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnUnaryFunc.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterScalarCompareColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnBetween.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarScalar.txt
    hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ScalarCompareColumn.txt
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedBatchUtil.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedColumnarSerDe.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/AbstractFilterStringColLikeStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastBooleanToStringViaLongToString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDecimalToDecimal.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDecimalToString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastLongToDate.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastLongToString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastStringToDate.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastStringToDecimal.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/DecimalToStringUnaryUDF.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterColAndScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterColOrScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprAndExpr.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterScalarAndColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterScalarOrColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncDoubleToDecimal.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncLogWithBaseDoubleToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncLogWithBaseLongToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncLongToDecimal.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncLongToString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncPowerDoubleToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncPowerLongToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncRand.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FuncRoundWithNumDigitsDecimalToDecimal.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IsNotNull.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IsNull.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/LongColDivideLongColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/LongColDivideLongScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/LongScalarDivideLongColumn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/LongToStringUnaryUDF.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NotCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModDoubleToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModLongToLong.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/RoundWithNumDigitsDoubleToDouble.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/SelectColumnIsFalse.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/SelectColumnIsNotNull.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/SelectColumnIsNull.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/SelectColumnIsTrue.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringLength.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringSubstrColStart.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringSubstrColStartLen.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringUnaryUDF.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringUnaryUDFDirect.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpression.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateAddColCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateAddColScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateAddScalarCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateDiffColCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateDiffColScalar.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateDiffScalarCol.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFDateLong.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldLong.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldString.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToBoolean.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIf.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqual.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrGreaterThan.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrLessThan.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPGreaterThan.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPLessThan.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPNotEqual.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorConditionalExpressions.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorGenericDateExpressions.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorStringExpressions.java

Modified: hive/trunk/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
URL: http://svn.apache.org/viewvc/hive/trunk/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java (original)
+++ hive/trunk/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java Fri Sep  5 15:59:47 2014
@@ -232,29 +232,98 @@ public class GenVectorCode extends Task 
       {"FilterScalarCompareColumn", "GreaterEqual", "long", "long", ">="},
       {"FilterScalarCompareColumn", "GreaterEqual", "double", "long", ">="},
 
-      {"FilterStringColumnCompareScalar", "Equal", "=="},
-      {"FilterStringColumnCompareScalar", "NotEqual", "!="},
-      {"FilterStringColumnCompareScalar", "Less", "<"},
-      {"FilterStringColumnCompareScalar", "LessEqual", "<="},
-      {"FilterStringColumnCompareScalar", "Greater", ">"},
-      {"FilterStringColumnCompareScalar", "GreaterEqual", ">="},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "Equal", "=="},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "NotEqual", "!="},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "Less", "<"},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "LessEqual", "<="},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "Greater", ">"},
+      {"FilterStringGroupColumnCompareStringGroupScalarBase", "GreaterEqual", ">="},
+
+      {"FilterStringGroupColumnCompareStringScalar", "Equal", "=="},
+      {"FilterStringGroupColumnCompareStringScalar", "NotEqual", "!="},
+      {"FilterStringGroupColumnCompareStringScalar", "Less", "<"},
+      {"FilterStringGroupColumnCompareStringScalar", "LessEqual", "<="},
+      {"FilterStringGroupColumnCompareStringScalar", "Greater", ">"},
+      {"FilterStringGroupColumnCompareStringScalar", "GreaterEqual", ">="},
+
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "Equal", "=="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "NotEqual", "!="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "Less", "<"},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "LessEqual", "<="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "Greater", ">"},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "VarChar", "GreaterEqual", ">="},
+
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "Equal", "=="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "NotEqual", "!="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "Less", "<"},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "LessEqual", "<="},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "Greater", ">"},
+      {"FilterStringGroupColumnCompareTruncStringScalar", "Char", "GreaterEqual", ">="},
 
       {"FilterStringColumnBetween", ""},
       {"FilterStringColumnBetween", "!"},
 
-      {"StringColumnCompareScalar", "Equal", "=="},
-      {"StringColumnCompareScalar", "NotEqual", "!="},
-      {"StringColumnCompareScalar", "Less", "<"},
-      {"StringColumnCompareScalar", "LessEqual", "<="},
-      {"StringColumnCompareScalar", "Greater", ">"},
-      {"StringColumnCompareScalar", "GreaterEqual", ">="},
-
-      {"FilterStringScalarCompareColumn", "Equal", "=="},
-      {"FilterStringScalarCompareColumn", "NotEqual", "!="},
-      {"FilterStringScalarCompareColumn", "Less", "<"},
-      {"FilterStringScalarCompareColumn", "LessEqual", "<="},
-      {"FilterStringScalarCompareColumn", "Greater", ">"},
-      {"FilterStringScalarCompareColumn", "GreaterEqual", ">="},
+      {"FilterTruncStringColumnBetween", "VarChar", ""},
+      {"FilterTruncStringColumnBetween", "VarChar", "!"},
+
+      {"FilterTruncStringColumnBetween", "Char", ""},
+      {"FilterTruncStringColumnBetween", "Char", "!"},
+
+      {"StringGroupColumnCompareStringGroupScalarBase", "Equal", "=="},
+      {"StringGroupColumnCompareStringGroupScalarBase", "NotEqual", "!="},
+      {"StringGroupColumnCompareStringGroupScalarBase", "Less", "<"},
+      {"StringGroupColumnCompareStringGroupScalarBase", "LessEqual", "<="},
+      {"StringGroupColumnCompareStringGroupScalarBase", "Greater", ">"},
+      {"StringGroupColumnCompareStringGroupScalarBase", "GreaterEqual", ">="},
+
+      {"StringGroupColumnCompareStringScalar", "Equal", "=="},
+      {"StringGroupColumnCompareStringScalar", "NotEqual", "!="},
+      {"StringGroupColumnCompareStringScalar", "Less", "<"},
+      {"StringGroupColumnCompareStringScalar", "LessEqual", "<="},
+      {"StringGroupColumnCompareStringScalar", "Greater", ">"},
+      {"StringGroupColumnCompareStringScalar", "GreaterEqual", ">="},
+
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "Equal", "=="},
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "NotEqual", "!="},
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "Less", "<"},
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "LessEqual", "<="},
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "Greater", ">"},
+      {"StringGroupColumnCompareTruncStringScalar", "VarChar", "GreaterEqual", ">="},
+
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "Equal", "=="},
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "NotEqual", "!="},
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "Less", "<"},
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "LessEqual", "<="},
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "Greater", ">"},
+      {"StringGroupColumnCompareTruncStringScalar", "Char", "GreaterEqual", ">="},
+
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "Equal", "=="},
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "NotEqual", "!="},
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "Less", "<"},
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "LessEqual", "<="},
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "Greater", ">"},
+      {"FilterStringGroupScalarCompareStringGroupColumnBase", "GreaterEqual", ">="},
+
+      {"FilterStringScalarCompareStringGroupColumn", "Equal", "=="},
+      {"FilterStringScalarCompareStringGroupColumn", "NotEqual", "!="},
+      {"FilterStringScalarCompareStringGroupColumn", "Less", "<"},
+      {"FilterStringScalarCompareStringGroupColumn", "LessEqual", "<="},
+      {"FilterStringScalarCompareStringGroupColumn", "Greater", ">"},
+      {"FilterStringScalarCompareStringGroupColumn", "GreaterEqual", ">="},
+
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "Equal", "=="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "NotEqual", "!="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "Less", "<"},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "LessEqual", "<="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "Greater", ">"},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "VarChar", "GreaterEqual", ">="},
+
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "Equal", "=="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "NotEqual", "!="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "Less", "<"},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "LessEqual", "<="},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "Greater", ">"},
+      {"FilterTruncStringScalarCompareStringGroupColumn", "Char", "GreaterEqual", ">="},
 
       {"FilterDecimalColumnCompareScalar", "Equal", "=="},
       {"FilterDecimalColumnCompareScalar", "NotEqual", "!="},
@@ -277,26 +346,47 @@ public class GenVectorCode extends Task 
       {"FilterDecimalColumnCompareColumn", "Greater", ">"},
       {"FilterDecimalColumnCompareColumn", "GreaterEqual", ">="},
 
-      {"StringScalarCompareColumn", "Equal", "=="},
-      {"StringScalarCompareColumn", "NotEqual", "!="},
-      {"StringScalarCompareColumn", "Less", "<"},
-      {"StringScalarCompareColumn", "LessEqual", "<="},
-      {"StringScalarCompareColumn", "Greater", ">"},
-      {"StringScalarCompareColumn", "GreaterEqual", ">="},
-
-      {"FilterStringColumnCompareColumn", "Equal", "=="},
-      {"FilterStringColumnCompareColumn", "NotEqual", "!="},
-      {"FilterStringColumnCompareColumn", "Less", "<"},
-      {"FilterStringColumnCompareColumn", "LessEqual", "<="},
-      {"FilterStringColumnCompareColumn", "Greater", ">"},
-      {"FilterStringColumnCompareColumn", "GreaterEqual", ">="},
-
-      {"StringColumnCompareColumn", "Equal", "=="},
-      {"StringColumnCompareColumn", "NotEqual", "!="},
-      {"StringColumnCompareColumn", "Less", "<"},
-      {"StringColumnCompareColumn", "LessEqual", "<="},
-      {"StringColumnCompareColumn", "Greater", ">"},
-      {"StringColumnCompareColumn", "GreaterEqual", ">="},
+      {"StringGroupScalarCompareStringGroupColumnBase", "Equal", "=="},
+      {"StringGroupScalarCompareStringGroupColumnBase", "NotEqual", "!="},
+      {"StringGroupScalarCompareStringGroupColumnBase", "Less", "<"},
+      {"StringGroupScalarCompareStringGroupColumnBase", "LessEqual", "<="},
+      {"StringGroupScalarCompareStringGroupColumnBase", "Greater", ">"},
+      {"StringGroupScalarCompareStringGroupColumnBase", "GreaterEqual", ">="},
+
+      {"StringScalarCompareStringGroupColumn", "Equal", "=="},
+      {"StringScalarCompareStringGroupColumn", "NotEqual", "!="},
+      {"StringScalarCompareStringGroupColumn", "Less", "<"},
+      {"StringScalarCompareStringGroupColumn", "LessEqual", "<="},
+      {"StringScalarCompareStringGroupColumn", "Greater", ">"},
+      {"StringScalarCompareStringGroupColumn", "GreaterEqual", ">="},
+
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "Equal", "=="},
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "NotEqual", "!="},
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "Less", "<"},
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "LessEqual", "<="},
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "Greater", ">"},
+      {"TruncStringScalarCompareStringGroupColumn", "VarChar", "GreaterEqual", ">="},
+
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "Equal", "=="},
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "NotEqual", "!="},
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "Less", "<"},
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "LessEqual", "<="},
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "Greater", ">"},
+      {"TruncStringScalarCompareStringGroupColumn", "Char", "GreaterEqual", ">="},
+
+      {"FilterStringGroupColumnCompareStringGroupColumn", "Equal", "=="},
+      {"FilterStringGroupColumnCompareStringGroupColumn", "NotEqual", "!="},
+      {"FilterStringGroupColumnCompareStringGroupColumn", "Less", "<"},
+      {"FilterStringGroupColumnCompareStringGroupColumn", "LessEqual", "<="},
+      {"FilterStringGroupColumnCompareStringGroupColumn", "Greater", ">"},
+      {"FilterStringGroupColumnCompareStringGroupColumn", "GreaterEqual", ">="},
+
+      {"StringGroupColumnCompareStringGroupColumn", "Equal", "=="},
+      {"StringGroupColumnCompareStringGroupColumn", "NotEqual", "!="},
+      {"StringGroupColumnCompareStringGroupColumn", "Less", "<"},
+      {"StringGroupColumnCompareStringGroupColumn", "LessEqual", "<="},
+      {"StringGroupColumnCompareStringGroupColumn", "Greater", ">"},
+      {"StringGroupColumnCompareStringGroupColumn", "GreaterEqual", ">="},
 
       {"FilterColumnCompareColumn", "Equal", "long", "double", "=="},
       {"FilterColumnCompareColumn", "Equal", "double", "double", "=="},
@@ -359,58 +449,58 @@ public class GenVectorCode extends Task 
       {"ColumnCompareColumn", "GreaterEqual", "double", "long", ">="},
 
       // template, <ClassNamePrefix>, <ReturnType>, <OperandType>, <FuncName>, <OperandCast>,
-      //   <ResultCast>, <Cleanup>
-      {"ColumnUnaryFunc", "FuncRound", "double", "double", "MathExpr.round", "", "", ""},
+      //   <ResultCast>, <Cleanup> <VectorExprArgType>
+      {"ColumnUnaryFunc", "FuncRound", "double", "double", "MathExpr.round", "", "", "", ""},
       // round(longCol) returns a long and is a no-op. So it will not be implemented here.
       // round(Col, N) is a special case and will be implemented separately from this template
-      {"ColumnUnaryFunc", "FuncFloor", "long", "double", "Math.floor", "", "(long)", ""},
+      {"ColumnUnaryFunc", "FuncFloor", "long", "double", "Math.floor", "", "(long)", "", ""},
       // Floor on an integer argument is a noop, but it is less code to handle it this way.
-      {"ColumnUnaryFunc", "FuncFloor", "long", "long", "Math.floor", "", "(long)", ""},
-      {"ColumnUnaryFunc", "FuncCeil", "long", "double", "Math.ceil", "", "(long)", ""},
+      {"ColumnUnaryFunc", "FuncFloor", "long", "long", "Math.floor", "", "(long)", "", ""},
+      {"ColumnUnaryFunc", "FuncCeil", "long", "double", "Math.ceil", "", "(long)", "", ""},
       // Ceil on an integer argument is a noop, but it is less code to handle it this way.
-      {"ColumnUnaryFunc", "FuncCeil", "long", "long", "Math.ceil", "", "(long)", ""},
-      {"ColumnUnaryFunc", "FuncExp", "double", "double", "Math.exp", "", "", ""},
-      {"ColumnUnaryFunc", "FuncExp", "double", "long", "Math.exp", "(double)", "", ""},
+      {"ColumnUnaryFunc", "FuncCeil", "long", "long", "Math.ceil", "", "(long)", "", ""},
+      {"ColumnUnaryFunc", "FuncExp", "double", "double", "Math.exp", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncExp", "double", "long", "Math.exp", "(double)", "", "", ""},
       {"ColumnUnaryFunc", "FuncLn", "double", "double", "Math.log", "", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       {"ColumnUnaryFunc", "FuncLn", "double", "long", "Math.log", "(double)", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       {"ColumnUnaryFunc", "FuncLog10", "double", "double", "Math.log10", "", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       {"ColumnUnaryFunc", "FuncLog10", "double", "long", "Math.log10", "(double)", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       // The MathExpr class contains helper functions for cases when existing library
       // routines can't be used directly.
       {"ColumnUnaryFunc", "FuncLog2", "double", "double", "MathExpr.log2", "", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       {"ColumnUnaryFunc", "FuncLog2", "double", "long", "MathExpr.log2", "(double)", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n, true);", ""},
       // Log(base, Col) is a special case and will be implemented separately from this template
       // Pow(col, P) and Power(col, P) are special cases implemented separately from this template
       {"ColumnUnaryFunc", "FuncSqrt", "double", "double", "Math.sqrt", "", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n);"},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n);", ""},
       {"ColumnUnaryFunc", "FuncSqrt", "double", "long", "Math.sqrt", "(double)", "",
-        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n);"},
-      {"ColumnUnaryFunc", "FuncAbs", "double", "double", "Math.abs", "", "", ""},
-      {"ColumnUnaryFunc", "FuncAbs", "long", "long", "MathExpr.abs", "", "", ""},
-      {"ColumnUnaryFunc", "FuncSin", "double", "double", "Math.sin", "", "", ""},
-      {"ColumnUnaryFunc", "FuncSin", "double", "long", "Math.sin", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncASin", "double", "double", "Math.asin", "", "", ""},
-      {"ColumnUnaryFunc", "FuncASin", "double", "long", "Math.asin", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncCos", "double", "double", "Math.cos", "", "", ""},
-      {"ColumnUnaryFunc", "FuncCos", "double", "long", "Math.cos", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncACos", "double", "double", "Math.acos", "", "", ""},
-      {"ColumnUnaryFunc", "FuncACos", "double", "long", "Math.acos", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncTan", "double", "double", "Math.tan", "", "", ""},
-      {"ColumnUnaryFunc", "FuncTan", "double", "long", "Math.tan", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncATan", "double", "double", "Math.atan", "", "", ""},
-      {"ColumnUnaryFunc", "FuncATan", "double", "long", "Math.atan", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncDegrees", "double", "double", "Math.toDegrees", "", "", ""},
-      {"ColumnUnaryFunc", "FuncDegrees", "double", "long", "Math.toDegrees", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncRadians", "double", "double", "Math.toRadians", "", "", ""},
-      {"ColumnUnaryFunc", "FuncRadians", "double", "long", "Math.toRadians", "(double)", "", ""},
-      {"ColumnUnaryFunc", "FuncSign", "double", "double", "MathExpr.sign", "", "", ""},
-      {"ColumnUnaryFunc", "FuncSign", "double", "long", "MathExpr.sign", "(double)", "", ""},
+        "MathExpr.NaNToNull(outputColVector, sel, batch.selectedInUse, n);", ""},
+      {"ColumnUnaryFunc", "FuncAbs", "double", "double", "Math.abs", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncAbs", "long", "long", "MathExpr.abs", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncSin", "double", "double", "Math.sin", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncSin", "double", "long", "Math.sin", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncASin", "double", "double", "Math.asin", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncASin", "double", "long", "Math.asin", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncCos", "double", "double", "Math.cos", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncCos", "double", "long", "Math.cos", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncACos", "double", "double", "Math.acos", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncACos", "double", "long", "Math.acos", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncTan", "double", "double", "Math.tan", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncTan", "double", "long", "Math.tan", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncATan", "double", "double", "Math.atan", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncATan", "double", "long", "Math.atan", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncDegrees", "double", "double", "Math.toDegrees", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncDegrees", "double", "long", "Math.toDegrees", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncRadians", "double", "double", "Math.toRadians", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncRadians", "double", "long", "Math.toRadians", "(double)", "", "", ""},
+      {"ColumnUnaryFunc", "FuncSign", "double", "double", "MathExpr.sign", "", "", "", ""},
+      {"ColumnUnaryFunc", "FuncSign", "double", "long", "MathExpr.sign", "(double)", "", "", ""},
 
       {"DecimalColumnUnaryFunc", "FuncFloor", "decimal", "DecimalUtil.floor"},
       {"DecimalColumnUnaryFunc", "FuncCeil", "decimal", "DecimalUtil.ceiling"},
@@ -420,20 +510,24 @@ public class GenVectorCode extends Task 
       {"DecimalColumnUnaryFunc", "FuncNegate", "decimal", "DecimalUtil.negate"},
 
       // Casts
-      {"ColumnUnaryFunc", "Cast", "long", "double", "", "", "(long)", ""},
-      {"ColumnUnaryFunc", "Cast", "double", "long", "", "", "(double)", ""},
+      {"ColumnUnaryFunc", "Cast", "long", "double", "", "", "(long)", "", ""},
+      {"ColumnUnaryFunc", "Cast", "double", "long", "", "", "(double)", "", ""},
       {"ColumnUnaryFunc", "CastTimestampToLongVia", "long", "long", "MathExpr.fromTimestamp", "",
-        "", ""},
+        "", "", "timestamp"},
       {"ColumnUnaryFunc", "CastTimestampToDoubleVia", "double", "long",
-          "MathExpr.fromTimestampToDouble", "", "", ""},
+          "MathExpr.fromTimestampToDouble", "", "", "", "timestamp"},
       {"ColumnUnaryFunc", "CastDoubleToBooleanVia", "long", "double", "MathExpr.toBool", "",
-        "", ""},
+        "", "", ""},
       {"ColumnUnaryFunc", "CastLongToBooleanVia", "long", "long", "MathExpr.toBool", "",
-        "", ""},
+        "", "", ""},
+      {"ColumnUnaryFunc", "CastDateToBooleanVia", "long", "long", "MathExpr.toBool", "",
+            "", "", "date"},
+      {"ColumnUnaryFunc", "CastTimestampToBooleanVia", "long", "long", "MathExpr.toBool", "",
+            "", "", "timestamp"},
       {"ColumnUnaryFunc", "CastLongToTimestampVia", "long", "long", "MathExpr.longToTimestamp", "",
-          "", ""},
+          "", "", ""},
       {"ColumnUnaryFunc", "CastDoubleToTimestampVia", "long", "double",
-         "MathExpr.doubleToTimestamp", "", "", ""},
+         "MathExpr.doubleToTimestamp", "", "", "", ""},
 
       // Boolean to long is done with an IdentityExpression
       // Boolean to double is done with standard Long to Double cast
@@ -658,22 +752,40 @@ public class GenVectorCode extends Task 
         generateVectorUDAFVar(tdesc);
       } else if (tdesc[0].equals("VectorUDAFVarDecimal")) {
         generateVectorUDAFVarDecimal(tdesc);
-      } else if (tdesc[0].equals("FilterStringColumnCompareScalar")) {
-        generateFilterStringColumnCompareScalar(tdesc);
+      } else if (tdesc[0].equals("FilterStringGroupColumnCompareStringGroupScalarBase")) {
+        generateFilterStringGroupColumnCompareStringGroupScalarBase(tdesc);
+      } else if (tdesc[0].equals("FilterStringGroupColumnCompareStringScalar")) {
+        generateFilterStringGroupColumnCompareStringScalar(tdesc);
+      } else if (tdesc[0].equals("FilterStringGroupColumnCompareTruncStringScalar")) {
+        generateFilterStringGroupColumnCompareTruncStringScalar(tdesc);
       } else if (tdesc[0].equals("FilterStringColumnBetween")) {
         generateFilterStringColumnBetween(tdesc);
+      } else if (tdesc[0].equals("FilterTruncStringColumnBetween")) {
+        generateFilterTruncStringColumnBetween(tdesc);
       } else if (tdesc[0].equals("FilterDecimalColumnBetween")) {
         generateFilterDecimalColumnBetween(tdesc);
-      } else if (tdesc[0].equals("StringColumnCompareScalar")) {
-        generateStringColumnCompareScalar(tdesc);
-      } else if (tdesc[0].equals("FilterStringScalarCompareColumn")) {
-        generateFilterStringScalarCompareColumn(tdesc);
-      } else if (tdesc[0].equals("StringScalarCompareColumn")) {
-        generateStringScalarCompareColumn(tdesc);
-      } else if (tdesc[0].equals("FilterStringColumnCompareColumn")) {
-        generateFilterStringColumnCompareColumn(tdesc);
-      } else if (tdesc[0].equals("StringColumnCompareColumn")) {
-        generateStringColumnCompareColumn(tdesc);
+      } else if (tdesc[0].equals("StringGroupColumnCompareStringGroupScalarBase")) {
+        generateStringGroupColumnCompareStringGroupScalarBase(tdesc);
+      } else if (tdesc[0].equals("StringGroupColumnCompareStringScalar")) {
+        generateStringGroupColumnCompareStringScalar(tdesc);
+      } else if (tdesc[0].equals("StringGroupColumnCompareTruncStringScalar")) {
+        generateStringGroupColumnCompareTruncStringScalar(tdesc);
+      } else if (tdesc[0].equals("FilterStringGroupScalarCompareStringGroupColumnBase")) {
+        generateFilterStringGroupScalarCompareStringGroupColumnBase(tdesc);
+      } else if (tdesc[0].equals("FilterStringScalarCompareStringGroupColumn")) {
+        generateFilterStringScalarCompareStringGroupColumn(tdesc);
+      } else if (tdesc[0].equals("FilterTruncStringScalarCompareStringGroupColumn")) {
+        generateFilterTruncStringScalarCompareStringGroupColumn(tdesc);
+      } else if (tdesc[0].equals("StringGroupScalarCompareStringGroupColumnBase")) {
+        generateStringGroupScalarCompareStringGroupColumnBase(tdesc);
+      } else if (tdesc[0].equals("StringScalarCompareStringGroupColumn")) {
+        generateStringScalarCompareStringGroupColumn(tdesc);
+      } else if (tdesc[0].equals("TruncStringScalarCompareStringGroupColumn")) {
+        generateTruncStringScalarCompareStringGroupColumn(tdesc);
+      } else if (tdesc[0].equals("FilterStringGroupColumnCompareStringGroupColumn")) {
+        generateFilterStringGroupColumnCompareStringGroupColumn(tdesc);
+      } else if (tdesc[0].equals("StringGroupColumnCompareStringGroupColumn")) {
+        generateStringGroupColumnCompareStringGroupColumn(tdesc);
       } else if (tdesc[0].equals("IfExprColumnColumn")) {
         generateIfExprColumnColumn(tdesc);
       } else if (tdesc[0].equals("IfExprColumnScalar")) {
@@ -710,6 +822,35 @@ public class GenVectorCode extends Task 
         className, templateString);
   }
 
+  private void generateFilterTruncStringColumnBetween(String[] tdesc) throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String truncStringHiveType;
+    String truncStringHiveGetBytes;
+    if (truncStringTypeName == "Char") {
+      truncStringHiveType = "HiveChar";
+      truncStringHiveGetBytes = "getStrippedValue().getBytes()";
+    } else if (truncStringTypeName == "VarChar") {
+      truncStringHiveType = "HiveVarchar";
+      truncStringHiveGetBytes = "getValue().getBytes()";
+    } else {
+      throw new Error("Unsupported string type: " + truncStringTypeName);
+    }
+    String optionalNot = tdesc[2];
+    String className = "Filter" + truncStringTypeName + "Column" + (optionalNot.equals("!") ? "Not" : "")
+        + "Between";
+        // Read the template into a string, expand it, and write it.
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    templateString = templateString.replaceAll("<TruncStringTypeName>", truncStringTypeName);
+    templateString = templateString.replaceAll("<TruncStringHiveType>", truncStringHiveType);
+    templateString = templateString.replaceAll("<TruncStringHiveGetBytes>", truncStringHiveGetBytes);
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<OptionalNot>", optionalNot);
+
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
   private void generateFilterDecimalColumnBetween(String[] tdesc) throws IOException {
     String optionalNot = tdesc[1];
     String className = "FilterDecimalColumn" + (optionalNot.equals("!") ? "Not" : "")
@@ -745,14 +886,12 @@ public class GenVectorCode extends Task 
   }
 
   private void generateColumnCompareColumn(String[] tdesc) throws Exception {
-    //The variables are all same as ColumnCompareScalar except that
-    //this template doesn't need a return type. Pass anything as return type.
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
     String className = getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Column";
-    generateColumnBinaryOperatorColumn(tdesc, "long", className);
+    generateColumnCompareOperatorColumn(tdesc, false, className);
   }
 
   private void generateVectorUDAFMinMax(String[] tdesc) throws Exception {
@@ -886,45 +1025,147 @@ public class GenVectorCode extends Task 
       writeFile(templateFile.lastModified(), udafOutputDirectory, udafClassesDirectory,
           className, templateString);
     }
-  
-  
-  private void generateFilterStringScalarCompareColumn(String[] tdesc) throws IOException {
+
+  private void generateFilterStringGroupScalarCompareStringGroupColumnBase(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "FilterStringScalar" + operatorName + "StringColumn";
+    String className = "FilterStringGroupScalar" + operatorName + "StringGroupColumnBase";
 
     // Template expansion logic is the same for both column-scalar and scalar-column cases.
     generateStringColumnCompareScalar(tdesc, className);
   }
 
-  private void generateStringScalarCompareColumn(String[] tdesc) throws IOException {
+  private void generateFilterStringScalarCompareStringGroupColumn(String[] tdesc) throws IOException {
+    String operatorName = tdesc[1];
+    String className = "FilterStringScalar" + operatorName + "StringGroupColumn";
+    String baseClassName = "FilterStringGroupScalar" + operatorName + "StringGroupColumnBase";
+    String operatorSymbol = tdesc[2];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
+  private void generateFilterTruncStringScalarCompareStringGroupColumn(String[] tdesc) throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String operatorName = tdesc[2];
+    String className = "Filter" + truncStringTypeName + "Scalar" + operatorName + "StringGroupColumn";
+    String baseClassName = "FilterStringGroupScalar" + operatorName + "StringGroupColumnBase";
+    generateStringCompareTruncStringScalar(tdesc, className, baseClassName);
+  }
+
+  private void generateStringGroupScalarCompareStringGroupColumnBase(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "StringScalar" + operatorName + "StringColumn";
+    String className = "StringGroupScalar" + operatorName + "StringGroupColumnBase";
 
     // Template expansion logic is the same for both column-scalar and scalar-column cases.
     generateStringColumnCompareScalar(tdesc, className);
   }
 
-  private void generateFilterStringColumnCompareScalar(String[] tdesc) throws IOException {
+  private void generateStringScalarCompareStringGroupColumn(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "FilterStringCol" + operatorName + "StringScalar";
-    generateStringColumnCompareScalar(tdesc, className);
+    String className = "StringScalar" + operatorName + "StringGroupColumn";
+    String baseClassName = "StringGroupScalar" + operatorName + "StringGroupColumnBase";
+    String operatorSymbol = tdesc[2];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);  }
+
+  private void generateTruncStringScalarCompareStringGroupColumn(String[] tdesc) throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String operatorName = tdesc[2];
+    String className = truncStringTypeName + "Scalar" + operatorName + "StringGroupColumn";
+    String baseClassName = "StringGroupScalar" + operatorName + "StringGroupColumnBase";
+    generateStringCompareTruncStringScalar(tdesc, className, baseClassName);
   }
 
-  private void generateStringColumnCompareScalar(String[] tdesc) throws IOException {
+  private void generateFilterStringGroupColumnCompareStringGroupScalarBase(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "StringCol" + operatorName + "StringScalar";
+    String className = "FilterStringGroupCol" + operatorName + "StringGroupScalarBase";
     generateStringColumnCompareScalar(tdesc, className);
   }
 
-  private void generateFilterStringColumnCompareColumn(String[] tdesc) throws IOException {
+  private void generateFilterStringGroupColumnCompareStringScalar(String[] tdesc) throws IOException {
+    String operatorName = tdesc[1];
+    String className = "FilterStringGroupCol" + operatorName + "StringScalar";
+    String baseClassName = "FilterStringGroupCol" + operatorName + "StringGroupScalarBase";
+    String operatorSymbol = tdesc[2];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
+  private void generateFilterStringGroupColumnCompareTruncStringScalar(String[] tdesc) throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String operatorName = tdesc[2];
+    String className = "FilterStringGroupCol" + operatorName + truncStringTypeName + "Scalar";
+    String baseClassName = "FilterStringGroupCol" + operatorName + "StringGroupScalarBase";
+    generateStringCompareTruncStringScalar(tdesc, className, baseClassName);
+  }
+
+  private void generateStringGroupColumnCompareStringGroupScalarBase(String[] tdesc) throws IOException {
+    String operatorName = tdesc[1];
+    String className = "StringGroupCol" + operatorName + "StringGroupScalarBase";
+    String operatorSymbol = tdesc[2];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
+  private void generateStringGroupColumnCompareStringScalar(String[] tdesc) throws IOException {
+    String operatorName = tdesc[1];
+    String className = "StringGroupCol" + operatorName + "StringScalar";
+    String baseClassName = "StringGroupCol" + operatorName + "StringGroupScalarBase";
+    String operatorSymbol = tdesc[2];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
+  private void generateStringGroupColumnCompareTruncStringScalar(String[] tdesc) throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String operatorName = tdesc[2];
+    String className = "StringGroupCol" + operatorName + truncStringTypeName + "Scalar";
+    String baseClassName = "StringGroupCol" + operatorName + "StringGroupScalarBase";
+    generateStringCompareTruncStringScalar(tdesc, className, baseClassName);
+  }
+
+  private void generateFilterStringGroupColumnCompareStringGroupColumn(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "FilterStringCol" + operatorName + "StringColumn";
+    String className = "FilterStringGroupCol" + operatorName + "StringGroupColumn";
     generateStringColumnCompareScalar(tdesc, className);
   }
 
-  private void generateStringColumnCompareColumn(String[] tdesc) throws IOException {
+  private void generateStringGroupColumnCompareStringGroupColumn(String[] tdesc) throws IOException {
     String operatorName = tdesc[1];
-    String className = "StringCol" + operatorName + "StringColumn";
+    String className = "StringGroupCol" + operatorName + "StringGroupColumn";
     generateStringColumnCompareScalar(tdesc, className);
   }
 
@@ -941,15 +1182,42 @@ public class GenVectorCode extends Task 
         className, templateString);
   }
 
+  private void generateStringCompareTruncStringScalar(String[] tdesc, String className, String baseClassName)
+      throws IOException {
+    String truncStringTypeName = tdesc[1];
+    String truncStringHiveType;
+    String truncStringHiveGetBytes;
+    if (truncStringTypeName == "Char") {
+      truncStringHiveType = "HiveChar";
+      truncStringHiveGetBytes = "getStrippedValue().getBytes()";
+    } else if (truncStringTypeName == "VarChar") {
+      truncStringHiveType = "HiveVarchar";
+      truncStringHiveGetBytes = "getValue().getBytes()";
+    } else {
+      throw new Error("Unsupported string type: " + truncStringTypeName);
+    }
+    String operatorSymbol = tdesc[3];
+    // Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    // Expand, and write result
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    templateString = templateString.replaceAll("<TruncStringTypeName>", truncStringTypeName);
+    templateString = templateString.replaceAll("<TruncStringHiveType>", truncStringHiveType);
+    templateString = templateString.replaceAll("<TruncStringHiveGetBytes>", truncStringHiveGetBytes);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+  }
+
   private void generateFilterColumnCompareColumn(String[] tdesc) throws Exception {
-    //The variables are all same as ColumnCompareScalar except that
-    //this template doesn't need a return type. Pass anything as return type.
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
     String className = "Filter" + getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Column";
-    generateColumnBinaryOperatorColumn(tdesc, null, className);
+    generateColumnCompareOperatorColumn(tdesc, true, className);
   }
 
   private void generateColumnUnaryMinus(String[] tdesc) throws Exception {
@@ -984,6 +1252,13 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<InputColumnVectorType>", inputColumnVectorType);
     templateString = templateString.replaceAll("<OperandType>", operandType);
+    String vectorExprArgType = operandType;
+    if (operandType.equals("long")) {
+      // Let comparisons occur for DATE and TIMESTAMP, too.
+      vectorExprArgType = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType>", vectorExprArgType);
+
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
   }
@@ -1006,6 +1281,15 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandType2>", operandType2);
     templateString = templateString.replaceAll("<OperandType3>", operandType3);
     templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+    String vectorExprArgType2 = operandType2;
+    String vectorExprArgType3 = operandType3;
+    if (operandType2.equals("long") && operandType3.equals("long")) {
+      // Let this work occur for DATE and TIMESTAMP, too.
+      vectorExprArgType2 = "int_datetime_family";
+      vectorExprArgType3 = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
+    templateString = templateString.replaceAll("<VectorExprArgType3>", vectorExprArgType3);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
   }
@@ -1028,6 +1312,15 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandType2>", operandType2);
     templateString = templateString.replaceAll("<OperandType3>", operandType3);
     templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+    String vectorExprArgType2 = operandType2;
+    String vectorExprArgType3 = operandType3;
+    if (operandType2.equals("long") && operandType3.equals("long")) {
+      // Let this work occur for DATE and TIMESTAMP, too.
+      vectorExprArgType2 = "int_datetime_family";
+      vectorExprArgType3 = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
+    templateString = templateString.replaceAll("<VectorExprArgType3>", vectorExprArgType3);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
   }
@@ -1049,6 +1342,15 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandType2>", operandType2);
     templateString = templateString.replaceAll("<OperandType3>", operandType3);
     templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+    String vectorExprArgType2 = operandType2;
+    String vectorExprArgType3 = operandType3;
+    if (operandType2.equals("long") && operandType3.equals("long")) {
+      // Let this work occur for DATE and TIMESTAMP, too.
+      vectorExprArgType2 = "int_datetime_family";
+      vectorExprArgType3 = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
+    templateString = templateString.replaceAll("<VectorExprArgType3>", vectorExprArgType3);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
   }
@@ -1073,6 +1375,7 @@ public class GenVectorCode extends Task 
   }
 
   // template, <ClassNamePrefix>, <ReturnType>, <OperandType>, <FuncName>, <OperandCast>, <ResultCast>
+  //   <Cleanup> <VectorExprArgType>
   private void generateColumnUnaryFunc(String[] tdesc) throws Exception {
     String classNamePrefix = tdesc[1];
     String operandType = tdesc[3];
@@ -1087,6 +1390,8 @@ public class GenVectorCode extends Task 
     String operandCast = tdesc[5];
     String resultCast = tdesc[6];
     String cleanup = tdesc[7];
+    String vectorExprArgType = tdesc[8].isEmpty() ? operandType : tdesc[8];
+
     // Expand, and write result
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<InputColumnVectorType>", inputColumnVectorType);
@@ -1097,6 +1402,7 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandCast>", operandCast);
     templateString = templateString.replaceAll("<ResultCast>", resultCast);
     templateString = templateString.replaceAll("<Cleanup>", cleanup);
+    templateString = templateString.replaceAll("<VectorExprArgType>", vectorExprArgType);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
   }
@@ -1108,58 +1414,53 @@ public class GenVectorCode extends Task 
     String className = getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Column";
     String returnType = getArithmeticReturnType(operandType1, operandType2);
-    generateColumnBinaryOperatorColumn(tdesc, returnType, className);
+    generateColumnArithmeticOperatorColumn(tdesc, returnType, className);
   }
 
   private void generateFilterColumnCompareScalar(String[] tdesc) throws Exception {
-    //The variables are all same as ColumnCompareScalar except that
-    //this template doesn't need a return type. Pass anything as return type.
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
     String className = "Filter" + getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Scalar";
-    generateColumnBinaryOperatorScalar(tdesc, null, className);
+    generateColumnCompareOperatorScalar(tdesc, true, className);
   }
 
   private void generateFilterScalarCompareColumn(String[] tdesc) throws Exception {
-    //this template doesn't need a return type. Pass anything as return type.
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
     String className = "Filter" + getCamelCaseType(operandType1)
         + "Scalar" + operatorName + getCamelCaseType(operandType2) + "Column";
-    generateScalarBinaryOperatorColumn(tdesc, null, className);
+    generateScalarCompareOperatorColumn(tdesc, true, className);
   }
 
   private void generateColumnCompareScalar(String[] tdesc) throws Exception {
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
-    String returnType = "long";
     String className = getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Scalar";
-    generateColumnBinaryOperatorScalar(tdesc, returnType, className);
+    generateColumnCompareOperatorScalar(tdesc, false, className);
   }
 
   private void generateScalarCompareColumn(String[] tdesc) throws Exception {
     String operatorName = tdesc[1];
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
-    String returnType = "long";
     String className = getCamelCaseType(operandType1)
         + "Scalar" + operatorName + getCamelCaseType(operandType2) + "Column";
-    generateScalarBinaryOperatorColumn(tdesc, returnType, className);
+    generateScalarCompareOperatorColumn(tdesc, false, className);
   }
 
-  private void generateColumnBinaryOperatorColumn(String[] tdesc, String returnType,
+  private void generateColumnCompareOperatorColumn(String[] tdesc, boolean filter,
          String className) throws Exception {
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
-    String outputColumnVectorType = this.getColumnVectorType(
-            returnType == null ? "long" : returnType);
     String inputColumnVectorType1 = this.getColumnVectorType(operandType1);
     String inputColumnVectorType2 = this.getColumnVectorType(operandType2);
+    String returnType = "long";
+    String outputColumnVectorType = this.getColumnVectorType(returnType);
     String operatorSymbol = tdesc[4];
 
     //Read the template into a string;
@@ -1174,16 +1475,25 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandType2>", operandType2);
     templateString = templateString.replaceAll("<ReturnType>", returnType);
     templateString = templateString.replaceAll("<CamelReturnType>", getCamelCaseType(returnType));
+    String vectorExprArgType1 = operandType1;
+    String vectorExprArgType2 = operandType2;
+    if (operandType1.equals("long") && operandType2.equals("long")) {
+      // Let comparisons occur for DATE and TIMESTAMP, too.
+      vectorExprArgType1 = "int_datetime_family";
+      vectorExprArgType2 = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType1>", vectorExprArgType1);
+    templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
 
-    if(returnType==null){
+    if (filter) {
       testCodeGen.addColumnColumnFilterTestCases(
           className,
           inputColumnVectorType1,
           inputColumnVectorType2,
           operatorSymbol);
-    }else{
+    } else {
       testCodeGen.addColumnColumnOperationTestCases(
           className,
           inputColumnVectorType1,
@@ -1192,13 +1502,44 @@ public class GenVectorCode extends Task 
     }
   }
 
-  private void generateColumnBinaryOperatorScalar(String[] tdesc, String returnType,
+  private void generateColumnArithmeticOperatorColumn(String[] tdesc, String returnType,
+         String className) throws Exception {
+    String operandType1 = tdesc[2];
+    String operandType2 = tdesc[3];
+    String outputColumnVectorType = this.getColumnVectorType(returnType);
+    String inputColumnVectorType1 = this.getColumnVectorType(operandType1);
+    String inputColumnVectorType2 = this.getColumnVectorType(operandType2);
+    String operatorSymbol = tdesc[4];
+
+    //Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<InputColumnVectorType1>", inputColumnVectorType1);
+    templateString = templateString.replaceAll("<InputColumnVectorType2>", inputColumnVectorType2);
+    templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    templateString = templateString.replaceAll("<OperandType1>", operandType1);
+    templateString = templateString.replaceAll("<OperandType2>", operandType2);
+    templateString = templateString.replaceAll("<ReturnType>", returnType);
+    templateString = templateString.replaceAll("<CamelReturnType>", getCamelCaseType(returnType));
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+
+    testCodeGen.addColumnColumnOperationTestCases(
+          className,
+          inputColumnVectorType1,
+          inputColumnVectorType2,
+          outputColumnVectorType);
+  }
+
+  private void generateColumnCompareOperatorScalar(String[] tdesc, boolean filter,
      String className) throws Exception {
     String operandType1 = tdesc[2];
     String operandType2 = tdesc[3];
-    String outputColumnVectorType = this.getColumnVectorType(
-            returnType == null ? "long" : returnType);
     String inputColumnVectorType = this.getColumnVectorType(operandType1);
+    String returnType = "long";
+    String outputColumnVectorType = this.getColumnVectorType(returnType);
     String operatorSymbol = tdesc[4];
 
     //Read the template into a string;
@@ -1211,10 +1552,20 @@ public class GenVectorCode extends Task 
     templateString = templateString.replaceAll("<OperandType1>", operandType1);
     templateString = templateString.replaceAll("<OperandType2>", operandType2);
     templateString = templateString.replaceAll("<ReturnType>", returnType);
+    templateString = templateString.replaceAll("<CamelReturnType>", getCamelCaseType(returnType));
+    String vectorExprArgType1 = operandType1;
+    String vectorExprArgType2 = operandType2;
+    if (operandType1.equals("long") && operandType2.equals("long")) {
+      // Let comparisons occur for DATE and TIMESTAMP, too.
+      vectorExprArgType1 = "int_datetime_family";
+      vectorExprArgType2 = "int_datetime_family";
+    }
+    templateString = templateString.replaceAll("<VectorExprArgType1>", vectorExprArgType1);
+    templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
 
-    if(returnType==null) {
+    if (filter) {
       testCodeGen.addColumnScalarFilterTestCases(
           true,
           className,
@@ -1231,13 +1582,42 @@ public class GenVectorCode extends Task 
     }
   }
 
-  private void generateScalarBinaryOperatorColumn(String[] tdesc, String returnType,
+  private void generateColumnArithmeticOperatorScalar(String[] tdesc, String returnType,
+     String className) throws Exception {
+    String operandType1 = tdesc[2];
+    String operandType2 = tdesc[3];
+    String outputColumnVectorType = this.getColumnVectorType(returnType);
+    String inputColumnVectorType = this.getColumnVectorType(operandType1);
+    String operatorSymbol = tdesc[4];
+
+    //Read the template into a string;
+    File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+    String templateString = readFile(templateFile);
+    templateString = templateString.replaceAll("<ClassName>", className);
+    templateString = templateString.replaceAll("<InputColumnVectorType>", inputColumnVectorType);
+    templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+    templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+    templateString = templateString.replaceAll("<OperandType1>", operandType1);
+    templateString = templateString.replaceAll("<OperandType2>", operandType2);
+    templateString = templateString.replaceAll("<ReturnType>", returnType);
+    writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+
+    testCodeGen.addColumnScalarOperationTestCases(
+          true,
+          className,
+          inputColumnVectorType,
+          outputColumnVectorType,
+          operandType2);
+  }
+
+  private void generateScalarCompareOperatorColumn(String[] tdesc, boolean filter,
      String className) throws Exception {
      String operandType1 = tdesc[2];
      String operandType2 = tdesc[3];
-     String outputColumnVectorType = this.getColumnVectorType(
-             returnType == null ? "long" : returnType);
+     String returnType = "long";
      String inputColumnVectorType = this.getColumnVectorType(operandType2);
+     String outputColumnVectorType = this.getColumnVectorType(returnType);
      String operatorSymbol = tdesc[4];
 
      //Read the template into a string;
@@ -1251,10 +1631,19 @@ public class GenVectorCode extends Task 
      templateString = templateString.replaceAll("<OperandType2>", operandType2);
      templateString = templateString.replaceAll("<ReturnType>", returnType);
      templateString = templateString.replaceAll("<CamelReturnType>", getCamelCaseType(returnType));
+     String vectorExprArgType1 = operandType1;
+     String vectorExprArgType2 = operandType2;
+     if (operandType1.equals("long") && operandType2.equals("long")) {
+       // Let comparisons occur for DATE and TIMESTAMP, too.
+       vectorExprArgType1 = "int_datetime_family";
+       vectorExprArgType2 = "int_datetime_family";
+     }
+     templateString = templateString.replaceAll("<VectorExprArgType1>", vectorExprArgType1);
+     templateString = templateString.replaceAll("<VectorExprArgType2>", vectorExprArgType2);
      writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
         className, templateString);
 
-     if(returnType==null) {
+     if (filter) {
        testCodeGen.addColumnScalarFilterTestCases(
            false,
            className,
@@ -1269,7 +1658,38 @@ public class GenVectorCode extends Task 
            outputColumnVectorType,
            operandType1);
      }
-   }
+  }
+
+  private void generateScalarArithmeticOperatorColumn(String[] tdesc, String returnType,
+     String className) throws Exception {
+     String operandType1 = tdesc[2];
+     String operandType2 = tdesc[3];
+     String outputColumnVectorType = this.getColumnVectorType(
+             returnType == null ? "long" : returnType);
+     String inputColumnVectorType = this.getColumnVectorType(operandType2);
+     String operatorSymbol = tdesc[4];
+
+     //Read the template into a string;
+     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
+     String templateString = readFile(templateFile);
+     templateString = templateString.replaceAll("<ClassName>", className);
+     templateString = templateString.replaceAll("<InputColumnVectorType>", inputColumnVectorType);
+     templateString = templateString.replaceAll("<OutputColumnVectorType>", outputColumnVectorType);
+     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
+     templateString = templateString.replaceAll("<OperandType1>", operandType1);
+     templateString = templateString.replaceAll("<OperandType2>", operandType2);
+     templateString = templateString.replaceAll("<ReturnType>", returnType);
+     templateString = templateString.replaceAll("<CamelReturnType>", getCamelCaseType(returnType));
+     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
+        className, templateString);
+
+     testCodeGen.addColumnScalarOperationTestCases(
+           false,
+           className,
+           inputColumnVectorType,
+           outputColumnVectorType,
+           operandType1);
+  }
 
   //Binary arithmetic operator
   private void generateColumnArithmeticScalar(String[] tdesc) throws Exception {
@@ -1279,7 +1699,7 @@ public class GenVectorCode extends Task 
     String className = getCamelCaseType(operandType1)
         + "Col" + operatorName + getCamelCaseType(operandType2) + "Scalar";
     String returnType = getArithmeticReturnType(operandType1, operandType2);
-    generateColumnBinaryOperatorScalar(tdesc, returnType, className);
+    generateColumnArithmeticOperatorScalar(tdesc, returnType, className);
   }
 
   private void generateColumnArithmeticScalarDecimal(String[] tdesc) throws IOException {
@@ -1373,7 +1793,7 @@ public class GenVectorCode extends Task 
     String className = getCamelCaseType(operandType1)
         + "Scalar" + operatorName + getCamelCaseType(operandType2) + "Column";
     String returnType = getArithmeticReturnType(operandType1, operandType2);
-    generateScalarBinaryOperatorColumn(tdesc, returnType, className);
+    generateScalarArithmeticOperatorColumn(tdesc, returnType, className);
   }
 
   private void generateFilterDecimalColumnCompareScalar(String[] tdesc) throws IOException {

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareColumn.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareColumn.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareColumn.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareColumn.txt Fri Sep  5 15:59:47 2014
@@ -163,8 +163,8 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.PROJECTION)
         .setNumArguments(2)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType1>"),
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareScalar.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareScalar.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareScalar.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnCompareScalar.txt Fri Sep  5 15:59:47 2014
@@ -155,8 +155,8 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.PROJECTION)
         .setNumArguments(2)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType1>"),
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnUnaryFunc.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnUnaryFunc.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnUnaryFunc.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/ColumnUnaryFunc.txt Fri Sep  5 15:59:47 2014
@@ -128,7 +128,7 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.PROJECTION)
         .setNumArguments(1)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
   }

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareColumn.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareColumn.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareColumn.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareColumn.txt Fri Sep  5 15:59:47 2014
@@ -188,8 +188,8 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.FILTER)
         .setNumArguments(2)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType1>"),
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareScalar.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareScalar.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareScalar.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterColumnCompareScalar.txt Fri Sep  5 15:59:47 2014
@@ -164,8 +164,8 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.FILTER)
         .setNumArguments(2)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType1>"),
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterScalarCompareColumn.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterScalarCompareColumn.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterScalarCompareColumn.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterScalarCompareColumn.txt Fri Sep  5 15:59:47 2014
@@ -164,8 +164,8 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.FILTER)
         .setNumArguments(2)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType1>"),
-            VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
+            VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.SCALAR,
             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();

Modified: hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnBetween.txt
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnBetween.txt?rev=1622729&r1=1622728&r2=1622729&view=diff
==============================================================================
--- hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnBetween.txt (original)
+++ hive/trunk/ql/src/gen/vectorization/ExpressionTemplates/FilterStringColumnBetween.txt Fri Sep  5 15:59:47 2014
@@ -184,9 +184,9 @@ public class <ClassName> extends VectorE
             VectorExpressionDescriptor.Mode.FILTER)
         .setNumArguments(3)
         .setArgumentTypes(
-            VectorExpressionDescriptor.ArgumentType.getType("string"),
-            VectorExpressionDescriptor.ArgumentType.getType("string"),
-            VectorExpressionDescriptor.ArgumentType.getType("string"))
+            VectorExpressionDescriptor.ArgumentType.STRING,
+            VectorExpressionDescriptor.ArgumentType.STRING,
+            VectorExpressionDescriptor.ArgumentType.STRING)
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
             VectorExpressionDescriptor.InputExpressionType.SCALAR,