#sql #apache-calcite
#sql #apache-calcite
Вопрос:
Я использую Apache Calcite для проверки SQL. Я добавляю таблицы и UDFS динамически. Проблема в том, что когда я добавляю UDF с параметром variable number, валидатор не может найти эту функцию.
Версия Calcite 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 — это скалярная функция с параметром с переменным номером, 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)
...
Похоже, что calcite преобразует тип массива java в SqlTypeName.Другое.
Я попытался переопределить метод «createJavaType» в JavaTypeFactoryImpl следующим образом:
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 с параметром variable number и что мне следует делать.
Комментарии:
1. Что произошло, когда вы говорите, что ваши изменения в
createJavaType
«не сработали»?2. По-прежнему «Не найдено соответствия для подписи функции testfunc», независимо от того, сколько параметров существует для testfunc. @MichaelMior