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

    https://github.com/apache/drill/pull/574#discussion_r77871026
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
 ---
    @@ -69,29 +72,43 @@ public static PhysicalPlan getPlan(QueryContext 
context, String sql, Pointer<Str
         final SqlHandlerConfig config = new SqlHandlerConfig(context, parser);
     
         switch(sqlNode.getKind()){
    -    case EXPLAIN:
    -      handler = new ExplainHandler(config, textPlan);
    -      break;
    -    case SET_OPTION:
    -      handler = new SetOptionHandler(context);
    -      break;
    -    case OTHER:
    -      if(sqlNode instanceof SqlCreateTable) {
    -        handler = ((DrillSqlCall)sqlNode).getSqlHandler(config, textPlan);
    +      case EXPLAIN:
    +        handler = new ExplainHandler(config, textPlan);
             break;
    -      }
    -
    -      if (sqlNode instanceof DrillSqlCall) {
    -        handler = ((DrillSqlCall)sqlNode).getSqlHandler(config);
    +      case SET_OPTION:
    +        handler = new SetOptionHandler(context);
             break;
    -      }
    -      // fallthrough
    -    default:
    -      handler = new DefaultSqlHandler(config, textPlan);
    +      case OTHER:
    +        if(sqlNode instanceof SqlCreateTable) {
    +          handler = ((DrillSqlCall)sqlNode).getSqlHandler(config, 
textPlan);
    +          break;
    +        }
    +
    +        if (sqlNode instanceof DrillSqlCall) {
    +          handler = ((DrillSqlCall)sqlNode).getSqlHandler(config);
    +          break;
    +        }
    +        // fallthrough
    +      default:
    +        handler = new DefaultSqlHandler(config, textPlan);
         }
     
         try {
    -      return handler.getPlan(sqlNode);
    +      try {
    +        return handler.getPlan(sqlNode);
    +      } catch (UserException e) {
    +        if 
(context.getOption(ExecConstants.DYNAMIC_UDF_SUPPORT_ENABLED).bool_val) {
    +          final Throwable rootCause = ExceptionUtils.getRootCause(e);
    +          if (rootCause instanceof SqlValidatorException
    +              && StringUtils.contains(rootCause.getMessage(), "No match 
found for function signature")) {
    --- End diff --
    
    This is hugely fragile: if anyone changes the text message (to make it 
clearer to the user, say), this code will break. Far better is to introduce a 
new exception class specific to this case. For example, MissingUDFException. 
Catch that in the catch clause. Be sure to document the new exception that it's 
purpose is to trigger auto-reload of UDFs, and that it should be thrown ONLY 
when that behavior is desired.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to