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"); + } }
