This is an automated email from the ASF dual-hosted git repository.

cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new 742e2d2  DRILL-6547: IllegalStateException: Tried to remove unmanaged 
buffer in concat function (#2183)
742e2d2 is described below

commit 742e2d2c37b10adb1d0f5c36cff825ea6db95bfb
Author: Oleg <[email protected]>
AuthorDate: Fri May 21 14:54:23 2021 +0300

    DRILL-6547: IllegalStateException: Tried to remove unmanaged buffer in 
concat function (#2183)
---
 .../drill/exec/udfs/ComplexSchemaFunctions.java    |  2 +-
 .../apache/drill/exec/udfs/ComplexSchemaUtils.java |  5 +-
 .../apache/drill/exec/udfs/UserAgentFunctions.java |  6 +-
 .../codegen/templates/CastIntervalVarChar.java     |  2 +-
 .../templates/Decimal/CastDecimalVarDecimal.java   |  2 +-
 .../templates/Decimal/CastDecimalVarchar.java      |  3 +-
 .../templates/Decimal/CastFloatDecimal.java        |  2 +-
 .../codegen/templates/Decimal/CastIntDecimal.java  |  3 +-
 .../templates/Decimal/CastVarCharDecimal.java      |  2 +-
 .../Decimal/DecimalAggrTypeFunctions1.java         |  4 +-
 .../Decimal/DecimalAggrTypeFunctions2.java         |  2 +-
 .../Decimal/DecimalAggrTypeFunctions3.java         |  2 +-
 .../templates/Decimal/DecimalFunctions.java        |  8 +--
 .../main/codegen/templates/NewValueFunctions.java  |  2 +-
 .../exec/expr/fn/impl/ParseQueryFunction.java      |  4 +-
 .../drill/exec/expr/fn/impl/ParseUrlFunction.java  |  4 +-
 .../exec/expr/fn/impl/StatisticsAggrFunctions.java | 60 ++++++++--------
 .../drill/exec/expr/fn/impl/StringFunctions.java   | 80 ++++++++++++----------
 .../drill/exec/expr/fn/impl/TDigestFunctions.java  | 34 ++++-----
 .../test/java/org/apache/drill/TestBugFixes.java   | 17 +++++
 20 files changed, 135 insertions(+), 109 deletions(-)

diff --git 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaFunctions.java
 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaFunctions.java
index 50fef82..2357add 100644
--- 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaFunctions.java
+++ 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaFunctions.java
@@ -57,7 +57,7 @@ public class ComplexSchemaFunctions {
     @Override
     public void eval() {
       if (reader.isSet()) {
-        org.apache.drill.exec.udfs.ComplexSchemaUtils.getFields(reader, 
outWriter, outBuffer);
+        outBuffer = 
org.apache.drill.exec.udfs.ComplexSchemaUtils.getFields(reader, outWriter, 
outBuffer);
       } else {
         org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter 
queryMapWriter = outWriter.rootAsMap();
         // Return empty map
diff --git 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaUtils.java 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaUtils.java
index 7f027aa..45ea5e7 100644
--- 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaUtils.java
+++ 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/ComplexSchemaUtils.java
@@ -29,7 +29,7 @@ import java.util.Iterator;
 
 public class ComplexSchemaUtils {
 
-  public static void getFields(FieldReader reader, BaseWriter.ComplexWriter 
outWriter, DrillBuf buffer) {
+  public static DrillBuf getFields(FieldReader reader, 
BaseWriter.ComplexWriter outWriter, DrillBuf buffer) {
 
     BaseWriter.MapWriter queryMapWriter = outWriter.rootAsMap();
 
@@ -54,7 +54,7 @@ public class ComplexSchemaUtils {
 
       VarCharHolder rowHolder = new VarCharHolder();
       byte[] rowStringBytes = dataType.getBytes();
-      buffer.reallocIfNeeded(rowStringBytes.length);
+      buffer = buffer.reallocIfNeeded(rowStringBytes.length);
       buffer.setBytes(0, rowStringBytes);
 
       rowHolder.start = 0;
@@ -64,5 +64,6 @@ public class ComplexSchemaUtils {
       queryMapWriter.varChar(fieldName).write(rowHolder);
     }
     queryMapWriter.end();
+    return buffer;
   }
 }
diff --git 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/UserAgentFunctions.java 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/UserAgentFunctions.java
index 40300d6..40f97a1 100644
--- 
a/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/UserAgentFunctions.java
+++ 
b/contrib/udfs/src/main/java/org/apache/drill/exec/udfs/UserAgentFunctions.java
@@ -69,7 +69,7 @@ public class UserAgentFunctions {
         String field = agent.getValue(fieldName);
 
         byte[] rowStringBytes = field.getBytes();
-        outBuffer.reallocIfNeeded(rowStringBytes.length);
+        outBuffer = outBuffer.reallocIfNeeded(rowStringBytes.length);
         outBuffer.setBytes(0, rowStringBytes);
 
         rowHolder.start = 0;
@@ -123,7 +123,7 @@ public class UserAgentFunctions {
         String field = agent.getValue(fieldName);
 
         byte[] rowStringBytes = field.getBytes();
-        outBuffer.reallocIfNeeded(rowStringBytes.length);
+        outBuffer = outBuffer.reallocIfNeeded(rowStringBytes.length);
         outBuffer.setBytes(0, rowStringBytes);
 
         rowHolder.start = 0;
@@ -166,7 +166,7 @@ public class UserAgentFunctions {
       String field = agent.getValue(requestedField);
 
       byte[] rowStringBytes = 
field.getBytes(java.nio.charset.StandardCharsets.UTF_8);
-      outBuffer.reallocIfNeeded(rowStringBytes.length);
+      outBuffer = outBuffer.reallocIfNeeded(rowStringBytes.length);
       outBuffer.setBytes(0, rowStringBytes);
 
       out.start = 0;
diff --git a/exec/java-exec/src/main/codegen/templates/CastIntervalVarChar.java 
b/exec/java-exec/src/main/codegen/templates/CastIntervalVarChar.java
index eb36263..92617c0 100644
--- a/exec/java-exec/src/main/codegen/templates/CastIntervalVarChar.java
+++ b/exec/java-exec/src/main/codegen/templates/CastIntervalVarChar.java
@@ -61,7 +61,7 @@ public class Cast${type.from}To${type.to} implements 
DrillSimpleFunc {
   @Output ${type.to}Holder out;
 
   public void setup() {
-    buffer.reallocIfNeeded(${type.bufferLength});
+    buffer = buffer.reallocIfNeeded(${type.bufferLength});
   }
 
   public void eval() {
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarDecimal.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarDecimal.java
index 68f5475..5510c9d 100644
--- 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarDecimal.java
+++ 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarDecimal.java
@@ -83,7 +83,7 @@ public class Cast${type.from}${type.to} implements 
DrillSimpleFunc {
     out.start = 0;
     byte[] bytes = bd.unscaledValue().toByteArray();
     int len = bytes.length;
-    out.buffer = buffer.reallocIfNeeded(len);
+    out.buffer = buffer = buffer.reallocIfNeeded(len);
     out.buffer.setBytes(out.start, bytes);
     out.end = out.start + len;
   }
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarchar.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarchar.java
index 369ba02..8a01b03 100644
--- a/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarchar.java
+++ b/exec/java-exec/src/main/codegen/templates/Decimal/CastDecimalVarchar.java
@@ -65,10 +65,9 @@ public class Cast${type.from}${type.to} implements 
DrillSimpleFunc {
   public void eval() {
     java.math.BigDecimal bigDecimal = 
org.apache.drill.exec.util.DecimalUtility.getBigDecimalFromDrillBuf(in.buffer, 
in.start, in.end - in.start, in.scale);
     String str = bigDecimal.toString();
-    out.buffer = buffer;
     out.start = 0;
     out.end = Math.min((int) len.value, str.length());
-    buffer = buffer.reallocIfNeeded((int) out.end);
+    out.buffer = buffer = buffer.reallocIfNeeded((int) out.end);
     out.buffer.setBytes(0, str.substring(0, out.end).getBytes());
   }
 }
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastFloatDecimal.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastFloatDecimal.java
index 245f6d1..6901b13 100644
--- a/exec/java-exec/src/main/codegen/templates/Decimal/CastFloatDecimal.java
+++ b/exec/java-exec/src/main/codegen/templates/Decimal/CastFloatDecimal.java
@@ -79,7 +79,7 @@ public class Cast${type.from}${type.to} implements 
DrillSimpleFunc {
 
     byte[] bytes = bd.unscaledValue().toByteArray();
     int len = bytes.length;
-    out.buffer = buffer.reallocIfNeeded(len);
+    out.buffer = buffer = buffer.reallocIfNeeded(len);
     out.buffer.setBytes(out.start, bytes);
     out.end = out.start + len;
   }
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastIntDecimal.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastIntDecimal.java
index 033c92e..b1daaab 100644
--- a/exec/java-exec/src/main/codegen/templates/Decimal/CastIntDecimal.java
+++ b/exec/java-exec/src/main/codegen/templates/Decimal/CastIntDecimal.java
@@ -66,7 +66,6 @@ public class Cast${type.from}${type.to} implements 
DrillSimpleFunc {
     out.precision = precision.value;
 
     out.start = 0;
-    out.buffer = buffer;
     java.math.BigDecimal bd = new java.math.BigDecimal(in.value);
 
     org.apache.drill.exec.util.DecimalUtility.checkValueOverflow(bd, 
precision.value, scale.value);
@@ -75,7 +74,7 @@ public class Cast${type.from}${type.to} implements 
DrillSimpleFunc {
 
     byte[] bytes = bd.unscaledValue().toByteArray();
     int len = bytes.length;
-    out.buffer = out.buffer.reallocIfNeeded(len);
+    out.buffer = buffer = buffer.reallocIfNeeded(len);
     out.buffer.setBytes(out.start, bytes);
     out.end = out.start + len;
   }
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/CastVarCharDecimal.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/CastVarCharDecimal.java
index 3296a04..f6dc304 100644
--- a/exec/java-exec/src/main/codegen/templates/Decimal/CastVarCharDecimal.java
+++ b/exec/java-exec/src/main/codegen/templates/Decimal/CastVarCharDecimal.java
@@ -101,7 +101,7 @@ public class CastEmptyString${type.from}To${type.to} 
implements DrillSimpleFunc
 
     byte[] bytes = bd.unscaledValue().toByteArray();
     int len = bytes.length;
-    out.buffer = buffer.reallocIfNeeded(len);
+    out.buffer = buffer = buffer.reallocIfNeeded(len);
     out.buffer.setBytes(out.start, bytes);
     out.end = out.start + len;
   }
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions1.java
 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions1.java
index cd14bbb..c5e8f6b 100644
--- 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions1.java
+++ 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions1.java
@@ -110,7 +110,7 @@ public class Decimal${aggrtype.className}Functions {
         value.obj = ((java.math.BigDecimal) value.obj).setScale(out.scale, 
java.math.BigDecimal.ROUND_HALF_UP);
         byte[] bytes = ((java.math.BigDecimal) 
value.obj).unscaledValue().toByteArray();
         int len = bytes.length;
-        out.buffer = buffer.reallocIfNeeded(len);
+        out.buffer = buffer = buffer.reallocIfNeeded(len);
         out.buffer.setBytes(0, bytes);
         out.end = len;
       } else {
@@ -180,7 +180,7 @@ public class Decimal${aggrtype.className}Functions {
         byte[] bytes = 
((java.math.BigDecimal)value.obj).unscaledValue().toByteArray();
         int len = bytes.length;
         out.start  = 0;
-        out.buffer = buffer.reallocIfNeeded(len);
+        out.buffer = buffer = buffer.reallocIfNeeded(len);
         out.buffer.setBytes(0, bytes);
         out.end = len;
         out.scale = scale.value;
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions2.java
 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions2.java
index c633b67..39bbb1d 100644
--- 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions2.java
+++ 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions2.java
@@ -111,7 +111,7 @@ public static class ${type.inputType}${aggrtype.className} 
implements DrillAggFu
       out.precision = 
org.apache.drill.exec.planner.types.DrillRelDataTypeSystem.DRILL_REL_DATATYPE_SYSTEM.getMaxNumericPrecision();
       byte[] bytes = average.unscaledValue().toByteArray();
       int len = bytes.length;
-      out.buffer = buffer.reallocIfNeeded(len);
+      out.buffer = buffer = buffer.reallocIfNeeded(len);
       out.buffer.setBytes(0, bytes);
       out.end = len;
     } else {
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions3.java
 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions3.java
index 211bab9..c0ad098 100644
--- 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions3.java
+++ 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalAggrTypeFunctions3.java
@@ -158,7 +158,7 @@ public class Decimal${aggrtype.className}Functions {
           org.apache.drill.exec.util.DecimalUtility.checkValueOverflow(result, 
out.precision, out.scale);
           byte[] bytes = result.unscaledValue().toByteArray();
           int len = bytes.length;
-          out.buffer = buffer.reallocIfNeeded(len);
+          out.buffer = buffer = buffer.reallocIfNeeded(len);
           out.buffer.setBytes(0, bytes);
           out.end = len;
         } else {
diff --git 
a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalFunctions.java 
b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalFunctions.java
index 9b055f1..5e42698 100644
--- a/exec/java-exec/src/main/codegen/templates/Decimal/DecimalFunctions.java
+++ b/exec/java-exec/src/main/codegen/templates/Decimal/DecimalFunctions.java
@@ -187,7 +187,7 @@ public class ${type.name}Functions {
 
       byte[] bytes = opResult.unscaledValue().toByteArray();
       int len = bytes.length;
-      result.buffer = buffer.reallocIfNeeded(len);
+      result.buffer = buffer = buffer.reallocIfNeeded(len);
       result.buffer.setBytes(0, bytes);
       result.end = len;
     }
@@ -246,7 +246,7 @@ public class ${type.name}Functions {
 
       byte[] bytes = opResult.unscaledValue().toByteArray();
       int len = bytes.length;
-      result.buffer = buffer.reallocIfNeeded(len);
+      result.buffer = buffer = buffer.reallocIfNeeded(len);
       result.buffer.setBytes(0, bytes);
       result.end = len;
     }
@@ -295,7 +295,7 @@ public class ${type.name}Functions {
                   .setScale(result.scale, java.math.BigDecimal.ROUND_DOWN);
       byte[] bytes = opResult.unscaledValue().toByteArray();
       int len = bytes.length;
-      result.buffer = buffer.reallocIfNeeded(len);
+      result.buffer = buffer = buffer.reallocIfNeeded(len);
       result.buffer.setBytes(0, bytes);
       result.end = len;
     }
@@ -324,7 +324,7 @@ public class ${type.name}Functions {
                   .setScale(result.scale, java.math.BigDecimal.ROUND_HALF_UP);
       byte[] bytes = bd.unscaledValue().toByteArray();
       int len = bytes.length;
-      result.buffer = buffer.reallocIfNeeded(len);
+      result.buffer = buffer = buffer.reallocIfNeeded(len);
       result.buffer.setBytes(0, bytes);
       result.end = len;
     }
diff --git a/exec/java-exec/src/main/codegen/templates/NewValueFunctions.java 
b/exec/java-exec/src/main/codegen/templates/NewValueFunctions.java
index 03460db..0a8b2ee 100644
--- a/exec/java-exec/src/main/codegen/templates/NewValueFunctions.java
+++ b/exec/java-exec/src/main/codegen/templates/NewValueFunctions.java
@@ -18,7 +18,7 @@
 <@pp.dropOutputFile />
 
 <#macro reassignHolder>
-        previous.buffer = buf.reallocIfNeeded(length);
+        previous.buffer = buf = buf.reallocIfNeeded(length);
         previous.buffer.setBytes(0, in.buffer, in.start, length);
         previous.end = length;
 </#macro>
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseQueryFunction.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseQueryFunction.java
index 5fd589d..2f78840 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseQueryFunction.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseQueryFunction.java
@@ -96,7 +96,7 @@ public class ParseQueryFunction {
         }
 
         byte[] valueBytes = keyValue[1].getBytes();
-        outBuffer.reallocIfNeeded(valueBytes.length);
+        outBuffer = outBuffer.reallocIfNeeded(valueBytes.length);
         outBuffer.setBytes(0, valueBytes);
 
         org.apache.drill.exec.expr.holders.VarCharHolder valueHolder =
@@ -170,7 +170,7 @@ public class ParseQueryFunction {
         }
 
         byte[] valueBytes = keyValue[1].getBytes();
-        outBuffer.reallocIfNeeded(valueBytes.length);
+        outBuffer = outBuffer.reallocIfNeeded(valueBytes.length);
         outBuffer.setBytes(0, valueBytes);
 
         org.apache.drill.exec.expr.holders.VarCharHolder valueHolder =
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseUrlFunction.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseUrlFunction.java
index 52a545a..e631de1 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseUrlFunction.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/ParseUrlFunction.java
@@ -90,7 +90,7 @@ public class ParseUrlFunction {
           if (entry.getValue() != null) {
             // Explicit casting to String is required because of Janino's 
limitations regarding generics.
             byte[] protocolBytes = ((String) entry.getValue()).getBytes();
-            outBuffer.reallocIfNeeded(protocolBytes.length);
+            outBuffer = outBuffer.reallocIfNeeded(protocolBytes.length);
             outBuffer.setBytes(0, protocolBytes);
             rowHolder.start = 0;
             rowHolder.end = protocolBytes.length;
@@ -165,7 +165,7 @@ public class ParseUrlFunction {
           if (entry.getValue() != null) {
             // Explicit casting to String is required because of Janino's 
limitations regarding generics.
             byte[] protocolBytes = ((String) entry.getValue()).getBytes();
-            outBuffer.reallocIfNeeded(protocolBytes.length);
+            outBuffer = outBuffer.reallocIfNeeded(protocolBytes.length);
             outBuffer.setBytes(0, protocolBytes);
             rowHolder.start = 0;
             rowHolder.end = protocolBytes.length;
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StatisticsAggrFunctions.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StatisticsAggrFunctions.java
index 79765ed..e4cf506 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StatisticsAggrFunctions.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StatisticsAggrFunctions.java
@@ -202,7 +202,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -303,7 +303,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -364,7 +364,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -419,7 +419,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -474,7 +474,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -533,7 +533,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -588,7 +588,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -647,7 +647,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -702,7 +702,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -761,7 +761,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -816,7 +816,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -875,7 +875,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -930,7 +930,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -989,7 +989,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1044,7 +1044,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1103,7 +1103,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1158,7 +1158,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1217,7 +1217,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1272,7 +1272,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1331,7 +1331,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1386,7 +1386,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1445,7 +1445,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1509,7 +1509,7 @@ public class StatisticsAggrFunctions {
                 (com.clearspring.analytics.stream.cardinality.HyperLogLog) 
work.obj;
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1580,7 +1580,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1638,7 +1638,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1699,7 +1699,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1756,7 +1756,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1817,7 +1817,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1874,7 +1874,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
@@ -1934,7 +1934,7 @@ public class StatisticsAggrFunctions {
 
         try {
           byte[] ba = hll.getBytes();
-          out.buffer = buffer.reallocIfNeeded(ba.length);
+          out.buffer = buffer = buffer.reallocIfNeeded(ba.length);
           out.start = 0;
           out.end = ba.length;
           out.buffer.setBytes(0, ba);
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
index 22edb47..e58e286 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
@@ -17,7 +17,6 @@
  */
 package org.apache.drill.exec.expr.fn.impl;
 
-import io.netty.buffer.ByteBuf;
 import io.netty.buffer.DrillBuf;
 
 import org.apache.drill.common.FunctionNames;
@@ -273,7 +272,6 @@ public class StringFunctions{
 
     @Param VarCharHolder input;
     @Param(constant=true) VarCharHolder pattern;
-    @Inject DrillBuf buffer;
     @Workspace java.util.regex.Matcher matcher;
     @Workspace org.apache.drill.exec.expr.fn.impl.CharSequenceWrapper 
charSequenceWrapper;
     @Output BitHolder out;
@@ -530,7 +528,6 @@ public class StringFunctions{
     @Param BigIntHolder length;
 
     @Output VarCharHolder out;
-    @Workspace ByteBuf buffer;
 
     @Override
     public void setup() {
@@ -568,7 +565,6 @@ public class StringFunctions{
     @Param BigIntHolder offset;
 
     @Output VarCharHolder out;
-    @Workspace ByteBuf buffer;
 
     @Override
     public void setup() {
@@ -678,7 +674,6 @@ public class StringFunctions{
     @Param BigIntHolder length;
 
     @Output VarCharHolder out;
-    @Workspace ByteBuf buffer;
 
     @Override
     public void setup() {
@@ -716,7 +711,6 @@ public class StringFunctions{
     @Param BigIntHolder length;
 
     @Output VarCharHolder out;
-    @Workspace ByteBuf buffer;
 
     @Override
     public void setup() {
@@ -1425,12 +1419,11 @@ public class StringFunctions{
       out.buffer = buffer = buffer.reallocIfNeeded((left.end - left.start) + 
(right.end - right.start));
       out.start = out.end = 0;
 
-      int id = 0;
-      for (id = left.start; id < left.end; id++) {
+      for (int id = left.start; id < left.end; id++) {
         out.buffer.setByte(out.end++, left.buffer.getByte(id));
       }
 
-      for (id = right.start; id < right.end; id++) {
+      for (int id = right.start; id < right.end; id++) {
         out.buffer.setByte(out.end++, right.buffer.getByte(id));
       }
     }
@@ -1486,18 +1479,21 @@ public class StringFunctions{
 
     @Override
     public void eval() {
-      out.buffer = buffer = buffer.reallocIfNeeded((left.end - left.start) + 
(right.end - right.start));
-      out.start = out.end = 0;
+      if (right.isSet == 1) {
+        out.buffer = buffer = buffer.reallocIfNeeded((left.end - left.start) + 
(right.end - right.start));
+        out.start = out.end = 0;
 
-      int id = 0;
-      for (id = left.start; id < left.end; id++) {
-        out.buffer.setByte(out.end++, left.buffer.getByte(id));
-      }
+        for (int id = left.start; id < left.end; id++) {
+          out.buffer.setByte(out.end++, left.buffer.getByte(id));
+        }
 
-      if (right.isSet == 1) {
-        for (id = right.start; id < right.end; id++) {
+        for (int id = right.start; id < right.end; id++) {
           out.buffer.setByte(out.end++, right.buffer.getByte(id));
         }
+      } else {
+        out.buffer = left.buffer;
+        out.start = left.start;
+        out.end = left.end;
       }
     }
   }
@@ -1519,18 +1515,21 @@ public class StringFunctions{
 
     @Override
     public void eval() {
-      out.buffer = buffer.reallocIfNeeded( (left.end - left.start) + 
(right.end - right.start));
-      out.start = out.end = 0;
-
-      int id = 0;
       if (left.isSet == 1) {
-        for (id = left.start; id < left.end; id++) {
+        out.buffer = buffer = buffer.reallocIfNeeded((left.end - left.start) + 
(right.end - right.start));
+        out.start = out.end = 0;
+
+        for (int id = left.start; id < left.end; id++) {
           out.buffer.setByte(out.end++, left.buffer.getByte(id));
         }
-      }
 
-      for (id = right.start; id < right.end; id++) {
-        out.buffer.setByte(out.end++, right.buffer.getByte(id));
+        for (int id = right.start; id < right.end; id++) {
+          out.buffer.setByte(out.end++, right.buffer.getByte(id));
+        }
+      } else {
+        out.buffer = right.buffer;
+        out.start = right.start;
+        out.end = right.end;
       }
     }
   }
@@ -1552,20 +1551,31 @@ public class StringFunctions{
 
     @Override
     public void eval() {
-      out.buffer = buffer.reallocIfNeeded( (left.end - left.start) + 
(right.end - right.start));
-      out.start = out.end = 0;
+      if (left.isSet == 1 && right.isSet == 1) {
+        out.buffer = buffer = buffer.reallocIfNeeded((left.end - left.start) + 
(right.end - right.start));
+        out.start = out.end = 0;
 
-      int id = 0;
-      if (left.isSet == 1) {
-        for (id = left.start; id < left.end; id++) {
+        for (int id = left.start; id < left.end; id++) {
           out.buffer.setByte(out.end++, left.buffer.getByte(id));
         }
-      }
 
-      if (right.isSet == 1) {
-        for (id = right.start; id < right.end; id++) {
+        for (int id = right.start; id < right.end; id++) {
           out.buffer.setByte(out.end++, right.buffer.getByte(id));
         }
+      } else if (left.isSet == 1) {
+        // right is null
+        out.buffer = left.buffer;
+        out.start = left.start;
+        out.end = left.end;
+      } else if (right.isSet == 1) {
+        // left is null
+        out.buffer = right.buffer;
+        out.start = right.start;
+        out.end = right.end;
+      } else {
+        // both null
+        out.buffer = buffer;
+        out.start = out.end = 0;
       }
     }
   }
@@ -1584,7 +1594,7 @@ public class StringFunctions{
 
     @Override
     public void eval() {
-      out.buffer = buffer.reallocIfNeeded(in.end - in.start);
+      out.buffer = buffer = buffer.reallocIfNeeded(in.end - in.start);
       out.start = out.end = 0;
       out.end = 
org.apache.drill.common.util.DrillStringUtils.parseBinaryString(in.buffer, 
in.start, in.end, out.buffer);
       out.buffer.setIndex(out.start, out.end);
@@ -1609,7 +1619,7 @@ public class StringFunctions{
     @Override
     public void eval() {
       byte[] buf = 
org.apache.drill.common.util.DrillStringUtils.toBinaryString(in.buffer, 
in.start, in.end).getBytes(charset);
-      out.buffer = buffer.reallocIfNeeded(buf.length);
+      out.buffer = buffer = buffer.reallocIfNeeded(buf.length);
       out.buffer.setBytes(0, buf);
       out.buffer.setIndex(0, buf.length);
 
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/TDigestFunctions.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/TDigestFunctions.java
index bfcf78d..f8f734c 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/TDigestFunctions.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/TDigestFunctions.java
@@ -87,7 +87,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -146,7 +146,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -201,7 +201,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -260,7 +260,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -315,7 +315,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -374,7 +374,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -429,7 +429,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -488,7 +488,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -543,7 +543,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -602,7 +602,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -657,7 +657,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -716,7 +716,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -771,7 +771,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -830,7 +830,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -885,7 +885,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -944,7 +944,7 @@ public class TDigestFunctions {
             int size = tdigest.smallByteSize();
             java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
             tdigest.asSmallBytes(byteBuf);
-            out.buffer = buffer.reallocIfNeeded(size);
+            out.buffer = buffer = buffer.reallocIfNeeded(size);
             out.start = 0;
             out.end = size;
             out.buffer.setBytes(0, byteBuf.array());
@@ -1125,7 +1125,7 @@ public class TDigestFunctions {
           int size = tdigest.smallByteSize();
           java.nio.ByteBuffer byteBuf = java.nio.ByteBuffer.allocate(size);
           tdigest.asSmallBytes(byteBuf);
-          out.buffer = buffer.reallocIfNeeded(size);
+          out.buffer = buffer = buffer.reallocIfNeeded(size);
           out.start = 0;
           out.end = size;
           out.buffer.setBytes(0, byteBuf.array());
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java 
b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
index c913888..f0a7959 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
@@ -24,8 +24,10 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.drill.categories.UnlikelyTest;
 import org.apache.drill.common.exceptions.UserException;
+import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.planner.physical.PlannerSettings;
 import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableList;
 import org.apache.drill.test.BaseTestQuery;
@@ -316,4 +318,19 @@ public class TestBugFixes extends BaseTestQuery {
     rows = testSql("SELECT FLATTEN(data) AS d FROM cp.`jsoninput/bug6318.json` 
LIMIT 3 OFFSET 5");
     Assert.assertEquals(3, rows);
   }
+
+  @Test
+  public void testDRILL6547() throws Exception {
+    String str1 = StringUtils.repeat('a', Types.MAX_VARCHAR_LENGTH);
+    String str2 = StringUtils.repeat('b', Types.MAX_VARCHAR_LENGTH * 2);
+    testBuilder()
+        .sqlQuery("select\n" +
+            "concat(cast(null as varchar), EXPR$0) as c1\n" +
+            "from (values('%1$s'), ('%2$s'))", str1, str2)
+        .ordered()
+        .baselineColumns("c1")
+        .baselineValuesForSingleColumn(str1, str2)
+        .build()
+        .run();
+  }
 }

Reply via email to