DRILL-978: Consider output type when we cost matching FunctionCall to 
FunctionHolder


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/9e7b14a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/9e7b14a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/9e7b14a5

Branch: refs/heads/master
Commit: 9e7b14a559e9361e7b6a43cd625571c0c3a72b2e
Parents: c8db346
Author: Mehant Baid <[email protected]>
Authored: Thu Jun 12 18:09:57 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Mon Jun 16 12:44:28 2014 -0700

----------------------------------------------------------------------
 .../org/apache/drill/exec/expr/fn/DrillFuncHolder.java    |  8 ++++++++
 .../org/apache/drill/exec/resolver/TypeCastRules.java     | 10 ++++++++++
 2 files changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/9e7b14a5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
index bbe76de..fd687af 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
@@ -293,4 +293,12 @@ public abstract class DrillFuncHolder {
     }
 
   }
+
+  public boolean matchInputOutputType() {
+    return false;
+  }
+
+  public MajorType getReturnType() {
+    return returnValue.type;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/9e7b14a5/exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
----------------------------------------------------------------------
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 5c5ff80..854342c 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
@@ -794,6 +794,16 @@ public class TypeCastRules {
     // number of arguments that could implicitly casts using precedence map or 
didn't require casting at all
     int nCasts = 0;
 
+    // Check if the function holder requires the input type and output type to 
match
+    if (holder.matchInputOutputType() == true) {
+      MinorType outputType = holder.getReturnType(call.args).getMinorType();
+      for (int i = 0; i < holder.getParamCount(); i++) {
+        if (call.args.get(i).getMajorType().getMinorType() != outputType) {
+          return -1;
+        }
+      }
+    }
+
     for (int i = 0; i < holder.getParamCount(); i++) {
       MajorType argType = call.args.get(i).getMajorType();
       MajorType parmType = holder.getParmMajorType(i);

Reply via email to