You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by se...@apache.org on 2015/08/06 02:50:47 UTC

[41/53] [abbrv] hive git commit: HIVE-11406: Vectorization: StringExpr::compare() == 0 is bad for performance (Matt McCline, reviewed by Gopal V)

HIVE-11406: Vectorization: StringExpr::compare() == 0 is bad for performance (Matt McCline, reviewed by Gopal V)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/c7e1d34b
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/c7e1d34b
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/c7e1d34b

Branch: refs/heads/llap
Commit: c7e1d34b6e8734ca65e9a635f4094876b2032d77
Parents: 290ff1f
Author: Matt McCline <mm...@hortonworks.com>
Authored: Tue Aug 4 11:01:12 2015 -0700
Committer: Matt McCline <mm...@hortonworks.com>
Committed: Tue Aug 4 11:01:12 2015 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hive/ant/GenVectorCode.java   | 103 +++++++++++++++++
 ...tringGroupColumnCompareStringGroupColumn.txt | 112 +++++++++----------
 ...gGroupColumnCompareStringGroupScalarBase.txt |  12 +-
 ...gGroupScalarCompareStringGroupColumnBase.txt |  12 +-
 ...tringGroupColumnCompareStringGroupColumn.txt | 112 +++++++++----------
 ...gGroupColumnCompareStringGroupScalarBase.txt |  12 +-
 ...gGroupScalarCompareStringGroupColumnBase.txt |  12 +-
 .../ql/exec/vector/expressions/StringExpr.java  |  24 ++++
 8 files changed, 263 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
----------------------------------------------------------------------
diff --git a/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java b/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
index 6485a2a..54f3783 100644
--- a/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
+++ b/ant/src/org/apache/hadoop/hive/ant/GenVectorCode.java
@@ -1338,6 +1338,23 @@ public class GenVectorCode extends Task {
     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
     String templateString = readFile(templateFile);
     // Expand, and write result
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
@@ -1370,6 +1387,23 @@ public class GenVectorCode extends Task {
     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
     String templateString = readFile(templateFile);
     // Expand, and write result
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
@@ -1399,6 +1433,23 @@ public class GenVectorCode extends Task {
     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
     String templateString = readFile(templateFile);
     // Expand, and write result
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
@@ -1422,6 +1473,23 @@ public class GenVectorCode extends Task {
     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
     String templateString = readFile(templateFile);
     // Expand, and write result
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,
@@ -1437,6 +1505,23 @@ public class GenVectorCode extends Task {
     File templateFile = new File(joinPath(this.expressionTemplateDirectory, tdesc[0] + ".txt"));
     String templateString = readFile(templateFile);
     // Expand, and write result
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<BaseClassName>", baseClassName);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
@@ -1466,11 +1551,29 @@ public class GenVectorCode extends Task {
 
   private void generateStringColumnCompareScalar(String[] tdesc, String className)
       throws IOException {
+    String operatorName = tdesc[1];
     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
+
+    String compareOrEqual;
+    String compareOrEqualReturnType = "boolean";
+    String optionalCompare = "";
+    if (operatorName.equals("Equal")) {
+      compareOrEqual = "StringExpr.equal";
+    } else if (operatorName.equals("NotEqual")) {
+      compareOrEqual = "!StringExpr.equal";
+    } else {
+      compareOrEqual = "StringExpr.compare";
+      compareOrEqualReturnType = "int";
+      optionalCompare = operatorSymbol + " 0";
+    }
+    templateString = templateString.replaceAll("<CompareOrEqual>", compareOrEqual);
+    templateString = templateString.replaceAll("<CompareOrEqualReturnType>", compareOrEqualReturnType);
+    templateString = templateString.replaceAll("<OptionalCompare>", optionalCompare);
+
     templateString = templateString.replaceAll("<ClassName>", className);
     templateString = templateString.replaceAll("<OperatorSymbol>", operatorSymbol);
     writeFile(templateFile.lastModified(), expressionOutputDirectory, expressionClassesDirectory,

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt
index 70fce17..a72b882 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupColumn.txt
@@ -75,8 +75,8 @@ public class <ClassName> extends VectorExpression {
         /* Either all must remain selected or all will be eliminated.
          * Repeating property will not change.
          */
-        if (!(StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                 vector2[0], start2[0], length2[0]) <OperatorSymbol> 0)) {
+        if (!(<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                 vector2[0], start2[0], length2[0])<OptionalCompare>)) {
           batch.size = 0;
         }      
       } else if (inputColVector1.isRepeating) {
@@ -84,8 +84,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -93,8 +93,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -108,8 +108,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -117,8 +117,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -131,8 +131,8 @@ public class <ClassName> extends VectorExpression {
         int newSize = 0;
         for(int j = 0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                 vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                 vector2[i], start2[i], length2[i])<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -140,8 +140,8 @@ public class <ClassName> extends VectorExpression {
       } else {
         int newSize = 0;
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                 vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                 vector2[i], start2[i], length2[i])<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -155,8 +155,8 @@ public class <ClassName> extends VectorExpression {
     } else if (inputColVector1.noNulls) { 
       if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
         if (nullPos2[0] ||
-            !(StringExpr.compare(vector1[0], start1[0], length1[0], 
-                               vector2[0], start2[0], length2[0]) <OperatorSymbol> 0)) {
+            !(<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                               vector2[0], start2[0], length2[0])<OptionalCompare>)) {
           batch.size = 0; 
         } 
       } else if (inputColVector1.isRepeating) {
@@ -167,8 +167,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -178,8 +178,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -200,8 +200,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -209,8 +209,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -225,8 +225,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -236,8 +236,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -253,8 +253,8 @@ public class <ClassName> extends VectorExpression {
     } else if (inputColVector2.noNulls) {
       if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
         if (nullPos1[0] ||
-            !(StringExpr.compare(vector1[0], start1[0], length1[0], 
-                               vector2[0], start2[0], length2[0]) <OperatorSymbol> 0)) {
+            !(<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                               vector2[0], start2[0], length2[0])<OptionalCompare>)) {
           batch.size = 0; 
           return;
         } 
@@ -269,8 +269,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -278,8 +278,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }
@@ -294,8 +294,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -305,8 +305,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -322,8 +322,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -333,8 +333,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -350,8 +350,8 @@ public class <ClassName> extends VectorExpression {
     } else {
       if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
         if (nullPos1[0] || nullPos2[0] ||
-            !(StringExpr.compare(vector1[0], start1[0], length1[0], 
-                               vector2[0], start2[0], length2[0]) <OperatorSymbol> 0)) {
+            !(<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                               vector2[0], start2[0], length2[0])<OptionalCompare>)) {
           batch.size = 0; 
         } 
       } else if (inputColVector1.isRepeating) {
@@ -364,8 +364,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -375,8 +375,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -396,8 +396,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -407,8 +407,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -424,8 +424,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             if (!nullPos1[i] && !nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }
@@ -435,8 +435,8 @@ public class <ClassName> extends VectorExpression {
           int newSize = 0;
           for(int i = 0; i != n; i++) {
             if (!nullPos1[i] && !nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 sel[newSize++] = i;
               }
             }

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt
index 1c868ba..8b1c366 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupColumnCompareStringGroupScalarBase.txt
@@ -57,7 +57,7 @@ public abstract class <ClassName> extends VectorExpression {
       if (inputColVector.isRepeating) {
       
         // All must be selected otherwise size would be zero. Repeating property will not change.
-        if (!(StringExpr.compare(vector[0], start[0], length[0], value, 0, value.length) <OperatorSymbol> 0)) {
+        if (!(<CompareOrEqual>(vector[0], start[0], length[0], value, 0, value.length)<OptionalCompare>)) {
 
           //Entire batch is filtered out.
           batch.size = 0;
@@ -66,7 +66,7 @@ public abstract class <ClassName> extends VectorExpression {
         int newSize = 0;
         for(int j=0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -74,7 +74,7 @@ public abstract class <ClassName> extends VectorExpression {
       } else {
         int newSize = 0;
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -88,7 +88,7 @@ public abstract class <ClassName> extends VectorExpression {
       
         // All must be selected otherwise size would be zero. Repeating property will not change.
         if (!nullPos[0]) {
-          if (!(StringExpr.compare(vector[0], start[0], length[0], value, 0, value.length) <OperatorSymbol> 0)) {
+          if (!(<CompareOrEqual>(vector[0], start[0], length[0], value, 0, value.length)<OptionalCompare>)) {
 
             //Entire batch is filtered out.
             batch.size = 0;
@@ -101,7 +101,7 @@ public abstract class <ClassName> extends VectorExpression {
         for(int j=0; j != n; j++) {
           int i = sel[j];
           if (!nullPos[i]) {
-           if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+           if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
              sel[newSize++] = i;
            }
           }
@@ -113,7 +113,7 @@ public abstract class <ClassName> extends VectorExpression {
         int newSize = 0;
         for(int i = 0; i != n; i++) {
           if (!nullPos[i]) {
-            if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt
index 91f5909..930069c 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/FilterStringGroupScalarCompareStringGroupColumnBase.txt
@@ -61,7 +61,7 @@ public abstract class <ClassName> extends VectorExpression {
       if (inputColVector.isRepeating) {
       
         // All must be selected otherwise size would be zero. Repeating property will not change.
-        if (!(StringExpr.compare(value, 0, value.length, vector[0], start[0], length[0]) <OperatorSymbol> 0)) {
+        if (!(<CompareOrEqual>(value, 0, value.length, vector[0], start[0], length[0])<OptionalCompare>)) {
 
           //Entire batch is filtered out.
           batch.size = 0;
@@ -70,7 +70,7 @@ public abstract class <ClassName> extends VectorExpression {
         int newSize = 0;
         for(int j=0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -78,7 +78,7 @@ public abstract class <ClassName> extends VectorExpression {
       } else {
         int newSize = 0;
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
             sel[newSize++] = i;
           }
         }
@@ -92,7 +92,7 @@ public abstract class <ClassName> extends VectorExpression {
       
         // All must be selected otherwise size would be zero. Repeating property will not change.
         if (!nullPos[0]) {
-          if (!(StringExpr.compare(value, 0, value.length, vector[0], start[0], length[0]) <OperatorSymbol> 0)) {
+          if (!(<CompareOrEqual>(value, 0, value.length, vector[0], start[0], length[0])<OptionalCompare>)) {
 
             //Entire batch is filtered out.
             batch.size = 0;
@@ -105,7 +105,7 @@ public abstract class <ClassName> extends VectorExpression {
         for(int j=0; j != n; j++) {
           int i = sel[j];
           if (!nullPos[i]) {
-           if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+           if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
              sel[newSize++] = i;
            }
           }
@@ -117,7 +117,7 @@ public abstract class <ClassName> extends VectorExpression {
         int newSize = 0;
         for(int i = 0; i != n; i++) {
           if (!nullPos[i]) {
-            if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
               sel[newSize++] = i;
             }
           }

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt
index 8ef1d97..e881037 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupColumn.txt
@@ -83,9 +83,9 @@ public class <ClassName> extends VectorExpression {
       outputColVector.noNulls = true;
       if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
         outputColVector.isRepeating = true;
-        int ret = StringExpr.compare(vector1[0], start1[0], length1[0], 
+        <CompareOrEqualReturnType> ret = <CompareOrEqual>(vector1[0], start1[0], length1[0], 
                                          vector2[0], start2[0], length2[0]);
-        if (ret <OperatorSymbol> 0) {
+        if (ret<OptionalCompare>) {
           outVector[0] = 1;
         } else {
           outVector[0] = 0;
@@ -94,8 +94,8 @@ public class <ClassName> extends VectorExpression {
         if (batch.selectedInUse) {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -103,8 +103,8 @@ public class <ClassName> extends VectorExpression {
           }
         } else {
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -115,8 +115,8 @@ public class <ClassName> extends VectorExpression {
         if (batch.selectedInUse) {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -124,8 +124,8 @@ public class <ClassName> extends VectorExpression {
           }
         } else {
           for(int i = 0; i != n; i++) {
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -135,8 +135,8 @@ public class <ClassName> extends VectorExpression {
       } else if (batch.selectedInUse) {
         for(int j = 0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                 vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                 vector2[i], start2[i], length2[i])<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -144,8 +144,8 @@ public class <ClassName> extends VectorExpression {
         }
       } else {
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                 vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                 vector2[i], start2[i], length2[i])<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -160,8 +160,8 @@ public class <ClassName> extends VectorExpression {
         outputColVector.isRepeating = true;
         outNull[0] = nullPos2[0];
         if (!nullPos2[0]) {
-          if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                               vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                               vector2[0], start2[0], length2[0])<OptionalCompare>) {
             outVector[0] = 1;
           } else {
             outVector[0] = 0;
@@ -175,8 +175,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -187,8 +187,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -207,8 +207,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             outNull[i] = false;
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -217,8 +217,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           for(int i = 0; i != n; i++) {
             outNull[i] = false;
-            if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                   vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                   vector2[0], start2[0], length2[0])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -231,8 +231,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -243,8 +243,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -261,8 +261,8 @@ public class <ClassName> extends VectorExpression {
         outputColVector.isRepeating = true;
         outNull[0] = nullPos1[0];
         if (!nullPos1[0]) {
-          if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                               vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                               vector2[0], start2[0], length2[0])<OptionalCompare>) {
             outVector[0] = 1;
           } else {
             outVector[0] = 0;
@@ -279,8 +279,8 @@ public class <ClassName> extends VectorExpression {
           for(int j = 0; j != n; j++) {
             int i = sel[j];
             outNull[i] = false;
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -289,8 +289,8 @@ public class <ClassName> extends VectorExpression {
         } else {
           for(int i = 0; i != n; i++) {
             outNull[i] = false;
-            if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                   vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                   vector2[i], start2[i], length2[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -303,8 +303,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -315,8 +315,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -330,8 +330,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -342,8 +342,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -360,8 +360,8 @@ public class <ClassName> extends VectorExpression {
         outputColVector.isRepeating = true;
         outNull[0] = nullPos1[0] || nullPos2[0];
         if (!outNull[0]) {
-          if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                             vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                             vector2[0], start2[0], length2[0])<OptionalCompare>) {
             outVector[0] = 1;
           } else {
             outVector[0] = 0;
@@ -378,8 +378,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -390,8 +390,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos2[i];
             if (!nullPos2[i]) {
-              if (StringExpr.compare(vector1[0], start1[0], length1[0], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[0], start1[0], length1[0], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -410,8 +410,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -422,8 +422,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos1[i];
             if (!nullPos1[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[0], start2[0], length2[0]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[0], start2[0], length2[0])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -437,8 +437,8 @@ public class <ClassName> extends VectorExpression {
             int i = sel[j];
             outNull[i] = nullPos1[i] || nullPos2[i];
             if (!outNull[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;
@@ -449,8 +449,8 @@ public class <ClassName> extends VectorExpression {
           for(int i = 0; i != n; i++) {
             outNull[i] = nullPos1[i] || nullPos2[i];
             if (!outNull[i]) {
-              if (StringExpr.compare(vector1[i], start1[i], length1[i], 
-                                     vector2[i], start2[i], length2[i]) <OperatorSymbol> 0) {
+              if (<CompareOrEqual>(vector1[i], start1[i], length1[i], 
+                                     vector2[i], start2[i], length2[i])<OptionalCompare>) {
                 outVector[i] = 1;
               } else {
                 outVector[i] = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt
index 4d65d50..92bf27a 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupColumnCompareStringGroupScalarBase.txt
@@ -63,7 +63,7 @@ public abstract class <ClassName> extends VectorExpression {
       outputColVector.noNulls = true;
       if (inputColVector.isRepeating) {
         outputColVector.isRepeating = true; 
-        if (StringExpr.compare(vector[0], start[0], length[0], value, 0, value.length) <OperatorSymbol> 0) {
+        if (<CompareOrEqual>(vector[0], start[0], length[0], value, 0, value.length)<OptionalCompare>) {
           outVector[0] = 1;
         } else {
           outVector[0] = 0;
@@ -71,7 +71,7 @@ public abstract class <ClassName> extends VectorExpression {
       } else if (batch.selectedInUse) {
         for(int j=0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -79,7 +79,7 @@ public abstract class <ClassName> extends VectorExpression {
         }
       } else {
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -92,7 +92,7 @@ public abstract class <ClassName> extends VectorExpression {
         outputColVector.isRepeating = true;
         outNull[0] = nullPos[0];
         if (!nullPos[0]) {
-          if (StringExpr.compare(vector[0], start[0], length[0], value, 0, value.length) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(vector[0], start[0], length[0], value, 0, value.length)<OptionalCompare>) {
             outVector[0] = 1;
           } else {
             outVector[0] = 0;
@@ -103,7 +103,7 @@ public abstract class <ClassName> extends VectorExpression {
           int i = sel[j];
           outNull[i] = nullPos[i];
           if (!nullPos[i]) {
-            if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -114,7 +114,7 @@ public abstract class <ClassName> extends VectorExpression {
         for(int i = 0; i != n; i++) {
           outNull[i] = nullPos[i];
           if (!nullPos[i]) {
-            if (StringExpr.compare(vector[i], start[i], length[i], value, 0, value.length) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(vector[i], start[i], length[i], value, 0, value.length)<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt
----------------------------------------------------------------------
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt
index a734281..238dc93 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/StringGroupScalarCompareStringGroupColumnBase.txt
@@ -63,7 +63,7 @@ public abstract class <ClassName> extends VectorExpression {
       outputColVector.noNulls = true;
       if (inputColVector.isRepeating) {
         outputColVector.isRepeating = true; 
-        if (StringExpr.compare(value, 0, value.length, vector[0], start[0], length[0]) <OperatorSymbol> 0) {
+        if (<CompareOrEqual>(value, 0, value.length, vector[0], start[0], length[0])<OptionalCompare>) {
           outVector[0] = 1;
         } else {
           outVector[0] = 0;
@@ -71,7 +71,7 @@ public abstract class <ClassName> extends VectorExpression {
       } else if (batch.selectedInUse) {
         for(int j=0; j != n; j++) {
           int i = sel[j];
-          if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -79,7 +79,7 @@ public abstract class <ClassName> extends VectorExpression {
         }
       } else {
         for(int i = 0; i != n; i++) {
-          if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
             outVector[i] = 1;
           } else {
             outVector[i] = 0;
@@ -92,7 +92,7 @@ public abstract class <ClassName> extends VectorExpression {
         outputColVector.isRepeating = true;
         outNull[0] = nullPos[0];
         if (!nullPos[0]) {
-          if (StringExpr.compare(value, 0, value.length, vector[0], start[0], length[0]) <OperatorSymbol> 0) {
+          if (<CompareOrEqual>(value, 0, value.length, vector[0], start[0], length[0])<OptionalCompare>) {
             outVector[0] = 1;
           } else {
             outVector[0] = 0;
@@ -103,7 +103,7 @@ public abstract class <ClassName> extends VectorExpression {
           int i = sel[j];
           outNull[i] = nullPos[i];
           if (!nullPos[i]) {
-            if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;
@@ -114,7 +114,7 @@ public abstract class <ClassName> extends VectorExpression {
         for(int i = 0; i != n; i++) {
           outNull[i] = nullPos[i];
           if (!nullPos[i]) {
-            if (StringExpr.compare(value, 0, value.length, vector[i], start[i], length[i]) <OperatorSymbol> 0) {
+            if (<CompareOrEqual>(value, 0, value.length, vector[i], start[i], length[i])<OptionalCompare>) {
               outVector[i] = 1;
             } else {
               outVector[i] = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/c7e1d34b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java
index df71d8b..ebeb642 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/StringExpr.java
@@ -46,6 +46,30 @@ public class StringExpr {
     return len1 - len2;
   }
 
+  /* Determine if two strings are equal from two byte arrays each
+   * with their own start position and length.
+   * Use lexicographic unsigned byte value order.
+   * This is what's used for UTF-8 sort order.
+   */
+  public static boolean equal(byte[] arg1, int start1, int len1, byte[] arg2, int start2, int len2) {
+    if (len1 != len2) {
+      return false;
+    }
+    for (int index1 = start1,
+             index2 = start2;
+         len1 > 0;
+         len1--,
+         index1++,
+         index2++) {
+      // Note the "& 0xff" is just a way to convert unsigned bytes to signed integer.
+      if ((arg1[index1] & 0xff) != (arg2[index2] & 0xff)) {
+        return false;
+      }
+
+    }
+    return true;
+  }
+
   public static int characterCount(byte[] bytes) {
     int end = bytes.length;