Hello Drill Devs, 
I'm having an issue with some UDFs I'm working on.   Basically, whenever I 
write a UDF which returns a complex type, List or Map,  Drill does not 
recognize the UDF.  I know that Drill CAN do this, as I have written other UDFs 
that return maps, so I'm a little stumped as to why this is happening.  Here is 
the full stack trace and UDF code.  Any help would be greatly appreciated as 
I'm sure I'm missing some small step somewhere.
Thanks,
-- C

java.lang.Exception: org.apache.drill.common.exceptions.UserRemoteException: 
VALIDATION ERROR: From line 1, column 8 to line 1, column 38: No match found 
for function signature get_mx_records(<CHARACTER>)


[Error Id: 1b745443-e05d-4b7a-ada0-85a5a1f23567 ]
For query: select get_mx_records('216.239.36.21') as record from (values(1))

        at 
org.apache.drill.test.DrillTestWrapper.compareMergedOnHeapVectors(DrillTestWrapper.java:639)
        at 
org.apache.drill.test.DrillTestWrapper.compareOrderedResults(DrillTestWrapper.java:593)
        at org.apache.drill.test.DrillTestWrapper.run(DrillTestWrapper.java:166)
        at org.apache.drill.test.TestBuilder.go(TestBuilder.java:145)
        at 
org.apache.drill.exec.udfs.TestDNSFunctions.testGetMXNames(TestDNSFunctions.java:101)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.drill.exec.rpc.RpcException: 
org.apache.drill.common.exceptions.UserRemoteException: VALIDATION ERROR: From 
line 1, column 8 to line 1, column 38: No match found for function signature 
get_mx_records(<CHARACTER>)


[Error Id: 1b745443-e05d-4b7a-ada0-85a5a1f23567 ]
        at 
org.apache.drill.exec.rpc.RpcException.mapException(RpcException.java:60)
        at 
org.apache.drill.exec.client.DrillClient$ListHoldingResultsListener.getResults(DrillClient.java:881)
        at 
org.apache.drill.exec.client.DrillClient.runQuery(DrillClient.java:583)
        at org.apache.drill.test.QueryBuilder.results(QueryBuilder.java:339)
        at 
org.apache.drill.test.ClusterFixture$FixtureTestServices.testRunAndReturn(ClusterFixture.java:575)
        at 
org.apache.drill.test.DrillTestWrapper.testRunAndReturn(DrillTestWrapper.java:935)
        at 
org.apache.drill.test.DrillTestWrapper.compareMergedOnHeapVectors(DrillTestWrapper.java:607)
        ... 5 more
Caused by: org.apache.drill.common.exceptions.UserRemoteException: VALIDATION 
ERROR: From line 1, column 8 to line 1, column 38: No match found for function 
signature get_mx_records(<CHARACTER>)


   






@FunctionTemplate(name = "get_mx_records",
  scope = FunctionTemplate.FunctionScope.SIMPLE,
  nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)

public static class MXRecordListFunction implements DrillSimpleFunc {

  @Param
  VarCharHolder ipaddress;

  @Output
  BaseWriter.ListWriter out;

  @Inject
  DrillBuf buffer;

  @Override
  public void setup() {

  }

  @Override
  public void eval() {
    String ipString = 
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(ipaddress.start,
 ipaddress.end, ipaddress.buffer);
    String MXRecordName = "";
    VarCharHolder temp = new VarCharHolder();
    out.startList();
    try {
      org.xbill.DNS.Record[] records = new org.xbill.DNS.Lookup("gmail.com", 
Type.MX).run();
      for (int i = 0; i < records.length; i++) {
        org.xbill.DNS.MXRecord mx = (org.xbill.DNS.MXRecord) records[i];
        System.out.println("Nameserver " + mx.getTarget());
        MXRecordName = mx.getTarget().toString();
        temp = new VarCharHolder();

        temp.buffer = buffer;
        temp.start = 0;
        temp.end = MXRecordName.getBytes().length;
        buffer.setBytes(0, MXRecordName.getBytes());

        out.varChar().write(temp);
      }
    } catch(Exception e){
      MXRecordName = "Unknown";
      temp = new VarCharHolder();
      temp.buffer = buffer;
      temp.start = 0;
      temp.end = MXRecordName.getBytes().length;
      buffer.setBytes(0, MXRecordName.getBytes());
      out.varChar();
    }
    out.endList();
  }
}

Reply via email to