Há um terceiro tipo de função, ao qual a função ‘arrayJoin’ pertence. E as funções de tabela também podem ser mencionadas separadamente.
Tipagem forte
Eliminação de subexpressões comuns
Tipos de resultados
Constantes
Processamento de NULL
- Se pelo menos um dos argumentos da função for
NULL, o resultado da função também seráNULL. - Comportamento especial, especificado individualmente na descrição de cada função. No código-fonte do ClickHouse, essas funções têm
UseDefaultImplementationForNulls=false.
Constância
Funções de ordem superior
Operador -> e funções lambda(params, expr)
->. O lado esquerdo da seta contém um parâmetro formal, que pode ser qualquer ID, ou vários parâmetros formais — quaisquer IDs em uma tupla. O lado direito da seta contém uma expressão que pode usar esses parâmetros formais, bem como quaisquer colunas da tabela.
Exemplos:
Nomes de funções simples como lambdas
arrayMap(plus, ...) usa aridade 2 porque plus recebe dois argumentos, então também funciona com entradas em tupla, como arrayMap(plus, [(1, 10), (2, 20)]), em que os elementos da tupla são desempacotados nos argumentos da lambda.
Para funções internas variádicas (como concat, que aceita qualquer número de argumentos), a aridade da lambda passa a ser o número de argumentos de array. Isso está correto para funções de ordem superior como arrayMap, arrayFilter e arrayFold. Para funções de ordem superior que aceitam parâmetros fixos que não são arrays além dos arrays — por exemplo, arrayPartialSort(f, limit, arr) — nomes de funções variádicas sem lambda explícita podem produzir a aridade errada; nesse caso, é necessária uma lambda explícita.
Funções internas variádicas também não desempacotam automaticamente entradas em tupla. Por exemplo, arrayMap(concat, [('a', 'b'), ('c', 'd')]) é reescrito como uma lambda unária e não é equivalente a arrayMap((x, y) -> concat(x, y), [('a', 'b'), ('c', 'd')]). Use uma lambda explícita quando quiser desestruturar elementos da tupla em uma chamada variádica.