Как добавить UDF с параметром переменного номера в calcite?

#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