如何在方解石中添加具有可变数字参数的UDF?

时间:2019-03-26 03:28:00

标签: sql apache-calcite

我正在使用Apache Calcite验证SQL。我动态添加表和UDF。 问题是当我添加带有可变数字参数的UDF时,验证器找不到此函数。

方解石的版本为1.18.0

这是我的代码。

TestfuncFunction.java

public class TestfuncFunction {
    public String testfunc(String... arg0) {
        return null;
    }
}

添加UDF

Function schemafunction = ScalarFunctionImpl.create(TestfuncFunction.class),"testfunc");
SchemaPlus schemaPlus = Frameworks.createRootSchema(true);
schemaPlus.add("testfunc", schemafunction);

SQL

select testfunc(field1, field2) from test_table

testfunc是带有可变数字参数的ScalarFunction,field1和field2是test_table的列。因此,这是合法的SQL。但是验证时出现了CalciteContextException:

No match found for function signature testfunc(<CHARACTER>, <CHARACTER>)

我试图将sql更改为一个这样的参数:

select testfunc(field1) from test_table

并获得此例外

java.lang.AssertionError: No assign rules for OTHER defined
    at org.apache.calcite.sql.type.SqlTypeAssignmentRules.canCastFrom(SqlTypeAssignmentRules.java:386)
    at org.apache.calcite.sql.type.SqlTypeUtil.canCastFrom(SqlTypeUtil.java:864)
    at org.apache.calcite.sql.SqlUtil.lambda$filterRoutinesByParameterType$4(SqlUtil.java:554)
    ...

方解石似乎将java数组类型转换为SqlTypeName.OTHER。 我试图像这样在JavaTypeFactoryImpl中覆盖方法“ createJavaType”:

private static class CustomJavaTypeFactoryImpl extends JavaTypeFactoryImpl {
    @Override
    public RelDataType createJavaType(Class clazz) {
        if (clazz.isArray()) {
            return new ArraySqlType(super.createJavaType(clazz.getComponentType()), true);
        }
        return super.createJavaType(clazz);
    }
}

但是没有用。

方解石是否支持带有可变数字参数的UDF,我应该怎么做。

0 个答案:

没有答案