DRILL-699: Allow case insensitive function names in queries.

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

Branch: refs/heads/master
Commit: 7fe8a15b1e638dcad5787360d5b9b955d4dd2f8c
Parents: 5bd7f5f
Author: vkorukanti <[email protected]>
Authored: Mon Jun 16 16:52:28 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Tue Jun 17 16:05:45 2014 -0700

----------------------------------------------------------------------
 .../drill/exec/expr/ExpressionTreeMaterializer.java    |  6 +++---
 .../expr/fn/DrillFunctionImplementationRegistry.java   |  8 +++++++-
 .../drill/exec/expr/fn/FunctionGenerationHelper.java   |  2 +-
 .../expr/fn/HiveFunctionImplementationRegistry.java    | 13 +++++--------
 .../drill/exec/planner/sql/DrillOperatorTable.java     |  2 +-
 .../drill/exec/physical/impl/TestSimpleFunctions.java  |  2 +-
 .../org/apache/drill/jdbc/test/TestFunctionsQuery.java | 11 +++++++++++
 7 files changed, 29 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
index ef6e6dc..18609f8 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
@@ -142,7 +142,7 @@ public class ExpressionTreeMaterializer {
 
       FunctionResolver resolver = FunctionResolverFactory.getResolver(call);
       DrillFuncHolder matchedFuncHolder =
-        
resolver.getBestMatch(registry.getDrillRegistry().getMethods().get(call.getName()),
 call);
+        
resolver.getBestMatch(registry.getDrillRegistry().getMethods(call.getName()), 
call);
 
       if (matchedFuncHolder instanceof DrillComplexWriterFuncHolder && ! 
allowComplexWriter) {
         errorCollector.addGeneralError(call.getPosition(), "Only 
ProjectRecordBatch could have complex writer function. You are using complex 
writer function " + call.getName() + " in a non-project operation!");
@@ -192,7 +192,7 @@ public class ExpressionTreeMaterializer {
 
             FunctionCall castCall = new FunctionCall(castFuncName, castArgs, 
ExpressionPosition.UNKNOWN);
             DrillFuncHolder matchedCastFuncHolder = resolver.getBestMatch(
-              registry.getDrillRegistry().getMethods().get(castFuncName), 
castCall);
+              registry.getDrillRegistry().getMethods(castFuncName), castCall);
 
             if (matchedCastFuncHolder == null) {
               logFunctionResolutionError(errorCollector, castCall);
@@ -326,7 +326,7 @@ public class ExpressionTreeMaterializer {
       FunctionResolver resolver = 
FunctionResolverFactory.getResolver(funcCall);
 
       DrillFuncHolder matchedConvertToNullableFuncHolder =
-          
resolver.getBestMatch(registry.getDrillRegistry().getMethods().get(funcName), 
funcCall);
+          
resolver.getBestMatch(registry.getDrillRegistry().getMethods(funcName), 
funcCall);
 
       if (matchedConvertToNullableFuncHolder == null) {
         logFunctionResolutionError(errorCollector, funcCall);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionImplementationRegistry.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionImplementationRegistry.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionImplementationRegistry.java
index fb2f443..8db2abd 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionImplementationRegistry.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionImplementationRegistry.java
@@ -17,6 +17,7 @@
  */
 package org.apache.drill.exec.expr.fn;
 
+import java.util.List;
 import java.util.Set;
 
 import org.apache.drill.common.config.DrillConfig;
@@ -39,7 +40,7 @@ public class DrillFunctionImplementationRegistry {
       if(holder != null){
         // register handle for each name the function can be referred to
         String[] names = holder.getRegisteredNames();
-        for(String name : names) methods.put(name, holder);
+        for(String name : names) methods.put(name.toLowerCase(), holder);
       }else{
         logger.warn("Unable to initialize function for class {}", 
clazz.getName());
       }
@@ -56,4 +57,9 @@ public class DrillFunctionImplementationRegistry {
   public ArrayListMultimap<String, DrillFuncHolder> getMethods() {
     return this.methods;
   }
+
+  /** Returns functions with given name. Function name is case insensitive. */
+  public List<DrillFuncHolder> getMethods(String name) {
+    return this.methods.get(name.toLowerCase());
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionGenerationHelper.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionGenerationHelper.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionGenerationHelper.java
index 21281be..25eff90 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionGenerationHelper.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionGenerationHelper.java
@@ -58,7 +58,7 @@ public class FunctionGenerationHelper {
       argExpressions.add(new HoldingContainerExpression(c));
     }
     
-    for (DrillFuncHolder h : 
registry.getDrillRegistry().getMethods().get(name)) {
+    for (DrillFuncHolder h : registry.getDrillRegistry().getMethods(name)) {
       if (h.matches(returnType, argTypes)) {
         return new DrillFuncHolderExpr(name, h, argExpressions, 
ExpressionPosition.UNKNOWN);
       }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/HiveFunctionImplementationRegistry.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/HiveFunctionImplementationRegistry.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/HiveFunctionImplementationRegistry.java
index e5c890e..a72b7de 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/HiveFunctionImplementationRegistry.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/HiveFunctionImplementationRegistry.java
@@ -75,12 +75,7 @@ public class HiveFunctionImplementationRegistry {
 
 
     for(int i=0; i<names.length;i++){
-      methods.put(names[i], clazz);
-      if (!names[i].toLowerCase().equals(names[i])) {
-        // After the Optiq-Drill conversion of function calls, function names 
are in lowercase
-        // and we fail to find them in the map. Add a lowercase name entry.
-        methods.put(names[i].toLowerCase(), clazz);
-      }
+      methods.put(names[i].toLowerCase(), clazz);
     }
   }
 
@@ -107,15 +102,17 @@ public class HiveFunctionImplementationRegistry {
       argOIs[i] = 
ObjectInspectorHelper.getDrillObjectInspector(argTypes[i].getMinorType());
     }
 
+    String funcName = call.getName().toLowerCase();
+
     // search in GenericUDF list
-    for(Class<? extends GenericUDF> clazz: 
methodsGenericUDF.get(call.getName())) {
+    for(Class<? extends GenericUDF> clazz: methodsGenericUDF.get(funcName)) {
       holder = matchAndCreateGenericUDFHolder(clazz, argTypes, argOIs);
       if(holder != null)
         return holder;
     }
 
     // search in UDF list
-    for (Class<? extends UDF> clazz : methodsUDF.get(call.getName())) {
+    for (Class<? extends UDF> clazz : methodsUDF.get(funcName)) {
       holder = matchAndCreateUDFHolder(call.getName(), clazz, argTypes, 
argOIs);
       if (holder != null)
         return holder;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillOperatorTable.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillOperatorTable.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillOperatorTable.java
index 772b3b9..29161aa 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillOperatorTable.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillOperatorTable.java
@@ -84,7 +84,7 @@ public class DrillOperatorTable extends SqlStdOperatorTable {
         return;
       }
 
-      List<SqlOperator> drillOps = opMap.get(opName.getSimple());
+      List<SqlOperator> drillOps = opMap.get(opName.getSimple().toLowerCase());
       if(drillOps != null){
         operatorList.addAll(drillOps);
       }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
 
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
index 27a6caa..7adef02 100644
--- 
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
+++ 
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
@@ -143,7 +143,7 @@ public class TestSimpleFunctions extends ExecTest {
         ExpressionPosition.UNKNOWN
     );
     FunctionResolver resolver = FunctionResolverFactory.getResolver(call);
-    DrillFuncHolder matchedFuncHolder = 
resolver.getBestMatch(registry.getDrillRegistry().getMethods().get(call.getName()),
 call);
+    DrillFuncHolder matchedFuncHolder = 
resolver.getBestMatch(registry.getDrillRegistry().getMethods(call.getName()), 
call);
     assertEquals( expectedBestInputMode, 
matchedFuncHolder.getParmMajorType(0).getMode());
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/7fe8a15b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git 
a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java 
b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index d700763..39919a5 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -548,4 +548,15 @@ public class TestFunctionsQuery {
             "EXT_INTDAY=45.1\n");
   }
 
+  @Test
+  public void testFunctionCaseInsensitiveNames() throws Exception {
+    String query = "SELECT to_date('2003/07/09', 'yyyy/MM/dd') as col1, " +
+        "TO_DATE('2003/07/09', 'yyyy/MM/dd') as col2, " +
+        "To_DaTe('2003/07/09', 'yyyy/MM/dd') as col3 " +
+        "from cp.`employee.json` LIMIT 1";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns("col1=2003-07-09; col2=2003-07-09; col3=2003-07-09");
+  }
 }

Reply via email to