[
https://issues.apache.org/jira/browse/DRILL-7502?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul Rogers updated DRILL-7502:
-------------------------------
Description:
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}
By contrast, here is the generated code for one of the existing {{TestTypeFns}}
tests where things work:
{code:java}
public class ProjectorGen0
extends ProjectorTemplate
{
DrillBuf work0;
NullableBigIntVector vv1;
VarCharVector vv7;
public ProjectorGen0() {
try {
__DRILL_INIT__();
} catch (SchemaChangeException e) {
throw new UnsupportedOperationException(e);
}
}
public void doEval(int inIndex, int outIndex)
throws SchemaChangeException
{
{
..
//---- start of eval portion of typeOf function. ----//
VarCharHolder out6 = new VarCharHolder();
{
final VarCharHolder out = new VarCharHolder();
FieldReader input = new NullableIntHolderReaderImpl(out5);
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;
}
work0 = buf;
out6 .start = out.start;
out6 .end = out.end;
out6 .buffer = out.buffer;
}
//---- end of eval portion of typeOf function. ----//
{code}
Notice that the {{input}} variable is of type {{FieldReader}} as expected.
was:
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}
> 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
> Priority: Major
>
> 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}
> By contrast, here is the generated code for one of the existing
> {{TestTypeFns}} tests where things work:
> {code:java}
> public class ProjectorGen0
> extends ProjectorTemplate
> {
> DrillBuf work0;
> NullableBigIntVector vv1;
> VarCharVector vv7;
> public ProjectorGen0() {
> try {
> __DRILL_INIT__();
> } catch (SchemaChangeException e) {
> throw new UnsupportedOperationException(e);
> }
> }
> public void doEval(int inIndex, int outIndex)
> throws SchemaChangeException
> {
> {
> ..
> //---- start of eval portion of typeOf function. ----//
> VarCharHolder out6 = new VarCharHolder();
> {
> final VarCharHolder out = new VarCharHolder();
> FieldReader input = new NullableIntHolderReaderImpl(out5);
> 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;
> }
> work0 = buf;
> out6 .start = out.start;
> out6 .end = out.end;
> out6 .buffer = out.buffer;
> }
> //---- end of eval portion of typeOf function. ----//
> {code}
> Notice that the {{input}} variable is of type {{FieldReader}} as expected.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)