You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@drill.apache.org by "Muhammad Gelbana (JIRA)" <ji...@apache.org> on 2017/01/12 11:31:52 UTC
[jira] [Created] (DRILL-5194) UDF returns NULL as expected only if
the input is a literal
Muhammad Gelbana created DRILL-5194:
---------------------------------------
Summary: UDF returns NULL as expected only if the input is a literal
Key: DRILL-5194
URL: https://issues.apache.org/jira/browse/DRILL-5194
Project: Apache Drill
Issue Type: Bug
Components: Functions - Drill
Affects Versions: 1.9.0
Reporter: Muhammad Gelbana
I defined the following UDF
{code:title=SplitPartFunc.java|borderStyle=solid}
import javax.inject.Inject;
import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.holders.IntHolder;
import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
import org.apache.drill.exec.expr.holders.VarCharHolder;
import io.netty.buffer.DrillBuf;
@FunctionTemplate(name = "split_string", scope = FunctionTemplate.FunctionScope.SIMPLE, nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)
public class SplitPartFunc implements DrillSimpleFunc {
@Param
VarCharHolder input;
@Param(constant = true)
VarCharHolder delimiter;
@Param(constant = true)
IntHolder field;
@Output
NullableVarCharHolder out;
@Inject
DrillBuf buffer;
public void setup() {
}
public void eval() {
String stringValue = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(input.start, input.end, input.buffer);
out.buffer = buffer; //If I return before this statement, a NPE is thrown :(
if(stringValue == null){
return;
}
int fieldValue = field.value;
if(fieldValue <= 0){
return;
}
String delimiterValue = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(delimiter.start, delimiter.end, delimiter.buffer);
if(delimiterValue == null){
return;
}
String[] splittedInput = stringValue.split(delimiterValue);
if(splittedInput.length < fieldValue){
return;
}
// put the output value in the out buffer
String outputValue = splittedInput[fieldValue - 1];
out.start = 0;
out.end = outputValue.getBytes().length;
buffer.setBytes(0, outputValue.getBytes());
out.isSet = 1;
}
}
{code}
If I run the following query on the sample employees.json file (or actually a parquet, after modifying the table and columns names)
{code:title=SQL Query|borderStyle=solid}SELECT full_name, split_string(full_name, ' ', 4), split_string('Whatever', ' ', 4) FROM cp.employee.json LIMIT 1{code}
I get the following result
!https://i.stack.imgur.com/L8uQW.png!
Shouldn't I be getting the column value and null for the other 2 columns ?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)