Существует и третий тип функций, к которому относится функция ‘arrayJoin’. Кроме того, отдельно можно упомянуть и табличные функции.
Строгая типизация
Устранение общих подвыражений
Типы результатов
Константы
Обработка NULL
- Если хотя бы один из аргументов функции равен
NULL, результат функции также будетNULL. - Особое поведение, которое отдельно указывается в описании каждой функции. В исходном коде ClickHouse для таких функций задано
UseDefaultImplementationForNulls=false.
Константность
Функции высшего порядка
оператор -> и функции lambda(params, expr)
->. В левой части стрелки указывается формальный параметр, которым может быть любой идентификатор, или несколько формальных параметров — любые идентификаторы в кортеже. В правой части стрелки указывается выражение, которое может использовать эти формальные параметры, а также любые столбцы таблицы.
Примеры:
Имена функций как лямбда-выражения
arrayMap(plus, ...) использует арность 2, потому что plus принимает два аргумента, поэтому это также работает с входными кортежами, например arrayMap(plus, [(1, 10), (2, 20)]), где элементы кортежа распаковываются в аргументы лямбда-функции.
Для вариативных внутренних функций (например, concat, которая принимает любое число аргументов) арность лямбда-функции определяется по числу аргументов-массивов. Это корректно для функций высшего порядка, таких как arrayMap, arrayFilter и arrayFold. Для функций высшего порядка, которые помимо массивов принимают фиксированные параметры, не являющиеся массивами, — например, arrayPartialSort(f, limit, arr) — использование имени вариативной функции без лямбды может дать неправильную арность; в этом случае требуется явная лямбда-функция.
Вариативные внутренние функции также не распаковывают входные кортежи автоматически. Например, arrayMap(concat, [('a', 'b'), ('c', 'd')]) переписывается в унарную лямбда-функцию и не эквивалентно arrayMap((x, y) -> concat(x, y), [('a', 'b'), ('c', 'd')]). Используйте явную лямбда-функцию, если хотите деструктурировать элементы кортежа при вариативном вызове.