Skip to main content

Alterações incompatíveis com versões anteriores

Mudanças em consultas e sintaxe

  • O operador IN agora usa semântica de valores exatos para o tipo Bool: apenas 0 e 1 no conjunto correspondem a valores Bool. Antes, valores numéricos maiores que 255 no conjunto IN eram incorretamente convertidos para true, então SELECT CAST(1, 'Bool') IN (256) retornava 1. Agora, retorna corretamente 0. #93115 (Ashrith Bandla).
  • Corrigida a precedência do operador NOT para corresponder ao padrão SQL: NOT agora tem precedência menor que IS NULL, BETWEEN, LIKE e operadores aritméticos. Por exemplo, NOT (x) IS NULL agora é interpretado como NOT (x IS NULL) em vez de (NOT x) IS NULL. Isso pode alterar o resultado de consultas que dependiam do comportamento anterior (fora do padrão). #97680 (Alexey Milovidov).
  • SELECT não é mais permitido como identificador sem aspas em um elemento da lista de expressões WITH. #101059 (Aruj Bansal).
  • O operador IN agora rejeita conversões com perda de Decimal dentro de tipos compostos (Tuple, Array, Map), tornando seu comportamento consistente com comparações escalares no nível superior. Antes, as verificações de precisão eram aplicadas apenas a valores escalares no nível superior: por exemplo, CAST('33.3', 'Decimal64(1)') IN (33.33) retornava corretamente 0, mas CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) retornava incorretamente 1. Agora, ambos os casos retornam corretamente 0. #101812 (Nihal Z. Miaji).

Alterações em tipos de dados

  • As versões de serialização dos tipos de dados agora são propagadas para tipos de dados aninhados. Por exemplo, a versão de serialização with_size_stream de String antes era aplicada apenas a colunas String de nível superior e a elementos de Tuple; agora, ela é aplicada a qualquer tipo String dentro de qualquer tipo aninhado, como Array, Map, Variant ou JSON. Isso é controlado pela configuração do MergeTree propagate_types_serialization_versions_to_nested_types, que agora vem habilitada por padrão. Após essa alteração, partes de dados recém-criadas não podem ser lidas por versões mais antigas, mas partes antigas podem ser lidas na nova versão. As atualizações são seguras, mas as reversões para versões anteriores não. #94859 (Pavel Kruglov).
  • Corrigida a ordem dos bytes da serialização binária de QBit para usar o formato little-endian. #101378 (Raufs Dunamalijevs).

Alterações em armazenamento e índices

  • Corrigidos os metadados das projeções normais para que projeções com chaves de ordenação de várias colunas sejam reconhecidas corretamente. #91352 (Amos Bird).
  • Corrigidos os arquivos de skip index que não respeitavam a configuração replace_long_file_name_to_hash, o que causava erros de “Nome de arquivo muito longo” e falhas nas leituras de índice para índices com nomes longos. Os nomes de arquivo de skip index agora passam por hash quando excedem max_file_name_length, de forma semelhante aos arquivos de coluna. Isso é retrocompatível (novos servidores leem partes antigas), mas fazer downgrade (ou usar servidores antigos durante um rolling upgrade) pode fazer com que índices com nomes longos sejam ignorados. #97128 (Raúl Marín).

Funcionalidades removidas

  • Removido o tipo de skip index hypothesis. Era uma funcionalidade experimental pouco conhecida, com utilidade prática limitada. Criar tabelas com INDEX ... TYPE hypothesis agora gera um erro. #96874 (Alexey Milovidov).
  • Removida a função experimental detectProgrammingLanguage. #99567 (Alexey Milovidov).

Alterações em Settings e na configuração

  • O valor padrão de mysql_datatypes_support_level foi alterado de vazio para decimal,datetime64,date2Date32, habilitando por padrão o mapeamento correto de DATE do MySQL para Date32, de DECIMAL/NUMERIC para Decimal e de DATETIME/TIMESTAMP com precisão para DateTime64. Anteriormente, colunas DATE do MySQL eram mapeadas para Date, que não consegue representar datas anteriores a 1970-01-01, causando corrupção de dados. #97716 (Alexey Milovidov).

Alterações em inserção e desduplicação

  • A inserção assíncrona agora vem ativado por padrão — o ClickHouse agrupa todas as inserções pequenas em lotes por padrão. Isso é controlado pela configuração compatibility: definir compatibility como uma versão inferior a 26.2 restaura o valor padrão anterior, false. As inserções assíncronas podem ser ativadas ou desativadas em vários níveis: nos perfis de usuário da config, na sessão, na consulta ou na tabela MergeTree. #97590 (Sema Checherinda).

Alterações em tabelas de sistema

Outras alterações incompatíveis

  • mergeTreeAnalyzeIndexes{,UUID} agora aceita um array de nomes de partes em vez de uma regexp, já que expressões regulares são lentas (funcionalidade experimental). #98474 (Azat Khuzhin).
  • A biblioteca H3 foi atualizada para a v4, o que melhora a precisão dos cálculos de comprimento, área e outras métricas. Esta alteração não é compatível com versões anteriores porque os novos resultados diferem dos anteriores. #100348 (Alexey Milovidov).
  • Foi alterada a forma como a tabela Merge lida com colunas virtuais. Se a tabela subjacente contiver _table ou _database, essas colunas serão lidas do armazenamento; caso contrário, serão preenchidas após a etapa de leitura, usando a etapa de expressão. #101742 (Mikhail Artemenko).

Novos recursos

Funções

  • Adicionada a função naturalSortKey(s) para chaves de ordenação natural. #90322 (Nazarii Piontko).
  • Adicionada a função arrayAutocorrelation(arr [, max_lag]), que calcula a autocorrelação normalizada de um array numérico para cada defasagem. Suporta arrays dos tipos inteiro, Float e Decimal. #94776 (Wenyu Chen).
  • A função has() agora é compatível com o tipo JSON para verificar a existência de caminhos, de forma semelhante a Map. #96927 (DQ).
  • Adicionada a table function mergeTreeTextIndex(database, table, index), que lê dados diretamente de um índice de texto. Ela pode ser usada para introspecção ou para executar agregações sobre dados do índice de texto. #97003 (Anton Popov).
  • Adicionada a função SQL obfuscateQuery. #98305 (Xuewei Wang).
  • Adicionadas as funções caseFoldUTF8 e removeDiacriticsUTF8 para case folding de Unicode e remoção de marcas diacríticas. #98973 (George Larionov).
  • A função printf agora suporta format strings não constantes, permitindo um padrão de formato diferente por linha com base nos valores das colunas. #98991 (Yash).
  • Adicionada a função highlight(), que envolve ocorrências de termos de busca em uma string de texto com tags HTML (por padrão, <em>/</em>). Suporta correspondência ASCII sem diferenciar maiúsculas de minúsculas, mesclagem automática de correspondências sobrepostas e tags personalizadas de abertura/fechamento. #99131 (Peng).
  • Adicionada a função de string normalizeUTF8NFKCCasefold para normalização Unicode NFKC_Casefold, que combina a normalização NFKC com case folding. #99276 (George Larionov).
  • Adicionado o tokenizer unicode_word para full-text indexes e a função tokens. Ele divide o texto usando regras de fronteira de palavras do Unicode: palavras ASCII são formadas com caracteres conectores (underscore, dois-pontos, ponto, aspas simples), enquanto caracteres Unicode não ASCII se tornam tokens de um único caractere. As stop words configuráveis usam, por padrão, pontuação CJK comum. #99357 (Amos Bird).
  • Adicionada a função arrayTranspose, que recebe um array bidimensional (matriz) e o transpõe. #101214 (Vitaly Baranov).
  • Adicionada a função hasPhrase (alias matchPhrase) para busca por frase (sequências contínuas de tokens). A busca é por brute-force e ainda não é compatível com o índice de texto. #101997 (Elmi Ahmadov).
  • Adicionado dotProduct como função de distância compatível para índices de similaridade vetorial. A direção de ordenação agora é validada para todas as funções de distância para evitar resultados silenciosamente incorretos. #102254 (Renzo).
  • A função stem agora pode aplicar stemming a todas as palavras/tokens em colunas String, FixedString, Array([Fixed]String), Nullable, LowCardinality e Const. #99137 (Jimmy Aguilar Mena).
  • A função stem deixou de ser experimental (antes, era necessário habilitar allow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena).
  • Adicionada a função JSONAllValues, que retorna todos os valores de uma coluna JSON como Array(String), com os valores serializados em representação textual e ordenados pelos nomes de seus caminhos. Também foi adicionado suporte a índice de texto para a expressão JSONAllValues em colunas JSON: quando um índice de texto é criado em JSONAllValues(json_column), ele é usado automaticamente para filtrar consultas em subcolunas JSON (por exemplo, json_column.key1 = 'value'). #100730 (Anton Popov).
  • Adicionadas unidades compatíveis com PostgreSQL ao operador EXTRACT: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE e MILLENNIUM. Também foi corrigido EXTRACT(WEEK FROM date), que antes gerava um erro. #100274 (Alexey Milovidov).
  • Adicionado suporte à função toDaysInMonth() por meio de açúcar sintático no parser para a sintaxe da função OVERLAY padrão SQL. A função overlay já existe; isso adiciona suporte à forma baseada em palavras-chave usando PLACING, FROM e FOR como separadores. #101681 (Desel72).
  • Valores Date e Date32 agora podem ser somados a valores Time e Time64 usando o operador +, produzindo um resultado DateTime ou DateTime64. Por exemplo, SELECT toDate('2024-01-15') + toTime('14:30:25') retorna 2024-01-15 14:30:25. O resultado é calculado no fuso horário da sessão, e resultados fora do intervalo são tratados de acordo com a configuração date_time_overflow_behavior. #102421 (Nihal Z. Miaji).

Recursos de SQL e de consultas

  • Quando um parâmetro tem o tipo Nullable e não é especificado, agora presume-se que seu valor seja NULL. #93869 (Vikash Kumar).
  • O ClickHouse agora pode descartar partes de dados inteiras em consultas SELECT com base em estatísticas de mín./máx. #94140 (zoomxi).
  • Adicionado suporte a CTEs materializadas, que avaliam CTEs apenas uma vez durante a execução da consulta e armazenam seus resultados em tabelas temporárias. #94849 (Dmitry Novik).
  • Certas funções agora podem ser usadas sem parênteses em SQL. #95949 (Aly Kafoury).
  • Adicionada a sintaxe combinada de subcoluna json.@path para o tipo JSON. Ela retorna o valor literal como Dynamic se o caminho apontar para um escalar, o subobjeto como Dynamic se o caminho apontar para um objeto aninhado, ou NULL se o caminho não existir. #98788 (Pavel Kruglov).
  • Adicionada a palavra-chave SOME para expressões de subconsulta. Ela se comporta de forma idêntica a ANY. #99842 (Artem Kytkin).
  • Adicionado suporte a SET TIME ZONE 'tz' como alias de SET session_timezone. #99883 (phulv94).
  • Adicionado suporte à cláusula padrão SQL VALUES como expressão de tabela em FROM, por exemplo SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72).
  • Adicionado suporte a literais compostos de intervalos no padrão SQL com qualificadores de intervalo TO, por exemplo INTERVAL '1:30' HOUR TO MINUTE, decompostos internamente em somas de intervalos. #100453 (Desel72).
  • Adicionado o comando SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x' para os modos ordered e unordered. #100709 (Bharat Nallan).

Motores de tabela e armazenamento

  • Adicionado suporte à leitura incremental para o motor de tabela Paimon, com rastreamento do progresso de snapshots baseado em Keeper, incluindo leituras direcionadas de delta de snapshot via paimon_target_snapshot_id. #93655 (XiaoBinMu).
  • Adicionado suporte a auxiliary ZooKeeper em DatabaseReplicated. #95590 (RinChanNOW).
  • Adicionado suporte para ler tipos de timestamp em nanossegundos do Iceberg v3 (timestamp_ns e timestamptz_ns), mapeados para DateTime64(9) e DateTime64(9, 'UTC'). Isso permite que o ClickHouse leia dados Iceberg com esses tipos no schema; isso não constitui suporte completo ao Iceberg v3 nem gravação em Iceberg v3 com esses tipos. #97132 (Dmitry Kovalev).
  • Adicionado ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') para tabelas Iceberg. #97904 (murphy-4o).
  • Adicionado um novo cache SLRU para metadados do Parquet para melhorar o desempenho de leitura, eliminando a necessidade de baixar novamente arquivos apenas para ler os metadados. #98140 (Grant Holly).
  • Adicionado suporte a skip index do MergeTree para colunas JSON usando JSONAllPaths com os tipos de índice bloom_filter, tokenbf_v1, ngrambf_v1 e text (invertido), permitindo o salto de grânulos com base no conjunto de JSON paths presentes em cada grânulo. #98886 (Pavel Kruglov).
  • Adicionado o índice de projeção commit_order, que reorganiza os dados na ordem de inserção. #99004 (Mikhail Artemenko).
  • Adicionada serialização em buckets para colunas Map no MergeTree (map_serialization_version = 'with_buckets'). As chaves são divididas em buckets baseados em hash, de modo que a leitura de uma única chave (m['key']) leia apenas um bucket em vez da coluna inteira, proporcionando um ganho de desempenho de 2 a 49 vezes em lookup de chave única, dependendo do tamanho do map. O número de buckets e a estratégia de distribuição em buckets podem ser controlados pelas novas configurações do MergeTree map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient e map_buckets_min_avg_size. A configuração map_serialization_version_for_zero_level_parts mantém a serialização básica para inserts, a fim de evitar sobrecarga de gravação, enquanto as partes mescladas usam buckets. Há suporte a skip indexes em mapKeys/mapValues com serialização em buckets, e optimize_functions_to_subcolumns reescreve m['key'] para uma leitura de subcoluna por chave quando buckets estão disponíveis. #99200 (Pavel Kruglov).

Inserção e desduplicação

  • Implementado um novo comportamento de max_insert_block_size_rows, max_insert_block_size_bytes, min_insert_block_size_rows e min_insert_block_size_bytes no processo de combinação de blocos, controlado pela configuração de compatibilidade use_strict_insert_block_limits. #94207 (Kirill Kopnev).

Configurações e definições

  • Adicionada a configuração do MergeTree table_readonly para marcar tabelas como somente leitura, impedindo inserções e modificações. #97652 (Alexey Milovidov).
  • Adicionada a configuração use_partition_pruning (alias use_partition_key). Defina-a como false para desativar a poda de partições com base na chave de partição. #97888 (Nihal Z. Miaji).
  • Cada entrada type=http em <protocols> agora pode especificar uma chave <handlers> personalizada apontando para uma seção de configuração <http_handlers_*> separada, permitindo regras de roteamento HTTP diferentes para cada porta. #98414 (Amos Bird).
  • Adicionadas duas configurações do MergeTree — replicated_fetches_min_part_level e replicated_fetches_min_part_level_timeout_seconds — que permitem que réplicas evitem buscar partes recém-inseridas (ainda não mescladas) de outras réplicas, reduzindo a sobrecarga de replicação durante ingestão intensa. #98625 (tanner-bruce).
  • Adicionada a configuração de servidor restore_access_entities_with_current_grants. Quando habilitada, usuários/funções restaurados têm seus grants limitados ao que o usuário que está restaurando tem permissão para conceder (com a mesma semântica de GRANT CURRENT GRANTS), em vez de falhar com ACCESS_DENIED. #98795 (pufit).
  • Adicionadas as configurações max_skip_unavailable_shards_num e max_skip_unavailable_shards_ratio para limitar quantos shards podem ser ignorados silenciosamente quando skip_unavailable_shards está habilitada. Se o número ou a proporção de shards indisponíveis exceder o limite configurado, uma exceção será lançada em vez de retornar silenciosamente resultados incompletos. #99369 (Alexey Milovidov).
  • Implementadas quotas por hash de consulta normalizada para proteger serviços públicos do ClickHouse contra abuso. NORMALIZED_QUERY_HASH é compatível como um tipo de quota key — um bucket de quota separado para cada consulta normalizada única, de modo que CREATE QUOTA q KEYED BY normalized_query_hash rastreia cada consulta distinta de forma independente. QUERIES_PER_NORMALIZED_HASH é compatível como um tipo de recurso de quota — limitando o número máximo de execuções de qualquer consulta normalizada dentro de um intervalo, de modo que MAX queries_per_normalized_hash = 100 impede que qualquer padrão de consulta seja executado mais de 100 vezes. #99586 (Alexey Milovidov).
  • A configuração do MergeTree auto_statistics_types agora usa minmax, uniq por padrão, de modo que estatísticas minmax e uniq são criadas automaticamente para todas as colunas adequadas em novas tabelas. materialize_statistics_on_insert agora usa false por padrão, de modo que as estatísticas são geradas durante as mesclagens em vez de no momento da inserção, reduzindo a sobrecarga das inserções. Defina materialize_statistics_on_insert = 1 para restaurar o comportamento antigo. #101275 (Han Fei).
  • Adicionada a configuração de refresh prefer_dependency_replica para cadeias de dependência de visão materializada, reduzindo dados ausentes causados por atraso de replicação entre réplicas. #101591 (Seva Potapov).

Autenticação

  • Adicionada a opção de configuração LDAP por servidor <follow_referrals> (padrão false) para controlar se o cliente LDAP segue redirecionamentos. Desabilitar o seguimento de redirecionamentos evita timeouts e travamentos ao pesquisar a partir de uma base DN da raiz do domínio do Active Directory, além de gerar menos ruído nos logs. #96765 (paf91).

Tabelas de sistema

  • Foi adicionada a system.histogram_metric_log, uma nova tabela de sistema que gera periodicamente snapshots de todas as métricas de histograma (por exemplo, latências de S3/Azure e durações dos estágios de processamento de solicitações do Keeper). A coluna value de system.histogram_metrics agora é Float64, para maior flexibilidade e compatibilidade com o modelo de dados do Prometheus. #103046 (Miсhael Stetsyuk).

Recursos experimentais

  • Adicionado o codec de compressão de ponto flutuante ALP (sem fallback ALP_rd para valores double não compressíveis). #91362 (Nazarii Piontko).
  • Adicionadas lazy type hints experimentais para colunas JSON. Quando habilitado por allow_experimental_json_lazy_type_hints, ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName) que apenas adiciona ou modifica type hints é concluído instantaneamente como uma operação apenas de metadados, sem reescrever dados históricos. As type hints são aplicadas no momento da consulta para partes antigas e materializadas durante INSERTs e mesclagens em segundo plano. #97412 (tanner-bruce).
  • Adicionado suporte a dialetos SQL externos usando a biblioteca polyglot. #99496 (Alexey Milovidov).
  • Adicionada a configuração query_plan_optimize_join_order_randomize, que randomiza as estatísticas usadas para reordenar joins, útil para testes. #100643 (Vladimir Cherkasov).
  • Adicionado suporte a funções de IA no ClickHouse, permitindo que os usuários chamem endpoints da OpenAI e da Anthropic usando SQL. aiGenerate está incluída como a primeira função desse tipo. #100831 (George Larionov).
  • Adicionadas as funções de IA aiClassify, aiExtract e aiTranslate para usar APIs de LLM no ClickHouse. #100832 (George Larionov).
  • Adicionado suporte a lagos de dados no Azure com Delta Kernel. #102202 (Smita Kulkarni).

Melhorias de desempenho

Desempenho de JOIN

  • Pequenas melhorias em HashJoin e ConcurrentHashJoin. #96663 (Yarik Briukhovetskyi).
  • Adicionado suporte para trocar os lados das junções ANTI, SEMI e FULL com base nas estatísticas do otimizador. #97498 (Hechem Selmi).
  • Reduzida a contenção de cache nas junções RIGHT e FULL ao verificar se JoinUsedFlags está definido antes de gravar. #99274 (Hechem Selmi).
  • Aceleradas as junções hash com chaves Int32 e Int64 de pequeno intervalo usando uma tabela hash com índice direto. #99275 (Hechem Selmi).

Otimização de consultas

  • Otimizado o skipping de grânulos para pointInPolygon em polígonos grandes e corrigido o problema em que a análise de índice de pointInPolygon lançava erro durante o pruning da chave primária. #91633 (Nihal Z. Miaji).
  • optimize_read_in_order agora é respeitado na leitura de projeções. #95885 (Andrey Zvonov).
  • A leitura do dicionário do text index foi levemente otimizada, melhorando o desempenho geral da análise do text index. #97519 (Anton Popov).
  • Melhorado o desempenho da análise do text index para queries com condições combinadas envolvendo colunas indexadas e não indexadas. Antes, a otimização de saída antecipada durante a análise de índice era desabilitada incorretamente nesses casos. #98096 (Anton Popov).
  • Melhorado o desempenho de queries com expressões constantes que geram arrays ou maps muito longos. #98287 (Alexey Milovidov).
  • Corrigida a análise da condição de chave para chaves primárias DateTime64 comparadas com constantes inteiras, o que antes resultava na ausência de pruning de grânulos. #98410 (Amos Bird).
  • A configuração optimize_syntax_fuse_functions agora está habilitada por padrão. #98424 (Alexey Milovidov).
  • O partition pruning agora é permitido quando o predicado contém qualquer operador de comparação (=, <, >, !=) e a chave de partição está envolvida em uma cadeia determinística de funções (por exemplo, com PARTITION BY x, predicados como cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026 ou toYYYYMM(x) != 2026 agora usarão a chave de partição para pruning). #98432 (Nihal Z. Miaji).
  • A otimização read-in-order e o pruning da chave primária agora são permitidos quando o tipo de destino de CAST é Nullable e a conversão é monotônica; por exemplo, com PRIMARY KEY x, o ClickHouse pode usar a otimização read-in-order para ORDER BY x::Nullable(UInt64) e o pruning da chave primária para predicados como WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • O pruning de índice e o pushdown de filtro agora são permitidos quando uma coluna inteira é comparada com um literal float; por exemplo, predicados como WHERE x < 10.5 agora podem usar a chave primária para pruning, e filtros como prime < 1e9 ou number < 1e5 agora são aplicados por pushdown às table functions primes() e numbers(), em vez de causar execução ilimitada. #98516 (Nihal Z. Miaji).
  • Queries que filtram colunas de chave primária do MergeTree com alternâncias regex sobre strings literais, como ^(abc-1|abc-2), agora podem usar o pruning da chave primária quando as alternativas compartilham um prefixo em comum. #98988 (Yash).
  • Otimizados INTERSECT ALL e EXCEPT ALL. #99097 (Raufs Dunamalijevs).
  • Adicionado suporte à otimização read_in_order_use_virtual_row para leituras em ordem reversa. #99198 (Vladimir Cherkasov).
  • Consultas descontínuas mais rápidas para colunas LowCardinality com um único dicionário. #99285 (Ivan Babrou).
  • Corrigida a escalabilidade negativa de consultas curtas com agregação em máquinas com muitos núcleos. Quando uma consulta lê poucas marcas, o pipeline não é mais expandido para max_threads após a agregação, evitando a sobrecarga de streams quase vazios. #99493 (Alexey Milovidov).
  • Melhorado o desempenho de consultas com réplicas paralelas por meio da seleção correta do tamanho da tarefa de leitura. #99801 (Nikita Taranov).
  • Removidos elementos redundantes no final de ORDER BY quando todas as chaves de GROUP BY já estão cobertas pelo prefixo de ORDER BY. #100157 (Alexey Milovidov).
  • Consultas otimizadas ao levar a cláusula LIMIT para dentro de UNION ALL. #100364 (Alexey Milovidov).
  • Adicionado suporte à compilação JIT para comparações de colunas String e FixedString em ORDER BY, melhorando em 6–17% o desempenho da ordenação na fase de merge para chaves de ordenação com muitas strings. #100577 (Raúl Marín).
  • Quando read_in_order_use_virtual_row está habilitado junto com a nova configuração read_in_order_use_virtual_row_per_block, as informações de limite de linha virtual agora são emitidas após cada bloco lido do MergeTree, permitindo que o merge repriorize fontes no meio do stream para partes cujos dados são totalmente filtrados por WHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov).
  • Melhor paralelização de consultas com views simples (sobre uma tabela MergeTree subjacente) executadas com réplicas paralelas. #100815 (Igor Nikonov).
  • Adicionado suporte a réplicas paralelas sobre views simples (incluindo views UNION ALL elegíveis sobre tabelas MergeTree) quando parallel_replicas_allow_view_over_mergetree=1. Isso paraleliza a consulta externa da view em vez da interna, aumentando a paralelização da consulta entre nós. #100958 (Igor Nikonov).
  • Otimizada a leitura na ordem da chave primária para full_sorting_merge quando há filtros com IN no plano da consulta. #101261 (Nikita Taranov).
  • Melhorado o desempenho de INSERT VALUES para colunas Map, Array e Tuple quando os valores são passados como strings com escape (por exemplo, '{\'key\':1}'), evitando fallback desnecessário para o parser de expressões SQL. #102119 (Joanna Hulboj).

Desempenho de funções e agregação

  • Melhorado o desempenho da função levenshteinDistance. #94543 (Joanna Hulboj).
  • Otimizadas as conversões em lote do tipo Decimal, evitando chamadas de função por elemento. #95923 (Konstantin Bogdanov).
  • Melhorado o desempenho de consultas LIKE. #98149 (Elmi Ahmadov).
  • Otimizada a função de agregação avgWeighted com o uso de acumuladores locais em vez de store-forwarding por linha via estado de agregação, melhorando o desempenho em até 27% para entradas Nullable. #98793 (Antonio Andelic).
  • Aceleradas as funções var*Stable e stddev*Stable para colunas Float64 com a desvirtualização do loop interno. Isso permite otimizações do compilador (FMA/registers) que alteram os resultados de ponto flutuante no nível de ULP. #99460 (Riyane El Qoqui).
  • Passa a usar a codificação base58 otimizada do Firedancer para entradas de 32/64 bytes (automaticamente em base58Encode) e permite usar a decodificação base58 otimizada se o resultado decodificado tiver 32/64 bytes (explicitamente com base58Decode('...', 32)). #99461 (Joanna Hulboj).
  • Otimizada a função cutURLParameter com a eliminação de deslocamentos de memória desnecessários. #100218 (Nikita Semenov).
  • Conversão mais rápida de float para string para valores inteiros grandes, estendendo o caminho rápido de itoa com arredondamento compatível com dragonbox. #100649 (Raúl Marín).
  • Substituído dragonbox por zmij para uma conversão de float para string de 1,5x a 3x mais rápida. #100650 (Raúl Marín).
  • Conversão mais rápida de Int128/UInt128 para string ao substituir a divisão por software pela redução de Barrett e desenrolar o loop de conversão. #100671 (Raúl Marín).
  • Evitada a criação de threads redundantes na mesclagem paralela de UniqExactSet. #100686 (Jiebin Sun).
  • Adicionada mesclagem paralela em lote para UniqExactSet. #100687 (Jiebin Sun).

Desempenho de armazenamento e E/S

  • Redução da contenção de bloqueios durante operações somente leitura em tabelas ReplicatedMergeTree com mutações concluídas. #95771 (Eduard Karacharov).
  • O Iceberg agora pode pré-carregar metadados no cache de forma assíncrona, ao definir iceberg_metadata_async_prefetch_period_ms na criação da tabela. Consultas SELECT em tabelas Iceberg agora podem especificar o parâmetro iceberg_metadata_staleness_ms, o que permite ao ClickHouse usar a versão em cache dos metadados se ela estiver mais atual do que o limite de desatualização especificado; caso contrário, o catálogo Iceberg remoto será consultado para obter os metadados mais recentes. Isso pode eliminar chamadas ao catálogo Iceberg durante o processamento das solicitações, trazendo um ganho de desempenho perceptível. #96191 (Arsen Muk).
  • O modo ordered do S3Queue agora usa S3 ListObjectsV2 StartAfter para evitar listar novamente todo o histórico do prefixo, reduzindo as chamadas ListObjects. #96370 (Venkata Vineel).
  • Habilitadas leituras paralelas no YTsaurus table engine. #97343 (MikhailBurdukov).
  • Melhorado o desempenho de lagos de dados. Em versões anteriores, a leitura a partir do armazenamento de objetos não redimensionava a pipeline de acordo com o número de threads de processamento. #99548 (Alexey Milovidov).
  • Permitido o prefetch ao ler um arquivo remoto por meio do userspace page cache. #99919 (Alexey Milovidov).
  • Corrigida uma regressão significativa no desempenho de INSERT quando deduplicate_insert=enable (padrão desde 26.2), adiando o cálculo do hash dos dados da etapa de squashing para o sink e usando hash em lote de colunas via updateHashWithValueRange, reduzindo a sobrecarga de ~2.5s para ~0.5s em 5M de linhas com 22 colunas. #101494 (Sema Checherinda).

Otimização de memória

  • Para inserções síncronas, o bloco original (necessário para desduplicação) agora pode ser omitido para economizar memória. #96661 (Sema Checherinda).
  • Melhor desempenho e menor uso de memória para funções de janela paralelas em determinados cenários e para cargas de trabalho de arrayFold com arrays grandes. Isso também pode reduzir a pressão causada por falhas de página e melhorar a estabilidade das consultas afetadas sob limites de memória mais restritos. #98892 (filimonov).

Melhorias

Consultas e SQL

  • Projeções agregadas agora têm suporte correto em views. #88798 (Amos Bird).
  • optimize_aggregators_of_group_by_keys agora otimiza corretamente aggregate functions em consultas GROUPING SETS. #93935 (Xiaozhe Yu).
  • Adicionado suporte à otimização que converte join OUTER em INNER com join_use_nulls. #95968 (Vladimir Cherkasov).
  • cast_keep_nullable foi estendido para funcionar com os tipos Dynamic/JSON. Quando definido, o CAST de NULL a partir de tipos que podem ser Nullable retorna NULL; caso contrário, NULL lança o erro CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).
  • Adicionada a cláusula ROLE a CREATE USER. #97074 (Vitaly Baranov).
  • Adicionadas informações sobre filtros adiados como item separado na saída da consulta EXPLAIN (ao usar row policies/PREWHERE com FINAL). #97374 (Yarik Briukhovetskyi).
  • Adicionado suporte a expressões de join de tabelas entre parênteses na cláusula FROM, por exemplo SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
  • Aplicação de data skipping indexes durante a análise de índice distribuída. #97767 (Azat Khuzhin).
  • A chave de ordenação de uma tabela agora pode ser uma expressão como toDate(time), e a decisão de não adiar essas expressões é tomada quando elas fazem parte de filtros. #98237 (Yarik Briukhovetskyi).
  • O otimizador de ordem de join agora infere predicados transitivos de equi-join a partir das condições de join existentes. Por exemplo, dado A.x = B.x AND B.x = C.x, a equivalência A.x = C.x é reconhecida, permitindo que o otimizador considere direct joins entre tabelas conectadas transitivamente. Isso pode melhorar a qualidade do plano para schemas estrela e floco de neve. O recurso é controlado pela nova configuração enable_join_transitive_predicates (desativada por padrão). #98479 (Alexander Gololobov).
  • Quando apply_row_policy_after_final ou apply_prewhere_after_final está habilitado, as condições compostas com AND em row policies e PREWHERE agora são decompostas para extrair átomos da chave de ordenação para a análise de índice da chave primária. Antes, se um filtro adiado contivesse uma mistura de predicados da chave de ordenação e predicados fora dela (por exemplo, x > 1 AND y != 'foo'), a expressão inteira era excluída da análise de índice. #98513 (Yarik Briukhovetskyi).
  • Apenas réplicas “ativas” (conectáveis) agora participam da análise de índice distribuída. #98521 (Azat Khuzhin).
  • O número de nós usados na heurística automática de parallel replicas foi limitado ao número real de nós no cluster (em vez de apenas à configuração max_parallel_replicas). #98668 (Nikita Taranov).
  • Implementadas hedged requests e leitura assíncrona para análise de índice distribuída. #98724 (Azat Khuzhin).
  • Adicionado suporte à cláusula SAMPLE na análise distribuída de índices. #98931 (Azat Khuzhin).
  • Adicionado suporte à monotonicidade para multiplicação, permitindo o pruning da chave primária em expressões key * constant. #98983 (Amos Bird).
  • As mensagens de erro do analisador não listam mais todas as colunas de uma tabela (o que poderia gerar exceções de mais de 150 KB). As listas de colunas agora são limitadas a 10 entradas. #99002 (Yash).
  • Estatísticas de colunas de subconsultas com junções agora são retornadas corretamente para que a consulta pai possa usá-las na reordenação de junções. #99096 (Alexander Gololobov).
  • ALTER TABLE MODIFY COLUMN x TTL ... agora é permitido sem especificar o tipo da coluna. #99208 (Nikolay Degterinsky).
  • Melhorada a saída de EXPLAIN PLAN pretty=1: agora imprime as colunas de saída da consulta de nível superior, mostra rótulos/símbolos de relações de join com estimativa de linhas no resultado e localidade, e inclui colunas de saída por etapa para etapas de join/source. #99462 (Kirill Kopnev).
  • Corrigida a falha da função de tabela merge(), que gerava um erro UNKNOWN_IDENTIFIER ao consultar colunas não presentes em todas as tabelas distributed/remotas subjacentes. #99833 (Alexey Milovidov).
  • ConditionSelectivityEstimator não é mais usado no otimizador quando a condição não está em CNF (por exemplo, where a = 0, que é uma condição única na qual as estatísticas não ajudam). #100110 (Han Fei).
  • distributed_index_analysis_min_indexes_bytes_to_activate agora é aplicado após o pruning de partições. #100477 (Azat Khuzhin).
  • EXPLAIN PIPELINE agora oferece suporte à configuração distributed=1 para incluir fragmentos remotos do pipeline. #100513 (Nikita Taranov).
  • use_partition_pruning = 0 agora também desabilita o pruning do índice MinMax e a otimização de contagem em colunas da chave de partição, além de desabilitar o pruning com base em chaves de partição. #100904 (Nihal Z. Miaji).
  • EXPLAIN [PLAN] pretty=1 agora imprime expressões em um formato legível. #100927 (Kirill Kopnev).
  • accurateCastOrNull e accurateCastOrDefault agora oferecem suporte a tipos de destino Tuple, incluindo Tuples aninhadas com elementos Nullable. Antes, essas funções rejeitavam destinos Tuple porque Tuple não podia estar dentro de Nullable. #100942 (Nihal Z. Miaji).
  • Agora você pode usar uma vírgula final na cláusula WITH antes de uma consulta SELECT. #101093 (Aruj Bansal).
  • Implementada a materialização preguiçosa de colunas para ReplacingMergeTree com FINAL quando o predicado é seletivo o suficiente. #101647 (Nikolai Kochetov).
  • Aprimoradas as estimativas padrão de seletividade para condições sem estatísticas, para alinhá-las às heurísticas padrão do setor: 0.1 para a seletividade da condição LIKE e 0.33 para a seletividade de condição desconhecida. #101653 (Alexander Gololobov).
  • Subconsulta VIEW incorporada diretamente à árvore de consulta para permitir a aplicação de mais otimizações à VIEW. #100830 (Dmitry Novik).

Funções

  • Agora você pode usar entrada nativa em JSON/Object nas funções JSONExtract. #96711 (Fisnik Kastrati).
  • Foi introduzida a função SQL tokensForLikePattern, que tokeniza padrões LIKE respeitando a semântica dos curingas: % e _ são tratados como curingas, curingas escapados (\%, \_) são tratados como literais, e tokens adjacentes a curingas não escapados são descartados. #97872 (Amos Bird).
  • Foi implementada a função toDaysInMonth(), que retorna o número de dias no mês da data especificada. #99227 (Vitaly Baranov).
  • O tokenizador unicodeWord foi renomeado para asciiCJK. #100956 (George Larionov).
  • Foi adicionado açúcar sintático no nível do parser para a sintaxe da função OVERLAY no padrão SQL. A função overlay já existe; isso adiciona suporte à forma baseada em palavras-chave, usando PLACING, FROM e FOR como separadores. #101681 (Desel72).
  • A função ngrams agora rejeita tamanhos de ngram inválidos. Por exemplo, SELECT ngrams('abc', 0) agora gera um erro. #101922 (Robert Schulze).
  • Foi adicionado suporte ao tokenizador array na otimização de LIKE. #102880 (Elmi Ahmadov).

Motores de tabela e armazenamento

  • Adicionada uma thread dedicada para limpeza no MergeTree, para evitar atrasos na limpeza sob alta carga de mesclagem. #91574 (Amos Bird).
  • Tabelas com regras DELETE TTL agora podem usar o algoritmo de mesclagem vertical. #97332 (murphy-4o).
  • As marks de índices secundários agora são pré-aquecidas quando a configuração prewarm_mark_cache está habilitada (carregadas no cache de index mark durante fetches de partes de dados e na inicialização da tabela). #97772 (Anton Popov).
  • Índices de texto agora podem ser criados em colunas Nullable([Fixed]String) e Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
  • Cancela mesclagens em segundo plano antecipadamente em DROP DATABASE para ordinary shared merge tree. #98161 (Shaohua Wang).
  • Adicionada a configuração finalize_projection_parts_synchronously para permitir a finalização síncrona de partes de projeção durante INSERT, reduzindo o pico de uso de memória em tabelas com muitas projeções, enquanto preserva, por padrão, o comportamento assíncrono existente. #98228 (Amos Bird).
  • Adicionada a configuração de MergeTree share_nested_offsets (padrão true). Quando definida como false, colunas Array com nomes pontilhados (por exemplo, n.a, n.b) são tratadas como colunas independentes, em vez de compartilharem arquivos de offsets e validarem tamanhos iguais de array como parte da semântica legada de Nested. #98416 (Amos Bird).
  • Otimizado TRUNCATE DATABASE TABLES LIKE com o pré-cancelamento de mesclagens em paralelo. #98597 (Shaohua Wang).
  • Reduzida a contenção de bloqueio em MergeTreeBackgroundExecutor ao liberar recursos de tarefas sem adquirir o bloqueio. #98604 (Dmitry Novik).
  • TRUNCATE DATABASE agora responde ao cancelamento de consulta. #98828 (Shaohua Wang).
  • Reinicia o cache de estatísticas após alterar uma configuração de MergeTree. #98520 (Han Fei).
  • Adicionada a configuração de MergeTree compress_per_column_in_compact_parts para controlar como os blocos comprimidos são organizados dentro de partes Compact. Quando true (padrão, preservando o comportamento atual), cada coluna inicia um novo bloco comprimido, permitindo descompressão seletiva. Quando false, todas as colunas dentro de um grânulo são empacotadas no mesmo bloco comprimido, melhorando a taxa de compressão e o desempenho de leitura para workloads que sempre leem todas as colunas. #101114 (Amos Bird).
  • O índice de texto agora é GA e permanece habilitado independentemente da configuração compatibility, evitando desabilitação inesperada durante restaurações de backup ou ao executar em modo de compatibilidade. #101518 (Nikita Fomichev).
  • Adicionado suporte ao índice de texto criado em mapValues(map) com o operador IN. #99286 (Anton Popov).
  • Melhorada a análise de múltiplos índices de texto usados simultaneamente na mesma consulta. A configuração use_skip_indexes_on_data_read não é mais necessária para a otimização de leitura direta de índices de texto. #102255 (Anton Popov).
  • Adicionado suporte à análise de índice de texto para a função hasPhrase via o modo HINT. #102438 (Elmi Ahmadov).
  • As estatísticas MinMax de coluna agora armazenam os valores mínimo e máximo como Field (tipado), em vez de Float64. O formato serializado inclui o nome do tipo da coluna junto com os valores. A versão do arquivo de estatísticas foi atualizada para V2; arquivos gravados por versões mais antigas exigem rematerialização (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).

Lagos de dados

  • Adicionada uma nova consulta para verificar a integridade do DataLakeCatalog. #94690 (Smita Kulkarni).
  • Aprimoradas as escritas do Iceberg para o Unity Catalog. #98162 (Konstantin Vedernikov).
  • Entidades recriadas em IcebergManifestFile para tornar a manutenção do código menos propensa a erros (também corrige alguns problemas de cache de arquivos de manifesto). #98231 (Daniil Ivanik).
  • Aprimorado o ALTER TABLE ... EXECUTE expire_snapshots(...) do Iceberg com suporte mais amplo a argumentos. #99130 (murphy-4o).
  • Alterada a interface das inserções do Iceberg no catálogo. Descontinuadas as configurações storage_catalog_type, storage_aws_access_key_id e semelhantes. #100334 (Konstantin Vedernikov).
  • Corrigido o tratamento inconsistente de caminhos no Iceberg causado pelo uso misto de caminhos de armazenamento e caminhos de metadados; passou-se a exigir que as tabelas Iceberg gravem um local de tabela que seja uma URL ou um caminho absoluto; adicionado um fallback para contabilizar tamanhos de arquivos no Azure; tratado version-hint.txt de forma compatível com o Spark; introduzidas abstrações em nível de tipo para tornar os tipos de caminho mais difíceis de confundir; e corrigido o uso de exclusões por posição. #100420 (Daniil Ivanik).
  • Evita varrer todo o catálogo remoto do lago de dados em busca de sugestões de tabela “Maybe you meant …” quando show_data_lake_catalogs_in_system_tables está desabilitado. #100452 (Alsu Giliazova).
  • As informações do objeto usadas para processar arquivos de dados do Iceberg agora incluem o número de linhas do arquivo e o tamanho do arquivo em bytes extraídos do arquivo de manifesto. #100645 (Daniil Ivanik).
  • Adicionado um mecanismo de pruning do Delta Lake com colunas virtuais. #101634 (Konstantin Vedernikov).

S3 e armazenamento de objetos

  • Adicionado um placeholder {_schema_hash} para o table engine S3, que insere um hash das definições de coluna da tabela no caminho do S3. #98265 (Miсhael Stetsyuk).
  • Adicionada uma nova opção para forçar o uso do estilo virtual/path nos endpoints do S3. #102378 (Konstantin Vedernikov).

Ajustes e configuração

  • Agora, os usuários podem especificar vários métodos de autenticação na configuração users_xml. #91998 (Flip-Liquid).
  • Agora é possível definir as configurações de internal_replication para um cluster criado pelo banco de dados Replicated. #97228 (Pervakov Grigorii).
  • Foi adicionada a configuração allow_nullable_tuple_in_extracted_subcolumns, que controla se subcolunas Tuple(...) extraídas de Tuple, Variant, Dynamic e JSON são retornadas como Nullable(Tuple(...)) (NULL para linhas ausentes) ou como Tuple(...) (valores padrão de tupla para linhas ausentes). Ela vem desativada por padrão e só pode ser alterada reiniciando o servidor. #97299 (Nihal Z. Miaji).
  • type_json_allow_duplicated_key_with_literal_and_nested_object agora vem ativada por padrão, evitando erros sobre chaves duplicadas ao analisar JSON como {"a" : 42, "a" : {"b" : 42}}, que o ClickHouse pode produzir a partir dos dados originais {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
  • As estatísticas de coluna agora são GA. A configuração allow_experimental_statistics (padrão false) foi descontinuada em favor de allow_statistics (padrão true); allow_statistics_optimize foi promovida de beta para GA; o ClickHouse cria estatísticas minmax e uniq para novas colunas (configuração do MergeTree auto_statistics_types); e, para evitar INSERTs mais lentos, materialize_statistics_on_insert agora vem desativada por padrão. #97487 (Han Fei).
  • Foi esclarecida a relação entre enable_parallel_replicas e automatic_parallel_replicas_mode: uma consulta só pode usar réplicas paralelas se enable_parallel_replicas > 0. Com automatic_parallel_replicas_mode=1, a decisão é tomada durante o planejamento com base nas estatísticas coletadas; com automatic_parallel_replicas_mode=0, réplicas paralelas são usadas para todas as consultas compatíveis, independentemente das estatísticas. O insert-select distribuído com réplicas paralelas sempre se comporta como se automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
  • O recurso de impersonação (EXECUTE AS target_user) foi ativado por padrão. #97870 (Vitaly Baranov).
  • Foi adicionada a configuração access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (permitida por padrão), que impede o uso de perfis de configuração definidos em config (exceto o perfil default) para usuários definidos por SQL. #98662 (Alexander Tokmakov).
  • Foi adicionada uma configuração para controlar o comportamento em caso de incompatibilidade de tipo para Variant e Dynamic (throw ou retornar null). #99085 (Bharat Nallan).
  • O valor padrão de stderr_reaction foi alterado de throw para log_last para UDFs executáveis. UDFs que escrevem avisos em stderr não falham mais quando o código de saída é 0, e as exceções de código de saída agora incluem o conteúdo de stderr. #99232 (Xu Jia).
  • Foi adicionada a configuração input_format_column_name_matching_mode, que permite tratamentos diferentes para maiúsculas e minúsculas nos formatos de entrada. #99346 (manerone).
  • As estatísticas automáticas não são mais ativadas para tabelas de sistema, pois elas raramente se beneficiam delas. #102862 (Han Fei).

Tabelas do sistema e monitoramento

  • Os índices de data skipping usados durante a execução da consulta agora são registrados em system.query_log em uma nova coluna skip_indices. #99793 (Grant Holly).
  • Foi adicionada a coluna projections_duration_ms a system.part_log, que registra a duração, em milissegundos, da mesclagem/reconstrução por projeção. #98292 (Amos Bird).
  • Foi adicionado o alias de coluna INDEX_LENGTH a information_schema.tables. #101705 (Robert Schulze).
  • information_schema.tables agora ignora partes de tabela inativas, tornando mais realistas os valores exibidos para o tamanho das tabelas. #101706 (Robert Schulze).

ClickHouse Keeper

  • find_super_nodes não fica mais preso ao percorrer os filhos do primeiro supernó, o que agora permite encontrar mais de um. #97819 (pufit).
  • Uma sessão do ZooKeeper agora é marcada como expirada assim que a finalização começa, em vez de esperar a thread de envio encerrar. Isso permite que outras threads estabeleçam uma nova sessão sem atraso. #99102 (Raúl Marín).
  • Solicitações obsoletas do Keeper para sessões que já foram desconectadas agora são ignoradas, evitando idas e voltas desnecessárias ao Raft. O número de sessões finalizadas rastreadas é limitado pela configuração de coordenação max_finished_sessions_cache_size. #99246 (Antonio Andelic).
  • O comando mntr do Keeper não fica mais preso devido à contenção de bloqueio. #99472 (Antonio Andelic).
  • A contenção de bloqueio no dispatcher do Keeper foi reduzida ao invocar callbacks e despachar solicitações de leitura fora do escopo do mutex, além da adição de guardas de bloqueio com perfilamento para observabilidade. #99751 (Antonio Andelic).

Gerenciamento de memória

  • Adicionado o parâmetro de configuração use_separate_cache_arena para controlar a separação da arena de cache. #100664 (Seva Potapov).

Formatos de dados

  • Adicionada a configuração output_format_trim_fixed_string para remover bytes nulos à direita de valores FixedString em formatos de saída de texto. #97558 (NeedmeFordev).
  • Passou a ser possível processar arquivos GeoParquet que contêm diferentes tipos Geo na mesma coluna. #97851 (Mark Needham).
  • A desserialização de estados binários de AggregateFunction agora exige o consumo de toda a entrada. Se houver bytes extras e redundantes ao final, o ClickHouse lança uma exceção em vez de aceitar dados de estado malformados. #98786 (Nihal Z. Miaji).
  • Agora, os usuários podem gravar tipos de dados de intervalo do ClickHouse no formato Arrow. #99519 (Peter Nguyen).
  • Adicionado suporte nativo para importar e exportar tipos de dados UUID nos formatos Arrow e Parquet, com inferência lógica automática para UUIDs de nível superior e suporte a dicas explícitas de esquema para UUIDs aninhados. #99521 (Ivan).
  • Agora é tolerada a ausência de padding no final do último bloco de arquivos Parquet. #99857 (Seva Potapov).
  • A exportação de UUIDs para Parquet pelo codificador Arrow agora inclui a anotação correta do tipo UUID, eliminando a necessidade de converter manualmente dados FixedString(16) ao ler os arquivos de volta. #100150 (Ivan).
  • Adicionado suporte nativo para importar tipos de dados StringView e BinaryView do Apache Arrow para colunas String do ClickHouse, melhorando a compatibilidade para ingestão baseada em Arrow. #100762 (Ivan).
  • Adicionado suporte para Nullable(Tuple) nos formatos Arrow, ArrowStream, ORC e Parquet legado. #101272 (Nihal Z. Miaji).

Coleções nomeadas e dicionários

  • Adicionado sslmode às chaves permitidas para fontes de dicionário do PostgreSQL, tornando possível configurar o modo SSL para conexões de dicionário do PostgreSQL (por exemplo, no AWS RDS, que exige SSL por padrão). #98014 (mcalfin).
  • Evita remover coleções nomeadas que são dependências de fontes de dicionário. #98127 (Pablo Marcos).
  • Adicionado suporte aos tipos Map e JSON/Object como atributos de dicionário. Os dicionários agora podem armazenar e recuperar tipos complexos, incluindo Map(String, String), Map(String, Array(String)), JSON e Nullable(JSON) nos layouts FLAT e HASHED. #98627 (yanglongwei).
  • SYSTEM RELOAD DICTIONARIES agora recarrega os dicionários em ordem topológica para que dicionários cuja fonte são outros dicionários vejam dados atualizados após a recarga. #98356 (Alexey Milovidov).
  • Dicionários de cache não usam mais um bloqueio exclusivo em hasKeys, reduzindo a contenção de bloqueios ao usar um bloqueio compartilhado para leituras do cache. #100796 (liuguangliang).

Outras melhorias

  • As dicas de ACCESS_DENIED não revelam mais nomes de colunas, a menos que o usuário possa exibir todas as colunas necessárias; os nomes do banco de dados e da tabela permanecem visíveis na dica. #91067 (filimonov).
  • Recarrega a configuração do cluster se os IPs do hostname do servidor local mudarem, em vez de considerar os IPs de qualquer host. #93726 (Zhigao Hong).
  • Força a gravação dos buffers assíncronos de logging em caso de falha. #97836 (Azat Khuzhin).
  • Redução de bloqueios durante o controle de acesso. #97894 (Nikita Taranov).
  • ClickStack atualizado para a versão 2.20.0. #98252 (Aaron Knudtson).
  • Desabilita a AI SQL generation (comando ??) no cliente embutido (protocolos SSH e WebSocket) para evitar acesso às variáveis de ambiente do servidor. #100290 (Alexey Milovidov).
  • Envia NACK para mensagens com erro ao usar o armazenamento RabbitMQ. #102157 (Seva Potapov).

Correção de bugs

Correções de JOIN

  • Corrigida a ausência de uma coluna quando um alias de identificador não padrão era usado em um JOIN com o analisador antigo. #95679 (Zhigao Hong).
  • Corrigido um resultado incorreto quando o algoritmo grace_hash era usado com junções non-equi e o bloco esquerdo não podia ser processado por completo devido a restrições de tamanho no resultado da junção. #97866 (János Benjamin Antal).
  • Corrigido um erro lógico com analyzer_compatibility_join_using_top_level_identifier e ARRAY JOIN. #98179 (Vladimir Cherkasov).
  • Corrigida uma exceção LOGICAL_ERROR quando um RIGHT JOIN encapsulado em um CROSS JOIN foi invertido pela otimização query_plan_join_swap_table no caminho de código legado da etapa de junção. #98279 (Alexey Milovidov).
  • Corrigida uma exceção “Pipeline stuck” em junções full_sorting_merge, causada por um deadlock em PingPongProcessor quando a otimização FilterBySetOnTheFly criava uma dependência circular com MergeJoinTransform. #98454 (Alexey Milovidov).
  • Corrigida uma exceção de erro lógico quando CROSS JOIN era usado junto com INNER JOIN USING. #98459 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR quando arrayJoin era usado em uma expressão de filtro com OUTER JOIN e join_use_nulls habilitado. #98464 (Alexey Milovidov).
  • Corrigidas uma exceção BAD_GET e resultados de consulta incorretos quando uma expressão não booleana (por exemplo, sin(col)) era usada tanto em WHERE quanto em SELECT com um JOIN, devido à otimização de push-down de filtro corromper nós DAG compartilhados. #98681 (Alexey Milovidov).
  • Corrigida uma LOGICAL_ERROR “Replica decided to read in Default mode, not in WithOrder” ao usar read_in_order_through_join com réplicas paralelas. #98685 (Alexey Milovidov).
  • LEFT ANTI JOIN com múltiplas colunas na chave de junção retornava resultados errados quando enable_join_runtime_filters=1 (o padrão). #98871 (Alexander Gololobov).
  • Corrigido um bug na otimização query_plan_convert_any_join_to_semi_or_anti_join que retornava um resultado incorreto para linhas sem correspondência. #99112 (Yarik Briukhovetskyi).
  • Corrigida uma exceção em funções que operam sobre ColumnReplicated com linhas não referenciadas produzidas por JOIN. #99564 (Hechem Selmi).
  • Corrigido um caso raro em que uma junção com reordenação podia produzir um resultado incorreto. #100790 (Yarik Briukhovetskyi).
  • Corrigidos resultados incorretos quando um JOIN com a otimização shard-by-PK usava o cache de condições de consulta e algumas partes eram filtradas por condições em cache. #100926 (Groene AI).
  • Corrigida uma exceção NOT_FOUND_COLUMN_IN_BLOCK ao usar ARRAY JOIN com JOIN USING e analyzer_compatibility_join_using_top_level_identifier habilitado. #101507 (Vladimir Cherkasov).
  • Corrigida a ordenação incorreta de linhas em consultas que usam ORDER BY com o algoritmo de join grace_hash, o que poderia gerar resultados incorretos sem aviso. #102036 (János Benjamin Antal).
  • Corrigido um LOGICAL_ERROR (tamanho inesperado do tipo de índice) que poderia ocorrer em consultas RIGHT JOIN e FULL JOIN quando max_bytes_in_join estivesse configurado. #102042 (Jimmy Aguilar Mena).

Correções de consultas e do analyzer

  • Corrigida a forma como o destino de uma tabela Alias é salvo como dependência DDL quando não está totalmente qualificado: agora ele é salvo com o database da tabela Alias em vez do database da sessão. #95175 (Enric Calabuig).
  • Corrigido um erro Block structure mismatch in stream causado por colunas desnecessárias retornadas pela materialização lazy. #96682 (Nikolai Kochetov).
  • Corrigida uma exceção na comparação de tuplas envolvendo elementos do tipo Nothing (por exemplo, comparação com elementos de tupla NULL) quando usada com GROUPING SETS e ORDER BY. #97509 (Alexey Milovidov).
  • Corrigida uma exceção “Context has expired” em subconsultas correlacionadas que contêm table functions como url(). #97544 (Alexey Milovidov).
  • Corrigidas exceções e comportamento incorreto em optimize_syntax_fuse_functions com projeções agregadas, Tipo Date e preservação de nomes de coluna. #97545 (Alexey Milovidov).
  • Removida uma query rewrite incorreta de replaceRegexpOne para extract, que produzia resultados incorretos quando o regexp não correspondia; também foi corrigida uma exceção quando replaceRegexpOne era usado com GROUP BY ... WITH CUBE e group_by_use_nulls=1. #97546 (Alexey Milovidov).
  • Corrigidas exceções LOGICAL_ERROR causadas por LowCardinality dentro de tipos compostos (Variant, Dynamic, Tuple) em concatWithSeparator, format, subconsultas IN, GLOBAL IN e junções com Runtime Filters. #97831 (Raúl Marín).
  • Corrigida uma exceção LOGICAL_ERROR “Chunk info was not set for chunk in MergingAggregatedTransform” ao usar ARRAY JOIN com a table function merge() em várias Distributed tables combinadas com GROUP BY. #97838 (Raúl Marín).
  • Corrigido um bug que impedia o uso de CTEs com insert-selects distribuídos. #97889 (Yarik Briukhovetskyi).
  • Corrigida uma incompatibilidade de coluna. #97921 (Kai Zhu).
  • Corrigido um segfault na otimização do plano de consulta ao converter uma outer join em uma inner join com arrayJoin em uma expressão de filtro. #98147 (Alexey Milovidov).
  • Corrigido um LOGICAL_ERROR “Trying to execute PLACEHOLDER action” quando colunas correlacionadas de consultas externas eram referenciadas dentro de funções lambda como arrayMap. #98285 (Alexey Milovidov).
  • Corrigida uma exceção de logical error em caseWithExpression quando a expressão CASE envolvia materialize(NULL) ou outros argumentos Nullable(Nothing). #98290 (Alexey Milovidov).
  • Corrigida uma exceção de conversão inválida ao filtrar a coluna virtual _table na table function merge. #98291 (Alexey Milovidov).
  • Corrigida uma exceção quando ORDER BY ... WITH FILL era usado junto com LIMIT BY. #98361 (Alexey Milovidov).
  • Corrigida uma exceção “Column … query tree node does not have valid source node” ao fazer join de uma tabela Merge (que encapsula uma tabela Distributed) com outra tabela. #98376 (Alexey Milovidov).
  • Corrigida uma exceção “Column identifier is already registered” quando count_distinct_optimization era usado com uma cláusula QUALIFY. #98433 (Alexey Milovidov).
  • Corrigida uma exceção “cannot be inside Nullable type” ao usar IN/NOT IN com argumentos de coluna LowCardinality (por exemplo, a NOT IN (b), em que a é LowCardinality(String)). #98443 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR “Projection cannot increase the number of rows in a block” ao mesclar partes com um TTL que exclui todas as linhas e uma projeção agregada com uma chave GROUP BY constante. #98458 (Alexey Milovidov).
  • Corrigida uma exceção em consultas DISTINCT quando o uso de projeções agregadas e materialize causava diferenças no tipo LowCardinality entre a consulta e a projeção. #98462 (Alexey Milovidov).
  • Corrigida uma exceção de erro lógico “Replica decided to read in WithOrder mode, not in ReverseOrder” ao usar réplicas paralelas com optimize_aggregation_in_order. #98467 (Alexey Milovidov).
  • Corrigido um resultado inesperado com read_in_order_use_virtual_row e funções monotônicas. #98514 (Vladimir Cherkasov).
  • Corrigida uma exceção LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' ao usar PREWHERE com uma subconsulta IN em tabelas MergeTree. #98522 (Alexey Milovidov).
  • Corrigida uma exceção “Sorting column wasn’t found in the ActionsDAG’s outputs” quando query_plan_convert_join_to_in estava habilitado com query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
  • Corrigido um LOGICAL_ERROR quando um Identifier estava vazio após a substituição de parâmetro. #98530 (Pervakov Grigorii).
  • Corrigida a análise de índice distribuído com expressões (não apenas colunas) na chave primária, o que resultava em nenhuma filtragem de grânulos redundantes em réplicas remotas. #98561 (Azat Khuzhin).
  • Corrigido um erro lógico “TABLE_FUNCTION is not allowed in expression context” quando uma table function com alias aparecia várias vezes no mesmo escopo da consulta (por exemplo, nas cláusulas PREWHERE e QUALIFY). #98557 (Alexey Milovidov).
  • Corrigida uma exceção “Bad cast from type DB::TableFunctionNode to DB::QueryNode” ao usar a função de tabela input como argumento de remote. #98694 (Alexey Milovidov).
  • Corrigida uma exceção em LogicalExpressionOptimizerPass quando uma função booleana em uma comparação equals retornava um tipo Variant. #98712 (Alexey Milovidov).
  • Corrigida uma exceção UNKNOWN_IDENTIFIER ao consultar a função de tabela merge() ou o engine Merge em tabelas com colunas JSON que têm parâmetros diferentes e colunas ALIAS que fazem referência a subcaminhos de JSON, com o novo analyzer habilitado. #98753 (Pavel Kruglov).
  • Corrigida a otimização optimize_skip_unused_shards com o analyzer quando um armazenamento Distributed era usado em uma View. #98754 (Nikolai Kochetov).
  • Corrigida uma exceção LOGICAL_ERROR (incompatibilidade na estrutura do block em removeUnusedColumns) que podia ocorrer com FINAL + PREWHERE + uma expressão WHERE constante + agregações independentes de coluna, como count(). #98778 (Alexey Milovidov).
  • Corrigida uma exceção “Inconsistent table names” ao usar a função de tabela view() contendo JOINs dentro de outro JOIN (somente com o analyzer antigo). #98809 (Alexey Milovidov).
  • Corrigida uma exceção ao compor loop com funções de tabela de cluster. #98860 (Konstantin Bogdanov).
  • Corrigido um LOGICAL_ERROR “RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin).
  • Corrigida uma exceção “Scalar doesn’t exist” ao consultar um shard remoto com optimize_const_name_size definido e enable_scalar_subquery_optimization = 0. #98979 (andriibeee).
  • Corrigido NOT_FOUND_COLUMN_IN_BLOCK para algumas consultas com GROUP BY e expressões que incluem lookup inverso em Dicionário, comparações de conversão Date/DateTime e comparações de Tuple. #98980 (Nihal Z. Miaji).
  • Corrigido um bug em que EXISTS ignorava as cláusulas LIMIT e OFFSET em subconsultas, causando resultados incorretos quando a subconsulta não retornava linhas devido a um offset ou a um limite zero. #99005 (andriibeee).
  • Corrigida uma exceção “Block structure mismatch” quando a otimização de push-down de filtro encontrava uma expressão AND que era avaliada em curto-circuito como uma constante com GROUPING SETS. #99010 (Alexey Milovidov).
  • Corrigido um LOGICAL_ERROR ao consultar uma tabela que possui tanto uma ROW POLICY quanto uma coluna ALIAS usando dictGet, causado por acesso prematuro à expressão da tabela durante a resolução da coluna ALIAS no novo analyzer. #99065 (Peng).
  • Corrigido um segfault em uma CTE recursiva com remote() + view(). #99081 (Konstantin Bogdanov).
  • Ignora a análise de índice extra desnecessária quando a otimização de leitura em ordem é aplicada. #99084 (Vladimir Cherkasov).
  • Corrigidas as verificações de acesso durante InverseDictionaryLookupPass, verificando o acesso apenas uma vez antes de executar a etapa de otimização. #99210 (Mikhail Artemenko).
  • Corrigido optimize_skip_unused_shards com o novo analisador quando uma tabela Distributed era usada em uma subconsulta IN. #99436 (Nikolai Kochetov).
  • Corrigido um heap-use-after-free em INTERSECT/EXCEPT quando a consulta produzia nomes de coluna duplicados. #99471 (Alexey Milovidov).
  • Corrigido um erro lógico em ALTER TABLE ... DROP PART quando um parâmetro de consulta tipado era usado como nome da parte. #99489 (Alexey Milovidov).
  • Corrigida uma exceção std::length_error ao consultar tabelas de sistema vazias no formato Pretty pela interface HTTP. #99541 (Alexey Milovidov).
  • Corrigida a degradação de desempenho no analisador ao eliminar colunas não usadas de ARRAY JOIN. #99587 (Dmitry Novik).
  • Corrigida uma exceção (Bad get: has Tuple, actual type String) em ConditionSelectivityEstimator quando uma consulta usava IN com um único parâmetro de consulta escalar (por exemplo, WHERE col IN ({p:String})) em uma tabela com estatísticas de coluna e use_statistics habilitado. #99614 (Ilya Yatsishin).
  • Corrigida uma exceção “Block structure mismatch” em consultas com uma cláusula HAVING, em que a expressão de filtro continha tanto uma agregação encapsulada em uma função que produz NULL quanto materialize(0). #99915 (Alexey Milovidov).
  • Corrigido um erro lógico com uma subconsulta correlacionada em um argumento untuple. #99917 (Vladimir Cherkasov).
  • Corrigida uma exceção “Inconsistent AST formatting” em ALTER TABLE ... MODIFY QUERY com subconsultas aninhadas contendo SETTINGS quando o próprio ALTER também tinha SETTINGS. #99938 (Nikita Mikhaylov).
  • Corrigida uma exceção LOGICAL_ERROR “Not-ready Set” na função IN durante a otimização do plano de consulta com convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR “Unexpected node type for table expression … Actual IDENTIFIER” quando uma subconsulta escalar era usada em um argumento de função de tabela não resolvido. #100014 (Alexey Milovidov).
  • Corrigido o número quadrático de consultas executadas quando distributed_index_analysis era usado com predicados contendo subconsultas IN. #100287 (Anton Popov).
  • Corrigida uma exceção de “Block structure mismatch” ao usar GROUP BY ... WITH TOTALS HAVING em combinação com UNION DISTINCT e expressões Nullable. #100293 (Alexey Milovidov).
  • Corrigida uma exceção de “Inconsistent AST formatting” em builds de depuração ao usar GROUP BY CUBE(...) WITH ROLLUP ou combinações semelhantes. #100376 (Alexey Milovidov).
  • Corrigida uma exceção ao criar uma view com aliases de coluna e consultas SELECT * ou EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
  • Corrigida uma exceção TOO_MANY_ROWS em consultas SELECT count() com max_rows_to_read / force_primary_key quando os dados estavam divididos em várias partes com limites de grânulos não alinhados. #100408 (Alexey Milovidov).
  • Corrigidos casos de NOT_FOUND_COLUMN_IN_BLOCK em que a parte SELECT da projeção continha colunas que não existiam na parte SELECT original da consulta. #100623 (Yarik Briukhovetskyi).
  • Agora é possível passar uma chave de sharding para as funções de tabela cluster() e clusterAllReplicas() ao usar uma função de tabela como origem (por exemplo, cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy).
  • Corrigidos tipos de argumento AggregateFunction incorretos na contagem trivial otimizada, o que causava uma exceção NUMBER_OF_ARGUMENTS_DOESNT_MATCH ao consultar expressões como count(v0 + v1) em tabelas distribuídas. #100794 (YjyJeff).
  • Corrigido um erro lógico “Invalid action query tree node” ao usar INTERSECT ALL / UNION ALL com expressões com constantes já avaliadas. #100977 (Alexey Milovidov).
  • Corrigido um erro UNKNOWN_IDENTIFIER incorreto quando o mesmo alias era usado para várias expressões em SELECT; agora o erro correto MULTIPLE_EXPRESSIONS_FOR_ALIAS é reportado. #101040 (Alexey Milovidov).
  • Corrigida uma exceção em DirectJoinMergeTreeEntity quando blocos do pipeline continham colunas ColumnConst mescladas com colunas regulares. #101046 (Alexey Milovidov).
  • Corrigido um espaço indevido na formatação de aliases de coluna em CTE (WITH t (a, b)WITH t(a, b)). #101049 (Alexey Milovidov).
  • Corrigida a falha das funções de tabela remote/cluster com funções de tabela aninhadas, como merge, quando o analisador estava habilitado. #101055 (Alexey Milovidov).
  • Corrigido o problema em que OFFSET era aplicado duas vezes em consultas distribuídas quando prefer_localhost_replica=1, produzindo menos linhas do que o esperado. #101071 (Nihal Z. Miaji).
  • Corrigido um erro “Illegal type Decimal64 of start parameter” em funções de agregação para séries temporais ao usar serialize_query_plan=1 com réplicas paralelas. #101083 (Groene AI).
  • Corrigidos resultados incorretos de consulta quando uma constante inteira grande (por exemplo, 256, 2147483648) era usada como predicado booleano em uma cláusula WHERE com AND em tabelas MergeTree. #101287 (Groene AI).
  • Corrigida uma falha com “Logical error: Reading from materialized CTE before materialization” quando uma subconsulta escalar referenciava uma cadeia de CTEs materializadas dependentes. #101305 (Groene AI).
  • Corrigida uma exceção ao converter uma string com dados extras no final para o tipo vazio Tuple(). #102011 (Alexey Milovidov).
  • Corrigido um erro lógico ao fazer o parsing de uma string incorreta de tupla vazia. #102289 (Nihal Z. Miaji).
  • Corrigidos resultados incorretos de agregação (linhas duplicadas) ao usar optimize_aggregation_in_order=1 com colunas de GROUP BY ordenadas de forma diferente da chave de ordenação da tabela. #102299 (Groene AI).
  • Corrigida uma exceção em getStructureOfRemoteTable quando o shard local retornava colunas vazias devido a DDL concorrente. #102604 (Alexey Milovidov).
  • Otimizadas cadeias de OR em ROW POLICY para IN no novo analisador. #102915 (Azat Khuzhin).
  • Corrigidos resultados incorretos retornados por WHERE x AND toNullable(N) em tabelas MergeTree quando N é um inteiro maior que UInt8 (por exemplo, 256, 65535, 2147483648 ou qualquer inteiro negativo). #103077 (Groene AI).

Correções de MergeTree e armazenamento

  • Corrigido um erro lógico ao anexar uma parte no MergeTree quando havia várias renomeações encadeadas entre a desanexação e o anexo. #96351 (Alexey Milovidov).
  • Corrigido o cálculo não determinístico de uncompressed_hash para partes Compact do MergeTree quando vários codecs de compressão são usados, o que podia causar um comportamento incorreto de desduplicação. #97522 (Alexey Milovidov).
  • Corrigidos casos em que exceções MEMORY_LIMIT_EXCEEDED eram relatadas incorretamente como CORRUPTED_DATA durante merges de SummingMergeTree e CoalescingMergeTree. #97537 (János Benjamin Antal).
  • hasPartitionId agora retorna false se existir outra partição com um ID de partição maior no conjunto de partes de dados. #97748 (Mikhail Artemenko).
  • Corrigida uma mutação após uma atualização leve com índices secundários. #98044 (Raúl Marín).
  • Corrigidos resultados incorretos de consultas FINAL ao misturar skip indexes da chave primária com skip indexes que não são da chave primária. #98097 (Raúl Marín).
  • Se as colunas da chave de partição não forem cobertas pela chave de ordenação, o partition pruning poderá ignorar incorretamente partições que contêm linhas que deveriam “vencer” durante a desduplicação FINAL. #98242 (Yarik Briukhovetskyi).
  • Corrigido um possível deadlock quando duas operações concorrentes de MOVE PARTITION trabalham com o mesmo par de tabelas em direções opostas. #98264 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR “Invalid binary search result in MergeTreeSetIndex” acionada pela conversão toDate em colunas-chave com dados que cruzam o limite de 65535. #98276 (Alexey Milovidov).
  • Corrigida uma falha esporádica de desduplicação em que reinserções eram desduplicadas incorretamente devido à ordem inconsistente de limpeza entre os diretórios blocks/ e deduplication_hashes/ no ZooKeeper. #98293 (Alexey Milovidov).
  • Corrigido o travamento de mutações MATERIALIZE INDEX e MATERIALIZE PROJECTION quando o índice ou a projeção eram removidos antes de a mutação terminar. #98369 (Alexey Milovidov).
  • Corrigidos resultados incorretos de partition pruning após o merge de partes com colunas Nullable na chave de partição, causado por limites incorretos do índice min-max. #98405 (Amos Bird).
  • Corrigida uma exceção LOGICAL_ERROR em renameAndCommitEmptyParts que podia ocorrer quando TRUNCATE TABLE era executado concorrentemente com OPTIMIZE TABLE usando transações do MergeTree. #98508 (Alexey Milovidov).
  • Corrigido um overflow decimal durante o partition pruning com DateTime64. #98628 (Yarik Briukhovetskyi).
  • Corrigida a ressurreição de partes de dados desatualizadas causada pela limpeza incorreta de partes de cobertura vazias. #98698 (Shaohua Wang).
  • Corrigida a detecção da utilidade do skip index set com um predicado OR com falso (isto é, or(x, 0)). #98776 (Azat Khuzhin).
  • Corrigido o problema em que skip indexes (e condições de chave primária) não eram aplicados a colunas ALIAS quando a mesclagem de expressões do plano de consulta estava desabilitada (query_plan_merge_expressions = 0 ou query_plan_enable_optimizations = 0). #98960 (Peng).
  • Corrigida a poda incorreta ou insuficiente quando startsWith, LIKE ou NOT LIKE eram usados com uma coluna FixedString. Além disso, a função de cast de FixedString para String agora pode podar grânulos quando aplicada sobre uma coluna-chave. #99001 (Nihal Z. Miaji).
  • Corrigida uma exceção ao ler patch parts (atualizações leves) sem a coluna _part_offset no plano de consulta. #99023 (Alexey Milovidov).
  • Uma consulta como SELECT * FROM table WHERE pk_id = '', em que pk_id é uma chave primária String, agora usa corretamente o índice da chave primária para filtrar grânulos. #99027 (Shankar Iyer).
  • Corrigida uma exceção ao criar uma tabela com uma coluna EPHEMERAL que tem o mesmo nome de uma coluna virtual (por exemplo, _part_offset). #99031 (Alexey Milovidov).
  • Corrigido LOGICAL_ERROR devido à incompatibilidade na ordem das colunas de patch parts. #99164 (Pablo Marcos).
  • Corrigida a falha de ALTER TABLE UPDATE/DELETE com um erro Missing columns quando uma tabela tem uma coluna MATERIALIZED cuja expressão depende de uma coluna EPHEMERAL. #99281 (Yash).
  • Corrigida a compatibilidade ao atualizar tabelas replicadas com índices minmax implícitos da versão 25.10 para versões mais recentes. #99392 (Raúl Marín).
  • Corrigida a rara marcação incorreta de uma parte de dados como corrompida e seu desanexamento após uma consulta DETACH/ATTACH TABLE. #99529 (Anton Popov).
  • Corrigida uma falha de asserção rows_sources em mesclagem vertical quando SYSTEM STOP/START MERGES é alternado rapidamente durante uma mesclagem de uma tabela com colunas Dynamic. #99532 (Alexey Milovidov).
  • Corrigida a poda incorreta de partição para toWeek(), que fazia consultas com WHERE toWeek(date, mode) = N retornarem resultados vazios para as semanas 49–52 em tabelas particionadas por toYYYYMM(date). #99542 (Takumi Hara).
  • Corrigido um LOGICAL_ERROR ao usar ALTER TABLE ADD COLUMN para criar uma coluna EPHEMERAL com o mesmo nome de uma coluna virtual (por exemplo, _part_offset). #99549 (Alexey Milovidov).
  • Corrigido o fato de CLEAR COLUMN não reconstruir projeções nem reavaliar colunas materializadas que dependem da coluna limpa, o que poderia causar exceções ou corrupção de dados durante mesclagens posteriores. #99565 (Desel72).
  • Uma parte com projeções desconhecidas não é mais marcada como perdida para sempre. #99623 (Sema Checherinda).
  • Corrigida uma referência solta em injectRequiredColumns que causava uma falha durante a mesclagem. #99679 (Tuan Pham Anh).
  • Corrigido um erro lógico durante a mesclagem de partes de projeção após CLEAR COLUMN em uma tabela com projeções e partes compact. #100068 (Pavel Kruglov).
  • Corrigido um LOGICAL_ERROR “Stream … not found” ao inserir em uma tabela com colunas Array(JSON) aninhadas em partes wide com optimize_on_insert=0. #100475 (Pavel Kruglov).
  • Os argumentos do mecanismo para StorageAlias agora são avaliados antes de armazenar a definição, para que expressões como currentDatabase() sejam resolvidas em literais antes de serem salvas no banco de dados. #100902 (Nikolay Degterinsky).
  • Corrigido o retorno de ILLEGAL_DIVISION por divide e intDiv quando usados em expressões de filtro durante a análise de índice em alguns casos. #100928 (Nihal Z. Miaji).
  • Corrigido o fato de a otimização de minmax_count_projection e a otimização trivial de COUNT(*) permanecerem desativadas permanentemente após uma exclusão leve, mesmo depois de todas as partes com máscara de exclusão leve terem sido mescladas. #101212 (Anton Popov).
  • Corrigida uma condição de corrida de dados em storage_id em IStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky).
  • Corrigido o fato de materialize_skip_indexes_on_merge=false não suprimir índices de texto (full-text) durante a mesclagem. Antes, apenas skip indexes não textuais (minmax, set, bloom_filter) eram suprimidos. #101932 (Groene AI).
  • As entradas do cache de índice de similaridade vetorial agora são removidas após a remoção da parte (por exemplo, durante uma mesclagem), corrigindo o problema de entradas que nunca eram removidas devido a chaves de cache incompatíveis. #99575 (Seva Potapov).
  • Corrigida uma exceção LOGICAL_ERROR falsa durante o redimensionamento dinâmico do cache do sistema de arquivos devido a uma condição de corrida na promoção da subfila SLRU. #99850 (Alexey Milovidov).
  • Corrigido um possível erro lógico durante a leitura de subcolunas de map. #101641 (Pavel Kruglov).
  • Corrigida a prioridade da correspondência exata de subcolunas sobre a correspondência por prefixo em getSubcolumnData para evitar uma possível falha. #101645 (Pavel Kruglov).
  • Corrigido o uso de extremos incorretos em um índice min-max criado em uma coluna JSON, o que levava a resultados incorretos de consulta. #101918 (Pavel Kruglov).
  • Corrigido um bug de condição de corrida em SLRU no cache do sistema de arquivos (26.1+) que podia levar a um erro lógico na reserva de espaço. #101991 (Kseniia Sumarokova).
  • Corrigido um erro lógico Having zero bytes no cache, causado pela sobrescrita de um objeto remoto entre list e read, o que antes resultava em metadados de objeto desatualizados. #101219 (Kseniia Sumarokova).
  • Corrigida uma falha de asserção file_offset_of_buffer_end <= getFileSize() ao ler tabelas Log ou StripeLog no armazenamento de objetos S3 com gravações concorrentes. #100763 (Alexey Milovidov).
  • Corrigido o limite de tamanho do cache ao recarregar a configuração. #100659 (Aleksei Filatov).
  • Corrigida uma interrupção com LOGICAL_ERROR durante o redimensionamento dinâmico do cache do sistema de arquivos SLRU, causada por estatísticas de evicção compartilhadas entre subfilas e por um caminho de recuperação incorreto para candidatos com falha. #102396 (Antonio Andelic).
  • Corrigido o fato de a otimização minmax_count_projection e a otimização trivial COUNT(*) permanecerem desabilitadas permanentemente após uma exclusão leve. #102900 (Anton Popov).

Correções de tipo de dados e serialização

  • Corrigido um resultado incorreto ou uma exceção durante a leitura de subcolumns de colunas ALIAS. #95408 (Pavel Kruglov).
  • Corrigido o problema que impedia a aggregate function sumCount de ler estados serializados mais antigos após a introdução de Nullable(Tuple). #97502 (Nihal Z. Miaji).
  • Corrigido um logical error relacionado à ausência de um stream durante INSERT SELECT com JSON e buckets em shared data. #97523 (Pavel Kruglov).
  • Corrigidos possíveis travamentos durante a leitura de grânulos vazios em shared data avançado em JSON. #97778 (Pavel Kruglov).
  • Corrigida a compilação incorreta por JIT da função sign para tipos inteiros mais largos que Int8 — valores fora do intervalo -128..127 podiam produzir um sinal incorreto. #98012 (Alexey Milovidov).
  • Corrigido o problema que fazia o format ProtobufList não funcionar com o motor Kafka porque o estado de leitura não era redefinido entre as mensagens. #98151 (Alexey Milovidov).
  • Corrigida a corrupção silenciosa de dados ao inserir uma coluna Date de Parquet/Arrow em uma coluna Enum — a conversão entre tipos incompatíveis agora é rejeitada corretamente, em vez de armazenar valores enum inválidos. #98364 (Alexey Milovidov).
  • Corrigida uma exceção ao ler um arquivo Arrow com uma coluna Array em uma table com uma coluna Nested. #98365 (Alexey Milovidov).
  • Corrigida uma exceção ao ler de Nullable(Tuple(...)) quando o nome de um elemento de Tuple colide com a subcolumn null de Nullable. #98372 (Alexey Milovidov).
  • Corrigida a conversão incorreta de Parquet Bool para FixedString no leitor native V3, que produzia raw bytes em vez de uma string representation. #98378 (Alexey Milovidov).
  • Corrigido tryGetColumnDescription para filtrar subcolumns por Kind da coluna pai, em conformidade com outros métodos de lookup de colunas. #98391 (Alexey Milovidov).
  • Corrigido o rollback de coluna no engine Buffer ao lidar com uma exceção durante a adição de um novo block. A lógica anterior podia levar a um state corrompido da coluna em memória. #98551 (Pavel Kruglov).
  • Corrigida uma exceção Bad cast from type ColumnConst to ColumnDynamic em comparação null-safe (<=> / IS NOT DISTINCT FROM) com colunas const Dynamic ou Variant e NULL. Também foi corrigido o problema em que IS DISTINCT FROM com Dynamic/Variant vs NULL sempre retornava incorretamente 0. #98553 (Alexey Milovidov).
  • Corrigido o fato de parseDateTimeBestEffort interpretar incorretamente palavras que começam com prefixes de mês/dia da semana. #98742 (Pavel Kruglov).
  • Corrigida uma exceção de reverseUTF8 em entrada UTF-8 inválida (truncada). #98770 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR em funções financeiras (financialNetPresentValue, financialInternalRateOfReturn, etc.) ao passar argumentos do tipo BFloat16. #98958 (Alexey Milovidov).
  • O SummingMergeTree não soma mais colunas Bool (e outros tipos de domínio); os valores Bool agora são mantidos como estão, em vez de serem somados aritmeticamente. #98976 (Yash).
  • Corrigido um comportamento indefinido (desreferenciamento de ponteiro nulo) ao alterar uma coluna version/sign/is_deleted para EPHEMERAL ou ALIAS em motores MergeTree. Essas alterações agora são rejeitadas corretamente. #98985 (Alexey Milovidov).
  • Corrigido o parseDateTimeBestEffort, que interpretava incorretamente palavras iniciadas por prefixos de mês no formato DD-month-YYYY. #99350 (Pavel Kruglov).
  • Corrigido CHECK TABLE com serialização esparsa dentro de um Tuple com Dynamic. #99351 (Pavel Kruglov).
  • Corrigido um erro lógico unordered_map::at: key not found no formato de saída Avro ao serializar colunas Enum8/Enum16 com valores ausentes na definição do enum. #99332 (Desel72).
  • Corrigido um bug em que a comparação entre os tipos Time[64] e DateTime[64] era confusa; os valores Time[64] agora são promovidos para DateTime[64] com a adição de 1970-01-01 como parte da data. #99267 (Yarik Briukhovetskyi).
  • Corrigida a desserialização de \N (NULL) para o tipo Variant nos formatos de texto Escaped/Raw. #99648 (Pavel Kruglov).
  • Corrigido um comportamento indefinido no leitor do formato Avro ao ler valores numéricos que excediam o limite do tipo da coluna de destino. Agora, as queries falham em caso de overflow, em vez de produzirem silenciosamente valores incorretos. #99697 (asyablue22).
  • Corrigido um falso positivo de abort em NativeReader ao desserializar um fluxo no formato Native com divergência na contagem de linhas: alterado de LOGICAL_ERROR para INCORRECT_DATA. #99822 (Rahul Nair).
  • Corrigido um abort de processo na desserialização de coluna Tuple quando o tipo de serialização no fluxo binário é DETACHED. #99823 (Rahul Nair).
  • Corrigida a configuração aggregate_functions_null_for_empty para funcionar com funções agregadas que retornam tipos não Nullable, como Array ou Map (por exemplo, groupArray, sumMap). #99839 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR na função midpoint quando chamada com tipos inteiros com e sem sinal misturados. #99867 (Alexey Milovidov).
  • Corrigida uma exceção LOGICAL_ERROR em queries envolvendo colunas Dynamic com junções cruzadas e filtros de runtime, causada por ColumnVariant::filter compartilhar ponteiros para colunas Variant em vez de cloná-los no caminho de otimização hasOnlyNulls. #100234 (Pavel Kruglov).
  • Corrigido um bug em array-of-variant que podia reinterpretar o tipo de dado ao chamar arrayFirst/arrayLast. Por exemplo, Array(Variant(Date, Bool)) era convertido em Bool quando o tipo de variant subjacente real era Date. #100255 (timothygk).
  • Corrigidos os formatos CSV e MsgPack, que não conseguiam interpretar Nullable(Tuple) corretamente. #100038 (Nihal Z. Miaji).
  • Corrigidas as funções accurateCastOrDefault e to*OrDefault, que não preservavam o tipo de coluna Const para entradas constantes. #100132 (Alexey Milovidov).
  • Parâmetros de consulta omitidos com tipo LowCardinality(Nullable(T)) agora assumem corretamente NULL por padrão, assim como Nullable(T). #100144 (Denys Melnyk).
  • Corrigido overflow de inteiro com sinal (comportamento indefinido) em toStartOfInterval quando chamado com valores de intervalo de milissegundos/microssegundos muito grandes em DateTime64 de alta precisão. #100156 (Alexey Milovidov).
  • Corrigidos os runtime filters de join sobre o tipo de dado Variant. #100182 (Dmitry Novik).
  • Corrigido um cast de Time64 para UInt64 que podia limitar os valores a 24 horas. #100025 (Yarik Briukhovetskyi).
  • Corrigida uma exceção ao calcular o supertipo comum para tuplas vazias e não vazias com use_variant_as_common_type habilitado. #100699 (Antonio Andelic).
  • Corrigido comportamento indefinido em positiveModulo quando o divisor sem sinal não cabe no tipo de resultado com sinal. #100705 (Raúl Marín).
  • Corrigido comportamento indefinido (overflow de inteiro com sinal) em toStartOfInterval ao usar intervalos de Week, Quarter ou Year com um argumento origin e valores de intervalo extremos. #100817 (Raúl Marín).
  • Corrigidos os combinadores de função de agregação If, Distinct, DistinctIf e IfState com tipo de retorno Tuple e um ou mais argumentos Nullable, que não conseguiam ler estados serializados antigos após a introdução de Nullable(Tuple). #100826 (Nihal Z. Miaji).
  • cast_keep_nullable, quando habilitado, não lança mais erro ao fazer cast de um null Dynamic para um Variant. #100864 (Seva Potapov).
  • Corrigida uma exceção em intDiv/intDivOrZero em arrays de tuplas anuláveis. #100895 (Raúl Marín).
  • Corrigido comportamento indefinido (overflow de inteiro com sinal) em parseDateTimeBestEffort ao interpretar strings de datetime com mais de 18 dígitos fracionários de segundo. #100948 (Vasily Chekalkin).
  • Corrigida a função de agregação sumCountOrDefault com um ou mais argumentos Nullable que não conseguiam ler estados serializados antigos após a introdução de Nullable(Tuple). #101021 (Nihal Z. Miaji).
  • Corrigidas colunas ALIAS com tipos DateTime/DateTime64 que não aplicavam a conversão de fuso horário quando o fuso horário declarado diferia do fuso horário da expressão. #101043 (Alexey Milovidov).
  • Removido Nullable da coluna de resultado em arrayIntersect e funções relacionadas para evitar uma incompatibilidade entre serialização e desserialização. #101569 (George Larionov).
  • Corrigido positiveModulo(tuple, number), que estava sendo encaminhado incorretamente para divisão em vez de módulo. #101709 (ClickGap AI Bot).
  • Corrigida a saída incorreta em formatDateTime com o Formatter %W em determinadas configurações de formatting não padrão. #101847 (Robert Schulze).
  • Corrigida uma exceção de incompatibilidade de tipo em transform quando a coluna padrão é const em alguns blocos. #100616 (Pavel Kruglov).
  • Permitidos row groups vazios em Parquet. #100653 (Vitaly Baranov).
  • min/max/argMin/argMax agora tratam NaN de forma consistente com ORDER BY: NaN é sempre ignorado (retornado apenas quando todos os valores são NaN). Antes, os resultados dependiam da posição do NaN nos dados devido à semântica de comparação não ordenada do IEEE 754. #100448 (Raúl Marín).
  • Corrigida a inferência incorreta do tipo de dado de data em caso de overflow após o ajuste de fuso horário. #102674 (Pavel Kruglov).
  • Corrigido CASE com uma expressão Dynamic que retornava ELSE para todas as linhas. #102684 (Pavel Kruglov).
  • Corrigida a serialização do tipo Dynamic achatado com tipos de dado codificados em binário. #102692 (Pavel Kruglov).
  • Corrigido o fato de cast_string_to_date_time_mode ser ignorado em CAST para Nullable(DateTime). #103035 (Pavel Kruglov).
  • A representação de nulo na serialização de colunas replicadas e esparsas agora respeita as configurações (por exemplo, format_tsv_null_representation). #102888 (Hechem Selmi).

Correções de text index e skip index

  • Corrigido o uso do índice de texto com outros índices de salto. Antes, erros lógicos como “Trying to get non-existing mark” podiam ocorrer quando um filtro de consulta usava simultaneamente um índice de texto e outros índices de salto regulares. #98555 (Anton Popov).
  • Corrigida a recriação de índices de texto durante merges com TTL. #99107 (Anton Popov).
  • Corrigida a validação excessivamente rígida do preprocessador do índice de texto. #99359 (Anton Popov).
  • Removido o suporte a funções negadas (notEquals, notLike, notIn) na análise de índice de texto. Essas funções nunca conseguiam ignorar grânulos, portanto analisá-las no índice apenas adicionava sobrecarga. #99393 (Anton Popov).
  • Corrigida uma exceção NOT_FOUND_COLUMN_IN_BLOCK quando um predicado de índice de texto (por exemplo, hasAllTokens) era referenciado nas cláusulas SELECT e WHERE por meio de um alias. #99504 (Anton Popov).
  • Corrigidos resultados incorretos ao usar hasAllTokens com OR entre colunas que têm índices de texto separados. #99505 (Anton Popov).
  • Corrigida a leitura do índice de texto em uma tabela com exclusões leves e políticas de linha já existentes. #99661 (Anton Popov).
  • Corrigida a análise, pelo índice de texto com preprocessador, de predicados com a função IN, além de uma colisão de tokens pesquisados que podia levar a resultados incorretos. #99755 (Anton Popov).
  • Corrigido o uso incorreto do índice de texto com as funções startsWith e endsWith em tokenizers que não oferecem suporte a correspondência por substring (array, splitByString). Antes, esses tokenizers podiam produzir resultados incorretos silenciosamente. #100151 (Anton Popov).
  • Corrigido um crash raro quando uma exceção “Memory Limit” era lançada durante a construção do índice de texto. #100213 (Anton Popov).
  • Corrigidos erros “Not-ready Set is passed as the second argument” durante a análise de um índice de texto criado sobre mapValues para predicados contendo uma cláusula IN. #100224 (Anton Popov).
  • Corrigido um crash ao usar um índice de busca textual com uma cláusula IN contendo uma subconsulta de tupla, por exemplo, WHERE (id, str) IN (SELECT (id, str) FROM ...), ou quando o número de colunas na subconsulta não correspondia à tupla no lado esquerdo de IN. #100959 (Anton Popov).
  • O tokenizer splitByString agora rejeita strings separadoras vazias. #101928 (Robert Schulze).
  • O tokenizer sparseGrams gerava tokens mais longos do que o comprimento máximo fornecido (devido a um +2 fixo na implementação). #101934 (Elmi Ahmadov).
  • Corrigida uma exceção ao consultar tabelas Merge ou Distributed com um índice de texto completo e condições de filtro combinadas que misturam has*Tokens com LIKE, com query_plan_direct_read_from_text_index habilitado. #101939 (Jimmy Aguilar Mena).
  • Corrigido hasToken/hasTokenOrNull com padrões de busca compostos apenas por separadores (por exemplo, '()', '!!!') em colunas com índice de texto: antes, o índice ignorava silenciosamente todos os grânulos em vez de gerar BAD_ARGUMENTS (para hasToken) ou retornar NULL (para hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
  • As configurações de índice de texto completo (enable_full_text_index, allow_experimental_full_text_index, use_skip_indexes_on_data_read) não são mais desabilitadas quando a configuração compatibility aponta para uma versão anterior à 26.1. #102422 (Nikita Fomichev).
  • Adicionado suporte a colunas ALIAS na otimização de leitura direta a partir do índice de texto. #103037 (Anton Popov).

Correções no lago de dados

  • Corrigida uma condição de corrida lógica na mudança da snapshot version no mecanismo de tabela DeltaLake, e removidos recarregamentos redundantes e pesados de snapshot. #96226 (Kseniia Sumarokova).
  • Corrigida uma exceção DUPLICATE_COLUMN e NULLs silenciosos ao ler tabelas Delta Lake que usam o modo de mapeamento de colunas “name” com campos struct cujos nomes contêm pontos. #98013 (Caio Ishizaka Costa).
  • Corrigido um bug ao usar o Unity Catalog sobre GCS. #98456 (Melvyn Peignon).
  • DataLakeCatalog agora respeita a configuração http_forbid_headers do servidor ao validar a configuração auth_header. #98827 (Michael Anastasakis).
  • Agora é proibido criar, anexar e atualizar tabelas locais de lago de dados fora dos caminhos do usuário; isso é verificado ao criar e atualizar IDataLakeMetadata. #98936 (Daniil Ivanik).
  • Corrigidas as leituras do Iceberg BigLake: as credenciais ADC agora são encaminhadas ao cliente S3 do GCS (corrigindo erros 403), as credenciais OAuth2 são codificadas em URL antes do envio, e o percurso do espaço de nomes não é mais interrompido por respostas HTTP 400 do BigLake. #98998 (Nikita Fomichev).
  • Corrigido um erro de acesso fora dos limites ao consultar apenas colunas virtuais de uma tabela Iceberg com dados Avro. #99080 (alesapin).
  • Corrigida uma falha em ALTER TABLE ... REMOVE SETTINGS para o mecanismo de tabela Iceberg. #99108 (alesapin).
  • Corrigida uma falha muito rara quando uma tabela Iceberg contém arquivos em formatos mistos (ORC e Parquet). #99168 (alesapin).
  • Corrigida uma falha (desreferência de ponteiro nulo) ao executar ALTER TABLE ... MODIFY COLUMN ... COMMENT em tabelas Iceberg. #99838 (Desel72).
  • O ClickHouse agora lida corretamente com tabelas no estilo Spark (com um caminho absoluto completo para cada arquivo ou um caminho relativo ao caminho comum da tabela). #99935 (alesapin).
  • Corrigida uma exceção quando uma configuração de caminho do arquivo de metadata do Iceberg contém um null byte. #100283 (Alexey Milovidov).
  • Corrigido um bug de copiar e colar em que delta_lake_snapshot_end_version, definida sem delta_lake_snapshot_start_version, era ignorada silenciosamente em vez de gerar um erro BAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar).
  • Corrigido um erro lógico em tabelas Iceberg ordenadas durante mutações. #100499 (alesapin).
  • Corrigido o catálogo Polaris com Azure, em que, desde a versão 25.12, o catálogo adicionava o bucket no início do caminho. #100583 (Konstantin Vedernikov).
  • Corrigida uma exceção Logical error: 'partitions_count > 0' ao executar comandos ALTER TABLE UPDATE consecutivos em uma tabela Iceberg particionada. #101278 (Desel72).
  • Corrigido o insert-select de um cluster Delta Lake com ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
  • Passa a emitir um erro quando as configurações de versão delta_lake_snapshot_version ou CDF são usadas sem o DeltaKernel habilitado, em vez de retornar dados incorretos silenciosamente. #101489 (Desel72).
  • Corrigido um loop de retry de INSERT do Iceberg que falhava quando a table era criada com iceberg_metadata_file_path e a versão de metadata de destino já existia. #101548 (Groene AI).
  • Corrigida uma falha do servidor (LOGICAL_ERROR) ao selecionar de uma visão materializada baseada no table engine IcebergLocal. #101577 (Groene AI).
  • Corrigida uma falha em ALTER TABLE ... UPDATE do IcebergLocal ao usar o formato Avro, causada por tipos wrapper LowCardinality/Nullable não serem desembrulhados antes da serialização. #102337 (Desel72).
  • Adicionada a coluna hostname ausente a system.delta_lake_metadata_log e system.iceberg_metadata_log. #102162 (Michael Russell).
  • Correção no CoalescingMergeTree para o tipo Array. #102384 (Konstantin Vedernikov).

Correções de S3/Azure/armazenamento de objetos

  • Corrigida uma exceção em CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova).
  • Corrigido um crash em que consultas a arquivos com um padrão glob (por exemplo, file('dir/**', 'LineAsString')) geravam uma exceção de sistema de arquivos não tratada se o diretório contivesse um symlink órfão. Symlinks órfãos agora são ignorados silenciosamente. #98143 (Mark Andreev).
  • Corrigido o uso excessivo de memória (~514 MiB) durante a autodetecção de formato ao ler dados não Arrow (por exemplo, JSON de url() ou file() sem um formato explícito), causado pelo leitor ArrowStream interpretar incorretamente os primeiros bytes como um comprimento de metadata muito grande. #98893 (Konstantin Bogdanov).
  • Corrigida uma race condition que podia causar uma exceção “ReadBuffer is canceled” em consultas usando urlCluster ou funções de tabela de cluster semelhantes. #98955 (Alexey Milovidov).
  • Corrigida uma mensagem enganosa “inflate failed: buffer error” ao ler arquivos comprimidos inexistentes por meio da função de tabela url() com padrões glob. #99034 (Alexey Milovidov).
  • Corrigidas chamadas N+1 de HeadObject para globs com expansão de chaves no S3. #99219 (Konstantin Bogdanov).
  • Corrigidos casos em que números com zeros à esquerda em um caminho de particionamento Hive causavam erros. #99458 (Yarik Briukhovetskyi).
  • Corrigido um seek incorreto em AsynchronousReadBufferFromFileDescriptor com O_DIRECT. #99678 (Pavel Kruglov).
  • Corrigido um bug em que o ClickHouse podia ignorar arquivos se o header Content-Length estivesse ausente na resposta à solicitação HEAD correspondente (por exemplo, devido à transcodificação descompressiva no GCS). #99971 (Yarik Briukhovetskyi).
  • O servidor não falha mais ao iniciar quando um disco do Azure blob storage está configurado, mas o endpoint está temporariamente inacessível (por exemplo, por falha de DNS). #100701 (Raúl Marín).
  • Corrigido um segfault em s3Cluster e em consultas distribuídas devido a um use-after-free no pool de conexões. #100837 (Konstantin Bogdanov).
  • Corrigida uma exceção que escapava do destrutor Client::~Client do S3, causando a finalização do servidor. #101798 (Gagan Dhakrey).
  • Corrigido o registro incorreto de host e port durante a reconexão. #102280 (Grant Holly).
  • Corrigida uma exceção do servidor no ClusterDiscovery quando um cluster estático (definido na config) ficava temporariamente sem nós ativos. #102661 (Kseniia Sumarokova).

Correções no S3Queue

  • S3Queue: corrigida uma falha de asserção após a perda de conexão com o ZooKeeper, mas com commit bem-sucedido. #100210 (Kseniia Sumarokova).
  • Corrigido o texto descritivo invertido da coluna alterable em system.s3_queue_settings e system.azure_queue_settings — os significados de 0 e 1 foram invertidos para corresponder ao comportamento real do código. #101703 (ClickGap AI Bot).

Correções de segurança e controle de acesso

  • A função de tabela loop chamava inner_storage->read() diretamente, contornando a camada do interpretador, onde políticas de linha, grants em nível de coluna e outras verificações de segurança são aplicadas. Isso permitia que um usuário restrito por políticas de linha lesse todas as linhas via loop(table). #97682 (pufit).
  • Impõe verificações de READ ON FILE para file() escalar e DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
  • Aceita credenciais em base64 sem padding na autenticação HTTP Basic. Alguns clientes HTTP omitem o padding = no final do cabeçalho Authorization: Basic, o que antes causava falhas de autenticação. #98392 (Amos Bird).
  • Corrigido um bypass de RBAC que permitia aos usuários executar DESCRIBE em qualquer tabela via remote(), remoteSecure(), cluster() ou clusterAllReplicas() apontando para localhost, sem exigir o privilégio SHOW_COLUMNS. #98669 (pufit).
  • Corrigido um problema em que system.grants omitia os parâmetros de expressão regular para grants URL e S3 na coluna access_object. #98987 (DQ).
  • Corrigido um bypass de RBAC que permitia aos usuários obter a estrutura da tabela via DESCRIBE TABLE ou CREATE TABLE AS em funções de tabela (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc(), etc.) sem os privilégios necessários de acesso à origem. Para funções que inferem o schema a partir de servidores remotos, isso também permitia disparar conexões de saída (SSRF) sem autorização. #99122 (pufit).
  • Limita as constraints de settings no worker de DDL para consultas DDL distribuídas. #99317 (Pablo Marcos).
  • Corrigidos pequenos problemas na autenticação TOTP: a opção de CLI --one-time-password com senha vazia e a validação dos valores de configuração <digits> e <period>. #99322 (Vladimir Cherkasov).
  • As credenciais em strings de conexão JDBC, ODBC e NATS agora são mascaradas nos query logs e na saída de SHOW CREATE. Para strings de conexão no estilo URI, apenas a parte da senha é mascarada. A setting nats_token agora também é mascarada. #99344 (János Benjamin Antal).
  • Proíbe a leitura de credenciais do Google a partir de um arquivo local, o que era inseguro porque permitia ler outras credenciais se o caminho do arquivo fosse conhecido. #99584 (Konstantin Vedernikov).
  • Corrigido o bypass da origem do Dicionário MySQL ao RemoteHostFilter para parâmetros DDL inline. #99720 (Shaohua Wang).
  • Corrigido system.completions para filtrar corretamente databases, tabelas e colunas por direitos de acesso em todas as combinações de grants: revogação por tabela, por DB e por coluna. #100432 (Shaohua Wang).
  • Sanitiza query_id no handler HTTP para evitar injeção de CRLF nos headers de resposta por meio do header X-ClickHouse-Query-Id. #100500 (Pablo Marcos).
  • Alguns catálogos podiam exibir informações sensíveis na seção SETTINGS de SELECT * FROM system.databases. Isso não acontece mais. #100800 (Konstantin Vedernikov).
  • As políticas de linha não eram propagadas dos subplanejadores para o planejador pai para registro em log, por isso ficavam ausentes em query_log para views, subconsultas e instruções INSERT SELECT. Agora elas são mantidas em QueryAccessInfo para registro em log. #101044 (Narasimha Pakeer).

Correções de backup e restauração

  • Corrigido o problema de max_execution_time não ser aplicado a backup/restauração. #99205 (Kseniia Sumarokova).
  • Corrigida a exceção ReadBuffer is canceled. Can't read from it. em operações de backup/restauração com arquivos zip. #100400 (Alexey Milovidov).
  • Validados os caminhos das entradas de arquivo nos metadados de backup para rejeitar path traversal, caminhos absolutos e nomes vazios durante RESTORE. #100483 (Pablo Marcos).
  • Corrigidas a formatação e a clonagem da AST de BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).

Correções do ClickHouse Keeper

  • Corrigido um data race no cliente ZooKeeper entre a thread de envio e a thread de recebimento. #97887 (Pablo Marcos).
  • Corrigida a perda de dados do Keeper após reinicialização ao usar Azure Blob Storage com metadados s3_plain para armazenamento de logs. #97987 (Antonio Andelic).
  • Definido o componente Watch para respostas de watch em aggregated_zookeeper_log, em vez de deixá-lo vazio. #98202 (Antonio Andelic).
  • Corrigido um problema em que o ClickHouse Keeper desconectava clientes Java do ZooKeeper após uma solicitação addWatch. O cliente Java espera um corpo ErrorResponse de 4 bytes, mas o Keeper enviava um corpo vazio, causando EOFException e desconexão da sessão. #98499 (Antonio Andelic).
  • Corrigidas as métricas do Keeper zk_followers e zk_synced_followers, que não diminuíam quando um seguidor caía. Adicionadas as novas métricas zk_learners e zk_synced_non_voting_followers ao comando mntr. #98504 (Antonio Andelic).
  • Corrigido o fato de a porta Raft segura do Keeper ignorar cipherList e dhParamsFile da configuração openSSL. #98509 (Antonio Andelic).
  • Corrigidas mensagens de log enganosas do Keeper, como “Receiving request for session X took 9963 ms”, em que o tempo informado era, na verdade, gasto aguardando ociosamente em poll() entre heartbeats. #98510 (Antonio Andelic).
  • Corrigidas conexões TCP do Keeper que impediam o desligamento gracioso do servidor por não responderem ao sinal de desligamento. #98525 (Alexey Milovidov).
  • Corrigida uma asserção de depuração em DDLWorker causada por um first_failed_task_name obsoleto após uma entrada do ZooKeeper ser excluída durante a recuperação da reinicialização. #99099 (Antonio Andelic).
  • Corrigido um caso de crash no Keeper. #99133 (JIaQi Tang).
  • Corrigido um bug no Keeper em que uma solicitação de leitura podia ficar travada (causando timeout de sessão) se uma sessão diferente e não relacionada no mesmo servidor fosse fechada exatamente no momento errado. #99484 (Michael Kolupaev).
  • Corrigido um segfault no NuRaft devido a uma race condition. #100444 (Pablo Marcos).
  • Corrigida a falha de CREATE TABLE em KeeperMap com “Cannot create metadata for table” quando nós remanescentes do ZooKeeper de um drop parcial anterior à versão 25.1 não tinham o nó drop_lock_version. #101623 (Antonio Andelic).
  • Corrigida a perda do registry de UDF quando uma sessão do ZooKeeper expirava durante o refresh periódico — todas as Funções Definidas pelo Usuário podiam ficar indisponíveis até que um full refresh fosse concluído com sucesso. #101891 (Nikita Fomichev).
  • Corrigido um crash no refresh de UDF causado por ZooKeeperRetriesControl tentar novamente em uma sessão do ZooKeeper obsoleta (expirada) sem renová-la. #102059 (Nikita Fomichev).

Correções de travamentos e estabilidade

  • Corrigido um crash nas funções do dialeto Kusto bin(), bin_at(), extract() e indexof() quando argumentos vazios são fornecidos. #95736 (NeedmeFordev).
  • Corrigido um crash/assert do servidor em mapContainsKey/mapContainsKeyLike com um skip index tokenbf_v1. #97826 (Shankar Iyer).
  • Corrigido um crash do servidor (std::terminate) causado por uma exceção não capturada no destrutor do pool de conexões HTTP quando o limite rígido do grupo de conexões é atingido em alta concorrência. #97850 (Antonio Andelic).
  • Corrigido um acesso fora dos limites em ColumnConst::getExtremes que podia causar um crash quando extremes = 1 está habilitado. #98263 (Alexey Milovidov).
  • Validação de dados corrompidos durante a desserialização de DDSketch para evitar segfaults, exceções, loops infinitos e OOM ao ler estados de função de agregação quantilesDD corrompidos. #98284 (Alexey Milovidov).
  • Corrigida uma exceção rara no executor do pipeline, que podia se manifestar como Received signal 6 (em compilações de depuração), quando a expansão do pipeline entra em condição de corrida com o cancelamento da consulta. #98428 (Alexey Milovidov).
  • Corrigida uma desreferenciação de ponteiro nulo em dictGetOrDefault quando o argumento de chave é Nullable. #98460 (Alexey Milovidov).
  • Corrigido um deadlock no pipeline ao usar sort_overflow_mode = 'break' junto com funções de janela. #98543 (Alexey Milovidov).
  • Corrigido um crash por desreferenciação de ponteiro nulo em tabelas de sistema criadas entre o snapshot das tabelas em IDatabaseTablesIterator::table() e a alteração dessas tabelas em outra thread durante a iteração posterior. #98792 (Grant Holly).
  • Corrigido o desvio no rastreamento de memória causado por alocações com falha que não eram revertidas, comportamento indefinido de nallocx(0) e um erro de uma unidade no rastreamento global de pico. O rastreamento foi estendido para abranger os ring buffers do io_uring. #98915 (Antonio Andelic).
  • Corrigido um crash do servidor (std::terminate) ao executar ALTER TABLE ... DROP PART em um patch part após uma alteração de esquema (por exemplo, ADD COLUMN). #99036 (Peng).
  • Corrigido um crash do servidor que podia ocorrer se uma exceção de limite de memória excedido fosse lançada durante uma leitura de disco em cache. #99042 (Shankar Iyer).
  • Corrigido um crash acionado por uma exceção de limite de memória lançada durante a aplicação de patch part. #99086 (Anton Popov).
  • Corrigido um crash ao usar uma tabela Buffer com SAMPLE quando o destino não oferece suporte a isso. #99141 (Kseniia Sumarokova).
  • Corrigido um uso da heap após liberação quando uma tabela é removida simultaneamente a uma consulta de leitura em execução. #99483 (Alexey Milovidov).
  • Corrigido um heap-buffer-overflow em CompressionCodecT64 e um abort do processo em CompressionCodecMultiple ao descomprimir dados comprimidos malformados. Os codecs agora lançam uma exceção em vez de travar. #99680 (Rahul Nair).
  • Corrigido um loop infinito ao ler arquivos no formato Npy com dimensões negativas de shape. #99812 (Desel72).
  • Corrigido um global-buffer-overflow na função CRC32 em argumentos FixedString quando avaliada com zero linhas durante o cálculo do cabeçalho do plano de consulta. #99835 (Alexey Milovidov).
  • Corrigida uma falha de asserção em sipHash128Keyed (e funções de hash com chave semelhantes) quando o argumento de dados é um map com chaves do tipo array ou outros tipos de array aninhados. #99921 (Alexey Milovidov).
  • Corrigida uma falha de asserção ao multiplicar aggregate states de NumericIndexedVector por uma constante inteira par, causada por self-XOR em bitmaps Roaring com alias em pointwiseAddInplace. #99976 (Desel72).
  • Corrigido um desreferenciamento de nullptr no leitor de Parquet quando o caminho filter-in-decoder encontra páginas filtradas. #99677 (Alexey Milovidov).
  • Corrigido um travamento do servidor local quando CREATE DICTIONARY tem uma definição com um valor de lista que contém uma função inexistente. #100036 (Yakov Olkhovskiy).
  • Corrigido um SIGSEGV ao ler patch parts após ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky).
  • Corrigido uso de valor não inicializado em StringSearcher.h. #100225 (Konstantin Bogdanov).
  • Corrigido um travamento do servidor (falha de asserção) ao usar funções agregadas paramétricas com o combinador Array e argumentos NULL, como quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot).
  • Corrigido um heap-buffer-overflow em sorted_buffer_gt::insert() do usearch que podia travar o processo ou corromper silenciosamente a memória durante a busca por similaridade vetorial. #100537 (Dustin Healy).
  • Corrigido um travamento do servidor (erro lógico “Unexpected return type from __topKFilter”) quando use_top_k_dynamic_filtering está habilitado e a coluna ORDER BY tem tipo Dynamic ou Variant. #100742 (Groene AI).
  • Corrigido um travamento do servidor ao usar a função has() com PREWHERE/WHERE em uma chave Tuple que contém elementos LowCardinality. #100760 (Groene AI).
  • Corrigido um segfault por desreferenciamento de ponteiro nulo ao carregar dicionários durante o desligamento do servidor. #100839 (Miсhael Stetsyuk).
  • Corrigido um buffer overflow em ULIDStringToDateTime quando a entrada contém bytes não ASCII. #100843 (Konstantin Bogdanov).
  • Corrigido um crash (LOGICAL_ERROR) ao consultar uma tabela Merge (ou a função de tabela merge()) que agrega várias tabelas, incluindo uma tabela Distributed, com distributed_group_by_no_merge=1 habilitado. #100859 (Groene AI).
  • Corrigido um crash ao criar um dicionário de polígonos a partir de uma tabela MergeTree que usa serialização de colunas esparsas. #100964 (Anton Popov).
  • Corrigido um crash (Logical error: isConst/isSparse/isReplicated assertTypeEquality) em algoritmos de merge quando a replicação lazy de colunas (enable_lazy_columns_replication) produz colunas ColumnReplicated que seguem para pipelines de merge-sort com entradas que chegam tardiamente. #101036 (Groene AI).
  • Corrigido um crash do servidor (SIGABRT) ao usar funções agregadas com o combinador interno Null (por exemplo, sumNull, avgNull) e aggregate_functions_null_for_empty = 1. #101147 (Groene AI).
  • Corrigido um use-after-free no caminho de escrita do cache do sistema de arquivos que podia causar leituras de memória já liberada ao registrar em log segmentos de arquivo concluídos. #101161 (Groene AI).
  • Corrigido um crash do servidor com “Trying to attach external table to a ready set without explicit elements” quando a análise de índice distribuído encontra um predicado GLOBAL IN cujo conjunto foi criado sem elementos explícitos. #101178 (Groene AI).
  • Corrigidas as funções agregadas MAX/MIN em colunas Decimal, que retornavam resultados incorretos quando a compilação JIT estava habilitada. #101203 (Raúl Marín).
  • Corrigido um crash do servidor (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) ao consultar uma tabela MergeTree com ORDER BY CAST(lc_column, 'Type'), em que lc_column tem o tipo LowCardinality. #101220 (Groene AI).
  • Corrigido UB em mergeTreeAnalyzeIndexes() no caso de um argumento de otimizações inválido. #101253 (Azat Khuzhin).
  • Corrigido um crash do servidor (Logical error: “Variant … is empty”) quando uma consulta lê ao mesmo tempo uma coluna Tuple contendo um tipo Dynamic Map e sua subcoluna. #101448 (Groene AI).
  • Corrigido um crash LOGICAL_ERROR “Current component is empty” ao consultar system.part_moves_between_shards com enforce_keeper_component_tracking habilitado. #101462 (Groene AI).
  • Corrigida uma falha de segmentação em DataTypeDynamic::create() quando o fuzzer gera uma AST de tipo Dynamic malformada. #101464 (Groene AI).
  • Corrigido um crash LOGICAL_ERROR (“ColumnUnique can’t contain null values”) ao comparar uma coluna LowCardinality com uma constante Variant NULL enquanto use_variant_default_implementation_for_comparisons está desabilitado. #101690 (Groene AI).
  • Adicionada uma proteção para stream vazio em Bzip2ReadBuffer, para que ele retorne EOF em vez de lançar UNEXPECTED_END_OF_FILE quando o stream interno estiver vazio. #101691 (ClickGap AI Bot).
  • Corrigido um crash de use-after-free no scheduler de lease de CPU quando o temporizador de espera sobrevive à thread de trabalho cujos ProfileEvents::Counters ele referencia. #101761 (Antonio Andelic).
  • Corrigido um use-after-scope na desserialização em paralelo de caminhos dinâmicos do tipo Object, que podia causar crashes ao ler tabelas com muitos caminhos dinâmicos. #101823 (Antonio Andelic).
  • Corrigido um SIGSEGV em MergeTreeDataPartWriterWide::cancel quando um construtor de stream lança uma exceção durante addStreams, deixando uma entrada nula em column_streams. #101936 (Antonio Andelic).
  • Corrigida uma falha de segmentação em mutações em colunas materializadas sem expressão. #102342 (zoomxi).
  • Corrigido um segfault (ou LOGICAL_ERROR em compilações de depuração) ao ler arquivos Parquet com push-down de filtro de Bloom habilitado e condições de igualdade/desigualdade na cláusula WHERE, causado por um acesso à memória fora dos limites no prefetcher do Parquet. #102385 (Groene AI).
  • Corrigida uma leitura fora dos limites em funções de busca de strings (countSubstrings, position, etc.) ao procurar uma substring composta inteiramente por bytes nulos. #102401 (Raúl Marín).
  • Corrigida uma leitura fora dos limites em printf com um % no final. #102472 (Raúl Marín).
  • Corrigido um crash de LOGICAL_ERROR “Número inesperado de linhas no subfragmento da coluna” no leitor nativo de Parquet V3 ao ler colunas nullable com um filtro WHERE. #102628 (Groene AI).
  • Corrigido um crash do servidor (SIGSEGV) ao ler arquivos Avro com esquemas recursivos contendo referências cíclicas a tipos simbólicos. Esses esquemas agora são detectados e rejeitados com uma mensagem de erro clara. #102853 (Groene AI).
  • Corrigido um crash do servidor (asserção LOGICAL_ERROR) quando uma função em uma coluna Variant atinge um limite de memória ou outra exceção que não seja de conversão de tipo durante a conversão do resultado em FunctionVariantAdaptor. #102855 (Groene AI).
  • Corrigido um crash do servidor em compilações de depuração/com sanitizer quando std::length_error é lançada durante a inferência de esquema. #102859 (Groene AI).
  • Corrigido um crash ao usar uma view com uma cláusula WHERE em que a consulta interna produz colunas com tipos diferentes dos metadados da view (por exemplo, Nullable de um LEFT JOIN com join_use_nulls). #102085 (Miсhael Stetsyuk).

Outras correções de bugs

  • Corrigido um bug em que configurações explícitas enviadas junto com compatibility na mesma solicitação podiam ser ignoradas silenciosamente quando seu valor correspondia ao padrão do servidor. #97078 (Raufs Dunamalijevs).
  • Corrigido o problema em que o cliente reportava NETWORK_ERROR em vez do erro de parsing real (com o número correto da linha) quando um INSERT com parsing paralelo encontrava dados inválidos. #97339 (Alexey Milovidov).
  • Corrigido o DROP DATABASE com database_atomic_wait_for_drop_and_detach_synchronously, que ficava travado indefinidamente quando a consulta era interrompida. #97586 (Alexey Milovidov).
  • Corrigido o KILL QUERY, que não conseguia encerrar consultas travadas na geração de WITH FILL, no carregamento de dicionário via dictGet ou em ALTER DELETE com mutations_sync=1 no ReplicatedMergeTree. #97589 (Alexey Milovidov).
  • Corrigido um erro lógico em uma consulta de política de mascaramento de dados com ON CLUSTER. #97594 (Bharat Nallan).
  • Corrigido o pruning incorreto de partição ao usar DateTime64 anterior à época Unix com a função toDate(). #97746 (Yarik Briukhovetskyi).
  • Corrigido um Cannot schedule a file LOGICAL_ERROR em INSERT na Distributed devido a uma condição de corrida entre DROP e INSERT. #97822 (Azat Khuzhin).
  • Corrigido um erro lógico “Bad cast from type DB::ColumnConst to DB::ColumnArray” em kql_array_sort_asc/kql_array_sort_desc quando chamado com argumentos de array constantes. #98251 (Alexey Milovidov).
  • O servidor HTTP agora retorna uma mensagem de erro no corpo da resposta para respostas 400 Bad Request causadas por headers malformados, em vez de um corpo vazio. #98268 (Alexey Milovidov).
  • Corrigidos resultados incorretos com distributed index analysis (recurso experimental) e o query condition cache. #98269 (Azat Khuzhin).
  • Corrigido um dictionary source do MongoDB que falhava com named collections. #98528 (Pablo Marcos).
  • Passa a impedir a remoção de uma coluna quando suas subcolumns são usadas nas expressões default/alias de outras colunas e a usar o analyzer para expressões default em ALTER DROP COLUMN. #98569 (Nikita Mikhaylov).
  • Todos os DB::Exception de PocoHTTPClient::makeRequestInternalImpl agora não permitem nova tentativa, incluindo HTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda).
  • Corrigidos dois bugs na compilação JIT de expressões: um erro de copiar e colar na verificação de tipo de nativeCast que tornava inacessíveis os branches de cast de inteiro para inteiro e de float para float, e um nullptr incorreto de TargetMachine passado ao LLVM PassBuilder. #98660 (Alexey Milovidov).
  • Corrigida uma exceção “Inconsistent KeyCondition behavior” em compilações de depuração quando a chave primária contém valores NaN de ponto flutuante, fazendo com que accurateLess e accurateEquals tratem NaN de forma consistente com a ordem de classificação do ClickHouse. #98964 (Alexey Milovidov).
  • Corrigido o windowFunnel com strict_deduplication, que retornava um nível incorreto ao encontrar um evento duplicado. #99003 (Yash).
  • Fez com que as entradas de system.trace_log para recargas automáticas de dicionários do ClickHouse passassem a ter IDs de consulta não vazios. #98784 (Miсhael Stetsyuk).
  • Corrigido SYSTEM START REPLICATED VIEW, que não ativava a tarefa de refresh. #98797 (Pablo Marcos).
  • Corrigido WITH FILL STALENESS, que produzia linhas preenchidas extras quando os dados eram lidos em vários fragmentos (por exemplo, com index_granularity pequeno). #98895 (Alexey Milovidov).
  • Corrigida uma falha na ofuscação de consultas para identificadores que começam com letra maiúscula, como Ab. #101450 (Xuewei Wang).
  • Corrigido o fato de TABLE_UUID_MISMATCH ser ignorado no caminho de código sem analyzer. #99380 (Azat Khuzhin).
  • Corrigido clickhouse format --obfuscate, que produzia SQL inválido ao ofuscar tipos de skip index, nomes de codec de compressão, nomes de engine de banco de dados e definições de layout/source de dicionário. #99260 (Raúl Marín).
  • Valida alterações de configuração em consultas CREATE quando o próprio engine também oferece suporte a configurações. #99279 (János Benjamin Antal).
  • Corrigido insert_deduplication_token, que era ignorado silenciosamente em consultas INSERT SELECT sem ORDER BY ALL. Fornecer insert_deduplication_token agora é suficiente para habilitar a desduplicação independentemente de ORDER BY ALL. #99206 (Desel72).
  • Atrasa o processamento até que o servidor termine de carregar todas as tabelas. #99700 (Seva Potapov).
  • Corrigido o parsing de aspas no estilo shell em argumentos da table function executable. #99794 (Nikita Semenov).
  • Corrigidas consultas async insert que reportavam zero written_rows, read_rows e result_rows em query_log e na saída do client. #99879 (Sema Checherinda).
  • Corrigido um INSERT com VALUES que falhava quando os dados eram seguidos, na linha seguinte, por um comentário SQL final (-- ou /* */). O comentário agora é ignorado em vez de ser interpretado como outra linha. #100016 (Pratima Patel).
  • Corrigida uma exceção em arrayRemove ao comparar tuplas com componentes NULL. #100017 (Alexey Milovidov).
  • Processa corretamente valores negativos em NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
  • Corrigido um problema em que a table function primes não respeitava corretamente max_rows_to_read em alguns casos, especialmente quando offset e step estavam presentes. #100199 (Nihal Z. Miaji).
  • Os usuários não veem mais NATURAL CROSS JOIN ao consultar a AST de uma consulta com natural join que é reescrita como CROSS JOIN. #100223 (Peter Nguyen).
  • Algumas pequenas mudanças em funções: as funções h3 agora validam melhor os limites; readWKB verifica limites de tamanho (uma nova configuração, max_wkb_geometry_elements); e as funções geradoras aleatórias limitam o número máximo de iterações. #100270 (Alexey Milovidov).
  • Corrigido um problema em que cutURLParameter podia ignorar parâmetros incorretamente quando eles apareciam como substrings de outros parâmetros. #100280 (Nikita Semenov).
  • Corrigida uma exceção LOGICAL_ERROR em estimateCompressionRatio quando o parâmetro block_size_bytes é extremamente grande. #100298 (Alexey Milovidov).
  • Corrigido o travamento indefinido de DROP TABLE em tabelas com motor Kafka quando consumidores ficam presos em um rebalance após um erro de heartbeat. #100388 (Alexey Milovidov).
  • As dimensões do shape do formato Npy agora são validadas em relação ao tamanho do arquivo e aos limites de overflow para evitar negação de serviço com arquivos .npy maliciosamente criados. Shapes vazios também passam a ser rejeitados, e a memória por linha fica limitada a 2 GiB. #100625 (Raúl Marín).
  • Corrigido o problema em que session_timezone era ignorado ao fazer o parsing de valores DateTime durante async inserts (TCP) e em todas as inserções via HTTP. #100647 (Sema Checherinda).
  • StorageRabbitMQ::shutdown passou a ser idempotente, e foram adicionadas verificações defensivas de null, já que agora ele é chamado duas vezes (em StreamingStorageRegistry e DatabaseCatalog). #100455 (Miсhael Stetsyuk).
  • Corrigida uma exceção LOGICAL_ERROR ao usar accurateCastOrNull com o tipo de destino QBit. #100470 (Raufs Dunamalijevs).
  • Corrigido o problema em que a sintaxe LIMIT m OFFSET n WITH TIES não funcionava (equivalente a LIMIT n, m WITH TIES, que já funcionava). #100491 (Nihal Z. Miaji).
  • Corrigido um segfault em que SerializationInfoTuple::add fazia um assert_cast em uma referência comum de SerializationInfo ao mesclar partes depois que ALTER MODIFY COLUMN alterou uma coluna de um tipo não Tuple para Tuple. #100509 (Miсhael Stetsyuk).
  • Corrigida a exceção “No set is registered for key” ao usar IN com colunas Nullable(Tuple) que têm campos nomeados e elementos LowCardinality. #100523 (Alexey Milovidov).
  • Corrigido o problema em que EXECUTE AS ignorava as cláusulas FORMAT e INTO OUTFILE especificadas na consulta. #100538 (pufit).
  • Corrigida a formatação inconsistente da AST para SAMPLE com OFFSET no nível da consulta. #100579 (Pavel Kruglov).
  • Corrigidos erros “A tabela de destino não existe” em visões materializadas com tabelas internas durante a inicialização assíncrona, causados por uma ordem incorreta das dependências de inicialização. #100946 (Nikolay Degterinsky).
  • Corrigida uma exceção em optimizeLazyMaterialization quando uma projeção com PREWHERE é usada com ORDER BY ... LIMIT. #101115 (Anton Popov).
  • Corrigida uma mensagem de erro incorreta ao chamar intExp10 com um argumento NaN — ela informava intExp2 em vez de intExp10. #101582 (Krishna Chaitanya).
  • Corrigido que allow_statistics=0 não bloqueava ALTER TABLE ADD STATISTICS e ALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya).
  • Corrigido que CREATE TABLE ... AS merge() ignorava a lista explícita de colunas e, em vez disso, inferia automaticamente as colunas das tabelas de origem, o que causava erros NOT_FOUND_COLUMN_IN_BLOCK quando merge_table_max_tables_to_look_for_schema_inference era baixo o suficiente e as tabelas de origem tinham esquemas diferentes. #101663 (Miсhael Stetsyuk).
  • Corrigida a criação de dicionário RANGE_HASHED, que aceitava silenciosamente um atributo de intervalo MAX inexistente e usava a configuração de tipo errada quando os atributos mínimo e máximo do intervalo tinham tipos diferentes. #101732 (Yakov Olkhovskiy).
  • Corrigidos bugs nas funções arrayLevenshteinDistanceWeighted e arraySimilarity. #101767 (Mikhail f. Shiryaev).
  • Corrigido que a API Prometheus Query ignorava corpos de formulário POST. #101794 (James Cunningham).
  • Corrigido um falso negativo de shouldPatchFunction em SYSTEM INSTRUMENT ADD quando a string de busca aparece pela primeira vez dentro de um argumento de Template do nome de símbolo após demangling. #101885 (Pablo Marcos).
  • Corrigida a descrição de system.codecs para AES_256_GCM_SIV, para informar AES-256 em vez de AES-128. #101917 (Jimmy Aguilar Mena).
  • Corrigido comportamento indefinido ao analisar pacotes de consulta do protocolo nativo com valores inválidos de QueryProcessingStage. #101972 (Raúl Marín).
  • A conexão TCP agora é fechada quando ocorre uma exceção durante a análise inicial da consulta, para evitar a leitura de dados inválidos de um stream dessincronizado. #101989 (Raúl Marín).
  • Corrigidos casos em que Time com valores negativos retornava um resultado incorreto na comparação com DateTime. #102056 (Yarik Briukhovetskyi).
  • Corrigidos espaços ausentes ao formatar unlock snapshot. #102063 (Han Fei).
  • Falha na inicialização, em uma réplica nova, de tabelas alias sem tabela de destino em Database Replicated. #102397 (Nikolay Degterinsky).
  • INSERTs simples sem visões materializadas não solicitam mais slots e threads excessivos do ConcurrencyControl (max_threads em vez de max_insert_threads), evitando o esgotamento de slots de CC e o aumento descontrolado na contagem de threads em clusters com alta vazão de INSERT. #102961 (Sema Checherinda).
  • Reintroduzido ArrowMemoryPool para permitir lançar MEMORY_LIMIT_EXCEEDED e evitar OOM do kernel. #102999 (Azat Khuzhin).
  • Corrigido um tipo de argumento incorreto exibido em mensagens de erro de funções de busca em strings (por exemplo, locate, position) quando os argumentos são passados em ordem invertida (locate(needle, haystack) com function_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov).
  • Corrigido o bloqueio indefinido de waitForPause quando disableFailPoint é chamado sem nenhuma thread pausada no failpoint. #103119 (Shaohua Wang).
Last modified on June 29, 2026