Alteração incompatível com versões anteriores
- Agora é permitido escrever
SETTINGSantes deFORMATem uma cadeia de consultas comUNIONquando as subconsultas estão entre parênteses. Isso fecha #39712. A alteração muda o comportamento quando uma consulta tem a cláusulaSETTINGSespecificada duas vezes em sequência. A cláusulaSETTINGSmais próxima terá preferência para a subconsulta correspondente. Nas versões anteriores, a cláusulaSETTINGSmais externa podia ter preferência sobre a interna. #60197#68614 (Alexey Milovidov). - Reimplementa o tipo Dynamic. Agora, quando o limite de tipos de dados dinâmicos é atingido, novos tipos não são convertidos em String, mas armazenados em uma estrutura de dados especial em formato binário, com o tipo de dado codificado em binário. Agora, qualquer tipo já inserido em uma coluna Dynamic pode ser lido dela como subcoluna. #68132 (Pavel Kruglov).
- Expressões como
a[b].cagora têm suporte para tuplas nomeadas, assim como subscritos nomeados em expressões arbitrárias, por exemplo,expr().name. Isso é útil para processar JSON. Isso fecha #54965. Nas versões anteriores, uma expressão na formaexpr().nameera analisada comotupleElement(expr(), name), e o analisador de consultas procurava uma colunanameem vez do elemento de tupla correspondente; já na nova versão, isso foi alterado paratupleElement(expr(), 'name'). Na maioria dos casos, a versão anterior não funcionava, mas é possível imaginar um cenário muito incomum em que essa mudança poderia levar a incompatibilidade: se você armazenasse nomes de elementos de tupla em uma coluna ou alias com nome diferente do nome do elemento da tupla:SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a. É muito improvável que você tenha usado consultas assim, mas ainda assim precisamos marcar essa alteração como potencialmente incompatível com versões anteriores. #68435 (Alexey Milovidov). - Quando a configuração
print_pretty_type_namesestá habilitada, ela passará a exibir o tipo de dadoTupleem formato Pretty nas instruçõesSHOW CREATE TABLE, na funçãoformatQuerye no modo interativo emclickhouse-clienteclickhouse-local. Nas versões anteriores, essa configuração era aplicada apenas a consultasDESCRIBEe atoTypeName. Isso fecha #65753. #68492 (Alexey Milovidov). - A reordenação das condições de filtro da cláusula
[PRE]WHEREagora é permitida por padrão. Isso pode ser desabilitado definindoallow_reorder_prewhere_conditionscomofalse. #70657 (Nikita Taranov). - Corrige a otimização
optimize_functions_to_subcolumns(antes, ela podia levar ao erroInvalid column type for ColumnUnique::insertRangeFrom. Expected String, got LowCardinality(String)), preservando o tipoLowCardinalityemmapKeys/mapValues. #70716 (Azat Khuzhin).
Novo recurso
- Views materializadas atualizáveis estão prontas para produção. #70550 (Michael Kolupaev). Views materializadas atualizáveis agora têm suporte em bancos de dados Replicated. #60669 (Michael Kolupaev).
- A função
toStartOfInterval()agora tem uma nova sobrecarga que emula a funçãotime_bucket()do TimescaleDB e, de forma equivalente, a funçãodate_bin()do PostgreSQL. (#55619). Ela permite alinhar valores de data ou timestamp a múltiplos de um determinado intervalo a partir de uma origem arbitrária (em vez de usar 0000-01-01 00:00:00.000 como origem fixa). Por exemplo,SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'));retorna2023-01-01 14:44:30, que corresponde a um múltiplo de intervalos de 1 minuto, a partir da origem2023-01-01 14:35:30. #56738 (Yarik Briukhovetskyi). - Integração com MongoDB refatorada: migração para o novo driver mongocxx em substituição ao obsoleto Poco::MongoDB, remoção do suporte ao protocolo antigo obsoleto, suporte à conexão por URI, suporte a todos os tipos do MongoDB, suporte a instruções WHERE e ORDER BY no MongoDB, restrição para expressões não suportadas pelo MongoDB. #63279 (Kirill Nikiforov).
- Uma nova opção
--progress-tableno clickhouse-client exibe uma tabela com métricas que variam durante a execução da consulta; a nova opção--enable-progress-table-toggleestá associada à opção--progress-tablee alterna a exibição da tabela de progresso ao pressionar a tecla de controle (Espaço). #63689 (Maria Khristenko). - Isso permite conceder acesso a prefixos com curinga.
GRANT SELECT ON db.table_pefix_* TO user. #65311 (pufit). - Introduzido o formato JSONCompactWithProgress, no qual o ClickHouse retorna cada linha como um objeto JSON delimitado por quebras de linha, incluindo metadados, dados, progresso, totais e estatísticas. #66205 (Alexey Korepanov).
- Adiciona system.query_metric_log, que contém o histórico de valores de memória e métricas da tabela system.events para consultas individuais, gravado periodicamente em disco. #66532 (Pablo Marcos).
- Adiciona a configuração
input_format_json_empty_as_default, que, quando habilitada, trata campos vazios em entradas JSON como valores padrão. Fecha #59339. #66782 (Alexis Arnaud). - Foram adicionadas as funções
overlayeoverlayUTF8, que substituem partes de uma string por outra. Exemplo:SELECT overlay('Hello New York', 'Jersey', 11)retornaHello New Jersey. #66933 (李扬). - Adicionado novo comando: exclusão leve em partição
DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr;``` VM-114-29-tos :) select * from ads_app_poster_ip_source_channel_di_replicated_local;. #67805 (sunny). - Implementada a comparação de valores do tipo de dados
Interval, de modo que agora eles são convertidos para o supertipo comum mínimo. #68057 (Yarik Briukhovetskyi). - Adiciona a configuração create_if_not_exists para usar por padrão o comportamento IF NOT EXISTS durante instruções CREATE. #68164 (Peter Nguyen).
- Permite ler tabelas Iceberg no Azure e localmente. #68210 (Daniil Ivanik).
- Adicionadas as funções de agregação distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes para uma melhor introspecção do conteúdo do tipo de coluna JSON. #68463 (Pavel Kruglov).
- As entradas do cache de consultas agora podem ser removidas por tag. Por exemplo, a entrada do cache de consultas criada por
SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc'agora pode ser removida comSYSTEM DROP QUERY CACHE TAG 'abc'(ou, claro, simplesmente comSYSTEM DROP QUERY CACHE, que limpará todo o cache de consultas). #68477 (Michał Tabaszewski). - Uma consulta
SELECTsimples pode ser escrita comSELECTimplícito para permitir expressões no estilo de calculadora, por exemplo,ch "1 + 2". Isso é controlado por uma nova configuração,implicit_select. #68502 (Alexey Milovidov). - Adicionar suporte ao modo —copy no clickhouse local como atalho para conversão de formato #68503. #68583 (Denis Hananein).
- Adicionada a função
ripeMD160, que calcula o hash criptográfico RIPEMD-160 de uma cadeia de caracteres. Exemplo:SELECT hex(ripeMD160('The quick brown fox jumps over the lazy dog'))retorna37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #68639 (Dergousov Maxim). - Adiciona a coluna virtual _headers ao mecanismo de tabela URL. Fecha #65026. #68867 (flynn).
- Adicionada a tabela
system.projectionspara acompanhar as projeções disponíveis. #68901 (Jordi Villar). - Adicionado suporte à função
arrayUnion. #68989 (Peter Nguyen). - Adicionar a nova função
arrayZipUnalignedpara garantir compatibilidade com o Spark(arrays_zip), permitindo arrays não alinhados com base naarrayZiporiginal. ``` sql SELECT arrayZipUnaligned([1], [1, 2, 3]). #69030 (李扬). - Suporte à função de agregação
quantileExactWeightedInterpolated, que é uma versão interpolada baseada emquantileExactWeighted. Algumas pessoas podem se perguntar por que precisamos de uma novaquantileExactWeightedInterpolated, já que já temosquantileExactInterpolatedWeighted. O motivo é que a nova é mais precisa do que a antiga. Além disso, ela serve para compatibilidade com o Spark no Apache Gluten. #69619 (李扬). - Suporte à função arrayElementOrNull. Ela retorna null se o índice do array estiver fora do intervalo ou se a chave do map não for encontrada. #69646 (李扬).
- Suporte ao tipo Dynamic na maioria das funções, executando-as sobre os tipos internos do Dynamic. #69691 (Pavel Kruglov).
- Adiciona o argumento
scale(padrão:true) à funçãoarrayAUC, permitindo pular a etapa de normalização (issue #69609). #69717 (gabrielmcg44). - A função
RIPEMD160foi adicionada novamente e calcula o hash criptográfico RIPEMD-160 de uma string. Exemplo:SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog'))retorna37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #70087 (Dergousov Maxim). - Permite armazenar em cache os arquivos lidos para motores de tabela com armazenamento de objetos e lagos de dados, usando o hash do ETag + caminho do arquivo como chave de cache. #70135 (Kseniia Sumarokova).
- Suporte à leitura de tabelas Iceberg no HDFS. #70268 (flynn).
- Permitir ler/gravar o tipo JSON como string binária no formato RowBinary com as configurações
input_format_binary_read_json_as_string/output_format_binary_write_json_as_string. #70288 (Pavel Kruglov). - Permite serializar/desserializar uma coluna JSON como uma única coluna String no formato Native. Na saída, use a configuração
output_format_native_write_json_as_string. Na entrada, use a versão de serialização1antes dos dados da coluna. #70312 (Pavel Kruglov). - Adiciona suporte a CTE padrão,
with insert, já que antes havia suporte apenas ainsert ... with .... #70593 (Shichao Jin).