Не найдено совпадений для сигнатуры функции, когда для NullHandling установлено значение INTERNAL - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь реализовать пользовательскую функцию для Apache Drill.

Функция принимает аргументы с плавающей запятой ( десятичные дроби не работают ), и они должны быть обнуляемыми, чтобы возвращать нули.

Однако, когда я использую NullHandling.Internal и устанавливаю параметры как типы, допускающие значение NULL, функция больше не может быть вызвана.

SELECT tetsting_udf(1.23,4.56);

ОШИБКА ВАЛИДАЦИИ: (...): не найдено совпадений для сигнатуры функции TESTING_UDF (, )

SELECT tetsting_udf(cast(1.23 as float), cast(4.56 as float));

ОШИБКА ВАЛИДАЦИИ: (...): не найдено совпадений для сигнатуры функции TESTING_UDF (, )

Когда используются Float8Holders и NullHandling.NULL_IF_NULL, оба вышеуказанных вызова работают.

Что я делаю не так?


@FunctionTemplate(
        name = "testing_udf",
        scope = FunctionTemplate.FunctionScope.SIMPLE,
        nulls = FunctionTemplate.NullHandling.INTERNAL
)
public class TestingFunction implements DrillSimpleFunc {

     @Param
         NullableFloat8Holder numberA;
     @Param
         NullableFloat8Holder numberB;
     @Output

     Float8Holder out;

     public void setup() {
     }

     public void eval() {
         // Whatever
     }
}

1 Ответ

1 голос
/ 04 июля 2019

Для случая, когда указано FunctionTemplate.NullHandling.INTERNAL, должны быть указаны реализации UDF со всеми комбинациями обнуляемости. Для вашего случая вы должны указать UDF, которые принимают (Float8Holder и Float8Holder), (NullableFloat8Holder и NullableFloat8Holder), (Float8Holder и NullableFloat8Holder), (NullableFloat8Holder и Float8Holder).

...