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

volodymyr 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 4e3cc06  DRILL-7867: Allow using required arguments for functions with 
nullable parameters
4e3cc06 is described below

commit 4e3cc06557283904092e6f9b82443a9091da794d
Author: Volodymyr Vysotskyi <[email protected]>
AuthorDate: Sun Feb 21 14:48:44 2021 +0200

    DRILL-7867: Allow using required arguments for functions with nullable 
parameters
---
 .../drill/exec/expr/fn/impl/StringFunctions.java   | 43 +---------------------
 .../apache/drill/exec/resolver/TypeCastRules.java  | 10 +++--
 2 files changed, 8 insertions(+), 45 deletions(-)

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 7b2aaba..22edb47 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
@@ -37,6 +37,7 @@ import 
org.apache.drill.exec.expr.holders.NullableVarCharHolder;
 import org.apache.drill.exec.expr.holders.VarBinaryHolder;
 import org.apache.drill.exec.expr.holders.VarCharHolder;
 import org.apache.drill.exec.physical.impl.project.OutputSizeEstimateConstants;
+import org.apache.drill.exec.vector.complex.writer.BaseWriter.ComplexWriter;
 
 import javax.inject.Inject;
 import java.nio.charset.Charset;
@@ -1360,46 +1361,6 @@ public class StringFunctions{
 
   @FunctionTemplate(name = "split", scope = FunctionScope.SIMPLE,
       outputWidthCalculatorType = 
OutputWidthCalculatorType.CUSTOM_FIXED_WIDTH_DEFAULT)
-  public static class Split implements DrillSimpleFunc {
-    @Param VarCharHolder in;
-    @Param VarCharHolder delimiter;
-
-    @Workspace com.google.common.base.Splitter splitter;
-    @Inject DrillBuf buffer;
-
-    @Output 
org.apache.drill.exec.vector.complex.writer.BaseWriter.ComplexWriter writer;
-
-    @Override
-    public void setup() {
-      int len = delimiter.end - delimiter.start;
-      if (len != 1) {
-        throw new IllegalArgumentException("Only single character delimiters 
are supported for split()");
-      }
-      char splitChar = 
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.
-          toStringFromUTF8(delimiter.start, delimiter.end, 
delimiter.buffer).charAt(0);
-      splitter = com.google.common.base.Splitter.on(splitChar);
-    }
-
-    @Override
-    public void eval() {
-      String inputString =
-          
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(in.start,
 in.end, in.buffer);
-      // Convert the iterable to an array as Janino will not handle generics.
-      Object[] tokens = 
com.google.common.collect.Iterables.toArray(splitter.split(inputString), 
String.class);
-      org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter list = 
writer.rootAsList();
-      list.startList();
-      for (Object token : tokens) {
-        final byte[] strBytes = ((String) 
token).getBytes(com.google.common.base.Charsets.UTF_8);
-        buffer = buffer.reallocIfNeeded(strBytes.length);
-        buffer.setBytes(0, strBytes);
-        list.varChar().writeVarChar(0, strBytes.length, buffer);
-      }
-      list.endList();
-    }
-  }
-
-  @FunctionTemplate(name = "split", scope = FunctionScope.SIMPLE,
-      outputWidthCalculatorType = 
OutputWidthCalculatorType.CUSTOM_FIXED_WIDTH_DEFAULT)
   public static class SplitNullableInput implements DrillSimpleFunc {
     @Param NullableVarCharHolder in;
     @Param VarCharHolder delimiter;
@@ -1407,7 +1368,7 @@ public class StringFunctions{
     @Workspace com.google.common.base.Splitter splitter;
     @Inject DrillBuf buffer;
 
-    @Output 
org.apache.drill.exec.vector.complex.writer.BaseWriter.ComplexWriter writer;
+    @Output ComplexWriter writer;
 
     @Override
     public void setup() {
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
index 9baf6c5..b617572 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
@@ -683,14 +683,16 @@ public class TypeCastRules {
     rules.put(MinorType.DICT, Sets.newHashSet(MinorType.DICT));
   }
 
-  public static boolean isCastableWithNullHandling(MajorType from, MajorType 
to, NullHandling nullHandling) {
-    if ((from.getMode() == DataMode.REPEATED || to.getMode() == 
DataMode.REPEATED) && from.getMode() != to.getMode()) {
+  public static boolean isCastableWithNullHandling(MajorType argumentType, 
MajorType paramType, NullHandling nullHandling) {
+    if ((argumentType.getMode() == DataMode.REPEATED || paramType.getMode() == 
DataMode.REPEATED) && argumentType.getMode() != paramType.getMode()) {
       return false;
     }
-    if (nullHandling == NullHandling.INTERNAL && from.getMode() != 
to.getMode()) {
+    // allow using functions with nullable parameters for required arguments 
only for the case of data mode mismatch
+    if (nullHandling == NullHandling.INTERNAL && argumentType.getMode() != 
paramType.getMode()
+        && (paramType.getMode() != DataMode.OPTIONAL || argumentType.getMode() 
!= DataMode.REQUIRED)) {
       return false;
     }
-    return isCastable(from.getMinorType(), to.getMinorType());
+    return isCastable(argumentType.getMinorType(), paramType.getMinorType());
   }
 
   public static boolean isCastable(MinorType from, MinorType to) {

Reply via email to