Paul Rogers created DRILL-7502:
----------------------------------

             Summary: Incorrect/invalid codegen for typeof() with UNION
                 Key: DRILL-7502
                 URL: https://issues.apache.org/jira/browse/DRILL-7502
             Project: Apache Drill
          Issue Type: Bug
            Reporter: Paul Rogers


The {{typeof()}} function is defined as follows:

{code:java}
  @FunctionTemplate(names = {"typeOf"},
          scope = FunctionTemplate.FunctionScope.SIMPLE,
          nulls = NullHandling.INTERNAL)
  public static class GetType implements DrillSimpleFunc {

    @Param
    FieldReader input;
    @Output
    VarCharHolder out;
    @Inject
    DrillBuf buf;

    @Override
    public void setup() {}

    @Override
    public void eval() {
      String typeName = input.getTypeString();
      byte[] type = typeName.getBytes();
      buf = buf.reallocIfNeeded(type.length);
      buf.setBytes(0, type);
      out.buffer = buf;
      out.start = 0;
      out.end = type.length;
    }
  }
{code}

Note that the {{input}} field is defined as {{FieldReader}} which has a method 
called {{getTypeString()}}. As a result, the code works fine in all existing 
tests in {{TestTypeFns}}.

I tried to add a function to use {{typeof()}} on a column of type {{UNION}}. 
When I did, the query failed with a compile error in generated code:

{noformat}
SYSTEM ERROR: CompileException: Line 42, Column 43: 
  A method named "getTypeString" is not declared in any enclosing class nor any 
supertype, nor through a static import
{noformat}

The stack trace shows the generated code; Note that the type of {{input}} 
changes from a reader to a holder, causing code to be invalid:

{code:java}
public class ProjectorGen0 {

    DrillBuf work0;
    UnionVector vv1;
    VarCharVector vv6;
    DrillBuf work9;
    VarCharVector vv11;
    DrillBuf work14;
    VarCharVector vv16;

    public void doEval(int inIndex, int outIndex)
        throws SchemaChangeException
    {
        {
            UnionHolder out4 = new UnionHolder();
            {
                out4 .isSet = vv1 .getAccessor().isSet((inIndex));
                if (out4 .isSet == 1) {
                    vv1 .getAccessor().get((inIndex), out4);
                }
            }
            //---- start of eval portion of typeOf function. ----//
            VarCharHolder out5 = new VarCharHolder();
            {
                final VarCharHolder out = new VarCharHolder();
                UnionHolder input = out4;
                DrillBuf buf = work0;
                UnionFunctions$GetType_eval:
{
    String typeName = input.getTypeString();
    byte[] type = typeName.getBytes();

    buf = buf.reallocIfNeeded(type.length);
    buf.setBytes(0, type);
    out.buffer = buf;
    out.start = 0;
    out.end = type.length;
}
{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to