我正在使用 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);
}
}
但它没有用。
Calcite 是否支持带有可变数字参数的 UDF,我该怎么办。