[ 
https://issues.apache.org/jira/browse/DRILL-5330?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15923125#comment-15923125
 ] 

ASF GitHub Bot commented on DRILL-5330:
---------------------------------------

Github user paul-rogers commented on a diff in the pull request:

    https://github.com/apache/drill/pull/777#discussion_r105792412
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
 ---
    @@ -160,7 +168,7 @@ public DrillFuncHolder 
findDrillFunction(FunctionResolver functionResolver, Func
         FunctionResolver exactResolver = 
FunctionResolverFactory.getExactResolver(functionCall);
         DrillFuncHolder holder = exactResolver.getBestMatch(functions, 
functionCall);
     
    -    if (holder == null) {
    +    if (holder == null && useDynamicUdfs) {
    --- End diff --
    
    Ah, now I see what's happening (I hope...) I pushed another commit that 
makes the suggested changes. 
    
    I wonder, do we have any unit tests for the ambiguous-function case? The 
unit tests passed with both the original and this new version, so I wonder if 
we have a hole in our test coverage?


> NPE in FunctionImplementationRegistry.functionReplacement()
> -----------------------------------------------------------
>
>                 Key: DRILL-5330
>                 URL: https://issues.apache.org/jira/browse/DRILL-5330
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.10.0
>            Reporter: Paul Rogers
>            Assignee: Paul Rogers
>             Fix For: 1.11.0
>
>
> The code in {{FunctionImplementationRegistry.functionReplacement()}} will 
> produce an NPE if ever it is called:
> {code}
>           if (optionManager != null
>               && optionManager.getOption(
>                    ExecConstants.CAST_TO_NULLABLE_NUMERIC).bool_val
>               ...
> {code}
> If an option manager is provided, then get the specified option. The option 
> manager will contain a value for that option only if the user has explicitly 
> set that option. Suppose the user had not set the option. Then the return 
> from {{getOption()}} will be null.
> The next thing we do is *assume* that the option exists and is a boolean by 
> dereferencing the option. This will trigger an NPE. This NPE was seen in 
> detail-level unit tests.
> The proper way to handle such options is to use an option validator. 
> Strangely, one actually exists in {{ExecConstants}}:
> {code}
>   String CAST_TO_NULLABLE_NUMERIC = 
> "drill.exec.functions.cast_empty_string_to_null";
>   OptionValidator CAST_TO_NULLABLE_NUMERIC_OPTION = new 
> BooleanValidator(CAST_TO_NULLABLE_NUMERIC, false);
> {code}
> Then do:
> {code}
> optionManager.getOption(
>          ExecConstants.CAST_TO_NULLABLE_NUMERIC_OPTION)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to