Skip to main content

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

Mudanças em consultas e sintaxe

  • As window functions RANK e DENSE_RANK agora rejeitam argumentos e lançam NUMBER_OF_ARGUMENTS_DOESNT_MATCH, em conformidade com o SQL standard. Anteriormente, consultas como RANK(x) OVER (ORDER BY id) eram aceitas silenciosamente e o argumento era ignorado, o que causava frequente confusão entre os usuários. Para restaurar o comportamento permissivo anterior, defina allow_rank_dense_rank_arguments = 1. #104324 (groeneai).

Alterações nos tipos de dados

  • icebergHash e icebergBucket agora rejeitam argumentos Int128, UInt128, Int256, UInt256 e Decimal256 com um erro explícito. Antes, truncavam silenciosamente valores maiores e produziam hashes com colisões. A especificação Iceberg define hashing apenas para inteiros de 32/64 bits e decimais com precisão de até 38; faça cast para Int64 ou Decimal128 para manter o comportamento anterior para valores compatíveis. #105866 (Algunenano).
  • toUUID, toUUIDOrNull, toUUIDOrZero, toUUIDOrDefault, CAST para UUID e Nullable(UUID), accurateCastOrNull para UUID e os formatos de entrada que fazem parse de um UUID a partir de texto (Avro, MsgPack, JSONExtract, …) agora rejeitam strings que têm o comprimento correto, mas contêm caracteres não hexadecimais. Antes, tais entradas eram silenciosamente convertidas em um UUID fabricado, ao ultrapassar o final da tabela de lookup de dígitos hexadecimais. Agora toUUID lança CANNOT_PARSE_UUID, e as variantes Or* retornam NULL / o zero UUID / o valor padrão fornecido. #104370 (groeneai).
  • Os tipos Dynamic e Variant agora são validados na cláusula PARTITION BY de window; antes, isso não era verificado quando allow_suspicious_types_in_group_by está desabilitado. Consultas que particionam uma window sobre uma coluna Dynamic ou Variant agora lançam erro, a menos que allow_suspicious_types_in_group_by = 1. #105450 (Avogar).

Alterações no armazenamento e nos índices

  • Rejeita Dynamic/Variant aninhados em agregações min/max e índices minmax. Antes, apenas Dynamic/Variant de nível superior eram verificados. #105468 (Avogar).
  • O valor padrão da configuração do servidor insert_deduplication_version muda de compatible_double_hashes para new_unified_hash. A desduplicação de inserts agora opera sobre todo o bloco inserido (por insert), e não mais por parte/partição: uma nova tentativa do mesmo insert continua sendo desduplicada, mas dois inserts diferentes que produzem uma parte idêntica não são mais desduplicados entre si, e inserts reordenados das mesmas linhas não são mais desduplicados. Defina insert_deduplication_version = compatible_double_hashes para restaurar o comportamento anterior. A desduplicação de inserts assíncronos também é controlada pela janela síncrona em new_unified_hash: tanto sua ativação (replicated_deduplication_window) quanto sua retenção (replicated_deduplication_window_seconds, cujo padrão é 1 hora) seguem as configurações síncronas. Portanto, *_for_async_inserts é legado e se aplica apenas a old_separate_hashes / compatible_double_hashes. As instâncias atualizadas diretamente de um lançamento cujo padrão era old_separate_hashes devem primeiro operar com compatible_double_hashes até que transcorra a maior janela de desduplicação relevante (incluindo replicated_deduplication_window_for_async_inserts, cujo padrão é uma semana, caso inserts assíncronos sejam usados) antes de adotar new_unified_hash. Workloads assíncronos que migram de compatible_double_hashes devem primeiro aumentar replicated_deduplication_window[_seconds] para a janela assíncrona (e operar durante uma janela assíncrona completa), interromper os inserts assíncronos ou permanecer em compatible_double_hashes, pois new_unified_hash não verifica mais os IDs de async_blocks, que têm retenção mais longa. #107886 (CheSema).
  • Corrige o caso em que hasToken, com uma needle que contém separador, retornava resultados silenciosamente por meio de um índice de texto, em vez de gerar BAD_ARGUMENTS. #108189 (Ergus).

Recursos removidos

  • Não é mais possível usar o leitor e o gravador de Parquet obsoletos baseados em Arrow. A implementação nativa é sempre usada em seu lugar. As configurações que selecionavam as implementações antigas ou as ajustavam agora são obsoletas e ignoradas: input_format_parquet_use_native_reader_v3, output_format_parquet_use_custom_encoder, output_format_parquet_version, output_format_parquet_compliant_nested_types e output_format_parquet_unsupported_types_as_binary. A implementação nativa de gravação sempre grava Parquet V2.6+ com tipos aninhados compatíveis e lança UNKNOWN_TYPE para tipos sem suporte em vez de gravá-los como binário bruto. #100949 (alexey-milovidov).
  • Removida a configuração obsoleta allow_experimental_query_deduplication e o comportamento experimental sem suporte de desduplicação de consultas associado a ela. #99398 (devcrafter).
  • ALTER TABLE ... REPLACE PARTITION ... FROM ... não descarta mais silenciosamente os dados da partição de destino quando a tabela de origem não tem partes na partição solicitada. Antes, essa solicitação removia a partição de destino sem gravar nada em seu lugar. Agora, por padrão, ela é rejeitada com BAD_ARGUMENTS. Esta é uma alteração incompatível com versões anteriores: um REPLACE PARTITION de uma origem vazia que antes era bem-sucedido (limpando o destino) agora gerará um erro após o upgrade. Para restaurar o comportamento anterior de limpeza silenciosa, defina a nova configuração allow_replace_partition_from_empty_source = 1 (por consulta ou no perfil) ou defina compatibility como 26.5 ou inferior. Para descartar explicitamente os dados de destino, use ALTER TABLE ... DROP PARTITION .... #104939 (groeneai).
  • Removidas as funções experimentais KQL (Kusto) array_sort_asc e array_sort_desc, bem como seus backends SQL kql_array_sort_asc e kql_array_sort_desc. Essas funções eram experimentais, tinham implementação de baixa qualidade e eram fonte de bugs de correção e no analisador sintático. As consultas que usam esses nomes agora retornam UNKNOWN_FUNCTION. #108101 (groeneai).

Novos recursos

Funções

  • Adicionado suporte à função PromQL histogram_quantile nas funções de tabela prometheusQuery e prometheusQueryRange. Isso permite calcular quantis em buckets de histogramas clássicos do Prometheus identificados pelo rótulo le. #103477 (Yasumoto).
  • Adicionada a função h3PolygonToCellsWithContainment, que oferece suporte aos modos de contenção baseado no centro, totalmente contido e sobreposto. #104455 (yousefQadry).
  • Agora, é possível especificar um argumento opcional de precisão para as funções formatReadableSize, formatReadableDecimalSize e formatReadableQuantity, controlando o número de dígitos após o separador decimal. O padrão é 2, preservando o comportamento anterior. #104648 (antoniofilipovic).
  • Adicionados os aliases de agregação min_by e max_by para argMin e argMax. #105712 (itsjoeoui).

Recursos de SQL e de consultas

  • formatReadableTimeDelta agora aceita como entrada uma expressão INTERVAL de tipo diferente de Month e Year. #64315 (Beetelbrox).
  • Adicionado suporte ao formato de saída PNG, permitindo renderizar diretamente os resultados das consultas como imagens PNG. #74691 (m7kss1).
  • Introduzido um recurso de reserva de memória para workloads. Consulte a documentação sobre agendamento de workloads. #82414 (serxa).
  • Adicionadas as opções IPV4_PREFIX_BITS e IPV6_PREFIX_BITS para cotas definidas por IP_ADDRESS ou FORWARDED_IP_ADDRESS, permitindo compartilhar os limites de cota por sub-rede IP, em vez de aplicá-los separadamente a cada endereço completo. #89270 (adityachopra29).
  • Implementado ADD ENUM VALUES em consultas ALTER TABLE para simplificar a adição de novos valores a um tipo Enum existente, sem a necessidade de especificar novamente todos os valores atuais. #93830 (ilejn).
  • Adicionado o formato de entrada GeoJSON para leitura. #98124 (mneedham).
  • Adicionado um pós-processador ao índice de texto que transforma os tokens após a tokenização. #98939 (Ergus).
  • Adicionado suporte opcional a nós TTL no ClickHouse Keeper. Os nós TTL expiram automaticamente após o ciclo de vida configurado e não podem ter filhos. #100397 (scanhex12).
  • Adicionado armazenamento das posições dos tokens para índices de texto, oferecendo suporte a buscas exatas com hasPhrase. Habilite o argumento de índice support_phrase_search e a configuração allow_experimental_text_index_phrase_search do MergeTree. #103172 (ahmadov).
  • Adicionadas as funções arrayTopK e arrayBottomK: - arrayTopK(k, array) retorna os K maiores elementos em ordem decrescente - arrayBottomK(k, array) retorna os K menores elementos em ordem crescente. #104563 (vitlibar).
  • Adicionado suporte para selecionar colunas por padrão de nome com * LIKE '<pattern>' e * ILIKE '<pattern>', incluindo formas qualificadas como table.* LIKE '<pattern>' e table.* ILIKE '<pattern>'. LIKE corresponde a nomes de colunas diferenciando maiúsculas de minúsculas, enquanto ILIKE não faz essa distinção. #104569 (niyue).
  • Adicionadas consultas contínuas para tabelas MergeTree usando uma sequência de leituras de snapshots. #105114 (Michicosun).
  • Adicionado o formato RowBinaryWithNamesAndTypesAndDefaults para aprimorar o suporte à evolução de esquema. #105736 (mzitnik).
  • Adicionadas funções para disponibilizar Mapbox Vector Tiles diretamente do SQL: MVTEncodeGeom projeta uma geometria no espaço de pixels de um tile slippy-map e a recorta; MVTEncode agrega as geometrias projetadas de um grupo nos bytes binários de um tile de camada única; e MVTBoundingBox / MVTBoundingBoxMercator retornam a caixa delimitadora de um tile para restringir linhas a ela. Há suporte para geometrias de pontos, linhas e polígonos. Também disponíveis pelos aliases PostGIS ST_AsMVTGeom e ST_AsMVT. #106107 (saarthak2002).
  • Adicionados LOCALTIME e LOCALTIMESTAMP (sintaxe padrão SQL / PostgreSQL). LOCALTIMESTAMP é um alias de now() (retorna DateTime); LOCALTIME retorna a hora atual como um valor Time. #106139 (thomas-cabral).
  • Adicionadas duas novas estratégias de load_balancing, hostname_longest_common_prefix e hostname_longest_common_suffix, que preferem a réplica cujo hostname compartilha com o hostname do iniciador o prefixo comum mais longo (ou, respectivamente, o sufixo). Elas são úteis quando o data center é codificado como prefixo ou sufixo de hostnames cujos segmentos numéricos têm comprimento variável, caso em que as estratégias existentes nearest_hostname e hostname_levenshtein_distance selecionam a réplica errada. #107360 (den-crane).
  • Novas funções quantizeBFloat16ToInt8 e dequantizeInt8ToBFloat16: um codec escalar que comprime componentes de embedding para 8 bits usando um quantizador Gaussiano Lloyd-Max de 256 níveis, do qual códigos Int4/Int2/binários podem ser extraídos por truncamento de bits. #108102 (alexey-milovidov).

Motores de tabela e armazenamento

  • Adicionado suporte à gravação no Azure Data Lake Storage Gen2. #105406 (scanhex12).

Configurações e configuração

  • Adicionada a configuração output_format_always_write_decimal_point_in_float_and_decimal para sempre exibir o separador decimal em números de ponto flutuante e Decimal em formatos de texto, mesmo quando o valor for inteiro. Por exemplo, exibe 1. em vez de 1. Desabilitada por padrão. #62614 (qoega).
  • Adicionada uma nova configuração imutável do MergeTree, allow_tuple_element_aggregation, desabilitada por padrão. Quando habilitada, SummingMergeTree, AggregatingMergeTree e CoalescingMergeTree achatam recursivamente as colunas Tuple e agregam cada elemento folha de forma independente durante as mesclagens, exatamente como se fosse uma coluna de nível superior — o SummingMergeTree o soma, o AggregatingMergeTree mescla seu estado de função agregada e o CoalescingMergeTree mantém seu último valor não NULL. A configuração deve ser especificada no momento da criação da tabela e é ignorada silenciosamente por motores que não a suportam. #98039 (JingYanchao).
  • Adicionada a configuração output_format_float_precision para controlar o número de dígitos decimais na saída de texto de números de ponto flutuante. #99721 (phulv94).
  • Adicionadas as configurações de tabela MergeTree materialize_projections_on_insert e materialize_projections_on_merge. Quando materialize_projections_on_insert = 0, os INSERTs não criam partes de projeção, o que melhora a taxa de inserção em tabelas com muitas projeções. Quando materialize_projections_on_merge = 1, uma mesclagem recria uma projeção ausente de todas as partes de origem, permitindo que projeções sejam criadas durante as mesclagens em vez de na inserção. As mesclagens ainda combinam apenas partes que compartilham o mesmo conjunto de projeções. #100993 (cwurm).
  • Adicionada uma nova configuração do S3Queue, after_processing_move_preserve_path. Quando habilitada junto com after_processing='move' e after_processing_move_prefix, os objetos processados são movidos preservando todo o caminho de origem sob o prefixo de destino, em vez de serem reduzidos apenas ao nome do arquivo. #105354 (asya-ch).
  • Adicionados os elementos de configuração do handler HTTP url_prefix e full_url_prefix para corresponder a todos os caminhos com determinado prefixo, além dos elementos explícitos url_regexp, full_url_regexp e headers_regexp. A forma legada <url>regex:...</url> continua com suporte. #107492 (vitlibar).

Autenticação

  • Adicionada uma credencial external_id opcional para acesso ao S3 baseado em funções. #106941 (eliangidoni).
  • Adicionadas à tabela system.session_log informações do certificado TLS do cliente (subjects, número de série, emissor e período de validade) para melhorar a observabilidade da autenticação baseada em certificado. #107679 (alexey-milovidov).

Tabelas do sistema

  • Adicionada a tabela system.iceberg_files, que expõe metadados por arquivo para tabelas Iceberg, com uma linha para cada arquivo de dados ou de exclusão no snapshot atual de cada tabela. #104415 (asya-ch).
  • Adicionados índices de descarte hipotéticos (what-if). Use CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ... para definir um índice de descarte virtual com escopo de sessão e, em seguida, EXPLAIN WHATIF SELECT ... para estimar sua taxa de descarte e custo sem materializá-lo. Os índices definidos ficam visíveis na nova tabela system.hypothetical_indexes. #104608 (yariks5s).
  • Adicionada a tabela do sistema system.constraints, que fornece informações sobre todas as restrições CHECK e ASSUME em todas as tabelas, incluindo o nome, o tipo e a expressão da restrição. #105337 (PedroTadim).
  • Adicionada a tabela do sistema system.documentation, que reúne em uma única tabela a documentação de referência embutida dos componentes padronizados do sistema (funções, motores de tabela, tipos de dados, configurações, formatos e outros), com a documentação renderizada em Markdown. #107463 (alexey-milovidov).

Recursos experimentais

  • Adicionado o algoritmo experimental dphyp de reordenação de junções baseada em custo para junções internas, como opção da configuração query_plan_optimize_join_order_algorithm, e a configuração query_plan_optimize_join_order_max_searched_plans, que limita a busca pela ordem das junções e recorre ao próximo algoritmo da cadeia quando esse limite é excedido; defina-a como 0 para manter o comportamento anterior de busca ilimitada. #98798 (davenger).
  • Adicionado o modo de aplicação lazy de posting lists para o índice de texto. Quando habilitado por meio de SET allow_experimental_text_index_lazy_apply = 1 e SET text_index_posting_list_apply_mode = 'lazy', as posting lists são decodificadas sob demanda, na granularidade de blocos packed, usando uma abordagem baseada em cursor, em vez de serem totalmente materializadas em bitmaps Roaring, reduzindo o uso de memória e o tempo de CPU em consultas seletivas de índice de texto. #100035 (fastio).
  • Permite anexar handlers do prometheus à porta HTTP principal com um prefixo opcional. #104975 (JTCunning).
  • Adicionada uma configuração experimental do MergeTree, packed_skip_index_max_bytes, que agrupa pequenos subfluxos de índices de descarte em um único arquivo skp_idx.packed por parte, reduzindo a pressão sobre os inodes quando muitos índices de descarte são definidos em uma tabela. A decisão é tomada por subfluxo no momento da gravação: os subfluxos cujo tamanho serializado fica abaixo do limite são incluídos no arquivo, enquanto os maiores mantêm o layout independente skp_idx_<name>.idx2 / .mrk2. Uma única parte pode combinar layouts. Índices de texto completo não são compatíveis e sempre são armazenados em arquivos separados. O padrão é 0 (empacotamento desabilitado). #105321 (Algunenano).
  • Compatibilidade com a serialização Buffers para UDFs WebAssembly usando ABI BUFFERED_V1, além da adição de webassembly_udf_enable_fuel como uma configuração persistente de função UDF WASM. #105574 (antonio2368).
  • Execução de consultas distribuídas em vários estágios: o planejador divide o plano de consulta em estágios conectados por exchanges scatter / broadcast / gather / shuffle e encaminha os fragmentos do plano aos nós worker. Os dados entre os estágios são transmitidos via TCP ou transferidos por arquivos temporários no armazenamento de objetos compartilhado; há suporte para shuffle distribuído e hash joins por broadcast, agregação com shuffle e ordenação distribuída. O recurso é experimental e vem desabilitado por padrão. #106020 (davenger).
  • O mecanismo experimental de plano de consulta distribuída (make_distributed_plan) agora pode usar portas diferentes para encaminhamento de tarefas e streaming exchanges por worker, configuradas por réplica em <remote_servers> com stateless_worker_port e streaming_exchange_port. Quando não definidas, são usadas as portas anteriores no nível do servidor (stateless_worker_client.port e distributed_query.streaming_exchange_port). Isso possibilita executar vários workers em um único host. #107885 (davenger).

Melhorias de desempenho

Desempenho de JOIN

  • Implementada a aplicação lazy de índices de seletor e de replicação em JOINs seguidos de um LIMIT seletivo, TopN ou outro JOIN. Para controlar o número de colunas de payload necessário para habilitar índices de seletor lazy, use a configuração query_plan_min_columns_for_join_lazy_indexing (0 significa que a otimização está desabilitada). Para controlar o LIMIT ao qual a otimização é aplicada, use a configuração query_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi).
  • Permite que ASOF JOIN use o algoritmo de join parallel_hash, paralelizando a compilação entre valores distintos de chaves de igualdade. Antes, ASOF era incondicionalmente excluído de parallel_hash. #105375 (gregakinman).
  • Compartilha o FixedHashMap do hash join como filtro de runtime de JOIN no lado de sondagem. Quando a tabela hash do lado de compilação é, ou pode ser convertida em, um FixedHashMap, ela é publicada como filtro de runtime e substitui o Set/BloomFilter que BuildRuntimeFilterStep instalaria de outra forma. Controlado pela nova configuração enable_join_runtime_filter_shared_fixed_hash_table (o padrão é true). #105640 (wudidapaopao).
  • A reordenação de JOIN por DP agora é permitida com réplicas paralelas. #105889 (nickitat).
  • Plano de consulta aprimorado quando JOIN usa filtros de runtime (enable_join_runtime_filters habilitado por padrão): o modelo de custo de reordenação de join agora considera WindowTransform (e outras etapas do plano que preservam linhas) na subárvore direita e usa a contagem de linhas subjacente e o NDV por coluna, em vez de assumir a ausência de estatísticas. #107229 (UnamedRus).

Otimização de consultas

  • Melhorado o desempenho da análise de índices de texto em buscas com vários tokens, otimizando o tratamento de tokens raros. #98226 (CurtizJ).
  • Melhora o desempenho das funções encrypt, decrypt e halfMD5 ao evitar buscas implícitas de provedores do OpenSSL por linha no OpenSSL 3.x. #99105 (thevar1able).
  • Combina blocos de origem antes de projection.calculate() durante MATERIALIZE PROJECTION para reduzir o número de partes temporárias de projeção e a sobrecarga de mesclagem. Aceleração de ~3,4x em uma tabela com 50 milhões de linhas. #100047 (amosbird).
  • Os usuários agora se beneficiam de melhor desempenho dos filtros de runtime aproximados e dos índices de filtro de Bloom. #100201 (cv4g).
  • Acelera consultas ORDER BY ... LIMIT BY executando LIMIT BY em cada stream ordenado em paralelo durante Sort, quando as colunas de LIMIT BY são um prefixo de ORDER BY. Isso reduz o número de linhas que passam pela mesclagem final da ordenação e por todas as etapas subsequentes do pipeline. Essa otimização é controlada pela nova configuração query_plan_push_limit_by_into_sort (habilitada por padrão). #104000 (nihalzp).
  • Reduz a sobrecarga por consulta em consultas SELECT simples (análise sintática, análise e planejamento). Por exemplo, SELECT count() FROM hits em uma única conexão é aproximadamente 50% mais rápido. #104513 (Algunenano).
  • Melhora o desempenho de bitmapContains para estados groupBitmap diferentes de UInt64 ao evitar chamadas repetidas a rb_max durante verificações de intervalo. #105960 (niyue).
  • Melhorado o desempenho de inserção em colunas LowCardinality com índices bloom_filter. #106410 (EmeraldShift).
  • Melhorado o desempenho das funções L2DistanceTransposed e cosineDistanceTransposed para o tipo de dados QBit. #106701 (rienath).
  • Melhora o desempenho da análise de consultas em tabelas com muitas colunas: evita calcular hashes de nós de coluna (que incluem toda a expressão da tabela de origem) quando isso não é necessário. A análise de subconsultas SELECT * aninhadas em uma tabela com ~1200 colunas agora é cerca de 50 vezes mais rápida. #106957 (novikd).
  • Melhora em até uma ordem de grandeza o desempenho das funções encrypt, decrypt, tryDecrypt, aes_encrypt_mysql e aes_decrypt_mysql, recuperando o desempenho perdido na migração do BoringSSL para o OpenSSL 3.x (24.4). #107339 (thevar1able).
  • Melhora a execução de arrayElement em Array(LowCardinality(String)) e de funções LIKE para map em maps com chaves ou valores LowCardinality(String) ao evitar a materialização desnecessária de strings. #107450 (EmeraldShift).
  • Reduzido o uso de CPU e melhorado o desempenho da avaliação de skip-index em consultas que filtram colunas DateTime64. #107707 (shankar-iyer).
  • Melhorado o desempenho de buscas de substrings que não diferenciam maiúsculas de minúsculas, incluindo positionCaseInsensitiveUTF8, ILIKE e multiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano).
  • Corrigida uma regressão de ~16% no throughput do codec de ponto flutuante FPC no ARM, introduzida quando suas tabelas de predição passaram a usar VectorWithMemoryTracking. #108182 (groeneai).
  • Corrigida uma regressão de desempenho em que uma única exclusão leve DELETE desabilitava o cache de condições de consulta para toda a tabela. Consultas seletivas repetidas em uma tabela que tivesse sido afetada por uma exclusão leve deixavam de eliminar grânulos e passavam a ler todas as marcas. #112947 (fm4v).
  • Limitado o custo de estimar a seletividade de col IN (...) com base nas estatísticas da coluna, que poderia acrescentar centenas de milissegundos ao planejamento de uma única consulta. O estimador não executa mais a subconsulta em col IN (subquery) para preencher um conjunto do qual precisa apenas de um valor de seletividade — em vez disso, um conjunto não construído é ignorado. Para um conjunto maior que a nova configuração statistics_max_set_size_for_exact_selectivity_estimation (padrão: 10000), a seletividade agora é derivada do tamanho do conjunto e de seu intervalo delimitador. #114389 (nickitat).

Desempenho de funções e agregações

  • Otimizada a análise do índice de chave primária para chaves primárias longas e de alta cardinalidade. Para uma chave primária longa, o tempo de execução da análise do índice agora depende principalmente da complexidade do filtro da consulta (das colunas-chave que ela realmente utiliza), e não do comprimento da chave primária. Portanto, estender a chave de ordenação gera uma sobrecarga adicional insignificante na análise do índice para consultas que filtram apenas algumas de suas colunas. Para uma chave primária de alta cardinalidade, em que o ClickHouse mantém na memória apenas um prefixo seletivo das colunas-chave e não carrega as colunas finais, a análise do índice agora opera somente sobre esse prefixo em memória, em vez da chave inteira. A otimização é habilitada por padrão e pode ser desativada com a nova configuração use_lightweight_primary_key_index_analysis. #91836 (nihalzp).
  • Reduzido o pico de uso de memória ao mesclar resultados parciais de agregação em dois níveis com estados de agregação grandes (por exemplo, groupArray), liberando incrementalmente os estados de origem de cada bucket durante a mesclagem, em vez de mantê-los todos na memória até a conclusão da mesclagem. #102330 (yurifedoseev).
  • Nova otimização de GROUP BY para chaves de alta cardinalidade distribuídas uniformemente, que distribui as linhas entre threads por meio do hash da chave de agrupamento, para que cada thread agregue um subconjunto distinto de chaves sem uma fase de mesclagem. Defina enable_sharding_aggregator = 1 para habilitá-la. #104233 (nihalzp).
  • Aceleradas as consultas LIMIT BY em tabelas MergeTree particionadas ao executar LIMIT BY em paralelo no fluxo de cada partição, em vez de mesclar todos os fluxos em um só antes de aplicar o limite. Isso se aplica quando a expressão de partição é uma função determinística das colunas de LIMIT BY, de modo que nenhum grupo de LIMIT BY pode abranger duas partições. Controlado pela nova configuração allow_limit_by_partitions_independently (habilitada por padrão). #105126 (nihalzp).
  • Aceleradas as consultas SELECT ... LIMIT N BY <cols> quando <cols> são um prefixo da chave de ordenação da tabela ou passam a sê-lo após WHERE col = const fixar as colunas iniciais. Com essa otimização habilitada, o MergeTree lê os dados na ordem da chave primária, e LIMIT BY primeiro filtra os dados no modo de streaming, usando memória O(1) por fluxo ordenado e descartando a maior parte dos dados; em seguida, executa o LIMIT BY normal sobre os dados reduzidos para obter o resultado final. Controlado pela nova configuração optimize_limit_by_in_order (habilitada por padrão). #105135 (nihalzp).
  • Aceleradas as consultas LIMIT BY com a remoção de expressões-chave redundantes: uma chave que é uma função determinística das outras chaves é descartada (por exemplo, LIMIT 5 BY x, f(x) torna-se LIMIT 5 BY x), e uma função injetiva de uma chave é substituída por seu argumento (por exemplo, LIMIT 5 BY toString(x) torna-se LIMIT 5 BY x). Assim, menos expressões são avaliadas por linha, e elas são mais baratas. Controlado pelas novas configurações optimize_limit_by_function_keys e optimize_injective_functions_in_limit_by, ambas habilitadas por padrão. #106818 (nihalzp).
  • Acelerada a análise de consultas com muitas chamadas de função ou chamadas de função profundamente aninhadas, com a remoção de um hash redundante da árvore de consultas do cache de resolução de funções. #107516 (novikd).
  • Paralelizado o processamento do resultado de uma CTE recursiva: uma operação GROUP BY ou outra operação sobre um resultado grande de WITH RECURSIVE não está mais limitada a uma única thread. #107694 (alexey-milovidov).

Desempenho de armazenamento e E/S

  • Clientes S3 com o mesmo endpoint e bucket compartilham um cache, evitando a descoberta duplicada da região. #96802 (zvonand).
  • Melhorado o desempenho de cópia no armazenamento de objetos ao copiar blobs em paralelo. #105089 (asya-ch).
  • Evita a leitura do conteúdo de arquivos ao usar o formato de entrada One com funções de tabela baseadas em arquivos, como file e s3. #105157 (niyue).
  • A chave primária do MergeTree e os índices de descarte agora podem eliminar grânulos para filtros em que ifNull ou coalesce envolve uma condição, como ifNull(key = 0, 0) ou coalesce(key = 0, 0). Esses predicados — frequentemente gerados por geradores de consultas para transformar uma comparação possivelmente NULL em um booleano definido — antes eram opacos à análise de índices e não podiam ignorar grânulos. Isso estende a configuração existente allow_key_condition_coalesce_rewrite (ativada por padrão). #106272 (andyzzhao).
  • Melhorado o desempenho de decodificação de colunas Parquet FLOAT e DOUBLE codificadas com BYTE_STREAM_SPLIT. #106376 (Algunenano).
  • Corrigidas longas pausas no login e no início de consultas com armazenamento de acesso replicado quando muitas entidades de acesso (políticas de linha, funções, cotas e perfis de configurações) mudam ao mesmo tempo. Cada cache por entidade agora é recalculado uma vez por lote de notificações, em vez de uma vez por entidade alterada, eliminando trabalho quadrático que poderia manter o bloqueio de acesso por minutos. #107672 (azat).
  • Corrigida uma regressão de desempenho em que a leitura de muitos arquivos pequenos do armazenamento de objetos por meio de s3 e outras funções de tabela deixou de fazer pré-busca e passou a usar leituras síncronas, reduzindo significativamente a velocidade de leituras de muitos arquivos pequenos em thread única ou com baixa concorrência. #108872 (fm4v).
  • Ativada a pré-busca inicial de objetos pequenos quando as leituras do armazenamento de objetos passam pelo cache do sistema de arquivos (filesystem_cache_name). Anteriormente, leituras de muitos arquivos pequenos, como na ingestão com S3Queue, permaneciam síncronas e limitadas pela latência quando o cache do sistema de arquivos estava ativado. #109478 (fm4v).
  • Melhorada a otimização de PREWHERE para subcolunas Map ao considerar seu tamanho em disco. #110623 (Avogar).
  • A materialização tardia agora é aplicada a consultas com FINAL, um filtro e um LIMIT pequeno, mesmo sem ORDER BY (para ReplacingMergeTree). #110722 (KochetovNicolai).
  • Reduzido o tempo de CPU da desduplicação para descarregamentos de inserções assíncronas que abrangem muitas partições. #111150 (valerypetrov).
  • Corrigida uma regressão de CPU em consultas que realizam muitas leituras pequenas e independentes na mesma parte do MergeTree quando a tabela tem colunas LowCardinality. A verificação que determina se uma parte tem um único dicionário compartilhado percorria todas as marcas da parte inteira em cada tarefa de leitura; agora, ela encontra cada sequência de marcas iguais usando busca binária. Consultas desse tipo em tabelas com index_granularity pequena ficaram até várias vezes mais lentas desde a versão 26.6. #116134 (groeneai).

Otimização de memória

  • Redução de até 10 vezes no uso de memória dos metadados do tipo Enum em tabelas com colunas Enum. As buscas de valor para nome permanecem semelhantes ou mais rápidas, enquanto as buscas de nome para valor durante a análise e a desserialização podem ser mais lentas. #95668 (qoega).
  • Redução do pico de uso de memória de BACKUP ao não copiar mais a lista interna de informações de arquivos durante a gravação de entradas de backup (relevante para backups que contêm milhões de arquivos). #111162 (jkartseva).

Melhorias

Consultas e SQL

  • Identificar colunas pela posição (em vez do nome) ao remover colunas não utilizadas no plano de consulta. Isso permite remover colunas não utilizadas quando há nomes de colunas duplicados. #100586 (antaljanosbenjamin).
  • Adicionado SESSION_USER como um alias de currentUser() que não diferencia maiúsculas de minúsculas, para compatibilidade com PostgreSQL / SQL padrão. #106081 (takumihara).
  • Reduzida a latência de cancelamento de consultas executadas pelo protocolo wire do PostgreSQL: KILL QUERY agora interrompe a serialização da saída em um único fragmento, em vez de aguardar o envio de todo o fragmento ao cliente. #106535 (rvasin).
  • Corrigido um erro ILLEGAL_TYPE_OF_ARGUMENT em consultas distribuídas com serialize_query_plan = 1 que contêm uma lambda com um argumento constante (por exemplo, arrayMap(t -> t.2, ...)). As colunas constantes dos nós INPUT de ActionsDAG agora são preservadas durante a serialização do plano de consulta. #107124 (alexey-milovidov).
  • Reduzida a latência de cancelamento de consultas executadas pelo protocolo wire do MySQL: KILL QUERY agora interrompe a serialização da saída em um único fragmento, em vez de aguardar o envio de todo o fragmento ao cliente. #107228 (rvasin).

Funções

  • EXPLAIN SYNTAX agora formata operadores consistentemente como chamadas de função na saída do explain (por exemplo, plus(1, 2) em vez de 1 + 2). #94681 (1abdelhalim).
  • Agora há suporte à sintaxe do PostgreSQL expr OP SOME(array) / expr OP ALL(array) (com lado direito que não é uma subconsulta), que é reescrita como has / NOT has para =/<> ou como lambdas arrayExists / arrayAll para outros operadores de comparação. ANY não é aceito na forma de array porque any também é uma função de agregação; use SOME em seu lugar. A forma de subconsulta de ANY/SOME/ALL continua sendo convertida para IN / NOT IN. #105129 (alexey-milovidov).
  • Adicionado suporte às funções multiSearchAny, multiSearchAnyUTF8 e multiMatchAny em índices de texto. Também foi aprimorada a análise de índices de texto da função match: agora, padrões com grupos alternativos podem ignorar mais grânulos. #106279 (CurtizJ).
  • A função h3PolygonToCells agora aplica o tamanho máximo do array ao conjunto de todos os polígonos de um MultiPolygon, valida os códigos de retorno da biblioteca H3 subjacente e rejeita argumentos MultiLineString em vez de retornar silenciosamente um resultado vazio. #106399 (Algunenano).
  • A desserialização dos estados das funções de agregação contingency, cramersV, cramersVBiasCorrected e theilsU agora valida se as contagens armazenadas formam uma tabela de contingência consistente e lança uma exceção CORRUPTED_DATA caso contrário. #107185 (nihalzp).
  • Melhoria na estimativa de cardinalidade no otimizador do plano de consulta: uma coluna produzida por uma função determinística de um único argumento (por exemplo, toYear(date)) agora herda, como limite superior, o número de valores distintos de seu argumento, em vez de ficar sem estatísticas, levando a uma reordenação de junções mais precisa. #107757 (davenger).

Motores de tabela e armazenamento

  • Corrige os consumidores do motor de tabela Kafka que continuavam usando um intervalo de poll curto após a atribuição de partições, fazendo com que voltem a usar o kafka_poll_timeout_ms configurado e evitando polls vazios excessivos, partes inseridas menores e sobrecarga adicional de merge após rebalanceamentos. #100431 (sugaf1204).
  • Os motores de tabela para data lakes, incluindo Iceberg e DeltaLake, agora podem usar discos S3 e Azure com cache, permitindo que leituras repetidas usem o cache do sistema de arquivos. #102017 (RinChanNOWWW).
  • Permite que filtros introduzidos após a seleção inicial de PREWHERE (pushdown de predicados, filtros de runtime ou um PREWHERE explícito com um WHERE definido pelo planejador) sejam mesclados ao PREWHERE existente em uma segunda passagem do otimizador, em vez de permanecerem como uma etapa Filter separada acima da leitura do MergeTree. #105445 (yariks5s).
  • Adicionada a configuração wait_for_part_commit_in_dependent_materialized_views. Quando ativada, uma visão materializada em cascata que faz join com sua origem pode ver a linha que está sendo inserida. #105943 (ahmadov).
  • Adicionado suporte compatível com PostgreSQL a EXTRACT(TIMEZONE_HOUR FROM dt) e EXTRACT(TIMEZONE_MINUTE FROM dt) para obter as partes de hora e minuto de um deslocamento de fuso horário, e a EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>) para extrair o valor de um intervalo. #106227 (vinayakj592).
  • Implementado SYSTEM RESTART DISK <name>: agora ele recarrega os metadados do disco na memória e reexamina as partes de dados das tabelas de réplicas somente leitura localizadas nele. Isso permite que uma réplica somente leitura de uma tabela em armazenamento compartilhado plain_rewritable observe, sob demanda, os dados gravados por outro servidor, sem aguardar refresh_parts_interval ou reiniciar o servidor. #106645 (jrdi).
  • Evita o carregamento desnecessário de arquivos de marcas para dados compartilhados avançados de JSON. #107051 (Avogar).
  • Adicionada a configuração materialized_postgresql_use_extended_date_and_time_types, aplicável no momento da criação, para o motor de banco de dados MaterializedPostgreSQL. Por padrão (ativada), as colunas date/timestamp do PostgreSQL são inferidas como Date32/DateTime64; defini-la como 0 ao executar CREATE DATABASE faz com que sejam inferidos os tipos mais restritos Date/DateTime. A configuração não se aplica ao motor de tabela MaterializedPostgreSQL. #107428 (alexey-milovidov).
  • O MergeTree agora pode ler um fluxo compactado cujos blocos usam codecs diferentes. Este é o pré-requisito no lado da leitura para a Seleção Adaptativa de Codecs. #108592 (rienath).
  • Usa o índice de descarte bloom_filter para predicados IN em uma coluna diretamente indexada quando transform_null_in = 1 e o conjunto IN não contém nenhum valor NULL. Antes, o índice era ignorado nessas consultas, forçando uma varredura completa. #111329 (groeneai).

S3 e armazenamento de objetos

  • Registra privilégios em system.query_log.used_privileges para todas as verificações de acesso concedido, inclusive as que seguem o caminho sem exceção de isGranted (checkAccessWithFilter). Anteriormente, apenas os privilégios verificados por pontos de entrada que lançam exceção (checkAccess / checkGrantOption) eram registrados, o que fazia com que READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL não aparecessem no log de auditoria de consultas DESCRIBE, CREATE TABLE AS e semelhantes que usam as funções de tabela file / s3 / azure / url. A aplicação do controle de acesso permanece inalterada. #104693 (alexbakharew).
  • Conclui de forma assíncrona a solicitação final de upload multipart do S3 por meio do rastreador de tarefas, permitindo que ela se sobreponha ao upload da última parte, em vez de ser executada sequencialmente na finalização. #105487 (asya-ch).
  • Aumentou de uma hora para seis horas a configuração padrão persistent_processing_node_ttl_seconds de S3Queue e AzureQueue, evitando que processamentos de longa duração ou reiniciados percam o bloqueio do bucket cedo demais. #106838 (kssenii).
  • Oferece suporte aos valores REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, GLACIER_IR e EXPRESS_ONEZONE (além de STANDARD e INTELLIGENT_TIERING) para a configuração s3_storage_class_name. #107251 (adityaksolves).
  • O caminho de exemplo para particionamento Hive em tabelas de armazenamento de objetos (por exemplo, S3) é resolvido no primeiro uso da tabela, em vez de durante CREATE/ATTACH, para que um endpoint inacessível não bloqueie mais a criação da tabela nem a inicialização do servidor. #111842 (evillique).

Configurações e configuração

  • Torna a estratégia de particionamento hive padrão na configuração de compatibilidade file_like_engine_default_partition_strategy. #86746 (kssenii).
  • Adicionadas quatro novas configurações de tabela MergeTree para controlar os parâmetros padrão dos índices de texto: text_index_dictionary_block_size, text_index_dictionary_block_frontcoding_compression, text_index_posting_list_block_size e text_index_posting_list_codec. Essas configurações permitem ajustar o comportamento dos índices de texto no nível da tabela sem especificar parâmetros em cada definição de índice. Argumentos explícitos por índice continuam tendo precedência. #100626 (CurtizJ).
  • Adiciona a configuração output_format_pretty_use_nbsp_for_padding para renderizar o preenchimento do layout de tabela nos formatos Pretty em estilo de tabela como ESPAÇO SEM QUEBRA U+00A0 quando output_format_pretty_grid_charset for UTF-8. Isso ajuda a saída Pretty copiada a manter o alinhamento da tabela em ferramentas que reduzem espaços comuns. A configuração é desabilitada por padrão, e a saída com conjunto de caracteres ASCII mantém espaços comuns. #103559 (ashrithb).
  • Oferece compatibilidade com o analisador antigo por meio da configuração analyzer_compatibility_allow_non_aggregate_in_having. Se habilitada, as condições não agregadas serão movidas de HAVING para WHERE. #104232 (novikd).
  • OPTIMIZE TABLE ... ON CLUSTER e outros comandos DDL não ficam mais bloqueados quando a tabela de destino tem table_readonly = 1. A configuração agora gera um novo código de erro específico, TABLE_IS_PERMANENTLY_READ_ONLY, que o DDLWorker trata como não repetível (diferentemente do erro transitório TABLE_IS_READ_ONLY, que ocorre durante desconexões temporárias do ZooKeeper em ReplicatedMergeTree). A configuração table_readonly também passa a ser explicitamente rejeitada para ReplicatedMergeTree, tanto na criação quanto por meio de ALTER MODIFY SETTING. #105109 (alexey-milovidov).
  • A ordenação decrescente nas chaves de ordenação do MergeTree (por exemplo, ORDER BY (time DESC, key)) agora é sempre compatível e não requer mais a configuração experimental allow_experimental_reverse_key, que se tornou obsoleta. #106440 (nikitamikhaylov).
  • Oferece suporte a keyed_by_normalized_query_hash para cotas definidas na configuração estática do servidor (users.xml), em conformidade com a sintaxe DDL existente CREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov).
  • A configuração de compatibilidade não aplica mais configurações obsoletas; portanto, não as marca como alteradas nem gera avisos sobre configurações obsoletas. #107737 (UberDever).
  • Adicionada a configuração analyzer_compatibility_multiple_joins_qualify_column_names (padrão: false). Quando habilitada e a cláusula FROM de uma consulta contém duas ou mais JOINs, os nomes das colunas de resultado produzidos pelo analisador imitam a reescrita de múltiplas junções do analisador antigo: colunas expandidas de * são nomeadas como <alias-or-table>.<column>, e uma referência de coluna sem alias na lista SELECT mantém o nome exatamente como foi escrito. Isso permite que consultas externas que fazem referência a esses nomes qualificados, como SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), funcionem como no analisador antigo. Também foi corrigido um problema em que o analisador perdia nomes qualificados de colunas de resultado para colunas expandidas de * quando group_by_use_nulls era combinado com ROLLUP, CUBE ou GROUPING SETS, o que produzia nomes de colunas de resultado duplicados e impedia referências externas a essas colunas. #110746 (novikd).
  • Adicionada a configuração analyzer_compatibility_apply_final_to_all_joined_tables, que restaura o comportamento antigo, em que o modificador FINAL na tabela mais à esquerda de um JOIN também era aplicado às demais tabelas associadas. A configuração é registrada no histórico de alterações das configurações; portanto, a compatibility com versões anteriores à 26.6 restaura automaticamente a semântica antiga. #111589 (fm4v).
  • Adicionada uma nova configuração do MergeTree, text_index_version, que controla a versão do formato em disco dos índices de texto: v0_initial, v1_with_codec ou v2_with_positions. Durante uma atualização gradual ou antes de um downgrade, defina-a como uma versão mais antiga para que os servidores mais novos continuem gravando partes de índices de texto em um formato que os servidores mais antigos ainda possam ler; a configuração de compatibilidade a ajusta automaticamente. #111803 (CurtizJ).

Tabelas de sistema e monitoramento

  • Preenche used_storages em system.query_log com o nome do motor de armazenamento ao consultar tabelas por meio do DataLakeCatalog. #100706 (melvynator).
  • Adiciona as colunas current_projection, current_projection_progress, projections_completed e projections_remaining a system.merges para expor o progresso da mesclagem de projeções. #102611 (amosbird).
  • Os motores de tabela agora incluem documentação embutida, que pode ser consultada pelas novas colunas description, syntax, examples, introduced_in e related da tabela system.table_engines. #106177 (alexey-milovidov).
  • Os motores de banco de dados agora incluem documentação embutida, que pode ser consultada pelas novas colunas description, syntax, examples, introduced_in e related da tabela system.database_engines. #106178 (alexey-milovidov).
  • Os tipos de dados agora incluem documentação embutida, que pode ser consultada pelas novas colunas description, syntax, examples, introduced_in e related da tabela system.data_type_families. #106180 (alexey-milovidov).
  • Os formatos de entrada e saída agora incluem documentação embutida, que pode ser consultada pelas novas colunas description, examples, introduced_in e related da tabela system.formats. #106181 (alexey-milovidov).
  • Os combinadores de funções agregadas agora incluem documentação embutida, que pode ser consultada pelas novas colunas description, syntax, examples, introduced_in e related da tabela system.aggregate_function_combinators. #106185 (alexey-milovidov).
  • Adicionada uma nova tabela system.data_skipping_index_types, que lista os tipos disponíveis de índices de ignorar dados juntamente com documentação embutida (description, syntax, examples, introduced_in, related). #106186 (alexey-milovidov).
  • Adicionada uma nova tabela system.disk_types, que lista os tipos de disco disponíveis juntamente com documentação embutida (description, syntax, examples, introduced_in, related). #106187 (alexey-milovidov).
  • Adicionadas as métricas assíncronas TotalUncompressedBytesOfMergeTreeTables e TotalUncompressedBytesOfMergeTreeTablesSystem, que informam o tamanho total não comprimido dos dados armazenados em tabelas da família MergeTree. #106364 (alexey-milovidov).
  • Adiciona o evento de perfil GlobalMemoryLimitExceeded, permitindo que os operadores monitorem quando o limite de memória de todo o servidor é atingido. #106466 (sacheendra).
  • Adicionadas as métricas assíncronas ExecutableUserDefinedFunctionMemoryResidentBytes e ExecutableUserDefinedFunctionProcesses, que informam a memória residente (VmRSS) e o número de processos em execução das funções definidas pelo usuário executable e executable_pool, incluindo processos descendentes e workers ociosos do pool. #107300 (HanziJiang).
  • Adicionada a configuração show_remote_databases_in_system_tables, habilitada por padrão, que permite ocultar bancos de dados MySQL e PostgreSQL de system.tables, system.columns e system.completions. show_data_lake_catalogs_in_system_tables continua controlando apenas a visibilidade de DataLakeCatalog. #104416 (pamarcos). #109082 (pamarcos).

ClickHouse Keeper

  • Várias alterações no Keeper que o tornam cerca de 2x mais rápido em geral (melhor batching, envio de mensagens em pipeline ao líder e adições ao log em pipeline). #101757 (al13n321).
  • Adiciona mais eventos de perfil do Keeper, tanto no servidor quanto no cliente, para watches. #105336 (scanhex12).
  • Adiciona uma nova tabela exclusiva do Keeper, system.keeper_snapshots, com informações sobre snapshots locais do ClickHouse Keeper. #105571 (mstetsyuk).
  • Adiciona uma nova tabela exclusiva do Keeper, system.keeper_changelogs, com informações sobre arquivos locais de changelog (log do Raft) do ClickHouse Keeper. #105617 (mstetsyuk).
  • Adiciona uma tabela exclusiva do Keeper, system.keeper_cluster. Contém uma linha para cada membro do cluster Raft, conforme identificado pelo Keeper atual. #105646 (mstetsyuk).
  • Reduz o pico de uso de memória ao aplicar snapshots recebidos no ClickHouse Keeper com KeeperMemoryStorage. #105851 (antonio2368).
  • Adiciona configurações de coordenação do Keeper (coordination_settings) para limitar a admissão de entradas de log não confirmadas do NuRaft e aplicar throttling a sondagens reversas de append-entries. #106108 (antonio2368).

Gerenciamento de memória

  • Corrigidas mensagens de erro de sintaxe que poderiam incluir bytes da memória adjacente após o analisador retroceder além do fim de uma instrução. #105086 (groeneai).
  • Reduzido o uso de memória ao abrir um backup (para RESTORE ou como base de um BACKUP incremental). Os metadados .backup agora são processados como um fluxo, em vez de serem carregados em uma árvore de documentos XML na memória, o que evita a alocação de uma árvore DOM de vários gigabytes para backups grandes, especialmente incrementais. #109107 (jkartseva).
  • Reduzido o pico de uso de memória ao finalizar um BACKUP. A gravação dos metadados do backup não copia mais as informações de todos os arquivos para um vetor temporário (o que, em backups com milhões de arquivos, consumia transitoriamente vários gigabytes); agora, as informações são percorridas no próprio local. #109861 (jkartseva).

Formatos de dados

  • Agora, os usuários podem inserir campos Fixed do Avro para variantes de inteiros de 8/16/32/64 bits. #98139 (patrickpichler).
  • O formato AvroConfluent agora repete as tentativas do cliente HTTP do Confluent Schema Registry em caso de falhas transitórias (timeouts de transporte, conexão recusada, erros de DNS, HTTP 5xx/408/429), com backoff exponencial, em vez de abortar o INSERT na primeira falha de rede. As novas configurações format_avro_schema_registry_max_retries (padrão 5) e format_avro_schema_registry_retry_initial_backoff_ms (padrão 100) controlam essa política. Erros de validação de schema (HTTP 409, JSON do Avro malformado) continuam sendo fatais. #106661 (groeneai).
  • Preservados os códigos de erro originais do ClickHouse para erros retornados pelo Apache Arrow. #107267 (azat).

Coleções nomeadas e dicionários

  • Adicionada a configuração enable_compression à função de tabela mysql, ao mecanismo de tabela MySQL, ao mecanismo de banco de dados MySQL, à fonte de dicionário SOURCE(MYSQL) e às coleções nomeadas. Quando ativada, o ClickHouse negocia a compressão no nível do protocolo MySQL para todos os dados transferidos pela conexão. #103229 (bernardlim).
  • Adicionada uma nova tabela system.dictionary_layouts, que lista os layouts de dicionário disponíveis juntamente com a documentação embutida (description, syntax, examples, introduced_in, related). #106182 (alexey-milovidov).
  • Adicionada uma nova tabela system.dictionary_sources, que lista as fontes de dicionário disponíveis juntamente com a documentação embutida (description, syntax, examples, introduced_in, related). #106184 (alexey-milovidov).
  • O tipo de armazenamento efetivo das coleções nomeadas agora está disponível como named_collections_storage.type em system.server_settings e por meio de getServerSetting('named_collections_storage_type'). #111806 (pamarcos).

Outras melhorias

  • Melhoradas as sugestões de nomes de tabelas nas mensagens de erro: não sugerem mais exatamente o mesmo nome e incluem o nome do banco de dados na sugestão (por exemplo, “Talvez você quis dizer other_db.my_table?”). #95116 (matt-metivier).
  • Melhorada a mensagem de erro para identificadores não resolvidos em consultas sem cláusula FROM, sugerindo adicionar uma. #101769 (Onyx2406).
  • Corrigido o PREWHERE com subconsulta IN em colunas de chave primária que não usava o índice de chave primária para eliminação de grânulos, causando varreduras completas da tabela em vez de ler apenas os grânulos relevantes. #102570 (nikitamikhaylov).
  • As views materializadas atualizáveis agora continuam sendo atualizadas após a substituição de sua tabela de destino com EXCHANGE TABLES e a remoção da tabela antiga. Anteriormente, as atualizações podiam falhar com uma exceção UNKNOWN_TABLE porque mantinham o UUID da tabela antiga. #102724 (seva-potapov).
  • Ative enable_join_transitive_predicates por padrão. #103724 (davenger).
  • A view materializada atualizável agora oferece suporte a REFRESH DEPENDS ON para disparar atualizações com base nas atualizações de outra RMV, em vez de em um agendamento baseado em tempo. (REFRESH EVERY ... DEPENDS ON já existia, mas não podia ser usado de forma confiável para esse caso de uso.) Consulte a documentação de CREATE MATERIALIZED VIEW. #104440 (al13n321).
  • Adicionada a opção EXPLAIN PIPELINE para compactar cadeias repetidas de processadores. #104662 (niyue).
  • Adicionado REGEXP_SUBSTR como um alias de regexpExtract que não diferencia maiúsculas de minúsculas, para compatibilidade com Oracle/MySQL/Snowflake. #105122 (alexey-milovidov).
  • Adicionado date_part('unit', expr) como açúcar sintático para EXTRACT(unit FROM expr). Há suporte a todos os tipos de intervalo padrão e aos extras do PostgreSQL (epoch, dow, doy, isodow, isoyear, century, decade, millennium). #105127 (alexey-milovidov).
  • O QueryConditionCache agora registra individualmente os grânulos filtrados, inclusive em lotes de leitura que passam parcialmente pelo PREWHERE, reduzindo o número de marcas relidas por consultas subsequentes com a mesma condição. #105335 (hanfei1991).
  • Adicionado suporte a BFloat16 para funções de predicados numéricos. #105391 (mohhddhassan).
  • Adicionado suporte a estatísticas básicas, uma estatística compacta por coluna que armazena valores numéricos mínimo/máximo, comprimento médio de strings e contagens de NULL quando aplicável. #106048 (hanfei1991).
  • Adicionado suporte a um modificador NULL / NOT NULL ao final de ALTER TABLE ... ADD/MODIFY COLUMN, espelhando CREATE TABLE. #106150 (takumihara).
  • O otimizador PREWHERE agora agrupa conjunções que fazem referência ao mesmo conjunto de colunas antes de estimar a seletividade, para que condições como a > 2500 AND a < 2502 sejam avaliadas em conjunto como um intervalo combinado (~0,02% de seletividade), em vez de dois predicados independentes (~50% cada). Isso resulta em uma ordenação mais precisa das condições PREWHERE quando há estatísticas de coluna disponíveis. #106337 (hanfei1991).
  • Não exibir o preâmbulo “Rastreamento de pilha (ao copiar esta mensagem, sempre inclua as linhas abaixo):” nas mensagens de exceção quando o rastreamento de pilha estiver vazio. #106524 (alexey-milovidov).
  • Corrigido o CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) em discos criptografados, que copiava os dados em vez de criar links físicos. #106731 (nikitamikhaylov).
  • Corrigida a leitura de dados de tabelas por bancos de dados DataLakeCatalog com catalog_type = 'onelake', que agora usa o endpoint Blob do OneLake (.blob.fabric.microsoft.com) por padrão. Defina onelake_use_blob_endpoint = false para manter o comportamento anterior do endpoint DFS (.dfs.fabric.microsoft.com). #106843 (scanhex12).
  • Reduzida a sobrecarga de CPU do logging assíncrono em altas taxas de logs, notificando o consumidor de logs apenas na transição da fila de vazia para não vazia, em vez de a cada mensagem. #107352 (nikitamikhaylov).
  • Corrigida a leitura do comprimento de auth_response no handshake do MySQL, em que um byte de comprimento >= 128 era interpretado como um valor de vários gigabytes por ser lido como um char com sinal. #107384 (uwezkhan).
  • MaterializedPostgreSQL agora mapeia colunas PostgreSQL numeric(p, 0) com precisão maior que 76 (por exemplo, numeric(78, 0), usado para inteiros de 256 bits) para Int256 do ClickHouse, em vez de falhar com “Precisão muito grande”. Valores que não cabem em Int256 são rejeitados com uma mensagem de erro clara. #107431 (alexey-milovidov).
  • Nullable(Tuple(...)) agora está em Beta. Desabilitado por padrão; defina enable_nullable_tuple_type = 1 para usá-lo. #107754 (nihalzp).
  • As inserções assíncronas não registram mais a lista completa de query_ids no nível trace/debug, o que, desde a versão 26.2, poderia fazer text_log crescer excessivamente em serviços com tráfego intenso de inserções assíncronas. As linhas detalhadas agora são registradas no nível test. #107852 (CheSema).
  • Reduzido o uso de metadados do cache do sistema de arquivos com a liberação imediata de entradas de prioridade invalidadas. #107903 (kssenii).
  • Um índice de salto bloom_filter em uma coluna Array agora é usado para arrayJoin(column) IN (set), arrayJoin(column) GLOBAL IN (set) e arrayJoin(column) = const, da mesma forma que já era usado para hasAny(column, set) e has(column, const). Anteriormente, essas formas de arrayJoin ... recorriam a uma varredura completa. #109536 (groeneai).
  • IS NOT DISTINCT FROM e IS TRUE agora usam índices de chave primária e minmax para eliminar grânulos, assim como =. Antes, k IS NOT DISTINCT FROM 42 e (k = 42) IS TRUE examinavam todos os grânulos. #110006 (groeneai).

Correção de bugs

Correções relacionadas a JOIN

  • Corrigida a função nested (usada internamente por ARRAY JOIN), que removia LowCardinality dos tipos de coluna e fazia com que Array(LowCardinality(String)) se tornasse Array(String) na saída. #98974 (Onyx2406).
  • Corrigida a reordenação de junções que descartava silenciosamente linhas sem correspondência de um RIGHT/LEFT JOIN quando ele era combinado por vírgula (cross join) com outra tabela, por exemplo, t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Antes, a consulta retornava o resultado de uma junção interna em vez do resultado de uma junção externa. #101684 (groeneai).
  • Corrigido um LOGICAL_ERROR (“Port is not connected”, código 49) que podia ocorrer ao executar consultas envolvendo uma VIEW com agregação dentro de um JOIN.. #102574 (Ergus).
  • Corrigido o problema de max_rows_to_transfer e max_bytes_to_transfer serem silenciosamente ignorados em consultas GLOBAL IN e GLOBAL JOIN com o novo analisador. As configurações agora geram SET_SIZE_LIMIT_EXCEEDED (ou interrompem a execução, dependendo de transfer_overflow_mode) quando a tabela externa materializada excede o limite configurado, reproduzindo o comportamento do analisador antigo. #104119 (groeneai).
  • Corrigidos resultados incorretos ou falhas em consultas JOIN que usam join_algorithm = 'direct' com uma tabela MergeTree no lado direito quando a otimização reordenava as colunas de pesquisa. #104174 (groeneai).
  • Corrigido um bug em que consultas que combinavam arrayJoin com ORDER BY ... LIMIT após um JOIN podiam retornar silenciosamente zero linhas. A otimização do plano de consulta que move a avaliação de funções para acima de SortingStep não se aplica mais quando a expressão movida contém arrayJoin, pois arrayJoin pode alterar o número de linhas. #104558 (groeneai).
  • Corrigido um erro lógico em LIMIT BY negativo, em alguns casos, quando usado com ARRAY JOIN. #105403 (nihalzp).
  • Adicionada uma nova configuração de compatibilidade analyzer_compatibility_prefer_alias_over_subcolumn (desabilitada por padrão). Quando habilitada, o novo analisador prioriza a interpretação de prefixo de alias em vez de correspondências de subcolunas de Tuple/colunas com ponto para identificadores compostos, restaurando o comportamento do interpretador anterior. Isso evita erros AMBIGUOUS_IDENTIFIER (e relacionados) quando uma consulta une uma tabela cujo nome corresponde a uma tabela interna de uma CTE/subconsulta que usa SELECT * em uma junção, em que colunas renomeadas pelo asterisco (por exemplo, b.id) poderiam, de outra forma, fazer os identificadores da tabela interna vazarem para o escopo externo. #105491 (vdimir).
  • Corrigidos resultados possivelmente incorretos em consultas que combinam uma junção externa com uma junção interna subsequente que referencia o lado da junção externa que fornece valores nulos. A reordenação de junções podia escolher um plano que movia as condições da junção interna para a cláusula ON da junção externa. #105992 (vdimir).
  • Melhorada a compatibilidade com o analisador antigo. Se a tabela tiver colunas como x.a Array, x.b Array, x String, prefira arrays para ARRAY JOIN x. #106069 (KochetovNicolai).
  • Corrigida uma exceção em consultas INNER JOIN com uma tabela MergeTree vazia no lado esquerdo quando enable_parallel_replicas, query_plan_use_new_logical_join_step e query_plan_optimize_join_order_algorithm = 'greedy' estão habilitados. #106338 (KochetovNicolai).
  • Corrige um erro lógico (Left and right columns have same names) no otimizador de ordem de junção que poderia ocorrer em junções executadas com réplicas paralelas quando duas relações no grafo de junção compartilham nomes de colunas. #106418 (alexey-milovidov).
  • Corrige uma LOGICAL_ERROR (Invalid number of rows in Chunk) em JoiningTransform para um LEFT JOIN com chaves exclusivas no lado direito, uma condição ON mista e um max_joined_block_size_rows pequeno. #106928 (groeneai).
  • Corrige uma exceção (LOGICAL_ERROR) no filtro de runtime de JOIN quando a chave de junção contém um tipo Variant ou Dynamic aninhado em uma Tuple, Array ou Map, e o lado direito da junção tem um único valor distinto. #106931 (groeneai).
  • Corrige uma LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y) ao executar uma função em uma coluna Dynamic criada por um JOIN em Dynamic (por exemplo, as linhas sem correspondência de um RIGHT/FULL JOIN ou uma subconsulta EXISTS correlacionada e descorrelacionada em uma junção). #107095 (groeneai).
  • Corrige uma exceção de erro lógico Bad cast from type DB::IColumn const* to DB::ColumnNullable const* quando um asterisco qualificado (t.*) aplicado a uma chave JOIN ... USING é passado a uma função de agregação, e o outro lado de um OUTER JOIN tem uma chave Nullable (com join_use_nulls = 0). #107129 (groeneai).
  • Corrige um erro lógico (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) quando a otimização de push-down de disjunção (predicado parcial) envia uma condição para uma chave USING cujo tipo é ampliado pelo JOIN. Também corrige uma falha do servidor (falha de segmentação) no analisador ao resolver identificadores em consultas JOIN ... USING que contêm ramificações if/multiIf passíveis de redução a constantes e que referenciam identificadores desconhecidos. #107407 (groeneai).
  • Corrige o filtro de runtime de JOIN que produzia resultados incorretos para colunas JSON. #107663 (Avogar).
  • Corrige uma exceção de erro lógico Bad cast from type DB::ColumnNullable to DB::ColumnVector<...> quando um asterisco qualificado (t.*) seleciona uma chave JOIN USING e essa junção está aninhada abaixo de uma junção PASTE/CROSS/por vírgula ou de uma junção ON externa, com join_use_nulls = 0. #108043 (groeneai).
  • Corrige um bug no novo analisador em que FINAL em uma tabela de um JOIN (por exemplo, FROM t1 FINAL JOIN t2) também era aplicado incorretamente às demais tabelas da junção, o que poderia tornar essas consultas mais lentas. #108979 (vdimir).
  • Com analyzer_compatibility_join_using_top_level_identifier = 1, um identificador em JOIN ... USING agora pode ser resolvido a partir de um alias definido em uma subexpressão na lista SELECT (por exemplo, SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), reproduzindo o comportamento do analisador antigo. Anteriormente, apenas aliases de projeção de nível superior eram considerados, e essas consultas falhavam com uma exceção UNKNOWN_IDENTIFIER mesmo com a configuração ativada. A dica de erro que sugere essa configuração agora também é exibida quando o alias correspondente está aninhado. #110739 (novikd).
  • Corrigido o erro INCOMPATIBLE_TYPE_OF_JOIN em uma junção ANY com uma tabela do mecanismo Join quando um filtro WHERE em uma coluna do lado direito permitia que o planejador de consultas reescrevesse a junção como SEMI ou ANTI. Uma tabela do mecanismo Join tem uma strictness declarada fixa, que não pode ser alterada; por isso, essa conversão agora é recusada para essas tabelas. #111362 (groeneai).
  • Corrigido TYPE_MISMATCH (“O tipo da chave complexa … não corresponde”) quando um JOIN com um dicionário usa uma chave de junção Nullable, LowCardinality ou LowCardinality(Nullable), enquanto a chave do dicionário não está encapsulada. A busca no dicionário para a junção direta agora normaliza a chave para o tipo de chave declarado do dicionário (como dictGet/dictHas já fazem), e uma chave NULL nunca encontra correspondência. #111857 (groeneai).
  • Corrigido AMBIGUOUS_COLUMN_NAME (Incompatibilidade na estrutura do bloco em (colunas com o mesmo nome devem ter estruturas idênticas)) para uma consulta que repete uma condição JOIN ON em WHERE com join_use_nulls = 1. Essa consulta agora retorna o resultado em vez de falhar. #112007 (groeneai).
  • Corrigidos resultados incorretos ou o encerramento do servidor em JOINs diretos com dicionários cuja chave usa serialização esparsa. #112327 (groeneai).
  • Corrigidos resultados incorretos quando uma junção hash tem uma única chave LowCardinality de um tipo com mais de 8 bytes (UInt128, Int128, UInt256, Int256 e suas variantes Nullable). Essa junção retornava silenciosamente linhas cujos valores de chave eram diferentes. #113230 (groeneai).
  • Corrigida a poda de partes e grânulos para uma condição JOIN ON que envolve colunas constantes do outro lado. #113484 (vdimir).
  • Corrigido o retorno de um valor incorreto para uma coluna virtual como _table ou _database, selecionada do lado direito de um JOIN atendido por DirectKeyValueJoin (um armazenamento de chave-valor, como EmbeddedRocksDB, KeeperMap, Redis ou um dicionário). A consulta retornava o conteúdo de uma coluna de dados ou falhava com LOGICAL_ERROR. #113698 (groeneai).

Correções de consultas e do analisador

  • Corrige um bug em que splitMultipartQuery gerava o erro “Consulta vazia” para consultas que terminavam com um comentário após o ponto e vírgula. #85491 (yariks5s).
  • Corrige o caso em que um alias após uma subconsulta em DESCRIBE TABLE não era aceito pelo analisador sintático e resultava em erro de sintaxe. #100205 (yariks5s).
  • Corrige o caso em que a cláusula FORMAT era consumida por INSERT, em vez de ser aplicada à saída de EXPLAIN em EXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406).
  • Corrige a lentidão significativa de consultas SELECT quando INSERTs simultâneos estão em execução. Anteriormente, um pipeline de INSERT reservava slots de CPU até max_threads no início da consulta, mesmo que a maioria deles nunca fosse usada, privando SELECTs simultâneos de recursos. A alocação de slots de CPU agora é orientada pela demanda: o pipeline solicita slots apenas à medida que envia trabalho paralelizável. Isso se aplica tanto ao controle de simultaneidade quanto ao scheduler de CPU preemptivo para workloads. A nova configuração do servidor concurrent_threads_lazy_allocation (padrão true) funciona como um mecanismo de rollback. #102928 (seva-potapov).
  • Corrige um bug em que ALTER TABLE ... MODIFY SETTING em uma tabela EmbeddedRocksDB podia persistir um valor de configuração inválido no arquivo de metadados da tabela, mesmo quando o servidor rejeitava a consulta. Na reinicialização seguinte do servidor, não era possível anexar a tabela devido a CANNOT_PARSE_BOOL (ou a um erro de análise semelhante) e, em bancos de dados nos quais falhas de carregamento são fatais, o servidor se recusava a iniciar. Valores de configuração inválidos agora são rejeitados antes da gravação de qualquer metadado. #103417 (groeneai).
  • Corrige o INSERT em streaming com input_format_max_block_wait_ms para a interface HTTP e para INSERT SELECT FROM input, para que blocos de entrada parciais sejam liberados antes do término da solicitação. #104534 (alexey-milovidov).
  • Corrige a expressão CASE, que retornava a ramificação ELSE em vez da ramificação THEN correspondente quando tanto a expressão quanto um valor WHEN eram NULL. #105556 (Algunenano).
  • Corrige o suporte ao uso de UDFs SQL WASM em definições de MATERIALIZED VIEW. #106161 (niyue).
  • Corrige INTERPOLATE () gerando INVALID_WITH_FILL_EXPRESSION quando colunas de ORDER BY recebem aliases na lista SELECT com o analisador antigo. #106252 (yakov-olkhovskiy).
  • As funções base58Encode, base58Decode e tryBase58Decode agora respeitam max_execution_time e o cancelamento de consultas para entradas grandes, além de rejeitarem entradas maiores que 10 KB, em vez de serem executadas por muito tempo. O limite é configurável pela nova configuração function_base58_max_input_size (0 o desativa). #106428 (alexey-milovidov).
  • Corrige um bug de resultados incorretos em que WHERE c0 = const não retornava linhas para tabelas com ORDER BY f(c0) quando f(const) era avaliado como NaN, por exemplo, ORDER BY sqrt(c0) com uma constante negativa. A análise da chave primária descartava incorretamente todos os grânulos e corrompia o cache de condições de consulta para consultas subsequentes. #106507 (groeneai).
  • Corrigidos resultados incorretos para SELECT c, count() FROM t WHERE c GROUP BY c em tabelas com a _minmax_count_projection implícita, uma projeção agregada explícita ou uma projeção normal: todos os grupos eram reduzidos a uma única linha com uma chave constante e a contagem total de linhas. #106590 (groeneai).
  • Agora FORMAT também se aplica à saída de EXPLAIN em EXPLAIN ... INSERT ... SELECT ... FORMAT ... quando SETTINGS precede FORMAT ou o formato de saída é Values. #106686 (alexey-milovidov).
  • Corrigido um raro erro espúrio de RESOURCE_ACCESS_DENIED (“Scheduler queue with resource request is about to be destructed”) em uma consulta que de fato tinha recebido acesso a um recurso de workload, causado pela reutilização de um objeto de solicitação local à thread que mantinha a falha de uma solicitação anterior. #106690 (alexey-milovidov).
  • Corrigido o retorno de resultados incorretos por match, extract, extractAll e countMatches para expressões regulares contendo escapes hexadecimais ou octais. #106709 (ofeliacode).
  • Corrigido um underflow de inteiro no analisador do protocolo wire do PostgreSQL, em que uma mensagem com um campo de comprimento menor que 4 causava um wraparound em size - 4 e um resize/ignore excessivamente grande. #107485 (uwezkhan).
  • Com enable_analyzer = 1 (o padrão), consultar uma tabela pelo nome simples quando ela existe apenas em outro banco de dados agora sugere a tabela correta; por exemplo, SELECT * FROM functions informa Maybe you meant system.functions?. Anteriormente, o novo analisador retornava o erro Unknown table expression identifier sem nenhuma dica, enquanto o analisador antigo já fornecia essa sugestão útil. #107550 (groeneai).
  • Corrigido um abort do servidor (std::terminate, sinal 6) durante o encerramento de uma consulta com plano distribuído (make_distributed_plan = 1) quando uma verificação de status de worker não conseguia reagendar a próxima verificação (por exemplo, CANNOT_SCHEDULE_TASK durante o desligamento ou MEMORY_LIMIT_EXCEEDED). Agora, a consulta falha corretamente e o servidor permanece em execução. #107575 (groeneai).
  • Corrigidos resultados incorretos de consultas distribuídas que selecionavam colunas ALIAS com uma subexpressão comum: as colunas podiam ficar desalinhadas e os valores eram retornados na coluna errada. #107675 (vdimir).
  • Corrigido um erro lógico Inconsistent AST formatting em uma função de janela sem argumentos dentro de uma declaração CODEC ou de mecanismo (por exemplo, CODEC(cume_dist() OVER (...))); essa função agora mantém os parênteses para que a consulta preserve sua integridade após um ciclo de formatação/análise. #107806 (alexey-milovidov).
  • getClientHTTPHeader agora é corretamente tratado como não determinístico, portanto seu resultado não é mais reutilizado incorretamente pelo cache de resultados de consulta. #108029 (alexey-milovidov).
  • Corrigidos resultados incorretos ao usar SELECT [...] SAMPLE [...] junto com o cache de condições de consulta (configuração use_query_condition_cache = 1, que também é o padrão). #108488 (groeneai).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK quando um predicado composto recebe um alias em GROUP BY e é referenciado novamente, com enable_identifier_resolve_cache habilitado (o padrão). A otimização optimize_and_compare_chain não era idempotente, e um nó resolvido compartilhado acumulava uma conjunção transitiva duplicada. #108553 (groeneai).
  • Corrige o erro NUMBER_OF_COLUMNS_DOESNT_MATCH quando uma subconsulta em uma tabela Distributed lê duas ou mais colunas ALIAS que se expandem para a mesma expressão (por exemplo, a1 String ALIAS toString(x), a2 String ALIAS toString(x)) e alimenta uma consulta externa, por exemplo, SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai).
  • Corrige o erro UNKNOWN_IDENTIFIER em ALTER TABLE ... DROP COLUMN quando outra coluna tem uma expressão DEFAULT ou MATERIALIZED que define e referencia um alias inline. #109374 (alexey-milovidov).
  • Corrige o fato de system.tables ignorar silenciosamente bancos de dados para usuários com permissões por banco de dados quando a consulta lê apenas as colunas name/database. Introduzido na versão 26.2. #109723 (samay-sharma).
  • Corrige o erro UNKNOWN_IDENTIFIER para colunas qualificadas pelo nome da CTE (cte_name.column) em consultas armazenadas em visualizações quando o analisador está habilitado. #111386 (novikd).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK quando uma consulta FINAL filtra por uma coluna da chave de ordenação que não está na lista SELECT e o filtro é movido para PREWHERE (por exemplo, SELECT s FROM t FINAL WHERE k GROUP BY s com optimize_move_to_prewhere_if_final = 1). #111721 (groeneai).
  • Corrige a falha na inicialização do servidor e em ATTACH com WITH RECURSIVE is not supported with the old analyzer para uma visualização com uma CTE recursiva quando enable_analyzer = 0 é o padrão do servidor. #112784 (evillique).
  • Corrige a propagação das configurações da consulta e o tratamento de NULL em accurateCastOrDefault. #114912 (alexey-milovidov).
  • Corrige read_rows, read_bytes, written_rows e written_bytes em system.query_thread_log, que reportavam o total acumulado ao longo do ciclo de vida da thread, em vez dos valores da consulta registrada. Linhas de threads de pool de longa duração, em particular a thread HTTPHandler que inicia a consulta, eram afetadas. #115596 (groeneai).

Correções no MergeTree e no armazenamento

  • Agora é possível descartar partes desanexadas com o sufixo tryN. #58957 (antaljanosbenjamin).
  • Corrigida uma exceção MULTIPLE_EXPRESSIONS_FOR_ALIAS em consultas com aliases de projeção duplicados (por exemplo, SELECT *, day + 365 AS day) dentro de subconsultas aninhadas executadas com réplicas paralelas. #80310 (alexey-milovidov).
  • Corrigida a seleção incorreta do codec de compressão para partes MergeTree quando a configuração default_compression_codec no nível da tabela era definida explicitamente. As partes gravadas durante inserções, merges e para projeções usavam o codec default do servidor, em vez da configuração no nível da tabela (isso também abrange agora a parte vazia produzida por uma mutation que exclui todos os dados). #101784 (Onyx2406).
  • Corrigidos erros MULTIPLE_EXPRESSIONS_FOR_ALIAS lançados por réplicas remotas ao executar consultas que referenciam aliases de projeção em PREWHERE / WHERE / HAVING / QUALIFY (por exemplo, SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) ou SELECT * em autojoins com nomes de colunas sobrepostos, usando réplicas paralelas e parallel_replicas_local_plan = 0. #103806 (groeneai).
  • Corrigida uma patch part corrompida após ALTER TABLE ... DROP PARTITION ID 'patch-...', seguido de DETACH/ATTACH TABLE. Anteriormente, a parte de cobertura vazia era gravada sem partition.dat e source_parts.dat, resultando em uma entrada broken-on-start_patch-... em system.detached_parts após o próximo anexo ou a reinicialização do servidor. #104353 (groeneai).
  • Corrigida a substituição silenciosa de dados por valores default quando ALTER TABLE ... RENAME COLUMN era executado simultaneamente com OPTIMIZE TABLE ... FINAL ou outro merge em segundo plano. #104822 (groeneai).
  • Corrigidas duas situações que geravam LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized em consultas com enable_materialized_cte: (1) uma CTE materializada reutilizada e filtrada por IN (subquery) em outra CTE materializada e (2) uma CTE materializada referenciada diretamente e também em um filtro WHERE ... IN (...) que acessa uma chave primária MergeTree por meio de uma subconsulta IN aninhada. O EXPLAIN das mesmas consultas também era afetado, pois os erros ocorriam durante a otimização do plano. #105041 (novikd).
  • Com skip_cache_on_disk_failure = 1, as consultas agora continuam quando FileCache não consegue criar um diretório de cache no disco. A falha é registrada em log em vez de interromper a consulta. #105250 (Diskein).
  • Corrigida a exceção de erro lógico Mutation of Memory table produced incomplete output gerada por ALTER TABLE <memory_table> APPLY PATCHES e ALTER TABLE <memory_table> APPLY DELETED MASK. As tabelas Memory não possuem patch parts nem máscaras de exclusão; portanto, ambos os comandos agora são corretamente tratados como operações sem efeito. #105286 (groeneai).
  • Corrigido CANNOT_CONVERT_TYPE para Merge sobre Merge sobre Distributed com distributed_group_by_no_merge=1 #105330 (azat).
  • Corrigido o retorno de um valor concreto por singleValueOrNullMerge, em vez de NULL, ao mesclar um estado que já havia observado vários valores distintos. #105734 (fallintoplace).
  • Corrige uma falha na função de tabela mongodb, no armazenamento MongoDB e na fonte de dicionário MongoDB quando o nome da coleção está vazio ou contém bytes NUL. #105776 (Algunenano).
  • Corrige a rejeição de ALTER TABLE ... CLEAR COLUMN para colunas columns_to_sum explicitamente definidas de SummingMergeTree e CoalescingMergeTree. #105785 (antonio2368).
  • Corrige erros UNKNOWN_DATABASE ao criar uma visualização parametrizada cujo nome do banco de dados é fornecido por meio de um parâmetro de consulta. #105799 (groeneai).
  • Restaura a otimização de leitura em ordem para tabelas Merge ao usar o analisador. #105867 (KochetovNicolai).
  • Corrige mutações UPDATE e DELETE em tabelas Iceberg acessadas por meio de um catálogo, incluindo atualizações e exclusões repetidas que não correspondem a nenhuma linha. #106111 (scanhex12).
  • Corrige o problema em que optimize_skip_unused_shards não era aplicado (e force_optimize_skip_unused_shards falhava incorretamente) quando uma tabela Distributed era consultada por meio de uma tabela Merge ou da função de tabela merge, com o predicado aplicado acima dela. #106250 (KochetovNicolai).
  • Corrige um erro lógico Column identifier ... is already registered quando um predicado de mutação (DELETE/UPDATE) contém uma subconsulta IN/EXISTS que lê de uma expressão de tabela padrão aninhada em outra subconsulta. #106414 (alexey-milovidov).
  • Corrige resultados incorretos esporádicos em consultas ORDER BY ... DESC ao ler partes largas em ordem inversa com read_in_order_use_virtual_row_per_block = 1 e um max_block_size pequeno. #106429 (vdimir).
  • Corrige uma exceção Bad cast exception em dicionários Redis que usam STORAGE_TYPE 'simple' com layout cache/direct e uma única chave de string (complexa); esses dicionários agora funcionam, e chaves compostas no armazenamento simple geram um erro claro. #106501 (vdimir).
  • Corrige a exceção Mutation of Memory table produced incomplete output gerada por comandos ALTER TABLE <memory_table> que não têm efeito nos dados por linha em um mecanismo Memory, incluindo APPLY PATCHES, APPLY DELETED MASK, MATERIALIZE STATISTICS, MATERIALIZE INDEX, MATERIALIZE PROJECTION e REWRITE PARTS. As tabelas Memory não possuem essas estruturas, portanto esses comandos agora são tratados como operações sem efeito. #106621 (groeneai).
  • Corrige a falha na inicialização do servidor com Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0) quando uma tabela MergeTree tem uma parte de índice de salto com zero grânulos e um arquivo de marcas não vazio no disco. #106675 (groeneai).
  • Corrige o caso em que réplicas paralelas não eram aplicadas a uma visualização com UNION devido a uma tabela vazia no UNION. #106900 (devcrafter).
  • Corrige uma exceção de erro lógico conflicted_part_name.has_value() que poderia ocorrer durante uma inserção síncrona em uma tabela ReplicatedMergeTree quando o bloco inserido era totalmente desduplicado e o nó de desduplicação da parte conflitante já tinha sido removido (por exemplo, por um DROP PARTITION concorrente). #107026 (groeneai).
  • Corrige o raro LOGICAL_ERROR “Attempt to release query context that does not exist” e a falha do servidor associada ao ler tabelas MergeTree por meio de um disco de cache do sistema de arquivos criado com enable_filesystem_query_cache_limit = 1. #107028 (groeneai).
  • Corrige uma falha do servidor ao mover uma parte vazia para um disco plain_rewritable (por exemplo, com ALTER TABLE ... MOVE PARTITION ... TO DISK em uma parte vazia preservada por remove_empty_parts = 0). #107040 (groeneai).
  • Corrige uma exceção Logical error: Too large size passed to allocator em um INSERT em uma tabela MergeTree quando adaptive_write_buffer_initial_size está definido como um valor extremamente alto. O tamanho inicial do buffer de gravação adaptativo agora é limitado ao tamanho máximo do buffer. #107104 (groeneai).
  • Corrige lotes ALTER TABLE ... ON CLUSTER que combinam MODIFY SETTING/RESET SETTING com uma alteração de comentário (por exemplo, MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) e eram aplicados apenas na réplica líder, deixando as demais réplicas divergentes. Também corrige um MODIFY COLUMN ... COMMENT SETTINGS posicional ou por coluna classificado incorretamente como uma alteração local de metadados apenas de comentário, o que deixava a reordenação de colunas fora dos metadados replicados e poderia causar INCOMPATIBLE_COLUMNS ao reiniciar a réplica. #107142 (groeneai).
  • Corrige o erro Argument ... of GROUPING function is not a part of GROUP BY clause em consultas que usam a função grouping com a configuração group_by_use_nulls habilitada. #107206 (KochetovNicolai).
  • Corrige consultas UPDATE leves com réplicas paralelas legadas habilitadas em tabelas MergeTree não replicadas. #107246 (groeneai).
  • Corrige uma possível exceção de erro lógico em SYSTEM SYNC DATABASE REPLICA … STRICT e faz com que o modificador STRICT efetivamente se aplique às réplicas de banco de dados. #107344 (PedroTadim).
  • Corrige Logical error: 'Duplicate announcement received for replica number N', que poderia ocorrer com réplicas paralelas quando uma subconsulta escalar continha subconsultas aninhadas que liam a mesma tabela. #107381 (groeneai).
  • Corrige a perda silenciosa de dados em MergeTree simples (não replicado) quando REPLACE PARTITION, MOVE PARTITION, DETACH PARTITION ou DETACH PART é executado em uma partição que ainda tem patches de UPDATE leves não aplicados. Essas operações agora rejeitam o comando (como ReplicatedMergeTree já faz), indicando ALTER TABLE ... APPLY PATCHES, em vez de reverter silenciosamente a atualização confirmada. #107386 (groeneai).
  • Corrige o problema em que MaterializedPostgreSQL interrompia silenciosamente a replicação de alterações quando o nome do banco de dados ou da tabela PostgreSQL continha letras maiúsculas (o consumidor pgoutput solicitava um nome de publicação sem aspas e em minúsculas, que não correspondia à publicação com distinção entre maiúsculas e minúsculas). #107423 (alexey-milovidov).
  • Corrige o erro THERE_IS_NO_COLUMN quando optimize_if_transform_strings_to_enum = 1 e a expressão otimizada if/transform sobre literais de string é uma chave de GROUP BY ou ORDER BY em uma tabela Distributed ou em réplicas paralelas. #107455 (groeneai).
  • Corrigido o problema em que SELECT ... FINAL e OPTIMIZE TABLE ... FINAL retornavam linhas duplicadas após CREATE TABLE ... CLONE AS, ATTACH PARTITION ... FROM ou MOVE PARTITION ... TO TABLE adotarem partes de uma MergeTree simples em uma ReplacingMergeTree, SummingMergeTree ou AggregatingMergeTree. O nível de mesclagem da parte adotada agora é redefinido para 0 quando os mecanismos de origem e destino diferem, para que ela seja desduplicada na próxima mesclagem. #107481 (groeneai).
  • O cancelamento de consultas agora é rastreado de forma mais adequada durante a espera pelo quórum em ReplicatedMergeTree. #107513 (nickitat).
  • A memória usada pela biblioteca rapidjson (em prettyPrintJSON, JSONMergePatch e no analisador JSON do rapidjson) agora é contabilizada pelo rastreador de memória, para que entradas patológicas sejam rejeitadas com MEMORY_LIMIT_EXCEEDED, em vez de alocarem memória sem limite. #107555 (Algunenano).
  • Corrige um Logical error: Stream ... variant_discr ... is not found que podia ocorrer ao mesclar ou ler uma parte de uma MergeTree produzida por uma mutação de uma tabela com uma coluna Dynamic. #107562 (alexey-milovidov).
  • Corrige um LOGICAL_ERROR (updateFormatPrewhereInfo called more than once) gerado ao consultar uma fonte file(), url() ou de armazenamento de objetos com PREWHERE e WHERE explícitos quando optimize_prewhere_after_pushdown estava habilitado. #107568 (groeneai).
  • Corrigida uma exceção do servidor (erro lógico Digest does not match) que podia ocorrer em RENAME TABLE, RENAME DATABASE ou CREATE OR REPLACE TABLE envolvendo uma tabela TimeSeries em um banco de dados Replicated. Agora há suporte para renomear tabelas TimeSeries. #107583 (groeneai).
  • Corrige DROP TABLE de uma tabela TimeSeries em um banco de dados Replicated, que anteriormente deixava as tabelas internas órfãs e fazia com que a tarefa de remoção em segundo plano tentasse novamente indefinidamente (DROP TABLE ... SYNC ficava bloqueado). #107604 (groeneai).
  • Corrigidos dois problemas de travessia de diretórios no protocolo de busca de partes replicadas que podiam permitir que uma réplica maliciosa gravasse arquivos fora do diretório da parte. #107606 (antonio2368).
  • Corrigido ALTER TABLE ... REPLACE PARTITION em uma tabela MergeTree simples, que fazia as partes substituídas reaparecerem após a reinicialização do servidor, fazendo com que a tabela retornasse tanto as linhas de substituição quanto as linhas obsoletas substituídas. #107623 (groeneai).
  • Corrigido um LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”) ao inserir em uma visão materializada cuja tabela de destino TO declara uma coluna com um Enum mais amplo do que o produzido pelo SELECT da visão. A ampliação válida de Enum agora é aplicada no caminho de inserção da visão materializada, como em um INSERT ... SELECT direto. #107648 (groeneai).
  • Corrige o erro NUMBER_OF_COLUMNS_DOESNT_MATCH ao consultar uma tabela Distributed (ou ao usar réplicas paralelas) que tenha várias colunas ALIAS expandidas para a mesma expressão e referenciá-las com ORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy).
  • Um erro transitório durante a atualização das partes de dados de uma tabela somente leitura não interrompe mais permanentemente a tarefa de atualização em segundo plano. #108034 (alexey-milovidov).
  • index_granularity_bytes agora é respeitado para colunas de estado AggregateFunction. Anteriormente, o limite de bytes por grânulo era ignorado para essas colunas (por exemplo, estados uniqExact em tabelas AggregatingMergeTree e projeções agregadas), produzindo grânulos muito maiores que o limite configurado e aumentando a amplificação de leitura e o uso de memória durante a consulta. #108297 (groeneai).
  • Corrigido o fato de insert_quorum = 'auto' não rejeitar inserções antecipadamente quando menos da maioria das réplicas estava ativa. Essas inserções agora falham imediatamente com TOO_FEW_LIVE_REPLICAS, em vez de gravar uma parte local e, posteriormente, expirar com UNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey).
  • Corrigida uma falha do servidor em inserções assíncronas com desduplicação quando optimize_on_insert torna vazio o bloco inserido (por exemplo, linhas cuja soma é zero em SummingMergeTree). #109229 (Diskein).
  • Corrige a perda de dados de uma coluna sem expressão padrão quando uma mesclagem é executada simultaneamente com ALTER TABLE ... RENAME COLUMN ou quando os únicos valores da coluna vêm de um UPDATE leve. A coluna poderia ser removida da parte mesclada, fazendo com que todos os seus valores fossem lidos como NULL. #109356 (groeneai).
  • Corrigida uma rara interrupção do servidor ao mesclar estados agregados uniqExact em paralelo com GROUPING SETS, ROLLUP ou CUBE. #109389 (groeneai).
  • Corrigido o reagendamento indefinido de mesclagens de rollup. #109410 (Michicosun).
  • Corrigidas mutações GROUP BY em tabelas com colunas virtuais materializadas ou persistentes. #109532 (Michicosun).
  • Corrigido o erro UNKNOWN_IDENTIFIER: Missing columns: '_block_offset' ao executar ALTER TABLE ... MATERIALIZE INDEX no índice minmax implícito criado por add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column em uma tabela com partes recém-inseridas (nível 0). O índice agora é criado para essas partes, em vez de falhar. #110236 (groeneai).
  • Corrigido o fato de uma réplica de armazenamento de objetos somente leitura (um disco configurado com read_only = true) não descobrir novas partes por meio de refresh_parts_interval e de table_disk = true ser rejeitado nesse disco com “table_disk não é compatível com discos que não são ObjectStorage”. #110460 (jkartseva).
  • Corrige um LOGICAL_ERROR (“No set is registered for key”) em ALTER TABLE … DROP COLUMN, mutações ALTER TABLE … DELETE/UPDATE e DELETE leve, em tabelas com uma coluna ALIAS cuja expressão usa o operador IN, inclusive por meio de outra coluna ALIAS. #111039 (PedroTadim).
  • Corrige casos em que a política de linha não era aplicada a projeções MergeTree durante a execução de consultas. #112329 (yariks5s).
  • Corrige o erro lógico ReadBufferFromEncryptedFile: Wrong file position ao ler uma parte Compact de um disco encrypted com E/S direta, que fazia as mesclagens ficarem bloqueadas em system.replication_queue. #112943 (alexey-milovidov).
  • Corrige a leitura do banco de dados interno _temporary_and_external_tables por meio da função de tabela merge e do mecanismo de tabela Merge, que permitia que uma sessão lesse as tabelas temporárias de outras sessões e usuários e causava uma exceção no caminho do analisador antigo. Agora, uma expressão regular de banco de dados ignora esse banco, e nomeá-lo explicitamente é proibido, assim como acessá-lo diretamente. #113224 (alexey-milovidov).
  • Corrige o problema em que uma política de linha contendo uma subconsulta escalar era avaliada apenas uma vez e, após a tabela ser lida por meio de uma tabela Merge, reutilizada indefinidamente. A condição da política convertida é armazenada em cache e compartilhada por todas as consultas, e a leitura por meio de Merge reescrevia a expressão em cache no próprio local, o que também causava uma condição de corrida entre consultas simultâneas que usavam a mesma política. #113563 (alexey-milovidov).
  • Corrige erros CANNOT_CONVERT_TYPE ao ler uma tabela Merge contendo uma tabela Distributed com réplicas paralelas com chave personalizada. #113742 (alexey-milovidov).
  • Corrige Logical error: No set is registered for key ... ao ler por meio de uma tabela Merge cujos filhos declaram uma coluna ALIAS contendo IN, mas divergem quanto ao valor padrão dessa coluna. #113757 (groeneai).
  • Corrige uma falha que permitia contornar a política de linha: a função de tabela mergeTreeIndex expunha valores da chave primária e do índice minmax de linhas ocultadas por uma política de linha SELECT na tabela de origem. Agora, a leitura de mergeTreeIndex para uma tabela com política de linha é proibida. #115304 (yariks5s).

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

  • Corrigida uma exceção em ARRAY JOIN ao usar tipos numéricos LowCardinality. #91784 (Ergus).
  • Corrigida a criação silenciosa de colunas NOT NULL como Nullable quando data_type_default_nullable = 1 e a tabela é criada em um banco de dados Replicated ou via ON CLUSTER. #97572 (xiaohuanlin).
  • Corrigido o número incorreto de linhas retornado por uma consulta a uma MaterializedView com query_plan_enable_optimizations = 0 quando a view mapeia uma coluna integer para uma coluna Bool. #100692 (Maximus5).
  • Corrigidos metadados inconsistentes de partes após mutações em colunas com serializações diferentes da padrão. #102817 (korowa).
  • Corrigida a propagação de NULL ao ler subcolunas extraídas de colunas Nullable(Tuple(...)). Por exemplo, para tup Nullable(Tuple(s Nullable(String))), SELECT tup.s agora retorna corretamente NULL nas linhas em que a tupla externa é NULL, em vez de valores inválidos. Isso abrange todos os tipos de elemento que podem representar NULL: Nullable, Dynamic, Variant e LowCardinality(Nullable(...)). #102942 (nihalzp).
  • Corrigida a remoção, por recursiveRemoveLowCardinality, de nomes personalizados de tipos de geometria (por exemplo, LineString vs. Ring, MultiLineString vs. Polygon), que causava a interpretação incorreta do tipo de geometria. #103041 (jh0x).
  • Corrigida a sobrescrita silenciosa, por dictGetOrNull, de outras colunas na projeção SELECT com NULL quando chamada com uma coluna-chave Nullable cujos valores estão ausentes no dicionário. A função alterava in loco um mapa de nulos com alias de entrada; agora, cria um clone profundo da coluna de resultado antes da mutação. #104327 (groeneai).
  • Corrigida uma exceção em consultas distribuídas que contêm uma tupla IN vazia na chave de sharding quando optimize_skip_unused_shards_rewrite_in está ativado. #104966 (alexey-milovidov).
  • Corrigida a estimativa de seletividade de PREWHERE das estatísticas count-min para colunas Float32, incluindo comparações com literais Float64. #105047 (hanfei1991).
  • Corrigido ILLEGAL_TYPE_OF_ARGUMENT ao mesclar os estados agregados de quantileExactWeightedInterpolated, quantileDD ou quantilePrometheusHistogram com suas contrapartes plurais quantilesXxxMerge (e vice-versa). As variantes singular e plural dessas três famílias de quantis compartilham o mesmo estado agregado interno, mas não estavam listadas na tabela interna de mapeamento de nomes; por isso, a mesclagem de estados entre funções — e a otimização de fusão de funções para essas famílias — era rejeitada. #105189 (groeneai).
  • Corrige resultados incorretos de toStartOfWeek, toLastDayOfWeek, toMonday, toStartOfMonth, toLastDayOfMonth, toStartOfQuarter e toStartOfYear para argumentos Date32 e DateTime64 cujo resultado fica fora do intervalo de Date: em vez de sofrerem overflow para datas arbitrárias, os resultados anteriores a 1970-01-01 agora são limitados a 1970-01-01, e os posteriores a 2149-06-06 são limitados a 2149-06-06. Isso também corrige resultados de consulta incorretos (partes e grânulos removidos incorretamente) quando essas funções eram usadas em WHERE sobre uma chave Date32 ou DateTime64 contendo valores fora do intervalo. #105244 (yariks5s).
  • Corrige um erro lógico em arrayRemove quando o primeiro argumento é um array de Variant cujas alternativas são todas incompatíveis com o tipo do segundo argumento e variant_throw_on_type_mismatch está desabilitado. Agora, a função trata a comparação como “nunca igual” e retorna o array inalterado, em vez de acionar uma falha de assertTypeEquality no servidor. #105248 (groeneai).
  • Corrige o fato de toFloat64/toUInt32/toString/etc. em Dynamic ignorarem cast_keep_nullable. #105467 (Avogar).
  • Corrige um segfault do servidor em uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (e cadeias de combinadores semelhantes sobre uniq) quando usados com GROUP BY ... WITH ROLLUP, WITH CUBE ou WITH TOTALS e um argumento Nullable. #105470 (groeneai).
  • Corrige toStartOfMillisecond e toStartOfMicrosecond, que retornavam resultados com uma diferença de quase um segundo para valores DateTime64 negativos (anteriores à época), e o overflow de inteiros com sinal detectado pelo UndefinedBehaviorSanitizer em toStartOfSecond, toStartOfMillisecond e toStartOfMicrosecond para entradas DateTime64 próximas de INT64_MIN. #105482 (groeneai).
  • Corrige o encerramento do servidor ao desserializar estados singleValueOrNull para JSON. #105535 (Avogar).
  • Corrige a ignorância de input_format_try_infer_datetimes durante a inserção em dados compartilhados em JSON. #105544 (Avogar).
  • Corrige o overflow circular de DateTime para valores fora do intervalo em JSONExtract e desserializações de texto. #105551 (Avogar).
  • Corrige uma falha ao inserir tuplas de tamanhos diferentes na mesma cláusula VALUES em uma coluna String. #105582 (Avogar).
  • Corrige o erro NOT_IMPLEMENTED em toString de DateTime com Timezone contendo valor NULL. #105587 (yariks5s).
  • Adiciona validação para colunas Dynamic achatadas malformadas na entrada Native. #105666 (Avogar).
  • Corrige um LOGICAL_ERROR (Unexpected return type from if) gerado durante o planejamento da consulta para expressões if cujo tipo de resultado é Variant e cujo segundo ou terceiro ramo é um if de condição constante sobre um literal UInt64 que cabe em Int64. #105680 (groeneai).
  • Corrige Bad get: has Decimal32, requested Decimal128 em sumMap e sumMapWithOverflow sobre uma coluna Nested(... Nullable(Decimal(P, S))) quando o estado de agregação é serializado (por exemplo, réplicas paralelas, sumMapState por meio de um formatador de estado binário ou agregação externa). #105816 (groeneai).
  • Corrige os erros Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality quando apply_mutations_on_fly = 1 é usado em uma tabela com mutações UPDATE/DELETE on-fly pendentes, enfileiradas antes de uma mutação ALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano).
  • Corrige o erro Cannot find column em consultas distribuídas com filtro IN Array(...) no novo analisador. #105894 (KochetovNicolai).
  • Corrige uma interrupção do servidor quando uma coluna com STATISTICS era modificada para Nullable enquanto outro ALTER a removia simultaneamente. #105917 (groeneai).
  • Rejeita bytes IntervalKind fora do intervalo durante a decodificação de tipos de RowBinaryWithNamesAndTypes (input_format_binary_decode_types_in_binary_format = 1), com um erro INCORRECT_DATA claro, em vez de construir um DataTypeInterval com um tipo inválido que poderia posteriormente causar comportamento indefinido em operações de hash. #106261 (groeneai).
  • Lê a subcoluna ‘null’ como caminho JSON em Nullable(JSON), em vez de como null-map. #106295 (Avogar).
  • Corrige uma leitura fora dos limites em sipHash64Keyed, sipHash128Keyed e sipHash128ReferenceKeyed ao calcular o hash de uma coluna cujos arrays estão todos vazios e cuja chave não é constante. #106355 (Algunenano).
  • Corrige um erro que impedia os usuários de usar subconsultas escalares no primeiro argumento de IN quando o segundo argumento é uma tupla não constante. #106610 (yariks5s).
  • Corrige o fato de session_timezone ser ignorado ao serializar colunas LowCardinality(DateTime) em formatos de texto (CSV, TSV, JSONEachRow etc.). Anteriormente, após a primeira gravação de uma coluna LowCardinality(DateTime) em um servidor, todas as consultas subsequentes que gravavam essa coluna renderizavam a string de horário local no primeiro fuso horário encontrado, independentemente de session_timezone. #106634 (groeneai).
  • Corrige uma interrupção do servidor em if e multiIf quando a condição é um valor constante Nullable(Nothing). #106678 (groeneai).
  • Reverte uma alteração que fazia sumMap / o combinador -Map rejeitar tipos numéricos de valor com nomes personalizados (como SimpleAggregateFunction(sum, T) e Bool) com ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, interrompendo agregações que antes funcionavam. #106729 (fm4v).
  • Corrige uma exceção Bad cast ao eliminar partes com base em estatísticas MinMax quando uma coluna-chave é LowCardinality e a constante do predicado é LowCardinality(Nullable(...)). #106793 (groeneai).
  • Corrige um erro lógico em parseDateTime com bytes não ASCII na entrada. #106856 (Avogar).
  • Corrige a exceção THERE_IS_NO_COLUMN em consultas distribuídas que envolvem a otimização optimize_rewrite_aggregate_function_with_if quando o argumento da função de agregação requer conversão para o tipo Nullable. #106908 (yakov-olkhovskiy).
  • Corrige um overflow de inteiro com sinal (comportamento indefinido) em arrayLevenshteinDistanceWeighted e arraySimilarity quando os arrays de pesos contêm valores inteiros grandes. A distância ponderada agora é acumulada em um tipo inteiro maior para pesos integrais; assim, pesos inteiros grandes não causam mais overflow e permanecem exatos. #106934 (groeneai).
  • Corrige uma falha (Source column is not Map / SIGSEGV) ao mesclar blocos ordenados que contêm uma coluna Variant com uma variante Map cuja ordem de armazenamento local difere da ordem global. #107011 (groeneai).
  • Corrige o erro TYPE_MISMATCH (“Cannot convert string … to type …”) em consultas ORDER BY <numeric column> ... LIMIT n quando a materialização tardia posicionava outra coluna antes da coluna de ordenação. O limite top-K agora é lido da coluna de ordenação correta. #107060 (groeneai).
  • Corrige um ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a composto que reutiliza um nome de coluna liberado (uma “troca”) entre colunas de tipos diferentes. A part materializada registrava o tipo de coluna incorreto, fazendo com que um SELECT posterior falhasse com Conversion between numeric types and IPv6 is not supported (ou fosse abortado ao carregar a part em compilações de depuração). #107064 (groeneai).
  • Corrige resultados não determinísticos da função roundDown quando o array de fronteiras contém NaN. O mesmo valor de entrada podia retornar uma fronteira finita ou NaN, dependendo das linhas adjacentes em um lote. As fronteiras NaN agora são ignoradas; portanto, o resultado depende apenas das fronteiras finitas. #107065 (groeneai).
  • Corrige o lançamento de DECIMAL_OVERFLOW por quantileTDigest e quantileTDigestWeighted para argumentos Date e DateTime quando o quantil interpolado é fracionário, mas está dentro do intervalo (por exemplo, quantileTDigestWeighted(date, weight) em valores que cabem no tipo). O resultado fracionário agora é truncado para o tipo de resultado, como em quantilesTDigestWeighted; valores realmente fora do intervalo ainda geram um erro. #107066 (groeneai).
  • Corrige o truncamento silencioso de valores inteiros fora do intervalo nas definições dos tipos Enum8/Enum16. Enum8('a' = 200) agora gera ARGUMENT_OUT_OF_BOUND em vez de criar silenciosamente Enum8('a' = -56). #107081 (groeneai).
  • Corrige a ordem incorreta das linhas (e um LOGICAL_ERROR “Rows are not sorted with permutation” em compilações de depuração) em consultas ORDER BY ... LIMIT com múltiplas colunas que ordenam por colunas Nullable quando várias linhas empatam nas colunas iniciais. #107094 (groeneai).
  • Corrige Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple' ao ler uma coluna Array(Tuple(...)) cujo valor foi preenchido com valores padrão, por exemplo, após ALTER TABLE ... ADD COLUMN ou após uma mutação ALTER TABLE ... CLEAR COLUMN incompleta aplicada on the fly. #107232 (groeneai).
  • Rejeita usos sem suporte de colunas AggregateFunction em expressões TTL durante o CREATE TABLE (por exemplo, TTL toDateTime(state)), em vez de falhar posteriormente, durante a execução do TTL, com ILLEGAL_TYPE_OF_ARGUMENT. Isso também abrange estados contidos em alternativas de Variant e valores Dynamic. Consumidores válidos que reconhecem estados, como finalizeAggregation, continuam sendo aceitos. #107366 (Ria-K912).
  • Corrige arrayResize com um argumento de tamanho Decimal: agora, o tamanho é interpretado por seu valor real (por exemplo, arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) retorna um elemento), em vez da representação bruta sem escala. #107389 (alexey-milovidov).
  • Corrige LOGICAL_ERROR: Unexpected return type from materialize (e erros semelhantes de incompatibilidade de tipos) quando apply_mutations_on_fly = 1 é usado em uma tabela com um UPDATE on the fly pendente, cuja coluna de destino também é lida como entrada de uma função por um UPDATE on the fly anterior, antes de uma mutação ALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai).
  • Corrige valores NULL convertidos silenciosamente em strings vazias ao inserir dados Arrow/ORC em uma coluna LowCardinality(Nullable(…)). Essa foi uma regressão introduzida na versão 26.5. #107532 (Ergus).
  • Corrige um LOGICAL_ERROR (“Input nodes size mismatch in dag”) quando uma consulta com make_distributed_plan = 1 realiza uma junção por uma chave encapsulada em uma função, cujos dois lados não têm tipo comum (por exemplo, ON intDiv(-1, t1.key) = t2.key com uma chave à direita do tipo UInt64). #107701 (groeneai).
  • Corrige a desduplicação de inserções que calculava hashes incorretos para colunas String e Array com a configuração do servidor insert_deduplication_version = new_unified_hash: inserções idênticas poderiam não ser desduplicadas porque o hash de desduplicação dependia da posição da linha no bloco inserido. #107915 (CheSema).
  • Corrige uma terminação do servidor em has ao pesquisar um Map com chaves Dynamic usando um argumento LowCardinality. #107956 (groeneai).
  • Corrige uma regressão de desempenho em subcolunas Map usadas com PREWHERE. #107988 (Avogar).
  • Corrige um erro lógico ao converter uma coluna Dynamic ou Variant aninhada em uma Tuple para um tipo de elemento não Nullable com accurateCastOrNull ou accurateCastOrDefault. #108061 (alexey-milovidov).
  • Corrige uma exceção de erro lógico Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t> quando uma consulta LIKE lê de um índice text pelo caminho alternativo de leitura direta em uma coluna armazenada de forma esparsa. #108068 (groeneai).
  • Corrige um LOGICAL_ERROR (“Tipo de retorno inesperado de if”) ao ler uma coluna com apply_mutations_on_fly = 1 após um ALTER UPDATE col = ... WHERE <cond> com condição não constante ou falsa, seguido de ALTER MODIFY COLUMN col <new type>. #108128 (groeneai).
  • Corrige signed integer overflow (comportamento indefinido) em dateDiff com as unidades hour e minute para valores extremos de DateTime64 próximos aos limites do intervalo de Int64. #108229 (groeneai).
  • Corrige uma exceção do servidor (Logical error em IColumn::insertFrom) ao converter um Array(Dynamic) ou Array(Variant) para QBit com accurateCastOrNull, por exemplo, accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai).
  • Corrige parseDateTimeBestEffort com fuso horário que gerava CANNOT_PARSE_DATETIME em linhas NULL de toString(Nullable(DateTime64)). #108310 (yariks5s).
  • Corrige uma falha do servidor (estouro de pilha) causada por expressões profundamente aninhadas, como [[[ ... ]]] ou array(array( ... )), quando max_parser_depth está definido com um valor alto. #108493 (Algunenano).
  • Corrige uma projeção SELECT * que retornava o valor padrão do tipo da coluna (por exemplo, 0) em vez de seu valor DEFAULT (por exemplo, -1) ao ler uma coluna adicionada com ALTER TABLE ... ADD COLUMN ... DEFAULT após a criação da projeção. As leituras da tabela base já estavam corretas; apenas as leituras atendidas pela projeção eram afetadas, até que ela fosse reconstruída. #108569 (tiandiwonder).
  • Corrige a desativação silenciosa da poda de partições e de chave primária quando uma coluna-chave LowCardinality(FixedString) (ou LowCardinality(Nullable(FixedString))) é encapsulada em uma função na chave, por exemplo, PARTITION BY sipHash64(k) % N com WHERE k = 'literal'. Essas consultas examinavam todas as partições em vez de eliminá-las pela poda. #108777 (groeneai).
  • Preserva a ordem original das chaves na serialização de Map em buckets para corrigir operações de comparação que dependem dela. #109178 (Avogar).
  • Corrige a inferência de esquema para os formatos Arrow, ArrowStream, Avro e os leitores legados ORC e Parquet, que retornavam Nullable(Tuple) para colunas struct anuláveis, embora o tipo Nullable(Tuple) não seja permitido (allow_experimental_nullable_tuple_type está desabilitado). DESCRIBE retornava um tipo que CREATE TABLE rejeita; por isso, a criação de tabelas ou a inserção de dados usando o esquema inferido falhava com o erro Nullable Tuple type is not allowed. #109185 (nihalzp).
  • Corrige um bug em que valores DEFAULT de colunas não eram aplicados a INSERT INTO TABLE FUNCTION (por exemplo, remote(...) ou file(...)) com dados VALUES embutidos quando o próprio servidor analisa esses dados (send_table_structure_on_insert_with_inline_data = 0). Um NULL explícito inserido em uma coluna não Nullable com DEFAULT tornava-se 0 em vez do padrão declarado. Agora, o comportamento é igual ao de um INSERT simples em tabela e ao do protocolo HTTP. #109258 (groeneai).
  • Corrige um segfault em groupArrayLastMerge. A desserialização do estado da função de agregação agora é validada, evitando que um estado corrompido cause acesso fora dos limites. #109485 (mstetsyuk).
  • Corrige um segfault na função de agregação largestTriangleThreeBuckets ao rejeitar estados corrompidos da função de agregação durante a desserialização. #109492 (mstetsyuk).
  • Corrige a leitura de uma coluna Parquet com um Tuple não anulável quando o tipo ClickHouse solicitado o envolve em Nullable (por exemplo, Nullable(Tuple(...))), que antes falhava com TYPE_MISMATCH. #109615 (groeneai).
  • O leitor nativo do Parquet v3 agora pode ler uma coluna struct fisicamente anulável (um grupo OPTIONAL do Parquet) como Nullable(Tuple(...)). Antes, isso gerava TYPE_MISMATCH. #109898 (groeneai).
  • Corrige uma falha do servidor (estouro da pilha nativa) ao copiar ou destruir um literal Array/Tuple/Map/Object profundamente aninhado, por exemplo, em uma consulta com um literal muito profundamente aninhado e max_parser_depth elevado. #110393 (Algunenano).
  • Corrige resultados incorretos de IS NULL / IS NOT NULL / count() com optimize_functions_to_subcolumns em uma coluna convertida em Nullable por um ALTER MODIFY COLUMN T somente de metadados para Nullable(T). Em partes gravadas antes da conversão, a subcoluna .null era preenchida com o valor padrão do tipo de armazenamento (NULL), em vez de ser derivada da coluna pai fisicamente presente. Assim, linhas existentes não nulas eram relatadas incorretamente como NULL. #110584 (groeneai).
  • Corrige um LOGICAL_ERROR (“Bad cast from ColumnString to ColumnLowCardinality”) durante a análise do índice de chave primária quando uma coluna-chave LowCardinality é envolvida em uma cadeia aninhada de CAST que reintroduz LowCardinality, por exemplo, WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. Em compilações de depuração e com sanitizer, isso abortava o servidor; em versões de lançamento, fazia a consulta falhar. #111050 (groeneai).
  • Corrige a leitura de dados Arrow e ArrowStream com colunas Array ou Map aninhadas vazias produzidas pelo Apache Arrow Java anterior à versão 19.0.0 (incluída no Apache Spark), que antes eram rejeitadas com um erro INCORRECT_DATA informando que o buffer de offsets era pequeno demais. #111101 (Algunenano).
  • Corrige um erro lógico Block structure mismatch (em compilações de depuração e com sanitizer) e um erro Illegal types of arguments em operações de conjunto sobre colunas compatíveis de estado de agregação (por exemplo, quantileState e quantilesState(0.9)) aninhadas em colunas contêiner, como Tuple, Array, Map, Nullable ou Variant. #111191 (alexey-milovidov).
  • Adiciona validação para dados corrompidos de índice replicado recebidos pelo protocolo nativo. #112331 (Avogar).
  • Corrige uma leitura fora dos limites durante a desduplicação de inserções quando um INSERT passa por uma visão materializada que altera a contagem de linhas antes de gravar em uma tabela de destino particionada. #112649 (CheSema).
  • Corrigida uma gravação fora dos limites ao ler uma coluna DECIMAL do Parquet cujo tipo físico é mais largo que o tipo correspondente à precisão declarada, por exemplo, DECIMAL(9, 2) armazenado fisicamente como INT64. Esses arquivos são Parquet válidos e outros gravadores os produzem, mas o leitor dimensionava a coluna de destino com base na precisão declarada, enquanto o decodificador gravava a largura física, corrompendo a memória. A leitura desse tipo de arquivo agora também gera DECIMAL_OVERFLOW quando um valor não cabe na precisão declarada, em vez de retornar dados corrompidos, e é feita sem perda com uma dica de tipo que tenha pelo menos a largura do tipo físico. #113046 (groeneai).
  • Corrigidas falhas em ATTACH PARTITION FROM, REPLACE PARTITION, MOVE PARTITION TO TABLE e na adição de uma réplica ReplicatedMergeTree, que exibiam Tables have different ..., METADATA_MISMATCH ou INCOMPATIBLE_COLUMNS em tabelas cujas definições foram escritas com parênteses redundantes, como PARTITION BY (a), ORDER BY (b), INDEX ix (b * c) TYPE minmax, PROJECTION p (SELECT (b) ...), CONSTRAINT c CHECK (a > 0), TTL (d + INTERVAL 10 YEAR) ou DEFAULT (a + 1). #114188 (alexey-milovidov).
  • Corrige um bug em que uma entidade de acesso com uma configuração cujo valor é Map, como um perfil de configurações com http_response_headers ou additional_table_filters, era armazenada em um formato que o ClickHouse não conseguia reler, deixando a entidade permanentemente impossível de carregar após uma reinicialização. #114620 (groeneai).
  • Corrige has, indexOf, countEqual, mapContainsKey, mapContainsValue e o subscrito de Map, que retornavam “não encontrado” para uma busca LowCardinality constante igual ao valor padrão do tipo de elemento, como uma String vazia ou o número zero. #114624 (groeneai).
  • Corrigidos resultados incorretos da otimização trivial GROUP BY ... LIMIT (configuração optimize_trivial_group_by_limit_query) para consultas com DISTINCT, QUALIFY, funções de janela ou arrayJoin na projeção: esses elementos consomem ou filtram os grupos após a agregação, portanto, limitar a agregação a LIMIT + OFFSET chaves poderia retornar linhas de menos ou valores incorretos. A otimização não se aplica mais a essas consultas. #114695 (alexey-milovidov).
  • Corrigidos resultados incorretos para SELECT count(arrayJoin(arr)) com o valor padrão optimize_trivial_count_query = 1. A contagem de linhas armazenada era retornada em vez do número de elementos do array, e, em file() e url(), a consulta retornava 0. #115227 (groeneai).
  • Corrigidos uniq, uniqExact, uniqHLL12 e uniqTheta, que retornavam um resultado incorreto para um argumento envolto em uma função injetiva que oculta a nulabilidade, como uniqExact(tuple(x)) em uma coluna Nullable. A otimização optimize_injective_functions_inside_uniq removia a função envolvente, fazendo com que as linhas NULL fossem ignoradas em vez de contadas. #115466 (vdimir).
  • Permite que leitores do KeeperMap aceitem metadados compartilhados quando chaves primárias equivalentes diferem apenas por parênteses externos redundantes. #115642 (skuznetsov-clickhouse).

Correções no índice de texto e no índice de salto

  • Corrige a interrupção do servidor quando uma consulta usa comparações coalesce/ifNull aninhadas (por exemplo, WHERE coalesce(a, b, coalesce(c, d), e) = const) em uma tabela MergeTree com vários índices de salto minmax e use_skip_indexes_for_disjunctions = 1. A reescrita de índice de salto de <op>(coalesce(...), const) agora é aplicada recursivamente aos argumentos internos de coalesce, para que a RPN de KeyCondition de cada índice corresponda à RPN do modelo, como o código de rastreamento de disjunções já pressupõe. #103929 (groeneai).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK gerado por ALTER TABLE ... MATERIALIZE INDEX em partes criadas na versão 25.8 que contêm um índice de salto em uma coluna adicionada por meio de um ALTER TABLE ... ADD COLUMN separado. A mutação agora lê corretamente todas as colunas exigidas por cada índice de salto e projeção preexistentes na parte durante o recálculo forçado. #105039 (groeneai).
  • Corrige uma subcontagem silenciosa em consultas SELECT quando use_query_condition_cache = 1 (padrão). Uma consulta no formato PREWHERE pk_prefix = X WHERE non_pk IN (...) em uma coluna com um índice de salto de filtro Bloom corrompia o QueryConditionCache para o predicado pk_prefix = X, fazendo com que um SELECT count() ... WHERE pk_prefix = X subsequente e inofensivo retornasse um resultado incorreto, com contagem inferior à real. Afetava todas as versões 26.x. #105686 (groeneai).
  • Corrige uma exceção quando uma consulta de busca vetorial usa um índice vetorial, outro índice de salto como minmax e use_skip_indexes_on_data_read = 1. #106473 (shankar-iyer).
  • Corrige “Too many marks” em um índice de texto de uma parte mesclada vazia. #106867 (azat).
  • Corrige resultados incorretos ao consultar uma tabela ReplacingMergeTree com FINAL e um filtro em um índice de texto enquanto query_plan_optimize_lazy_final estava habilitada. A otimização FINAL lazy criava etapas de leitura que não reproduziam a leitura direta do índice de texto, fazendo com que o filtro descartasse todas as linhas correspondentes. #106894 (Ergus).
  • Corrige LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) quando uma constante Variant contendo um membro LowCardinality é comparada a uma coluna-chave cuja expressão de chave é uma função determinística não monotônica (por exemplo, um índice de salto minmax em sipHash64(col)). #107111 (groeneai).
  • Corrige resultados incorretos (frequentemente vazios) de ORDER BY <col> LIMIT n quando a otimização use_skip_indexes_for_top_k está ativa e uma parte com um índice de salto minmax na coluna de ordenação teve linhas removidas por um DELETE leve. A otimização não classifica mais o minmax desatualizado de partes com linhas excluídas por DELETE leve à frente das partes que contêm as linhas ativas no topo. #107320 (groeneai).
  • Corrige a ausência de eliminação de grânulos pelo índice de salto Set em colunas LowCardinality. #107868 (thevar1able).
  • A configuração use_skip_indexes_on_data_read agora pode ser revertida ao padrão anterior à versão 26.1 (false) por meio da configuração compatibility, oferecendo uma alternativa para uma regressão de desempenho em que o caminho de leitura de dados impede a eliminação de intervalos de marcas por índices de salto minmax/set/bloom_filter. #108330 (egor-click).
  • Corrigida a leitura direta de vários índices de texto parcialmente materializados. #108607 (CurtizJ).
  • Corrigido o problema em que um índice de texto definido em mapValues(map) ou mapKeys(map) não era usado silenciosamente quando uma tabela era consultada por meio de uma tabela com engine Distributed usando o analyzer. O índice era usado na tabela local e via cluster()/remote(), mas uma consulta por meio de uma tabela com engine Distributed o ignorava (e falhava com INDEX_NOT_USED com force_data_skipping_indices). #109188 (groeneai).
  • Corrigida uma falha do servidor em CREATE HYPOTHETICAL INDEX ... TYPE set (e ngrambf_v1/tokenbf_v1) quando o argumento obrigatório do índice era omitido. Essas instruções agora são rejeitadas com uma mensagem de erro clara. #109294 (groeneai).
  • Corrigidos resultados incorretos nas funções has, mapContainsKey e mapContainsValue com uma substring de busca vazia quando há um índice de texto presente. #110246 (rschu1ze).
  • Corrigido o erro ATTEMPT_TO_READ_AFTER_EOF ao mesclar partes com um índice de texto quando uma das partes mescladas estava vazia, por exemplo, após uma mutação que excluiu todas as linhas da parte. #112490 (CurtizJ).
  • Corrigido um travamento na otimização do plano de consulta quando uma cláusula WHERE contém uma constante de string grande com muitos pontos e a tabela possui um índice de salto bloom_filter, tokenbf_v1, ngrambf_v1 ou text. A correspondência entre o nome de uma coluna de filtro e colunas de índice JSONAllPaths(...) enumerava cada divisão do nome por ponto, tornando quadrática, em relação ao comprimento da constante, a criação da condição do índice de salto. #113289 (groeneai).
  • Corrigido o caso em que ORDER BY ... LIMIT retornava menos linhas do que o solicitado, possivelmente nenhuma, quando uma política de linhas era o único filtro da consulta e a coluna de ordenação tinha um índice de salto minmax. A otimização top-K restringia a leitura antes da aplicação da política de linhas. #114073 (alexey-milovidov).

Correções no lago de dados

  • Corrige a exceção de erro lógico ao ler tabelas Iceberg cuja versão do formato foi atualizada por uma ferramenta externa (por exemplo, Spark). #100407 (alexey-milovidov).
  • Corrige uma exceção (LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') ao ler tabelas Iceberg que contêm arquivos de dados ORC com a otimização PREWHERE habilitada. #101206 (groeneai).
  • Corrige exceções LOGICAL_ERROR ao ler tabelas de lago de dados Iceberg ou DeltaLake por caminhos que podem chegar ao pipeline de leitura sem um datalake_table_state fixado, como atualizações simultâneas de metadados do Iceberg ou leituras de merge em tabelas DeltaLake. #102033 (groeneai).
  • Corrige o erro esporádico Logical error: 'Database <name> not found' gerado por DataLakeConfiguration::getCatalog quando uma tabela com engine Iceberg é carregada em um banco de dados comum durante o carregamento assíncrono de metadados. #103775 (groeneai).
  • Corrige leituras excessivas de metadados do catálogo/S3 quando uma instrução INSERT ou DDL faz referência a uma tabela inexistente em um banco de dados de catálogo DataLake com show_data_lake_catalogs_in_system_tables habilitado. O mecanismo de sugestão para erros de digitação carregava metadados completos do Iceberg de cada tabela de todo o catálogo, o que poderia esgotar a memória em catálogos grandes. #104124 (il9ue).
  • Corrige read_bytes inflado (e os bytes/s derivados exibidos em system.query_log, na barra de progresso etc.) ao ler arquivos Parquet. A implementação anterior informava o tamanho total comprimido do grupo de linhas em cada bloco, portanto a leitura de K de N colunas era superestimada por N / K. Agora, o valor é somado apenas para as colunas selecionadas. Também corrige o acompanhamento do progresso no nível do arquivo para tabelas Iceberg, que anteriormente nunca informava o tamanho do arquivo de dados. #105413 (groeneai).
  • Corrige resultados incorretos ao ler uma tabela Iceberg com iceberg_use_version_hint = 1 depois que outro gravador (como a função de tabela icebergLocal/icebergS3) sem essa configuração avança a tabela. Agora, version-hint.text é mantido sincronizado por todos os gravadores assim que o arquivo existe, para que leitores subsequentes que usam a indicação vejam o snapshot mais recente. #105682 (groeneai).
  • As gravações no Iceberg agora preservam valores NULL em colunas de partição Nullable(T). Anteriormente, um NULL gravado pelo ClickHouse aparecia como o valor padrão do tipo interno (0 para int) quando lido novamente pelo Spark ou outros leitores Iceberg. #105862 (groeneai).
  • Corrige exclusões posicionais merge-on-read do Iceberg v2 que retornavam linhas incorretas quando um único arquivo de exclusão fazia referência a vários arquivos de dados e diversos arquivos de exclusão se aplicavam ao mesmo arquivo de dados. As entradas de exclusão agora são filtradas pelo caminho do arquivo ao qual fazem referência. #105888 (groeneai).
  • Corrige a engine de tabela IcebergLocal, que passava a ser somente leitura após um ciclo DETACH + ATTACH ou uma reinicialização do servidor, fazendo com que todos os INSERT subsequentes falhassem com Local object storage Local is readonly. (READONLY). #106016 (groeneai).
  • Corrige a desativação silenciosa do cache do sistema de arquivos para o Azure Blob Storage (por exemplo, tabelas Delta Lake no Azure), pois os metadados do objeto não incluíam o ETag do blob. #106091 (thewisenerd).
  • Adicionada validação de caminho para tabelas Delta Lake a fim de impedir que os metadados acessem objetos fora do local de armazenamento configurado. #106115 (scanhex12).
  • A poda de partições do Iceberg agora lida corretamente com filtros WHERE partition_col = (SELECT ... FROM ...) nos quais o analisador encapsula o resultado da subconsulta escalar em um _CAST(Const, 'TargetType') interno com tipos de origem e destino correspondentes. Antes, esses filtros desativavam a poda de partições e acionavam uma varredura completa da tabela. #106204 (groeneai).
  • Corrigido o problema em que catálogos REST Iceberg contendo tabelas eram incorretamente reportados como vazios. #106301 (LefterisXefteris).
  • Corrigida uma exceção NOT_FOUND_COLUMN_IN_BLOCK ao consultar uma tabela Iceberg ou S3 com um WHERE composto contendo IS NOT NULL em uma coluna que não está na lista SELECT, usando o leitor nativo Parquet V3. #106443 (tiandiwonder).
  • Corrigido o relatório de progresso inflado ao ler tabelas Iceberg com filtros _file ou _path. Antes, o progresso de total_bytes_to_read incluía todos os arquivos do manifesto, independentemente da filtragem. #106491 (PedroTadim).
  • Corrigida uma exceção do servidor (erro lógico std::out_of_range) ao inserir em uma tabela Iceberg cujos nomes de coluna do bloco de escrita não correspondem aos IDs de campo do esquema mais recente (por exemplo, depois que um gravador concorrente renomeia uma coluna dentro da janela iceberg_metadata_staleness_ms). A inserção agora falha com um erro de consulta claro, em vez de interromper o servidor. #107279 (groeneai).
  • Corrigido um possível estouro de pilha do servidor (falha) ao ler um esquema ou valor profundamente aninhado nos formatos MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg e Paimon. Essas entradas profundamente aninhadas agora são rejeitadas com uma exceção. #107341 (Algunenano).
  • Corrigida uma falha (LOGICAL_ERROR em compilações de depuração) e um bug silencioso que produzia resultados incorretos (em compilações de lançamento) ao ler uma tabela Iceberg cujos metadados reassociam um schema-id existente a um esquema diferente entre versões de metadados. Esses metadados agora são rejeitados com ICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai).
  • Corrigida a leitura de tabelas Iceberg v3 cujos arquivos de dados Parquet contêm colunas reservadas de linhagem de linha (como _row_id); o leitor nativo Parquet não gera mais ICEBERG_SPECIFICATION_VIOLATION para IDs de campo reservados que não fazem parte do esquema da tabela. #107377 (gregakinman).
  • Corrigida uma exceção espúria filesystem error: in last_write_time: No such file or directory ao listar um diretório de armazenamento de objetos em disco local (por exemplo, uma tabela Iceberg em um disco local) enquanto arquivos são substituídos simultaneamente. Uma entrada removida simultaneamente agora é omitida da listagem, em vez de interrompê-la. #107432 (groeneai).
  • Corrigido o erro ‘A conta deve ser especificada’ ao ler uma tabela Delta Lake no Azure. #107620 (SmitaRKulkarni).
  • Corrige uma falha ao ler tabelas Iceberg com arquivos de exclusão por igualdade. Se uma coluna for anulável no arquivo de exclusão por igualdade, mas não anulável no esquema da tabela (ou vice-versa), os valores lidos do arquivo de exclusão eram inseridos, por meio de uma conversão não verificada, em uma coluna de tipo diferente (uma confusão de tipos de coluna), corrompendo a coluna e causando a falha do servidor. #109551 (mstetsyuk).
  • Corrige um falso erro ICEBERG_SPECIFICATION_VIOLATION ao ler uma tabela Iceberg cujo tipo decimal (ou outro tipo primitivo parametrizado) é serializado com espaços em branco diferentes em arquivos de metadados, por exemplo, decimal(20,0) nos metadados da tabela e decimal(20, 0) no manifesto. Essas strings de tipo equivalentes segundo a especificação agora são comparadas ignorando os espaços em branco. #109676 (groeneai).
  • Corrige a leitura de tabelas Iceberg cuja ordenação padrão faz referência a uma coluna que requer delimitação (por exemplo, @timestamp). Essas tabelas não podiam ser lidas porque o ORDER BY de armazenamento sintetizado era construído a partir do nome bruto da coluna e não era analisado, resultando em SYNTAX_ERROR. #110233 (groeneai).
  • Corrige a leitura de tabelas Paimon que contêm uma coluna ARRAY ou MAP anulável. Essas tabelas não podiam ser lidas porque o mapeador de esquema envolvia o tipo composto em Nullable, o que o ClickHouse não permite; assim, tanto DESC quanto SELECT falhavam com Nested type Array(Nullable(Int32)) cannot be inside Nullable type. Uma coluna composta anulável agora é mapeada para um tipo composto não Nullable, e um valor NULL é lido como vazio. #113450 (groeneai).
  • Registra o espaço de nomes Iceberg no catálogo antes de gravar arquivos de tabela (necessário para o SeaweedFS) #114285 (azat).

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

  • Corrigida a exceção “Distributed task iterator is not initialized” ao usar as funções de tabela url, s3 ou semelhantes em consultas com réplicas paralelas habilitadas. #100146 (alexey-milovidov).
  • Corrigido um possível segfault do servidor em funções de tabela de cluster (s3Cluster, urlCluster, fileCluster, …) quando o planejador produz um SELECT com a flag recursive_with definida, mas sem uma expressão WITH. #105433 (groeneai).
  • Corrigido o pushdown de filtro para Parquet e ORC em predicados IN (subquery), permitindo a eliminação de grupos de linhas, páginas e filtros Bloom em leituras de file, url, s3 e armazenamento de objetos. #105863 (arsenmuk).
  • Corrigida a exceção LOGICAL_ERROR durante o pré-download para o cache quando um objeto S3 remoto é sobrescrito com conteúdo menor entre a listagem e a leitura. #106375 (fm4v).
  • Corrigido o problema em que a função de tabela s3 ignorava silenciosamente uma partition_strategy posicional em minúsculas (por exemplo, hive). #107297 (jkartseva).
  • Corrigida uma regressão em que definir compatibility = '26.6' (que habilita implicitamente a estratégia de partição hive) aceitava silenciosamente {_partition_id} em caminhos de tabela de S3 e armazenamento de objetos, em vez de gerar BAD_ARGUMENTS. #107437 (LefterisXefteris).
  • Corrigido o problema em que s3 e outras funções de tabela de armazenamento de objetos geravam LOGICAL_ERROR em vez de BAD_ARGUMENTS quando um argumento de chave-valor era duplicado, por exemplo, s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai).
  • Corrigida uma exceção do servidor (Logical error: 'index >= result.start') ao formatar uma consulta malformada que mistura as formas posicional e nomeada do argumento Secret das funções de tabela s3/gcs, por exemplo, s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai).
  • Corrigida a prioridade das configurações do S3 para que um bloco de endpoint <s3> com escopo de URL tenha precedência sobre os padrões <s3> de nível superior. #109251 (bharatnc).
  • Corrigidos erros 411 Length Required de serviços Azure: o transporte HTTP do Azure baseado em Poco agora define Content-Length com base no corpo da requisição para clientes SDK que não definem o cabeçalho por conta própria (por exemplo, Azure Key Vault). #110299 (thevar1able).

Correções no S3Queue

  • Corrige uma falha do servidor (acesso fora dos limites) em S3Queue/AzureQueue com enable_hash_ring_filtering = 1 quando um lote continha um arquivo não processável e, ao mesmo tempo, falhava a solicitação ao Keeper para marcar o lote como em processamento. #108977 (groeneai).
  • Corrige vazamentos de credenciais em SHOW CREATE, system.query_log, logs do servidor e na saída de EXPLAIN. Todas as formas de localizador S3 agora mascaram session_token, secrets do Google ADC, valores de extra_credentials/headers em qualquer posição de argumento, chaves secret duplicadas ou em expressões, formas posicionais inválidas (falha segura) e credenciais incorporadas em URLs S3; isso abrange as funções de tabela s3/s3Cluster com URL explícita e coleção nomeada, os motores de tabela com suporte a S3 (S3, GCS, os motores de data lake, S3Queue), o motor de banco de dados S3, BACKUP ... TO S3 e o motor de banco de dados Backup. Além disso, argumentos secretos de encrypt/decrypt/HMAC criados por uma expressão (inclusive os inseridos de uma UDF SQL) agora são ocultados em nomes de projeção, EXPLAIN QUERY TREE e EXPLAIN actions. #109768 (Algunenano).
  • Corrige o modo ordenado de S3Queue/AzureQueue com nós de processamento persistentes: os bloqueios do bucket agora são renovados durante o streaming, para que a limpeza por TTL (persistent_processing_node_ttl_seconds) não remova bloqueios do bucket de um processador ativo. Se, ainda assim, a propriedade do lock for perdida, isso será detectado e relatado (um erro lógico e o evento de perfil ObjectStorageQueueBucketLockLostOwnership), e o streaming será retomado com um novo iterador de arquivos. #110292 (kssenii).

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

  • Corrigido um crash do servidor (SIGSEGV) que podia ser explorado por qualquer usuário com permissão para CREATE TABLE ao enviar CREATE TABLE ... TO INNER UUID '...' sem uma cláusula ENGINE por HTTP ou pelo protocolo nativo. O mesmo bug também causava o crash do cliente. O analisador agora informa corretamente o erro BAD_ARGUMENTS, em vez de desreferenciar um ponteiro nulo. #105579 (groeneai).
  • Corrigido um crash do servidor ao consultar tabelas DeltaLake com allow_experimental_delta_kernel_rs ativado e uma credencial ou opção contendo bytes inválidos (a FFI do Rust entrava em pânico ao atravessar o limite extern "C"). #106109 (Algunenano).
  • Corrigidas várias leituras fora dos limites da heap no leitor do formato Arrow IPC (ArrowColumnToCHColumn). Um arquivo Arrow malformado podia declarar mais linhas do que seus buffers contêm, declarar comprimentos de filhos de lista/struct/map inconsistentes com os respectivos pais, fornecer offsets de lista não monotônicos ou truncar um bitmap de validade filho, causando leituras além do fim das alocações na heap. Esse problema podia ser explorado por qualquer usuário com o privilégio SELECT via file(), format(), funções de tabela ou entradas ArrowFlight. Todos os buffers de dados, offsets, view-struct e bitmap de validade agora são validados antes de qualquer acesso a ponteiro bruto, e as estruturas e offsets de lista/struct/map são verificados quanto à consistência. #106395 (Algunenano).
  • Corrigido um bug em que as colunas used_privileges e missing_privileges de system.query_log podiam conter strings de privilégios vazadas de consultas anteriores e não relacionadas de outro usuário, banco de dados ou sessão. #106425 (alexey-milovidov).
  • Corrigido um heap buffer overflow (crash do servidor) em decodeHTMLComponent ao decodificar strings que contêm as entidades HTML expansíveis &nGt; ou &nLt;, que podia ser explorado por qualquer usuário com um único SELECT. #106741 (Algunenano).
  • Corrigidos resultados incorretos de consultas causados pelo cache de condições de consulta quando mutações em tempo real (apply_mutations_on_fly) ou patch parts filtravam linhas antes de PREWHERE. Uma consulta lida com apply_mutations_on_fly = 1 podia contaminar o cache, fazendo com que uma consulta posterior com apply_mutations_on_fly = 0 e o mesmo predicado ignorasse marcas que deveria ler e retornasse menos linhas do que o esperado. A mesma correção também abrange políticas de segurança em nível de linha, que são adicionadas como filtro antes de PREWHERE: uma consulta executada sob uma política de linha restritiva podia contaminar o cache para uma consulta posterior que usasse o mesmo predicado sem essa política. #107145 (groeneai).
  • Corrigido um heap buffer overflow (crash do servidor) em windowFunnel ao finalizar um estado de função agregada criado com um tipo de evento fora do intervalo, que podia ser explorado por qualquer usuário com um único SELECT. #107412 (uwezkhan).
  • Corrigido o problema em que currentUser(), user(), SESSION_USER e authenticatedUser() eram avaliados como uma string vazia durante a gravação de inserts assíncronos (com async_insert = 1). Isso afetava expressões de coluna DEFAULT/MATERIALIZED e visões materializadas que fazem referência a essas funções, que armazenavam silenciosamente uma string vazia em vez do usuário que realizou o insert. #107541 (groeneai).
  • Quando várias quotas são atribuídas ao mesmo usuário ou função, todas agora são aplicadas em conjunto (uma consulta é rejeitada se qualquer uma delas for excedida), em vez de apenas uma quota ser aplicada e escolhida de forma não determinística. SHOW QUOTA e system.quota_usage agora exibem todas as quotas aplicadas ao usuário atual. #107664 (alexey-milovidov).
  • SYSTEM RESET DDL WORKER agora requer o novo privilégio SYSTEM RESET DDL WORKER. Antes, qualquer usuário autenticado (inclusive usuários readonly) podia executá-lo e redefinir repetidamente o estado do worker de DDL, bloqueando DDLs ON CLUSTER. #108460 (groeneai).
  • Corrigida a identificação de usuários por ssl_certificate para que um único wildcard * corresponda exatamente a um componente do nome (RFC 6125 6.4.3). Antes, um wildcard em um assunto CN ou SAN DNS: (por exemplo, *.corp.example.com) também correspondia a nomes com vários rótulos, como evil.deep.corp.example.com, permitindo que o titular de um certificado de um subdomínio mais profundo se autenticasse como o usuário do wildcard. A correspondência de SANs URI: permanece inalterada. #108472 (groeneai).
  • Os comandos do MySQL wire protocol COM_FIELD_LIST (mysql_list_fields) e COM_INIT_DB (USE database) agora aplicam o mesmo controle de acesso que seus equivalentes em SQL (SHOW COLUMNS/DESCRIBE e USE). Antes, eles podiam revelar nomes de colunas de tabelas para as quais o usuário tinha permissões parciais em colunas e alterar o banco de dados atual sem o privilégio SHOW DATABASES. #108508 (groeneai).
  • Corrigida a correspondência de http_forbid_headers para não diferenciar maiúsculas de minúsculas. Os nomes de cabeçalhos HTTP não diferenciam maiúsculas de minúsculas, portanto proibir Authorization agora também bloqueia authorization, AUTHORIZATION e outras variações de maiúsculas e minúsculas. Os padrões header_regexp configurados agora são correspondidos sem diferenciar maiúsculas de minúsculas, sem exigir a flag explícita (?i). #108509 (groeneai).
  • Corrigida uma exposição de metadados em que DESCRIBE loop('db', 'table') e DESCRIBE loop(<inner table function>) contornavam a verificação de acesso à origem / SHOW COLUMNS, permitindo que um usuário sem privilégios lesse o esquema de colunas de uma tabela. #108624 (groeneai).
  • Corrigida uma falha de inicialização em que um banco de dados DataLakeCatalog criado por uma versão anterior (25.12 ou anterior) com um auth_header malformado não podia ser anexado após a atualização para 26.2 ou posterior, impedindo a inicialização do servidor. O auth_header agora é validado apenas em CREATE e, em ATTACH, o catálogo é criado sob demanda no primeiro uso, em vez de durante a inicialização. Assim, um único banco de dados de catálogo mal configurado ou inacessível não bloqueia mais a inicialização do servidor. #108674 (groeneai).
  • Reforçadas as conexões RabbitMQ contra frames AMQP excessivamente grandes e aplicadas de forma consistente as verificações de remote_url_allow_hosts a rabbitmq_address. #112479 (kssenii).
  • Corrigido um caso em que CREATE TABLE ... ENGINE = Distributed(...) sem uma lista de colunas podia revelar a estrutura de uma tabela local que o usuário que a criava não tinha permissão para ver. Em um CREATE executado pelo próprio servidor local, a estrutura agora é inferida no contexto do usuário, portanto é necessário ter SHOW COLUMNS na tabela de destino, como já ocorre com o engine Remote. Um CREATE reproduzido da fila DDL (ON CLUSTER ou dentro de um banco de dados Replicated) não é abrangido. #113220 (groeneai).
  • Corrigido um caso em que CREATE TABLE ... ENGINE = Buffer(...) sem lista de colunas poderia revelar a estrutura de uma tabela de destino que o usuário que a cria não tem permissão para ver. Em um CREATE executado localmente pelo próprio servidor, a estrutura agora é inferida no contexto do usuário, portanto é necessária a permissão SHOW COLUMNS na tabela de destino, como já ocorre com Merge e Remote. Um CREATE reproduzido da fila de DDL (ON CLUSTER ou dentro de um banco de dados Replicated) não é abrangido. #113372 (groeneai).
  • Limitado o tamanho da mensagem de inicialização do protocolo wire do PostgreSQL, que é lida antes da autenticação. #115708 (alexey-milovidov).

Correções de backup e restauração

  • Corrigida uma interrupção do servidor durante o RESTORE de backups contendo tabelas com dependências cíclicas. #103824 (thevar1able).
  • Corrigido o problema de a classe de armazenamento do S3 (s3_storage_class / s3_storage_class_name) ser ignorada para objetos gravados por upload multipartes em discos S3 e armazenamento de objetos, fazendo com que objetos grandes fossem criados com a classe padrão STANDARD. O nome da opção agora é aceito como s3_storage_class e s3_storage_class_name para discos, armazenamento de objetos e backups. #106214 (alexey-milovidov).
  • Corrigido o descarte, por SYSTEM RELOAD CONFIG, das configurações do Azure Blob Storage específicas de cada endpoint (como use_native_copy), o que fazia com que as configurações de um disco fossem ignoradas para BACKUP/RESTORE até a reinicialização do servidor. #106357 (jkartseva).
  • Corrigida a falha de backups com FILE_DOESNT_EXIST quando o destino REPLACE de uma view materializada atualizável é coletado em um banco de dados Replicated ou Shared cuja view materializada ainda não foi instanciada na réplica que iniciou o backup. #106411 (jkartseva).
  • Corrigido o Azure BACKUP/RESTORE que ignorava as configurações de endpoint para discos azure_blob_storage no formato legado. #106784 (jkartseva).
  • Corrigido o BACKUP para AzureBlobStorage: a cópia de um arquivo de dados dentro de um backup gravava o objeto de destino fora do diretório do backup. As verificações de existência de objetos de backup em destinos S3 agora usam solicitações exatas de HeadObject, em vez de listagem por prefixo, evitando correspondências incorretas com chaves de prefixos semelhantes. #107153 (pamarcos).
  • Backups incrementais não armazenam mais credenciais S3 no localizador <base_backup> do arquivo de metadados .backup. Backups criados com use_same_s3_credentials_for_base_backup = 1 ou com credenciais explícitas do backup base que correspondam a esse localizador armazenam um marcador não secreto e são restaurados sem configurações adicionais durante a restauração; para backups criados com credenciais explícitas diferentes para o backup base ou argumentos adicionais de autenticação do backup base, passe-os a RESTORE com a configuração base_backup. Backups criados por versões anteriores com credenciais incorporadas continuam podendo ser restaurados. #107357 (pamarcos).
  • Corrigido o RESTORE de tabelas ReplicatedMergeTree para preservar partes de um backup com conteúdo duplicado, em vez de deduplicá-las silenciosamente. #107652 (pamarcos).
  • Um placeholder {_partition_id} no caminho de um mecanismo semelhante a arquivo (S3, AzureBlobStorage, URL etc.) sem uma partition_strategy explícita volta a implicar a estratégia wildcard, independentemente de file_like_engine_default_partition_strategy. Isso restaura a compatibilidade retroativa para DDLs anteriores à versão 26.6 que passaram a falhar com BAD_ARGUMENTS (“A estratégia de partição hive não pode ser usada com um wildcard ‘_partition_id’ no caminho”). #111279 (fm4v).

Correções do ClickHouse Keeper

  • Corrige a limpeza de snapshots do Keeper após falhas de gravação, garantindo que snapshots parciais sejam removidos com segurança e que as gravações possam ser repetidas sem avançar latest_snapshot_meta. #105779 (antonio2368).
  • Corrige falhas do Keeper durante a sincronização de um seguidor quando a fila de respostas do novo dispatcher de solicitações podia encher antes de a thread de resposta ser iniciada. #106049 (antonio2368).
  • Corrige casos em que o Keeper ficava travado na inicialização quando a configuração nuraft_max_log_gap_in_stream era definida como um valor diferente do padrão (o padrão é 0, ou seja, desativa o pipelining de solicitações append_entries). #106220 (al13n321).
  • O TLS interno do Raft do Keeper agora respeita a configuração openSSL.client.verificationMode. Anteriormente, a verificação de certificados de pares ficava sempre habilitada para a comunicação Raft entre instâncias do Keeper, independentemente dessa configuração, portanto none era ignorado silenciosamente. Agora, none desativa explicitamente a verificação de certificados de pares do Raft, enquanto a ausência dessa configuração mantém o comportamento anterior, seguro por padrão. Configurações que definem explicitamente none deixarão de verificar certificados de pares do Raft após o upgrade, conforme a intenção da configuração. #106726 (antonio2368).
  • Corrige a recriação indevida de sessões do ZooKeeper ao recarregar a configuração. #107096 (azat).
  • Corrige um bug no ClickHouse Keeper em que os metadados do snapshot informados por last_snapshot (e zk_latest_snapshot_size em mntr) podiam regredir após a instalação de um snapshot obsoleto ou duplicado. Isso também podia permitir que um snapshot local com o mesmo índice sobrescrevesse um arquivo de snapshot registrado enquanto ele ainda estava sendo transmitido a um par ou enviado ao S3. #107321 (antonio2368).
  • Corrige casos em que uma view materializada atualizável ficava travada se a conexão com o ZooKeeper fosse perdida no momento errado. #108234 (al13n321).
  • Corrige mutações com um parâmetro de consulta como partição (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): o valor de partição substituído era serializado na entrada da mutação em um formato que não podia ser convertido novamente, interrompendo o carregamento da tabela (em todas as réplicas, no caso de tabelas replicadas). Agora, os comandos de mutação também são verificados para garantir que possam ser convertidos novamente antes de serem gravados no ZooKeeper ou no disco, de modo que uma incompatibilidade semelhante faça a consulta ALTER falhar em vez de interromper a tabela. #111518 (al13n321).
  • Corrige overflow numérico durante a análise de dados para system.zookeeper_info. #111629 (kssenii).

Correções de falhas e de estabilidade

  • Corrige a exceção NOT_FOUND_COLUMN_IN_BLOCK ao usar LIMIT BY com colunas constantes em conjunto com DISTINCT e ORDER BY no novo analisador. #93195 (ashrithb).
  • Melhora a estabilidade da conexão com o HiveCatalog ao adicionar um mecanismo de novas tentativas automáticas e lógica de reconexão para lidar com erros TTransportException na comunicação com o Hive Metastore. #98471 (otselnik).
  • Corrige a avaliação de constantes durante a análise em funções de curto-circuito (if, multiIf, and, or etc.), para que ramificações estaticamente inacessíveis não gerem mais exceções durante a análise. Por exemplo, WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) agora retorna corretamente 0, em vez de falhar com um erro de divisão por zero. #103157 (fastio).
  • Corrige uma finalização inesperada do servidor quando runningAccumulate era chamado em uma função de agregação que retorna seu próprio estado. #105085 (antaljanosbenjamin).
  • Corrige getServerSetting para retornar o valor efetivo atual das configurações do servidor que podem ser alteradas em tempo de execução (como max_server_memory_usage, mark_cache_size, max_concurrent_queries, tamanhos de pools de threads etc.), em conformidade com o reportado por system.server_settings. #105172 (alexey-milovidov).
  • Corrige a exceção NOT_FOUND_COLUMN_IN_BLOCK ao combinar ORDER BY ... WITH FILL INTERPOLATE e LIMIT N BY com o analisador habilitado. #105481 (yakov-olkhovskiy).
  • Corrige uma exceção do servidor (erro lógico Trying to execute PLACEHOLDER action) quando uma CTE MATERIALIZED cujo corpo é uma subconsulta correlacionada é usada no lado direito de IN. Essa CTE agora é rejeitada durante a análise, de forma consistente com o tratamento já aplicado ao mesmo padrão quando a CTE é referenciada diretamente em FROM. #105518 (groeneai).
  • Corrige o fato de variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false não capturar exceções durante a execução de funções. #105543 (Avogar).
  • Corrige a exceção NOT_FOUND_COLUMN_IN_BLOCK quando uma expressão TTL referencia uma subcoluna. #105578 (Avogar).
  • Corrige uma falha do servidor que poderia ocorrer quando uma consulta que lê do PostgreSQL — por meio da função de tabela postgresql, do mecanismo de tabela PostgreSQL ou de um dicionário com uma fonte PostgreSQL — era cancelada (por exemplo, com KILL QUERY) e o cancelamento da consulta remota no PostgreSQL falhava. #105949 (rorylshanks).
  • Corrige uma possível falha causada por um literal de string muito grande enviado na consulta. #105996 (nickitat).
  • Corrige a exceção INVALID_WITH_FILL_EXPRESSION ao usar INTERPOLATE () (vazio) com um prefixo de ordenação em ORDER BY e use_with_fill_by_sorting_prefix habilitado. As colunas do prefixo de ordenação agora são corretamente excluídas do conjunto de interpolação implícita, em conformidade com o comportamento de INTERPOLATE (col) quando nomeado explicitamente. #106001 (yakov-olkhovskiy).
  • Estados malformados de AggregateFunction(uniqTheta, ...) provenientes da entrada RowBinary ou de parâmetros de consulta agora são rejeitados com CORRUPTED_DATA, em vez de encerrar o servidor. #106260 (groeneai).
  • Corrige uma falha e um possível erro NOT_FOUND_COLUMN_IN_BLOCK quando a otimização baseada em restrições (optimize_using_constraints) é usada com subconsultas correlacionadas. #106349 (Algunenano).
  • Corrige a exceção NUMBER_OF_COLUMNS_DOESNT_MATCH ao consultar uma tabela Distributed com duas ou mais colunas ALIAS expandidas para a mesma expressão (por exemplo, ambas definidas como toString(x)), ou quando a mesma expressão é usada tanto como referência a uma coluna ALIAS quanto diretamente na lista SELECT, com uma cláusula ORDER BY. #106404 (yakov-olkhovskiy).
  • Corrigido o LOGICAL_ERROR “Trying to get name of not a column: ExpressionList”, gerado por consultas que passam um asterisco dentro de multiIf para um argumento de função de tabela, por exemplo, numbers(multiIf(*, ...), 2). A consulta agora rejeita o padrão não resolvível com UNSUPPORTED_METHOD. #106647 (groeneai).
  • Rejeita padrões glob de file problemáticos que causariam recursão ilimitada na listagem de diretórios. Agora é imposta uma profundidade máxima de recursão de 1000; consultas que a excedem geram TOO_DEEP_RECURSION, em vez de encerrar o servidor por estouro de pilha. #106676 (groeneai).
  • Corrige a exceção 'Trying to read from input() twice.' gerada quando a função de tabela input é encapsulada em uma CTE não MATERIALIZED referenciada em mais de um ponto da consulta. A consulta agora é rejeitada com um erro claro INVALID_USAGE_OF_INPUT durante o planejamento. input é um stream de cliente de uso único e só pode ser consumido por uma única fonte no plano de consulta. #106682 (groeneai).
  • Corrige colunas inconsistentes (que posteriormente levam a LOGICAL_ERROR) em caso de exceção (por exemplo, MEMORY_LIMIT_EXCEEDED) durante a análise. #106802 (azat).
  • Corrige uma falha do servidor (SIGSEGV) ao ler dados Protobuf truncados com input_format_allow_errors_num > 0. #106905 (atsarevskiy).
  • Corrige uma falha do servidor (desreferenciamento de ponteiro nulo) ao executar TRUNCATE ou DROP em uma tabela EmbeddedRocksDB cujo identificador do RocksDB foi liberado, por exemplo, uma tabela read_only cujo diretório de dados foi esvaziado por um TRUNCATE anterior. #106940 (groeneai).
  • Corrige uma exceção (std::length_error reportada como LOGICAL_ERROR) ao ler de uma função de tabela *Cluster, como urlCluster, com uma configuração max_streams_for_files_processing_in_cluster_functions muito alta. O número de streams agora é limitado a um valor razoável. #106946 (groeneai).
  • Corrigido o encerramento do servidor quando uma consulta distribuída era cancelada imediatamente antes de ser enviada a um shard. #106950 (groeneai).
  • Corrigida uma exceção do servidor (erro lógico this->visited_views == right->visited_views) em um INSERT quando duas visões materializadas na mesma tabela de origem gravam na mesma tabela de destino e uma visão dependente lê esse destino, com materialized_views_squash_parallel_inserts habilitado. #107027 (groeneai).
  • Corrigida uma exceção LOGICAL_ERROR ao inserir em uma tabela DeltaLake com colunas que não correspondem ao esquema de gravação (por exemplo, uma coluna Nested que é achatada em subcolunas ou uma função de tabela com um subconjunto explícito de colunas). Esses inserts agora falham com um erro INCOMPATIBLE_COLUMNS exibido ao usuário. #107058 (groeneai).
  • Corrigida uma LOGICAL_ERROR (“Table expression … data must be initialized”) gerada quando um seletor de asterisco qualificado (por exemplo, x.*) referenciava uma CTE recursiva pelo nome dentro de seu próprio termo recursivo. Esses seletores agora expandem as colunas da tabela recursiva, da mesma forma que uma coluna qualificada (x.a) ou um seletor não qualificado (*) já faz nessa posição. #107144 (groeneai).
  • Corrigida uma LOGICAL_ERROR (“Unexpected exception in refresh scheduling”) que poderia colocar o servidor em um ciclo de falhas após a reinicialização quando uma view materializada atualizável tem uma dependência REFRESH ... DEPENDS ON <name> cujo nome não qualificado corresponde ao de uma tabela temporária ou CTE. #107156 (groeneai).
  • Corrigida uma LOGICAL_ERROR (Variant N (T) has size X, but expected Y) quando uma função como toString ou concat é aplicada a uma coluna Variant ou Dynamic que contém uma única variante não vazia junto com NULLs, e a função retorna a coluna de entrada sem alterações. #107374 (groeneai).
  • Corrigida uma LOGICAL_ERROR (block.rows() == getRows()) gerada em um INSERT assíncrono em uma tabela Alias quando use_strict_insert_block_limits estava habilitado. #107400 (groeneai).
  • Corrigida uma exceção do servidor (Logical error: Not-ready Set is passed as the second argument for function 'in') quando uma expressão-chave (ORDER BY, PRIMARY KEY, PARTITION BY ou um INDEX de omissão) continha um operador IN com uma tabela no lado direito, por exemplo, ORDER BY (x IN some_table). Essas expressões-chave agora são rejeitadas na criação da tabela. #107424 (groeneai).
  • Corrigida uma falha rara do servidor no processamento de DISTINCT que poderia ocorrer quando uma alocação falhava (por exemplo, ao atingir o limite de memória) durante a inicialização do conjunto de chaves distintas. #107467 (groeneai).
  • Corrigidas falhas em operações DeltaLake após a expiração de credenciais temporárias do S3, atualizando as credenciais em cache antes da próxima operação. As credenciais de assume-role do STS também são atualizadas após falhas de autenticação. #107480 (ahmadov).
  • Corrigido um Not-ready Set is passed as the second argument for function 'in' (LOGICAL_ERROR) ao consultar uma tabela com uma chave PARTITION BY e uma subconsulta IN/NOT IN envolvida em uma expressão maior, por exemplo, WHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai).
  • Corrige uma falha (desreferenciamento de ponteiro nulo) que poderia ocorrer quando um plano de consulta distribuída era executado localmente (make_distributed_plan + distributed_plan_execute_locally) com log_formatted_queries = 1. #107570 (groeneai).
  • Corrige uma falha do servidor ao ler uma visão materializada cujo destino é uma tabela Distributed enquanto a consulta é executada com enable_analyzer = 0. #107653 (groeneai).
  • Corrige uma falha do servidor (SIGSEGV) ao ler dados Protobuf com input_format_allow_errors_num > 0, quando uma mensagem válida precede uma mensagem inválida (que pode ser ignorada) no mesmo bloco. #107739 (atsarevskiy).
  • Corrige o travamento por vários minutos das funções de tabela odbc e jdbc e o fato de ignorarem o cancelamento de consultas (KILL QUERY, max_execution_time) quando a ponte deixa de responder durante a inferência da estrutura da tabela remota. #107809 (alexey-milovidov).
  • Corrige uma possível falha (desreferenciamento de ponteiro nulo) quando a substituição de database/db de uma coleção nomeada passada para remote()/remoteSecure() não é um nome de banco de dados constante, por exemplo, remote(nc, database = (SELECT 1)). Agora, a consulta falha com um erro claro em vez de causar uma falha. #108271 (groeneai).
  • Consultas de busca vetorial que fazem SELECT da coluna _distance agora retornam um erro apropriado em vez de falhar com LOGICAL_ERROR. #108423 (rschu1ze).
  • Corrige uma possível falha (heap-buffer-overflow) quando uma coluna de estado de função de agregação da família quantileTDigest era usada como chave de GROUP BY e serializada simultaneamente por várias threads. #110263 (groeneai).
  • Corrige a poda incorreta decorrente da análise do índice de chave primária em tabelas com uma chave de ordenação inversa (decrescente) (ORDER BY (g, r DESC)). Um grânulo que abrangia uma mudança em uma coluna-chave inicial, seguida por uma coluna-chave decrescente, poderia ser podado incorretamente, descartando linhas correspondentes. #111059 (nihalzp).
  • Corrige um erro lógico block.rows() == getRows() (uma leitura fora dos limites e desduplicação de inserções corrompida em builds de release) quando um INSERT passa por uma visão materializada dependente cujo destino é um Alias e cuja consulta interna altera o número de linhas, com uma tabela com desduplicação acessível após o redirecionamento pelo alias. #111103 (alexey-milovidov).
  • Corrige um segfault causado por acesso à memória fora dos limites ao desserializar um estado malformado de função de agregação que contém um valor String. Esses estados agora são validados e rejeitados em vez de causar segfaults. #111606 (mstetsyuk).
  • Corrige uma falha ao ler um arquivo Parquet com metadados inconsistentes de filtro de Bloom. Esses arquivos também poderiam retornar silenciosamente menos linhas do que deveriam. #112498 (tiandiwonder).
  • Corrige um segfault e corrupção silenciosa de dados quando um INSERT no mecanismo File ou na função de tabela file adiciona dados a um arquivo não vazio em um formato que não aceita acréscimos, como Avro. A gravação por um descritor de arquivo ou caminho particionado ignorava a verificação existente, suprimindo o prefixo do formato e gravando um segundo cabeçalho após os bytes existentes, o que deixava o arquivo ilegível. Esse INSERT agora é rejeitado com CANNOT_APPEND_TO_FILE, como já ocorre para um caminho simples. #112839 (groeneai).
  • Corrige o travamento de DROP TABLE e SYSTEM STOP VIEW quando uma view materializada atualizável fica bloqueada durante o planejamento da consulta de atualização. #113188 (evillique).
  • Corrige uma rara interrupção do servidor quando entradas da fila de inserção assíncrona tinham deadlines idênticos. #113363 (mstetsyuk).
  • Corrige corrupção da memória heap ao ler Parquet por meio de um formato de entrada que possui seu próprio buffer de leitura, por exemplo, um Dicionário com SOURCE(FILE(... format 'Parquet')). Tarefas de pré-busca e decodificação em segundo plano ainda podiam ler e gravar no buffer depois que o pipeline o liberava, o que poderia interromper o servidor. #114668 (groeneai).
  • Corrige um travamento ao remover uma tabela TimeSeries cujo nome é ordenado lexicograficamente antes dos nomes de suas tabelas internas, por exemplo, uma tabela chamada -ts, ou ao remover uma visão materializada declarada com ENGINE = TimeSeries. A remoção causava um deadlock na própria proteção DDL e não podia ser cancelada com KILL QUERY. #114953 (groeneai).

Outras correções de bugs

  • As funções like, ilike, notLike, notILike e match agora oferecem suporte a texto pesquisado constante com padrão não constante (por exemplo, 'foo' LIKE pattern_column), o que antes gerava ILLEGAL_COLUMN. #100479 (Onyx2406).
  • Corrigido o erro NOT_FOUND_COLUMN_IN_BLOCK ao selecionar dados de uma VIEW sobre uma tabela com uma projeção normal. #101218 (amosbird).
  • Rejeitados valores Float64 negativos (por exemplo, -100.5) em configurações de workload, como max_bytes_per_second e max_cpus. Antes, apenas inteiros negativos eram validados, permitindo que floats negativos criassem silenciosamente nós de scheduler inválidos. #101842 (groeneai).
  • Leituras do armazenamento de objetos agora respondem prontamente ao cancelamento de consultas. #103016 (SmitaRKulkarni).
  • Corrigido o problema em que input_format_max_block_size_bytes era silenciosamente ignorado durante a análise de INSERT quando max_insert_block_size_bytes é 0 (o padrão). A configuração agora limita corretamente o tamanho dos blocos produzidos por formatos de entrada baseados em linhas. #103068 (Fgrtue).
  • Corrigido o problema em que o ClickHouse ocasionalmente produzia tokens GSSAPI inválidos devido à remoção incorreta de bytes nulos finais. #103114 (EmeraldShift).
  • EXPLAIN SYNTAX expande views parametrizadas. #103263 (jrdi).
  • Corrigida a corrupção de dados ao gravar Parquet (e outros formatos com trailer, como ORC e Arrow) no HDFS via INSERT INTO FUNCTION hdfs(...). Desde a versão 26.1, WriteBufferFromHDFS não esvaziava seu buffer de trabalho em finalize(), fazendo com que os últimos até DBMS_DEFAULT_BUFFER_SIZE bytes de cada arquivo fossem silenciosamente perdidos, incluindo o rodapé PAR1 do Parquet. A leitura desses arquivos retornava Not a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai).
  • Corrigidos resultados incorretos e um possível erro lógico em subconsultas correlacionadas quando um limite de tamanho de join (max_rows_in_join / max_bytes_in_join) é definido junto com join_overflow_mode = 'break'. O join criado internamente para avaliar uma subconsulta correlacionada agora ignora esses limites definidos pelo usuário, portanto não pode mais ser interrompido antecipadamente nem descartar linhas. #103322 (groeneai).
  • Corrigidos resultados incorretos ou a não utilização de projeções quando uma projeção agregada contém vários agregados sumIf com diferentes condições IN (...). #104765 (Ergus).
  • Corrigido deltaSumTimestamp retornando resultados incorretos para tipos inteiros com sinal que cruzam o zero. #104830 (thevar1able).
  • Corrigido o erro Logical error: 'Metadata is not initialized' gerado por DELETE FROM em uma tabela Iceberg, DeltaLake ou Hudi recém-anexada cujo arquivo de metadados está corrompido ou não pode ser carregado. Agora, uma exceção comum voltada ao usuário é reportada, e o servidor continua em execução. #104917 (groeneai).
  • Consultas ATTACH TABLE name <clauses>; que incluem cláusulas de armazenamento (ORDER BY, PARTITION BY, PRIMARY KEY, SAMPLE BY, TTL, UNIQUE KEY ou SETTINGS do engine) sem um ENGINE agora geram BAD_ARGUMENTS, em vez de reanexar silenciosamente a tabela com sua definição armazenada e descartar as cláusulas fornecidas pelo usuário. As SETTINGS de sessão no nível da consulta (como log_comment) continuam sendo aplicadas. Use ATTACH TABLE t; para reanexar com os metadados armazenados ou ALTER TABLE t MODIFY SETTING ... após ATTACH para alterar as configurações. #105068 (groeneai).
  • Corrigido um estouro de buffer de heap ao ler arquivos Arrow ou ArrowStream com deslocamentos intermediários corrompidos em uma coluna binária ou de string, bem como uma desreferência de ponteiro nulo ao ler colunas Arrow com geotags. #105449 (Algunenano).
  • Corrigida uma interrupção do servidor ao ler subcolunas Dynamic de uma tabela Memory comprimida após ALTER. #105464 (Avogar).
  • Incluído skip_first_lines na chave do cache de esquema para formatos WithNames. #105469 (Avogar).
  • Corrigido o histogram, que produzia resultados incorretos para entradas pequenas não ordenadas. #105548 (Avogar).
  • Corrigido o uso da tabela de inserção em funções de tabela quando optimize_trivial_insert_select está habilitado. #105555 (Avogar).
  • Corrigida a função de janela estimateCompressionRatio, que perdia dados acumulados entre linhas. #105581 (Avogar).
  • A extração de valores de partição Hive agora respeita a configuração cast_string_to_date_time_mode e, por padrão, aceita timestamps ISO 8601 com sufixos de fuso horário (por exemplo, +0000, +00:00, Z) em chaves de partição. #105584 (alexey-milovidov).
  • Corrigida a recuperação de erros do formato de entrada Template após linhas malformadas. #105735 (niyue).
  • Corrigida a formatação de SYSTEM INSTRUMENT ADD para que os argumentos do manipulador sejam separados por um único espaço, e rejeitadas listas inválidas de argumentos de instrumentação SLEEP com mais de dois valores ou um intervalo em que o mínimo é maior que o máximo. #105984 (pamarcos).
  • Corrigidas operações de partição em ALTER TABLE que falhavam silenciosamente para chaves de partição Bool. #106004 (Avogar).
  • Corrigidos JSONExtractRaw e JSONHas para caminhos JSON tipados com valores default. #106005 (Avogar).
  • Corrigido um prefixo / incorreto em caminhos base vazios nas configurações de lago de dados. #106013 (thewisenerd).
  • Corrigido system.dictionaries, que retornava 0 linhas com a revogação parcial de SHOW DICTIONARIES. #106105 (Avogar).
  • Corrigidos resultados incorretos em consultas a tabelas cujo ORDER BY contém uma função monotonicamente decrescente, como (c0 / -42) ou intDiv(c0, -42). Predicados na coluna subjacente (por exemplo, c0 < 0) poderiam podar incorretamente grânulos que continham linhas correspondentes, resultando em resultados ausentes. #106136 (nihalzp).
  • Adicionada validação de estados agregados DDSketch malformados durante a inserção. #106236 (yariks5s).
  • Corrigida a consistência do cache do sistema de arquivos após downgrades de SLRU com falha, evitando que entradas permanecessem presas em estado de remoção. Também foram corrigidos o redimensionamento do cache dividido System/Data e a limpeza de espaço livre, para que os limites sejam atualizados atomicamente e o espaço possa ser recuperado de ambos os segmentos do cache. #106286 (kssenii).
  • Corrigida uma conversão incorreta de valores Float16 subnormais para Float32 (por exemplo, ao lê-los de arquivos .npy do NumPy), causada por um deslocamento de mantissa com erro de uma posição. #106343 (jh0x).
  • Corrigido regexpExtract(haystack, pattern) para que padrões sem grupo de captura retornem a correspondência completa, em vez de gerar INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai).
  • Corrigido um erro lógico ao criar um dicionário de polígonos a partir de dados de origem contendo coordenadas de pontos NaN ou infinitas. Essas coordenadas agora são rejeitadas com uma mensagem de erro clara. #106423 (alexey-milovidov).
  • Dicionários HTTP agora podem especificar cabeçalhos de requisição por meio de coleções nomeadas. #106459 (ZelvaMan).
  • Valores de enumeração Avro malformados agora são validados e rejeitados com uma exceção, em vez de causarem acesso à memória fora dos limites e o encerramento do servidor. #106476 (mstetsyuk).
  • Corrigido o problema em que LIMIT WITH TIES e LIMIT WITH TIES fracionário não respeitavam a collation de ORDER BY ... COLLATE ao determinar empates. Linhas iguais de acordo com a collation (por exemplo, '1' e '01' com collation numérica) eram comparadas byte a byte, fazendo com que algumas linhas empatadas fossem incorretamente excluídas do resultado. #106539 (nihalzp).
  • Corrigidas as otimizações de DISTINCT em ordem e LIMIT BY em ordem (incluindo LIMIT BY negativo), que retornavam resultados incorretos quando a entrada era ordenada com uma collation (ORDER BY ... COLLATE). Linhas iguais de acordo com a collation (por exemplo, 'a' e 'A' com uma collation que não diferencia maiúsculas de minúsculas) são ordenadas pela chave de collation e não ficam adjacentes por valor; portanto, a otimização em ordem agora é ignorada quando uma collation é usada. #106564 (nihalzp).
  • Corrigida uma condição de corrida durante o encerramento de um consumidor NATS que poderia encerrar o servidor. #106692 (mstetsyuk).
  • Corrigidos diversos problemas de segurança de memória e esgotamento de recursos em leitores de formatos acessíveis por entradas não confiáveis: uma leitura de heap fora dos limites no tratamento do comprimento dos níveis de definição/repetição de DataPageV2 no leitor nativo de Parquet, um estouro de pilha em arquivos Parquet com esquemas profundamente aninhados e alocações que ignoravam max_memory_usage ao analisar geometrias GeoParquet WKB/WKT e strings/bytes Avro. #106739 (Algunenano).
  • Corrigido o keeper_server.http_control.secure_port, que fornecia respostas HTTP em texto simples a clientes HTTPS. A porta segura agora fornece HTTPS corretamente. #106822 (linjiayu1025-collab).
  • Corrigida a emissão de restrictive/permissive em minúsculas por SHOW CREATE ROW POLICY, em vez de maiúsculas, em inconsistência com outras palavras-chave. #106865 (valerypetrov).
  • Corrigido o problema em que partes eram marcadas como corrompidas e desanexadas a cada recarregamento de parte (reinicialização do servidor, DETACH ou ATTACH) em tabelas com uma coluna LowCardinality(Nullable(...)) na chave de partição. Desde a versão 26.5, o arquivo de índice minmax por parte não era gravado quando o mínimo e o máximo dessa coluna eram NULL, embora a verificação de consistência da parte ainda exigisse o arquivo. Partes gravadas por versões afetadas não têm o arquivo de índice minmax e ainda precisam ser reanexadas manualmente. #106945 (PedroTadim).
  • Corrigido o problema em que elapsed_us era sempre zero e read_rows/read_bytes eram subcontados em system.processors_profile_log e system.query_log para consultas de flush de inserts assíncronos (AsyncInsertFlush). #106982 (cwurm).
  • Corrigido um erro lógico Block structure mismatch in UnionStep stream (interrupção do servidor em compilações de depuração/sanitizer, Code: 49 em compilações de release) que ocorria quando uma ramificação de UNION/INTERSECT/EXCEPT lia uma coluna serializada como Sparse, enquanto a ramificação irmã lia a mesma coluna por completo (por exemplo, ao inserir em uma visão materializada). #107041 (groeneai).
  • Corrigida a ordem incorreta das linhas em consultas com ORDER BY sobre UNION ALL com optimize_read_in_order e read_in_order_use_virtual_row habilitados. #107053 (vdimir).
  • Corrigido um erro de sintaxe quando uma cláusula FORMAT, SETTINGS ou INTO OUTFILE segue SHOW ROW POLICIES ou SHOW MASKING POLICIES (por exemplo, SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai).
  • Corrigido o problema em que trimLeft, trimRight e trimBoth (e os aliases ltrim, rtrim, trim) lançavam TOO_LARGE_STRING_SIZE quando o conjunto personalizado de caracteres para trim tinha mais de 16 caracteres. Conjuntos de caracteres para trim de qualquer tamanho voltam a ser compatíveis. #107071 (fm4v).
  • Corrigido um estouro de inteiro com sinal em quantileExactExclusive, quantilesExactExclusive, quantileExactInclusive e quantilesExactInclusive que podia produzir resultados incorretos para entradas Int64 abrangendo um intervalo amplo. #107154 (groeneai).
  • Recarregamentos de configuração não executam mais os scripts de inicialização novamente, evitando a repetição de ações de inicialização executadas uma única vez. #107187 (mstetsyuk).
  • Corrigida a ordem incorreta dos resultados de ORDER BY sobre UNION ALL com optimize_read_in_order habilitado quando o pipeline de união era reduzido devido às configurações de max_streams_for_union_step; a redução agora é ignorada quando o plano depende de streams de saída ordenados de UNION. #107208 (vdimir).
  • Corrigida uma possível desreferenciação de ponteiro nulo ao resolver a configuração de proxy durante o desligamento final do servidor. #107231 (PedroTadim).
  • Corrige a geração de linhas extras por ORDER BY ... WITH FILL quando uma coluna de ORDER BY anterior à coluna de preenchimento usa uma ordenação COLLATE. As linhas agora são agrupadas pelo prefixo de ordenação usando essa ordenação, em conformidade com a ordem de ordenação. #107365 (groeneai).
  • Corrigido comportamento indefinido quando um valor de ponto flutuante não finito (como nan ou inf) é passado como argumento de timestamp/duração das funções de tabela prometheusQuery / prometheusQueryRange. Esse argumento agora gera BAD_ARGUMENTS em vez de produzir um timestamp inválido. #107417 (groeneai).
  • Corrige resultados incorretos da otimização optimize_rewrite_aggregate_function_with_if para funções de agregação que preservam valores de payload NULL (a família *_respect_nulls: anyRespectNulls, first_value_respect_nulls, anyLast_respect_nulls, last_value_respect_nulls). A otimização não reescreve mais f(if(cond, x, NULL)) para a forma -If dessas funções. #107430 (groeneai).
  • Adicionada validação para limites inválidos na entrada ORC. #107580 (al13n321).
  • Corrige uma vulnerabilidade de negação de serviço não autenticada por exaustão de memória na porta do protocolo MySQL. #107599 (tiandiwonder).
  • Corrigida a interface MySQL, que não podia ser usada com MySQL Connector/J 8.2.0 e versões mais recentes (incluindo 9.x). O campo info do pacote OK agora é codificado com comprimento, como no servidor MySQL, permitindo a conexão do driver JDBC. #107693 (alexey-milovidov).
  • Corrigido um erro lógico Block structure mismatch in UnionStep stream (interrupção do servidor em compilações de depuração/sanitizer, Code: 49 em compilações de lançamento) que ocorria quando ramificações irmãs de um UNION/INTERSECT/EXCEPT diferiam apenas no predicado WHERE e o predicado de uma das ramificações era avaliado como constante para uma coluna Const. #107719 (groeneai).
  • A leitura de dados Arrow e ArrowStream com colunas String ou Binary vazias produzidas pelo Apache Arrow Java anterior à versão 19.0.0 (incluindo Apache Spark) não gera mais INCORRECT_DATA. #107764 (Algunenano).
  • Blocos Native malformados cujo discriminador Variant referencia uma variante inexistente agora são rejeitados com segurança. #107991 (uwezkhan).
  • Corrigida uma regressão de desempenho na leitura de colunas Dynamic com várias threads. #107997 (Avogar).
  • A configuração obsoleta de lago de dados storage_catalog_url agora é corretamente rejeitada pela validação do catálogo (anteriormente, apenas storage_catalog_type e storage_aws_access_key_id eram verificadas), e a mensagem de erro lista todas as configurações obsoletas. #108040 (alexey-milovidov).
  • Corrigida a função de tabela/mecanismo ArrowFlight, que rejeitava uma coleção nomeada que omitia a chave opcional dataset com o erro No such key 'dataset'. #108041 (alexey-milovidov).
  • Secrets e credenciais agora são mascarados em system.query_views_log.view_query, em vez de serem expostos no SQL da view registrado em log. #108214 (Fidelaggio).
  • Corrigido o problema em que type_json_allow_duplicated_key_with_literal_and_nested_object não funcionava com caminhos tipados em JSON. #108218 (Avogar).
  • Corrigido comportamento indefinido (ponteiro nulo passado para memcpy) nas funções detectCharset e detectLanguageUnknown quando a string de entrada tem mais de 32768 bytes e nenhum conjunto de caracteres pode ser detectado. #108250 (groeneai).
  • Corrigido o erro NOT_FOUND_COLUMN_IN_BLOCK em consultas que usam as colunas virtuais _part_starting_offset/_part_offset em WHERE junto com materialização tardia. #108287 (vdimir).
  • Ocultados argumentos secretos de funções como encrypt, decrypt e HMAC na saída de EXPLAIN actions, EXPLAIN header e EXPLAIN PIPELINE quando format_display_secrets_in_show_and_select está desabilitado (o padrão). #108386 (Algunenano).
  • CREATE OR REPLACE agora é executado com êxito para uma view materializada atualizável quando seu destino TO já pertence a essa mesma view. Destinos pertencentes a outra view continuam sendo rejeitados. #108392 (evillique).
  • Restrito o caminho do modelo de catboostEvaluate ao diretório user_files, assim como em file() e nas fontes de dicionário. Anteriormente, a função aceitava qualquer caminho do sistema de arquivos sem verificar se ele estava contido em user_files, o que permitia verificar a existência de arquivos e acionar leituras fora de user_files. Agora, os modelos devem estar localizados em user_files. #108463 (groeneai).
  • Corrigido CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE, que deixava a nova view sem inscrição em sua tabela de origem, descartando silenciosamente todas as linhas inseridas após a substituição. #108728 (alexey-milovidov).
  • Corrigida uma falha de segmentação ao mesclar estados de agregação uniqExact com GROUPING SETS, ROLLUP ou CUBE e max_threads > 1. #108928 (Algunenano).
  • Corrigido possível erro lógico “Subfluxo inesperado … para a coluna …” durante a atualização da configuração de compatibilidade. #109496 (Avogar).
  • A função getClientHTTPHeader agora trata nomes de cabeçalhos como não sensíveis a maiúsculas e minúsculas, de acordo com a RFC 9110; em particular, o cabeçalho authorization agora é filtrado independentemente da capitalização. #109791 (Felixoid).
  • Corrigida perda silenciosa de dados com inserts assíncronos e desduplicação (async_insert=1, async_insert_deduplicate=1). Quando várias entradas de insert assíncrono com valores distintos de insert_deduplication_token eram combinadas em um único flush que gravava em partições distintas, cada token era registrado no log de desduplicação de todas as partições afetadas pelo flush, e não apenas na partição em que suas próprias linhas foram inseridas. Um insert posterior que reutilizasse um desses tokens em uma partição na qual ele nunca havia gravado era então silenciosamente desduplicado. Agora, os tokens são registrados apenas na partição em que suas linhas realmente foram inseridas. #111049 (groeneai).
  • Corrigidas inserções assíncronas no formato Native para que uma entrada em buffer que se torne incompatível após ALTER ... MODIFY COLUMN não faça mais o lote inteiro falhar. #111108 (Felixoid).
  • Corrigido o CREATE OR REPLACE de um dicionário por um objeto de outro tipo: a operação falhava com CANNOT_DETACH_DICTIONARY_AS_TABLE após a substituição já ter sido confirmada, deixando uma tabela _tmp_replace_* órfã. #111142 (evillique).
  • Corrigido um vazamento de memória de certificados de pares durante handshakes TLS com a verificação de certificados habilitada. #111425 (thevar1able).
  • Corrigido um erro lógico Block structure mismatch in IntersectOrExceptStep stream: different number of columns que podia ocorrer quando a otimização de divisão de filtro (query_plan_split_filter) era executada em uma cláusula WHERE cujo nome da coluna de filtro também era o nome de uma coluna de entrada. A otimização deixava uma coluna interna __split_filter no cabeçalho de saída do ramo, que então divergia do ramo irmão de uma operação de conjunto, como INTERSECT ou UNION. #111930 (groeneai).
  • Corrigidos resultados incorretos para filtros ou expressões ORDER BY que usam toString com valores Time, Time64 ou DateTime em fusos horários com horário de verão. Também foi restaurada a otimização de leitura em ordem para ORDER BY em um prefixo da chave de ordenação da tabela e para conversões de String em Nullable(String). #113291 (vdimir).
  • Corrigido o ATTACH de uma tabela Kafka quando kafka_num_consumers excede o limite derivado do número de núcleos de CPU. #113390 (evillique).
  • Desabilitada a análise de índice distribuída ao usar projeções para evitar resultados de consulta incorretos. #115132 (azat).
  • Corrigido um bug na função formatRowNoNewline que podia produzir resultados incorretos ou um erro lógico quando uma linha era formatada como resultado vazio. #115669 (alexey-milovidov).
  • Evitado o retorno de memória não inicializada no resultado de um literal de string binária cujo comprimento não é múltiplo de oito, bem como pelo descompressor LZ4 quando um bloco comprimido não tem corpo. #115704 (alexey-milovidov).
  • Incluídos caminhos de objetos nos hashes de desduplicação para impedir que valores de objetos distintos sejam desduplicados incorretamente. #115866 (Felixoid).
Última modificação em 26 de setembro de 2026