Alterações incompatíveis com versões anteriores
Mudanças em consultas e sintaxe
- As window functions
RANKeDENSE_RANKagora rejeitam argumentos e lançamNUMBER_OF_ARGUMENTS_DOESNT_MATCH, em conformidade com o SQL standard. Anteriormente, consultas comoRANK(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, definaallow_rank_dense_rank_arguments = 1. #104324 (groeneai).
Alterações nos tipos de dados
icebergHasheicebergBucketagora rejeitam argumentosInt128,UInt128,Int256,UInt256eDecimal256com 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 paraInt64ouDecimal128para manter o comportamento anterior para valores compatíveis. #105866 (Algunenano).toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,CASTparaUUIDeNullable(UUID),accurateCastOrNullparaUUIDe 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. AgoratoUUIDlançaCANNOT_PARSE_UUID, e as variantesOr*retornamNULL/ o zero UUID / o valor padrão fornecido. #104370 (groeneai).- Os tipos
DynamiceVariantagora são validados na cláusulaPARTITION BYde window; antes, isso não era verificado quandoallow_suspicious_types_in_group_byestá desabilitado. Consultas que particionam uma window sobre uma colunaDynamicouVariantagora lançam erro, a menos queallow_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_versionmuda decompatible_double_hashesparanew_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. Definainsert_deduplication_version = compatible_double_hashespara restaurar o comportamento anterior. A desduplicação de inserts assíncronos também é controlada pela janela síncrona emnew_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 aold_separate_hashes/compatible_double_hashes. As instâncias atualizadas diretamente de um lançamento cujo padrão eraold_separate_hashesdevem primeiro operar comcompatible_double_hashesaté que transcorra a maior janela de desduplicação relevante (incluindoreplicated_deduplication_window_for_async_inserts, cujo padrão é uma semana, caso inserts assíncronos sejam usados) antes de adotarnew_unified_hash. Workloads assíncronos que migram decompatible_double_hashesdevem primeiro aumentarreplicated_deduplication_window[_seconds]para a janela assíncrona (e operar durante uma janela assíncrona completa), interromper os inserts assíncronos ou permanecer emcompatible_double_hashes, poisnew_unified_hashnão verifica mais os IDs deasync_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 gerarBAD_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_typeseoutput_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çaUNKNOWN_TYPEpara tipos sem suporte em vez de gravá-los como binário bruto. #100949 (alexey-milovidov). - Removida a configuração obsoleta
allow_experimental_query_deduplicatione 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 comBAD_ARGUMENTS. Esta é uma alteração incompatível com versões anteriores: umREPLACE PARTITIONde 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çãoallow_replace_partition_from_empty_source = 1(por consulta ou no perfil) ou definacompatibilitycomo26.5ou inferior. Para descartar explicitamente os dados de destino, useALTER TABLE ... DROP PARTITION .... #104939 (groeneai).- Removidas as funções experimentais KQL (Kusto)
array_sort_ascearray_sort_desc, bem como seus backends SQLkql_array_sort_ascekql_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 retornamUNKNOWN_FUNCTION. #108101 (groeneai).
Novos recursos
Funções
- Adicionado suporte à função PromQL
histogram_quantilenas funções de tabelaprometheusQueryeprometheusQueryRange. Isso permite calcular quantis em buckets de histogramas clássicos do Prometheus identificados pelo rótulole. #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,formatReadableDecimalSizeeformatReadableQuantity, 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_byemax_byparaargMineargMax. #105712 (itsjoeoui).
Recursos de SQL e de consultas
formatReadableTimeDeltaagora aceita como entrada uma expressãoINTERVALde tipo diferente deMontheYear. #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_BITSeIPV6_PREFIX_BITSpara cotas definidas porIP_ADDRESSouFORWARDED_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 VALUESem consultasALTER TABLEpara 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
GeoJSONpara 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 índicesupport_phrase_searche a configuraçãoallow_experimental_text_index_phrase_searchdoMergeTree. #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 comotable.* LIKE '<pattern>'etable.* ILIKE '<pattern>'.LIKEcorresponde a nomes de colunas diferenciando maiúsculas de minúsculas, enquantoILIKEnão faz essa distinção. #104569 (niyue). - Adicionadas consultas contínuas para tabelas
MergeTreeusando uma sequência de leituras de snapshots. #105114 (Michicosun). - Adicionado o formato
RowBinaryWithNamesAndTypesAndDefaultspara aprimorar o suporte à evolução de esquema. #105736 (mzitnik). - Adicionadas funções para disponibilizar Mapbox Vector Tiles diretamente do SQL:
MVTEncodeGeomprojeta uma geometria no espaço de pixels de um tile slippy-map e a recorta;MVTEncodeagrega as geometrias projetadas de um grupo nos bytes binários de um tile de camada única; eMVTBoundingBox/MVTBoundingBoxMercatorretornam 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 PostGISST_AsMVTGeomeST_AsMVT. #106107 (saarthak2002). - Adicionados
LOCALTIMEeLOCALTIMESTAMP(sintaxe padrão SQL / PostgreSQL).LOCALTIMESTAMPé um alias denow()(retornaDateTime);LOCALTIMEretorna a hora atual como um valorTime. #106139 (thomas-cabral). - Adicionadas duas novas estratégias de
load_balancing,hostname_longest_common_prefixehostname_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 existentesnearest_hostnameehostname_levenshtein_distanceselecionam a réplica errada. #107360 (den-crane). - Novas funções
quantizeBFloat16ToInt8edequantizeInt8ToBFloat16: 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
Configurações e configuração
- Adicionada a configuração
output_format_always_write_decimal_point_in_float_and_decimalpara sempre exibir o separador decimal em números de ponto flutuante eDecimalem formatos de texto, mesmo quando o valor for inteiro. Por exemplo, exibe1.em vez de1. 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,AggregatingMergeTreeeCoalescingMergeTreeachatam recursivamente as colunasTuplee agregam cada elemento folha de forma independente durante as mesclagens, exatamente como se fosse uma coluna de nível superior — oSummingMergeTreeo soma, oAggregatingMergeTreemescla seu estado de função agregada e oCoalescingMergeTreemanté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_precisionpara 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_insertematerialize_projections_on_merge. Quandomaterialize_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. Quandomaterialize_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 comafter_processing='move'eafter_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_prefixefull_url_prefixpara corresponder a todos os caminhos com determinado prefixo, além dos elementos explícitosurl_regexp,full_url_regexpeheaders_regexp. A forma legada<url>regex:...</url>continua com suporte. #107492 (vitlibar).
Autenticação
- Adicionada uma credencial
external_idopcional para acesso ao S3 baseado em funções. #106941 (eliangidoni). - Adicionadas à tabela
system.session_loginformaçõ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 tabelasystem.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
dphypde reordenação de junções baseada em custo para junções internas, como opção da configuraçãoquery_plan_optimize_join_order_algorithm, e a configuraçãoquery_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 como0para 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 = 1eSET 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 arquivoskp_idx.packedpor 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 independenteskp_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
Bufferspara UDFs WebAssembly usandoABI BUFFERED_V1, além da adição dewebassembly_udf_enable_fuelcomo 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>comstateless_worker_portestreaming_exchange_port. Quando não definidas, são usadas as portas anteriores no nível do servidor (stateless_worker_client.portedistributed_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çãoquery_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi). - Permite que
ASOF JOINuse o algoritmo de joinparallel_hash, paralelizando a compilação entre valores distintos de chaves de igualdade. Antes, ASOF era incondicionalmente excluído deparallel_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/BloomFilterqueBuildRuntimeFilterStepinstalaria de outra forma. Controlado pela nova configuraçãoenable_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_filtershabilitado por padrão): o modelo de custo de reordenação de join agora consideraWindowTransform(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,decryptehalfMD5ao evitar buscas implícitas de provedores do OpenSSL por linha no OpenSSL 3.x. #99105 (thevar1able). - Combina blocos de origem antes de
projection.calculate()duranteMATERIALIZE PROJECTIONpara 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 BYexecutandoLIMIT BYem cada stream ordenado em paralelo duranteSort, quando as colunas deLIMIT BYsão um prefixo deORDER 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çãoquery_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 hitsem uma única conexão é aproximadamente 50% mais rápido. #104513 (Algunenano). - Melhora o desempenho de
bitmapContainspara estadosgroupBitmapdiferentes deUInt64ao evitar chamadas repetidas arb_maxdurante verificações de intervalo. #105960 (niyue). - Melhorado o desempenho de inserção em colunas
LowCardinalitycom índicesbloom_filter. #106410 (EmeraldShift). - Melhorado o desempenho das funções
L2DistanceTransposedecosineDistanceTransposedpara o tipo de dadosQBit. #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_mysqleaes_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
arrayElementemArray(LowCardinality(String))e de funções LIKE para map em maps com chaves ou valoresLowCardinality(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,ILIKEemultiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano). - Corrigida uma regressão de ~16% no throughput do codec de ponto flutuante
FPCno ARM, introduzida quando suas tabelas de predição passaram a usarVectorWithMemoryTracking. #108182 (groeneai). - Corrigida uma regressão de desempenho em que uma única exclusão leve
DELETEdesabilitava 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 emcol 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çãostatistics_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 BYpara 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. Definaenable_sharding_aggregator = 1para habilitá-la. #104233 (nihalzp). - Aceleradas as consultas
LIMIT BYem tabelasMergeTreeparticionadas ao executarLIMIT BYem 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 deLIMIT BY, de modo que nenhum grupo deLIMIT BYpode abranger duas partições. Controlado pela nova configuraçãoallow_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ósWHERE col = constfixar as colunas iniciais. Com essa otimização habilitada, oMergeTreelê os dados na ordem da chave primária, eLIMIT BYprimeiro 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 oLIMIT BYnormal sobre os dados reduzidos para obter o resultado final. Controlado pela nova configuraçãooptimize_limit_by_in_order(habilitada por padrão). #105135 (nihalzp). - Aceleradas as consultas
LIMIT BYcom 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-seLIMIT 5 BY x), e uma função injetiva de uma chave é substituída por seu argumento (por exemplo,LIMIT 5 BY toString(x)torna-seLIMIT 5 BY x). Assim, menos expressões são avaliadas por linha, e elas são mais baratas. Controlado pelas novas configuraçõesoptimize_limit_by_function_keyseoptimize_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 BYou outra operação sobre um resultado grande deWITH RECURSIVEnã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
MergeTreee os índices de descarte agora podem eliminar grânulos para filtros em queifNulloucoalesceenvolve uma condição, comoifNull(key = 0, 0)oucoalesce(key = 0, 0). Esses predicados — frequentemente gerados por geradores de consultas para transformar uma comparação possivelmenteNULLem um booleano definido — antes eram opacos à análise de índices e não podiam ignorar grânulos. Isso estende a configuração existenteallow_key_condition_coalesce_rewrite(ativada por padrão). #106272 (andyzzhao). - Melhorado o desempenho de decodificação de colunas Parquet
FLOATeDOUBLEcodificadas comBYTE_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
s3e 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 comS3Queue, permaneciam síncronas e limitadas pela latência quando o cache do sistema de arquivos estava ativado. #109478 (fm4v). - Melhorada a otimização de
PREWHEREpara subcolunasMapao considerar seu tamanho em disco. #110623 (Avogar). - A materialização tardia agora é aplicada a consultas com
FINAL, um filtro e umLIMITpequeno, mesmo semORDER BY(paraReplacingMergeTree). #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
MergeTreequando a tabela tem colunasLowCardinality. 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 comindex_granularitypequena 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
Enumem tabelas com colunasEnum. 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
BACKUPao 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_USERcomo um alias decurrentUser()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_ARGUMENTem consultas distribuídas comserialize_query_plan = 1que contêm uma lambda com um argumento constante (por exemplo,arrayMap(t -> t.2, ...)). As colunas constantes dos nósINPUTdeActionsDAGagora 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 SYNTAXagora formata operadores consistentemente como chamadas de função na saída do explain (por exemplo,plus(1, 2)em vez de1 + 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 comohas/NOT haspara=/<>ou como lambdasarrayExists/arrayAllpara outros operadores de comparação.ANYnão é aceito na forma de array porqueanytambém é uma função de agregação; useSOMEem seu lugar. A forma de subconsulta deANY/SOME/ALLcontinua sendo convertida paraIN/NOT IN. #105129 (alexey-milovidov). - Adicionado suporte às funções
multiSearchAny,multiSearchAnyUTF8emultiMatchAnyem índices de texto. Também foi aprimorada a análise de índices de texto da funçãomatch: agora, padrões com grupos alternativos podem ignorar mais grânulos. #106279 (CurtizJ). - A função
h3PolygonToCellsagora aplica o tamanho máximo do array ao conjunto de todos os polígonos de umMultiPolygon, valida os códigos de retorno da biblioteca H3 subjacente e rejeita argumentosMultiLineStringem vez de retornar silenciosamente um resultado vazio. #106399 (Algunenano). - A desserialização dos estados das funções de agregação
contingency,cramersV,cramersVBiasCorrectedetheilsUagora valida se as contagens armazenadas formam uma tabela de contingência consistente e lança uma exceçãoCORRUPTED_DATAcaso 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_msconfigurado 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
IcebergeDeltaLake, 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)eEXTRACT(TIMEZONE_MINUTE FROM dt)para obter as partes de hora e minuto de um deslocamento de fuso horário, e aEXTRACT(<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 compartilhadoplain_rewritableobserve, sob demanda, os dados gravados por outro servidor, sem aguardarrefresh_parts_intervalou 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 dadosMaterializedPostgreSQL. Por padrão (ativada), as colunasdate/timestampdo PostgreSQL são inferidas comoDate32/DateTime64; defini-la como0ao executarCREATE DATABASEfaz com que sejam inferidos os tipos mais restritosDate/DateTime. A configuração não se aplica ao motor de tabelaMaterializedPostgreSQL. #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_filterpara predicadosINem uma coluna diretamente indexada quandotransform_null_in = 1e o conjuntoINnão contém nenhum valorNULL. 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_privilegespara todas as verificações de acesso concedido, inclusive as que seguem o caminho sem exceção deisGranted(checkAccessWithFilter). Anteriormente, apenas os privilégios verificados por pontos de entrada que lançam exceção (checkAccess/checkGrantOption) eram registrados, o que fazia com queREAD ON FILE/READ ON S3/READ ON AZURE/READ ON URLnão aparecessem no log de auditoria de consultasDESCRIBE,CREATE TABLE ASe semelhantes que usam as funções de tabelafile/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_secondsdeS3QueueeAzureQueue, 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_IReEXPRESS_ONEZONE(além deSTANDARDeINTELLIGENT_TIERING) para a configuraçãos3_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 duranteCREATE/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_sizeetext_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_paddingpara renderizar o preenchimento do layout de tabela nos formatosPrettyem estilo de tabela como ESPAÇO SEM QUEBRAU+00A0quandooutput_format_pretty_grid_charsetforUTF-8. Isso ajuda a saídaPrettycopiada 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 caracteresASCIImanté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 CLUSTERe outros comandos DDL não ficam mais bloqueados quando a tabela de destino temtable_readonly = 1. A configuração agora gera um novo código de erro específico,TABLE_IS_PERMANENTLY_READ_ONLY, que oDDLWorkertrata como não repetível (diferentemente do erro transitórioTABLE_IS_READ_ONLY, que ocorre durante desconexões temporárias do ZooKeeper emReplicatedMergeTree). A configuraçãotable_readonlytambém passa a ser explicitamente rejeitada paraReplicatedMergeTree, tanto na criação quanto por meio deALTER 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 experimentalallow_experimental_reverse_key, que se tornou obsoleta. #106440 (nikitamikhaylov). - Oferece suporte a
keyed_by_normalized_query_hashpara cotas definidas na configuração estática do servidor (users.xml), em conformidade com a sintaxe DDL existenteCREATE 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áusulaFROMde uma consulta contém duas ou maisJOINs, 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 listaSELECTmantém o nome exatamente como foi escrito. Isso permite que consultas externas que fazem referência a esses nomes qualificados, comoSELECT 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*quandogroup_by_use_nullsera combinado comROLLUP,CUBEouGROUPING 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 modificadorFINALna 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, acompatibilitycom 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_codecouv2_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_storagesemsystem.query_logcom o nome do motor de armazenamento ao consultar tabelas por meio do DataLakeCatalog. #100706 (melvynator). - Adiciona as colunas
current_projection,current_projection_progress,projections_completedeprojections_remainingasystem.mergespara 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_inerelatedda tabelasystem.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_inerelatedda tabelasystem.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_inerelatedda tabelasystem.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_inerelatedda tabelasystem.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_inerelatedda tabelasystem.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
TotalUncompressedBytesOfMergeTreeTableseTotalUncompressedBytesOfMergeTreeTablesSystem, 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
ExecutableUserDefinedFunctionMemoryResidentByteseExecutableUserDefinedFunctionProcesses, que informam a memória residente (VmRSS) e o número de processos em execução das funções definidas pelo usuárioexecutableeexecutable_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 dadosMySQLePostgreSQLdesystem.tables,system.columnsesystem.completions.show_data_lake_catalogs_in_system_tablescontinua controlando apenas a visibilidade deDataLakeCatalog. #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 doNuRafte 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
RESTOREou como base de umBACKUPincremental). Os metadados.backupagora 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
AvroConfluentagora 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, HTTP5xx/408/429), com backoff exponencial, em vez de abortar o INSERT na primeira falha de rede. As novas configuraçõesformat_avro_schema_registry_max_retries(padrão5) eformat_avro_schema_registry_retry_initial_backoff_ms(padrão100) controlam essa política. Erros de validação de schema (HTTP409, 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 tabelamysql, ao mecanismo de tabelaMySQL, ao mecanismo de banco de dadosMySQL, à fonte de dicionárioSOURCE(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.typeemsystem.server_settingse por meio degetServerSetting('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
PREWHEREcom subconsultaINem 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 TABLESe a remoção da tabela antiga. Anteriormente, as atualizações podiam falhar com uma exceçãoUNKNOWN_TABLEporque mantinham o UUID da tabela antiga. #102724 (seva-potapov). - Ative
enable_join_transitive_predicatespor padrão. #103724 (davenger). - A view materializada atualizável agora oferece suporte a
REFRESH DEPENDS ONpara disparar atualizações com base nas atualizações de outra RMV, em vez de em um agendamento baseado em tempo. (REFRESH EVERY ... DEPENDS ONjá 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 PIPELINEpara compactar cadeias repetidas de processadores. #104662 (niyue). - Adicionado
REGEXP_SUBSTRcomo um alias deregexpExtractque 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 paraEXTRACT(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
QueryConditionCacheagora 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 NULLao final deALTER TABLE ... ADD/MODIFY COLUMN, espelhandoCREATE 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 < 2502sejam 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
DataLakeCatalogcomcatalog_type = 'onelake', que agora usa o endpoint Blob do OneLake (.blob.fabric.microsoft.com) por padrão. Definaonelake_use_blob_endpoint = falsepara 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_responseno handshake do MySQL, em que um byte de comprimento>= 128era interpretado como um valor de vários gigabytes por ser lido como umcharcom sinal. #107384 (uwezkhan). MaterializedPostgreSQLagora mapeia colunas PostgreSQLnumeric(p, 0)com precisão maior que 76 (por exemplo,numeric(78, 0), usado para inteiros de 256 bits) paraInt256do ClickHouse, em vez de falhar com “Precisão muito grande”. Valores que não cabem emInt256são rejeitados com uma mensagem de erro clara. #107431 (alexey-milovidov).Nullable(Tuple(...))agora está em Beta. Desabilitado por padrão; definaenable_nullable_tuple_type = 1para usá-lo. #107754 (nihalzp).- As inserções assíncronas não registram mais a lista completa de
query_ids no níveltrace/debug, o que, desde a versão 26.2, poderia fazertext_logcrescer excessivamente em serviços com tráfego intenso de inserções assíncronas. As linhas detalhadas agora são registradas no níveltest. #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_filterem uma colunaArrayagora é usado paraarrayJoin(column) IN (set),arrayJoin(column) GLOBAL IN (set)earrayJoin(column) = const, da mesma forma que já era usado parahasAny(column, set)ehas(column, const). Anteriormente, essas formas dearrayJoin ...recorriam a uma varredura completa. #109536 (groeneai). IS NOT DISTINCT FROMeIS TRUEagora usam índices de chave primária e minmax para eliminar grânulos, assim como=. Antes,k IS NOT DISTINCT FROM 42e(k = 42) IS TRUEexaminavam todos os grânulos. #110006 (groeneai).
Correção de bugs
Correções relacionadas a JOIN
- Corrigida a função
nested(usada internamente porARRAY JOIN), que removiaLowCardinalitydos tipos de coluna e fazia com queArray(LowCardinality(String))se tornasseArray(String)na saída. #98974 (Onyx2406). - Corrigida a reordenação de junções que descartava silenciosamente linhas sem correspondência de um
RIGHT/LEFT JOINquando 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_transferemax_bytes_to_transferserem silenciosamente ignorados em consultasGLOBAL INeGLOBAL JOINcom o novo analisador. As configurações agora geramSET_SIZE_LIMIT_EXCEEDED(ou interrompem a execução, dependendo detransfer_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
JOINque usamjoin_algorithm = 'direct'com uma tabelaMergeTreeno lado direito quando a otimização reordenava as colunas de pesquisa. #104174 (groeneai). - Corrigido um bug em que consultas que combinavam
arrayJoincomORDER BY ... LIMITapós umJOINpodiam retornar silenciosamente zero linhas. A otimização do plano de consulta que move a avaliação de funções para acima deSortingStepnão se aplica mais quando a expressão movida contémarrayJoin, poisarrayJoinpode alterar o número de linhas. #104558 (groeneai). - Corrigido um erro lógico em
LIMIT BYnegativo, em alguns casos, quando usado comARRAY 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 errosAMBIGUOUS_IDENTIFIER(e relacionados) quando uma consulta une uma tabela cujo nome corresponde a uma tabela interna de uma CTE/subconsulta que usaSELECT *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 paraARRAY JOIN x. #106069 (KochetovNicolai). - Corrigida uma exceção em consultas
INNER JOINcom uma tabelaMergeTreevazia no lado esquerdo quandoenable_parallel_replicas,query_plan_use_new_logical_join_stepequery_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) emJoiningTransformpara umLEFT JOINcom chaves exclusivas no lado direito, uma condiçãoONmista e ummax_joined_block_size_rowspequeno. #106928 (groeneai). - Corrige uma exceção (
LOGICAL_ERROR) no filtro de runtime de JOIN quando a chave de junção contém um tipoVariantouDynamicaninhado em umaTuple,ArrayouMap, 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 colunaDynamiccriada por um JOIN emDynamic(por exemplo, as linhas sem correspondência de umRIGHT/FULL JOINou uma subconsultaEXISTScorrelacionada 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 chaveJOIN ... USINGé passado a uma função de agregação, e o outro lado de um OUTER JOIN tem uma chaveNullable(comjoin_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 chaveUSINGcujo tipo é ampliado pelo JOIN. Também corrige uma falha do servidor (falha de segmentação) no analisador ao resolver identificadores em consultasJOIN ... USINGque contêm ramificaçõesif/multiIfpassí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 chaveJOIN USINGe essa junção está aninhada abaixo de uma junçãoPASTE/CROSS/por vírgula ou de uma junçãoONexterna, comjoin_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 emJOIN ... USINGagora 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çãoUNKNOWN_IDENTIFIERmesmo 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_JOINem uma junçãoANYcom uma tabela do mecanismoJoinquando um filtroWHEREem uma coluna do lado direito permitia que o planejador de consultas reescrevesse a junção comoSEMIouANTI. Uma tabela do mecanismoJointem 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 umJOINcom um dicionário usa uma chave de junçãoNullable,LowCardinalityouLowCardinality(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 (comodictGet/dictHasjá fazem), e uma chaveNULLnunca 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çãoJOIN ONemWHEREcomjoin_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
LowCardinalityde um tipo com mais de 8 bytes (UInt128,Int128,UInt256,Int256e suas variantesNullable). 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 ONque envolve colunas constantes do outro lado. #113484 (vdimir). - Corrigido o retorno de um valor incorreto para uma coluna virtual como
_tableou_database, selecionada do lado direito de umJOINatendido porDirectKeyValueJoin(um armazenamento de chave-valor, comoEmbeddedRocksDB,KeeperMap,Redisou um dicionário). A consulta retornava o conteúdo de uma coluna de dados ou falhava comLOGICAL_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
FORMATera consumida porINSERT, em vez de ser aplicada à saída deEXPLAINemEXPLAIN 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_threadsno 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 servidorconcurrent_threads_lazy_allocation(padrãotrue) funciona como um mecanismo de rollback. #102928 (seva-potapov). - Corrige um bug em que
ALTER TABLE ... MODIFY SETTINGem uma tabelaEmbeddedRocksDBpodia 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 aCANNOT_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
INSERTem streaming cominput_format_max_block_wait_mspara a interfaceHTTPe paraINSERT 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çãoELSEem vez da ramificaçãoTHENcorrespondente quando tanto a expressão quanto um valorWHENeramNULL. #105556 (Algunenano). - Corrige o suporte ao uso de UDFs SQL
WASMem definições deMATERIALIZED VIEW. #106161 (niyue). - Corrige
INTERPOLATE ()gerandoINVALID_WITH_FILL_EXPRESSIONquando colunas de ORDER BY recebem aliases na lista SELECT com o analisador antigo. #106252 (yakov-olkhovskiy). - As funções
base58Encode,base58DecodeetryBase58Decodeagora respeitammax_execution_timee 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çãofunction_base58_max_input_size(0o desativa). #106428 (alexey-milovidov). - Corrige um bug de resultados incorretos em que
WHERE c0 = constnão retornava linhas para tabelas comORDER BY f(c0)quandof(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 cem tabelas com a_minmax_count_projectionimplí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
FORMATtambém se aplica à saída deEXPLAINemEXPLAIN ... INSERT ... SELECT ... FORMAT ...quandoSETTINGSprecedeFORMATou 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,extractAllecountMatchespara 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 - 4e umresize/ignoreexcessivamente 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 functionsinformaMaybe you meant system.functions?. Anteriormente, o novo analisador retornava o erroUnknown table expression identifiersem 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_TASKdurante o desligamento ouMEMORY_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
ALIAScom 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 formattingem uma função de janela sem argumentos dentro de uma declaraçãoCODECou 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). getClientHTTPHeaderagora é 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çãouse_query_condition_cache = 1, que também é o padrão). #108488 (groeneai). - Corrige
NOT_FOUND_COLUMN_IN_BLOCKquando um predicado composto recebe um alias emGROUP BYe é referenciado novamente, comenable_identifier_resolve_cachehabilitado (o padrão). A otimizaçãooptimize_and_compare_chainnão era idempotente, e um nó resolvido compartilhado acumulava uma conjunção transitiva duplicada. #108553 (groeneai). - Corrige o erro
NUMBER_OF_COLUMNS_DOESNT_MATCHquando uma subconsulta em uma tabelaDistributedlê duas ou mais colunasALIASque 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_IDENTIFIERemALTER TABLE ... DROP COLUMNquando outra coluna tem uma expressãoDEFAULTouMATERIALIZEDque define e referencia um alias inline. #109374 (alexey-milovidov). - Corrige o fato de
system.tablesignorar silenciosamente bancos de dados para usuários com permissões por banco de dados quando a consulta lê apenas as colunasname/database. Introduzido na versão 26.2. #109723 (samay-sharma). - Corrige o erro
UNKNOWN_IDENTIFIERpara 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_BLOCKquando uma consultaFINALfiltra por uma coluna da chave de ordenação que não está na listaSELECTe o filtro é movido paraPREWHERE(por exemplo,SELECT s FROM t FINAL WHERE k GROUP BY scomoptimize_move_to_prewhere_if_final = 1). #111721 (groeneai). - Corrige a falha na inicialização do servidor e em
ATTACHcomWITH RECURSIVE is not supported with the old analyzerpara uma visualização com uma CTE recursiva quandoenable_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_rowsewritten_bytesemsystem.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 threadHTTPHandlerque 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_ALIASem 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
MergeTreequando a configuraçãodefault_compression_codecno 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_ALIASlançados por réplicas remotas ao executar consultas que referenciam aliases de projeção emPREWHERE/WHERE/HAVING/QUALIFY(por exemplo,SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) ouSELECT *em autojoins com nomes de colunas sobrepostos, usando réplicas paralelas eparallel_replicas_local_plan = 0. #103806 (groeneai). - Corrigida uma patch part corrompida após
ALTER TABLE ... DROP PARTITION ID 'patch-...', seguido deDETACH/ATTACH TABLE. Anteriormente, a parte de cobertura vazia era gravada sempartition.datesource_parts.dat, resultando em uma entradabroken-on-start_patch-...emsystem.detached_partsapó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 COLUMNera executado simultaneamente comOPTIMIZE TABLE ... FINALou outro merge em segundo plano. #104822 (groeneai). - Corrigidas duas situações que geravam
LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materializedem consultas comenable_materialized_cte: (1) uma CTE materializada reutilizada e filtrada porIN (subquery)em outra CTE materializada e (2) uma CTE materializada referenciada diretamente e também em um filtroWHERE ... IN (...)que acessa uma chave primária MergeTree por meio de uma subconsulta IN aninhada. OEXPLAINdas 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 quandoFileCachenã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 outputgerada porALTER TABLE <memory_table> APPLY PATCHESeALTER TABLE <memory_table> APPLY DELETED MASK. As tabelasMemorynã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_TYPEparaMergesobreMergesobreDistributedcomdistributed_group_by_no_merge=1#105330 (azat). - Corrigido o retorno de um valor concreto por
singleValueOrNullMerge, em vez deNULL, 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 COLUMNpara colunascolumns_to_sumexplicitamente definidas deSummingMergeTreeeCoalescingMergeTree. #105785 (antonio2368). - Corrige erros
UNKNOWN_DATABASEao 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
Mergeao usar o analisador. #105867 (KochetovNicolai). - Corrige mutações
UPDATEeDELETEem 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_shardsnão era aplicado (e force_optimize_skip_unused_shards falhava incorretamente) quando uma tabelaDistributedera consultada por meio de uma tabelaMergeou da função de tabelamerge, com o predicado aplicado acima dela. #106250 (KochetovNicolai). - Corrige um erro lógico
Column identifier ... is already registeredquando um predicado de mutação (DELETE/UPDATE) contém uma subconsultaIN/EXISTSque 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 ... DESCao ler partes largas em ordem inversa comread_in_order_use_virtual_row_per_block = 1e ummax_block_sizepequeno. #106429 (vdimir). - Corrige uma exceção
Bad cast exceptionem dicionários Redis que usamSTORAGE_TYPE 'simple'com layoutcache/directe uma única chave de string (complexa); esses dicionários agora funcionam, e chaves compostas no armazenamentosimplegeram um erro claro. #106501 (vdimir). - Corrige a exceção
Mutation of Memory table produced incomplete outputgerada por comandosALTER TABLE <memory_table>que não têm efeito nos dados por linha em um mecanismoMemory, incluindoAPPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTIONeREWRITE PARTS. As tabelasMemorynã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 tabelaMergeTreetem 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 tabelaReplicatedMergeTreequando o bloco inserido era totalmente desduplicado e o nó de desduplicação da parte conflitante já tinha sido removido (por exemplo, por umDROP PARTITIONconcorrente). #107026 (groeneai). - Corrige o raro
LOGICAL_ERROR“Attempt to release query context that does not exist” e a falha do servidor associada ao ler tabelasMergeTreepor meio de um disco de cache do sistema de arquivos criado comenable_filesystem_query_cache_limit = 1. #107028 (groeneai). - Corrige uma falha do servidor ao mover uma parte vazia para um disco
plain_rewritable(por exemplo, comALTER TABLE ... MOVE PARTITION ... TO DISKem uma parte vazia preservada porremove_empty_parts = 0). #107040 (groeneai). - Corrige uma exceção
Logical error: Too large size passed to allocatorem umINSERTem uma tabelaMergeTreequandoadaptive_write_buffer_initial_sizeestá 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 CLUSTERque combinamMODIFY SETTING/RESET SETTINGcom 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 umMODIFY COLUMN ... COMMENTSETTINGSposicional 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 causarINCOMPATIBLE_COLUMNSao reiniciar a réplica. #107142 (groeneai). - Corrige o erro
Argument ... of GROUPING function is not a part of GROUP BY clauseem consultas que usam a funçãogroupingcom a configuraçãogroup_by_use_nullshabilitada. #107206 (KochetovNicolai). - Corrige consultas
UPDATEleves com réplicas paralelas legadas habilitadas em tabelasMergeTreenã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
MergeTreesimples (não replicado) quandoREPLACE PARTITION,MOVE PARTITION,DETACH PARTITIONouDETACH PARTé executado em uma partição que ainda tem patches deUPDATEleves não aplicados. Essas operações agora rejeitam o comando (comoReplicatedMergeTreejá faz), indicandoALTER TABLE ... APPLY PATCHES, em vez de reverter silenciosamente a atualização confirmada. #107386 (groeneai). - Corrige o problema em que
MaterializedPostgreSQLinterrompia silenciosamente a replicação de alterações quando o nome do banco de dados ou da tabela PostgreSQL continha letras maiúsculas (o consumidorpgoutputsolicitava 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_COLUMNquandooptimize_if_transform_strings_to_enum = 1e a expressão otimizadaif/transformsobre literais de string é uma chave deGROUP BYouORDER BYem uma tabela Distributed ou em réplicas paralelas. #107455 (groeneai). - Corrigido o problema em que
SELECT ... FINALeOPTIMIZE TABLE ... FINALretornavam linhas duplicadas apósCREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROMouMOVE PARTITION ... TO TABLEadotarem partes de umaMergeTreesimples em umaReplacingMergeTree,SummingMergeTreeouAggregatingMergeTree. 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,JSONMergePatche no analisador JSON do rapidjson) agora é contabilizada pelo rastreador de memória, para que entradas patológicas sejam rejeitadas comMEMORY_LIMIT_EXCEEDED, em vez de alocarem memória sem limite. #107555 (Algunenano). - Corrige um
Logical error: Stream ... variant_discr ... is not foundque podia ocorrer ao mesclar ou ler uma parte de umaMergeTreeproduzida por uma mutação de uma tabela com uma colunaDynamic. #107562 (alexey-milovidov). - Corrige um
LOGICAL_ERROR(updateFormatPrewhereInfo called more than once) gerado ao consultar uma fontefile(),url()ou de armazenamento de objetos comPREWHEREeWHEREexplícitos quandooptimize_prewhere_after_pushdownestava habilitado. #107568 (groeneai). - Corrigida uma exceção do servidor (erro lógico
Digest does not match) que podia ocorrer emRENAME TABLE,RENAME DATABASEouCREATE OR REPLACE TABLEenvolvendo uma tabelaTimeSeriesem um banco de dadosReplicated. Agora há suporte para renomear tabelasTimeSeries. #107583 (groeneai). - Corrige
DROP TABLEde uma tabelaTimeSeriesem um banco de dadosReplicated, 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 ... SYNCficava 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 PARTITIONem uma tabelaMergeTreesimples, 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 … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) ao inserir em uma visão materializada cuja tabela de destinoTOdeclara uma coluna com umEnummais amplo do que o produzido peloSELECTda visão. A ampliação válida deEnumagora é aplicada no caminho de inserção da visão materializada, como em umINSERT ... SELECTdireto. #107648 (groeneai). - Corrige o erro
NUMBER_OF_COLUMNS_DOESNT_MATCHao consultar uma tabelaDistributed(ou ao usar réplicas paralelas) que tenha várias colunasALIASexpandidas para a mesma expressão e referenciá-las comORDER 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_bytesagora é respeitado para colunas de estadoAggregateFunction. Anteriormente, o limite de bytes por grânulo era ignorado para essas colunas (por exemplo, estadosuniqExactem tabelasAggregatingMergeTreee 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 comTOO_FEW_LIVE_REPLICAS, em vez de gravar uma parte local e, posteriormente, expirar comUNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey). - Corrigida uma falha do servidor em inserções assíncronas com desduplicação quando
optimize_on_inserttorna vazio o bloco inserido (por exemplo, linhas cuja soma é zero emSummingMergeTree). #109229 (Diskein). - Corrige a perda de dados de uma coluna sem expressão padrão quando uma mesclagem é executada simultaneamente com
ALTER TABLE ... RENAME COLUMNou quando os únicos valores da coluna vêm de umUPDATEleve. 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
uniqExactem paralelo comGROUPING SETS,ROLLUPouCUBE. #109389 (groeneai). - Corrigido o reagendamento indefinido de mesclagens de rollup. #109410 (Michicosun).
- Corrigidas mutações
GROUP BYem tabelas com colunas virtuais materializadas ou persistentes. #109532 (Michicosun). - Corrigido o erro
UNKNOWN_IDENTIFIER: Missing columns: '_block_offset'ao executarALTER TABLE ... MATERIALIZE INDEXno índice minmax implícito criado poradd_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_columnem 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 derefresh_parts_intervale detable_disk = trueser 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 positionao ler uma parteCompactde um discoencryptedcom E/S direta, que fazia as mesclagens ficarem bloqueadas emsystem.replication_queue. #112943 (alexey-milovidov). - Corrige a leitura do banco de dados interno
_temporary_and_external_tablespor meio da função de tabelamergee do mecanismo de tabelaMerge, 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 deMergereescrevia 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_TYPEao ler uma tabelaMergecontendo uma tabelaDistributedcom réplicas paralelas com chave personalizada. #113742 (alexey-milovidov). - Corrige
Logical error: No set is registered for key ...ao ler por meio de uma tabelaMergecujos filhos declaram uma colunaALIAScontendoIN, 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 JOINao usar tipos numéricosLowCardinality. #91784 (Ergus). - Corrigida a criação silenciosa de colunas
NOT NULLcomoNullablequandodata_type_default_nullable = 1e a tabela é criada em um banco de dadosReplicatedou viaON CLUSTER. #97572 (xiaohuanlin). - Corrigido o número incorreto de linhas retornado por uma consulta a uma
MaterializedViewcomquery_plan_enable_optimizations = 0quando a view mapeia uma colunaintegerpara uma colunaBool. #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
NULLao ler subcolunas extraídas de colunasNullable(Tuple(...)). Por exemplo, paratup Nullable(Tuple(s Nullable(String))),SELECT tup.sagora retorna corretamenteNULLnas linhas em que a tupla externa éNULL, em vez de valores inválidos. Isso abrange todos os tipos de elemento que podem representarNULL:Nullable,Dynamic,VarianteLowCardinality(Nullable(...)). #102942 (nihalzp). - Corrigida a remoção, por
recursiveRemoveLowCardinality, de nomes personalizados de tipos de geometria (por exemplo,LineStringvs.Ring,MultiLineStringvs.Polygon), que causava a interpretação incorreta do tipo de geometria. #103041 (jh0x). - Corrigida a sobrescrita silenciosa, por
dictGetOrNull, de outras colunas na projeçãoSELECTcomNULLquando chamada com uma coluna-chaveNullablecujos 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
INvazia na chave de sharding quandooptimize_skip_unused_shards_rewrite_inestá ativado. #104966 (alexey-milovidov). - Corrigida a estimativa de seletividade de
PREWHEREdas estatísticas count-min para colunasFloat32, incluindo comparações com literaisFloat64. #105047 (hanfei1991). - Corrigido
ILLEGAL_TYPE_OF_ARGUMENTao mesclar os estados agregados dequantileExactWeightedInterpolated,quantileDDouquantilePrometheusHistogramcom suas contrapartes pluraisquantilesXxxMerge(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,toStartOfQuarteretoStartOfYearpara argumentosDate32eDateTime64cujo resultado fica fora do intervalo deDate: em vez de sofrerem overflow para datas arbitrárias, os resultados anteriores a1970-01-01agora são limitados a1970-01-01, e os posteriores a2149-06-06são limitados a2149-06-06. Isso também corrige resultados de consulta incorretos (partes e grânulos removidos incorretamente) quando essas funções eram usadas emWHEREsobre uma chaveDate32ouDateTime64contendo valores fora do intervalo. #105244 (yariks5s). - Corrige um erro lógico em
arrayRemovequando o primeiro argumento é um array deVariantcujas alternativas são todas incompatíveis com o tipo do segundo argumento evariant_throw_on_type_mismatchestá desabilitado. Agora, a função trata a comparação como “nunca igual” e retorna o array inalterado, em vez de acionar uma falha deassertTypeEqualityno servidor. #105248 (groeneai). - Corrige o fato de
toFloat64/toUInt32/toString/etc. emDynamicignoraremcast_keep_nullable. #105467 (Avogar). - Corrige um segfault do servidor em
uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(e cadeias de combinadores semelhantes sobreuniq) quando usados comGROUP BY ... WITH ROLLUP,WITH CUBEouWITH TOTALSe um argumento Nullable. #105470 (groeneai). - Corrige
toStartOfMillisecondetoStartOfMicrosecond, que retornavam resultados com uma diferença de quase um segundo para valoresDateTime64negativos (anteriores à época), e o overflow de inteiros com sinal detectado peloUndefinedBehaviorSanitizeremtoStartOfSecond,toStartOfMillisecondetoStartOfMicrosecondpara entradasDateTime64próximas deINT64_MIN. #105482 (groeneai). - Corrige o encerramento do servidor ao desserializar estados
singleValueOrNullparaJSON. #105535 (Avogar). - Corrige a ignorância de
input_format_try_infer_datetimesdurante a inserção em dados compartilhados em JSON. #105544 (Avogar). - Corrige o overflow circular de
DateTimepara valores fora do intervalo emJSONExtracte 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
toStringdeDateTimecomTimezonecontendo valor NULL. #105587 (yariks5s). - Adiciona validação para colunas
Dynamicachatadas malformadas na entrada Native. #105666 (Avogar). - Corrige um
LOGICAL_ERROR(Unexpected return type from if) gerado durante o planejamento da consulta para expressõesifcujo tipo de resultado éVariante cujo segundo ou terceiro ramo é umifde condição constante sobre um literalUInt64que cabe emInt64. #105680 (groeneai). - Corrige
Bad get: has Decimal32, requested Decimal128emsumMapesumMapWithOverflowsobre uma colunaNested(... Nullable(Decimal(P, S)))quando o estado de agregação é serializado (por exemplo, réplicas paralelas,sumMapStatepor 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::ColumnLowCardinalityquandoapply_mutations_on_fly = 1é usado em uma tabela com mutaçõesUPDATE/DELETEon-fly pendentes, enfileiradas antes de uma mutaçãoALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano). - Corrige o erro
Cannot find columnem consultas distribuídas com filtroIN Array(...)no novo analisador. #105894 (KochetovNicolai). - Corrige uma interrupção do servidor quando uma coluna com
STATISTICSera modificada paraNullableenquanto outroALTERa removia simultaneamente. #105917 (groeneai). - Rejeita bytes
IntervalKindfora do intervalo durante a decodificação de tipos deRowBinaryWithNamesAndTypes(input_format_binary_decode_types_in_binary_format = 1), com um erroINCORRECT_DATAclaro, em vez de construir umDataTypeIntervalcom 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,sipHash128KeyedesipHash128ReferenceKeyedao 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
INquando o segundo argumento é uma tupla não constante. #106610 (yariks5s). - Corrige o fato de
session_timezoneser ignorado ao serializar colunasLowCardinality(DateTime)em formatos de texto (CSV, TSV, JSONEachRow etc.). Anteriormente, após a primeira gravação de uma colunaLowCardinality(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 desession_timezone. #106634 (groeneai). - Corrige uma interrupção do servidor em
ifemultiIfquando a condição é um valor constanteNullable(Nothing). #106678 (groeneai). - Reverte uma alteração que fazia
sumMap/ o combinador-Maprejeitar tipos numéricos de valor com nomes personalizados (comoSimpleAggregateFunction(sum, T)eBool) comILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, interrompendo agregações que antes funcionavam. #106729 (fm4v). - Corrige uma exceção
Bad castao eliminar partes com base em estatísticasMinMaxquando uma coluna-chave éLowCardinalitye a constante do predicado éLowCardinality(Nullable(...)). #106793 (groeneai). - Corrige um erro lógico em
parseDateTimecom bytes não ASCII na entrada. #106856 (Avogar). - Corrige a exceção
THERE_IS_NO_COLUMNem consultas distribuídas que envolvem a otimizaçãooptimize_rewrite_aggregate_function_with_ifquando 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
arrayLevenshteinDistanceWeightedearraySimilarityquando 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 colunaVariantcom uma varianteMapcuja ordem de armazenamento local difere da ordem global. #107011 (groeneai). - Corrige o erro
TYPE_MISMATCH(“Cannot convert string … to type …”) em consultasORDER BY <numeric column> ... LIMIT nquando 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 acomposto 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 umSELECTposterior falhasse comConversion 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
roundDownquando o array de fronteiras contémNaN. O mesmo valor de entrada podia retornar uma fronteira finita ouNaN, dependendo das linhas adjacentes em um lote. As fronteirasNaNagora são ignoradas; portanto, o resultado depende apenas das fronteiras finitas. #107065 (groeneai). - Corrige o lançamento de
DECIMAL_OVERFLOWporquantileTDigestequantileTDigestWeightedpara argumentosDateeDateTimequando 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 emquantilesTDigestWeighted; 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 geraARGUMENT_OUT_OF_BOUNDem vez de criar silenciosamenteEnum8('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 consultasORDER BY ... LIMITcom múltiplas colunas que ordenam por colunasNullablequando várias linhas empatam nas colunas iniciais. #107094 (groeneai). - Corrige
Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple'ao ler uma colunaArray(Tuple(...))cujo valor foi preenchido com valores padrão, por exemplo, apósALTER TABLE ... ADD COLUMNou após uma mutaçãoALTER TABLE ... CLEAR COLUMNincompleta aplicada on the fly. #107232 (groeneai). - Rejeita usos sem suporte de colunas
AggregateFunctionem expressões TTL durante oCREATE TABLE(por exemplo,TTL toDateTime(state)), em vez de falhar posteriormente, durante a execução do TTL, comILLEGAL_TYPE_OF_ARGUMENT. Isso também abrange estados contidos em alternativas deVariante valoresDynamic. Consumidores válidos que reconhecem estados, comofinalizeAggregation, continuam sendo aceitos. #107366 (Ria-K912). - Corrige
arrayResizecom um argumento de tamanhoDecimal: 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) quandoapply_mutations_on_fly = 1é usado em uma tabela com umUPDATEon the fly pendente, cuja coluna de destino também é lida como entrada de uma função por umUPDATEon the fly anterior, antes de uma mutaçãoALTER 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 commake_distributed_plan = 1realiza 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.keycom uma chave à direita do tipoUInt64). #107701 (groeneai). - Corrige a desduplicação de inserções que calculava hashes incorretos para colunas
StringeArraycom a configuração do servidorinsert_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
hasao pesquisar umMapcom chavesDynamicusando um argumentoLowCardinality. #107956 (groeneai). - Corrige uma regressão de desempenho em subcolunas
Mapusadas comPREWHERE. #107988 (Avogar). - Corrige um erro lógico ao converter uma coluna
DynamicouVariantaninhada em umaTuplepara um tipo de elemento nãoNullablecomaccurateCastOrNullouaccurateCastOrDefault. #108061 (alexey-milovidov). - Corrige uma exceção de erro lógico
Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>quando uma consultaLIKElê de um índicetextpelo 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 comapply_mutations_on_fly = 1após umALTER UPDATE col = ... WHERE <cond>com condição não constante ou falsa, seguido deALTER MODIFY COLUMN col <new type>. #108128 (groeneai). - Corrige
signed integer overflow(comportamento indefinido) emdateDiffcom as unidadeshoureminutepara valores extremos deDateTime64próximos aos limites do intervalo deInt64. #108229 (groeneai). - Corrige uma exceção do servidor (
Logical erroremIColumn::insertFrom) ao converter umArray(Dynamic)ouArray(Variant)paraQBitcomaccurateCastOrNull, por exemplo,accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai). - Corrige
parseDateTimeBestEffortcom 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
[[[ ... ]]]ouarray(array( ... )), quandomax_parser_depthestá 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 valorDEFAULT(por exemplo,-1) ao ler uma coluna adicionada comALTER TABLE ... ADD COLUMN ... DEFAULTapó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)(ouLowCardinality(Nullable(FixedString))) é encapsulada em uma função na chave, por exemplo,PARTITION BY sipHash64(k) % NcomWHERE 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,Avroe os leitores legadosORCeParquet, que retornavamNullable(Tuple)para colunas struct anuláveis, embora o tipoNullable(Tuple)não seja permitido (allow_experimental_nullable_tuple_typeestá desabilitado).DESCRIBEretornava um tipo queCREATE TABLErejeita; por isso, a criação de tabelas ou a inserção de dados usando o esquema inferido falhava com o erroNullable Tuple type is not allowed. #109185 (nihalzp). - Corrige um bug em que valores
DEFAULTde colunas não eram aplicados aINSERT INTO TABLE FUNCTION(por exemplo,remote(...)oufile(...)) com dadosVALUESembutidos quando o próprio servidor analisa esses dados (send_table_structure_on_insert_with_inline_data = 0). UmNULLexplícito inserido em uma coluna nãoNullablecomDEFAULTtornava-se0em vez do padrão declarado. Agora, o comportamento é igual ao de umINSERTsimples 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
largestTriangleThreeBucketsao rejeitar estados corrompidos da função de agregação durante a desserialização. #109492 (mstetsyuk). - Corrige a leitura de uma coluna Parquet com um
Tuplenão anulável quando o tipo ClickHouse solicitado o envolve emNullable(por exemplo,Nullable(Tuple(...))), que antes falhava comTYPE_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 geravaTYPE_MISMATCH. #109898 (groeneai). - Corrige uma falha do servidor (estouro da pilha nativa) ao copiar ou destruir um literal
Array/Tuple/Map/Objectprofundamente aninhado, por exemplo, em uma consulta com um literal muito profundamente aninhado emax_parser_depthelevado. #110393 (Algunenano). - Corrige resultados incorretos de
IS NULL/IS NOT NULL/count()comoptimize_functions_to_subcolumnsem uma coluna convertida emNullablepor umALTER MODIFY COLUMN Tsomente de metadados paraNullable(T). Em partes gravadas antes da conversão, a subcoluna.nullera 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-chaveLowCardinalityé envolvida em uma cadeia aninhada deCASTque reintroduzLowCardinality, 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
ArroweArrowStreamcom colunasArrayouMapaninhadas vazias produzidas pelo Apache Arrow Java anterior à versão 19.0.0 (incluída no Apache Spark), que antes eram rejeitadas com um erroINCORRECT_DATAinformando 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 erroIllegal types of argumentsem operações de conjunto sobre colunas compatíveis de estado de agregação (por exemplo,quantileStateequantilesState(0.9)) aninhadas em colunas contêiner, comoTuple,Array,Map,NullableouVariant. #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
INSERTpassa 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
DECIMALdoParquetcujo tipo físico é mais largo que o tipo correspondente à precisão declarada, por exemplo,DECIMAL(9, 2)armazenado fisicamente comoINT64. Esses arquivos sãoParquetvá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 geraDECIMAL_OVERFLOWquando 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 TABLEe na adição de uma réplicaReplicatedMergeTree, que exibiamTables have different ...,METADATA_MISMATCHouINCOMPATIBLE_COLUMNSem tabelas cujas definições foram escritas com parênteses redundantes, comoPARTITION 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)ouDEFAULT (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 comhttp_response_headersouadditional_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,mapContainsValuee o subscrito deMap, que retornavam “não encontrado” para uma buscaLowCardinalityconstante igual ao valor padrão do tipo de elemento, como umaStringvazia ou o número zero. #114624 (groeneai). - Corrigidos resultados incorretos da otimização trivial
GROUP BY ... LIMIT(configuraçãooptimize_trivial_group_by_limit_query) para consultas comDISTINCT,QUALIFY, funções de janela ouarrayJoinna projeção: esses elementos consomem ou filtram os grupos após a agregação, portanto, limitar a agregação aLIMIT + OFFSETchaves 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ãooptimize_trivial_count_query = 1. A contagem de linhas armazenada era retornada em vez do número de elementos do array, e, emfile()eurl(), a consulta retornava0. #115227 (groeneai). - Corrigidos
uniq,uniqExact,uniqHLL12euniqTheta, que retornavam um resultado incorreto para um argumento envolto em uma função injetiva que oculta a nulabilidade, comouniqExact(tuple(x))em uma colunaNullable. A otimizaçãooptimize_injective_functions_inside_uniqremovia 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/ifNullaninhadas (por exemplo,WHERE coalesce(a, b, coalesce(c, d), e) = const) em uma tabelaMergeTreecom vários índices de saltominmaxeuse_skip_indexes_for_disjunctions = 1. A reescrita de índice de salto de<op>(coalesce(...), const)agora é aplicada recursivamente aos argumentos internos decoalesce, para que a RPN deKeyConditionde 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_BLOCKgerado porALTER TABLE ... MATERIALIZE INDEXem partes criadas na versão 25.8 que contêm um índice de salto em uma coluna adicionada por meio de umALTER TABLE ... ADD COLUMNseparado. 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
SELECTquandouse_query_condition_cache = 1(padrão). Uma consulta no formatoPREWHERE pk_prefix = X WHERE non_pk IN (...)em uma coluna com um índice de salto de filtro Bloom corrompia oQueryConditionCachepara o predicadopk_prefix = X, fazendo com que umSELECT count() ... WHERE pk_prefix = Xsubsequente 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
minmaxeuse_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
ReplacingMergeTreecomFINALe um filtro em um índice de texto enquantoquery_plan_optimize_lazy_finalestava habilitada. A otimizaçãoFINALlazy 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 constanteVariantcontendo um membroLowCardinalityé comparada a uma coluna-chave cuja expressão de chave é uma função determinística não monotônica (por exemplo, um índice de saltominmaxemsipHash64(col)). #107111 (groeneai). - Corrige resultados incorretos (frequentemente vazios) de
ORDER BY <col> LIMIT nquando a otimizaçãouse_skip_indexes_for_top_kestá ativa e uma parte com um índice de saltominmaxna coluna de ordenação teve linhas removidas por umDELETEleve. A otimização não classifica mais o minmax desatualizado de partes com linhas excluídas porDELETEleve à 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_readagora pode ser revertida ao padrão anterior à versão 26.1 (false) por meio da configuraçãocompatibility, 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 saltominmax/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)oumapKeys(map)não era usado silenciosamente quando uma tabela era consultada por meio de uma tabela com engineDistributedusando o analyzer. O índice era usado na tabela local e viacluster()/remote(), mas uma consulta por meio de uma tabela com engineDistributedo ignorava (e falhava comINDEX_NOT_USEDcomforce_data_skipping_indices). #109188 (groeneai). - Corrigida uma falha do servidor em
CREATE HYPOTHETICAL INDEX ... TYPE set(engrambf_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,mapContainsKeyemapContainsValuecom uma substring de busca vazia quando há um índice de texto presente. #110246 (rschu1ze). - Corrigido o erro
ATTEMPT_TO_READ_AFTER_EOFao 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
WHEREcontém uma constante de string grande com muitos pontos e a tabela possui um índice de saltobloom_filter,tokenbf_v1,ngrambf_v1outext. A correspondência entre o nome de uma coluna de filtro e colunas de índiceJSONAllPaths(...)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 ... LIMITretornava 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 saltominmax. 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_ERRORao ler tabelas de lago de dadosIcebergouDeltaLakepor caminhos que podem chegar ao pipeline de leitura sem umdatalake_table_statefixado, como atualizações simultâneas de metadados doIcebergou leituras demergeem tabelasDeltaLake. #102033 (groeneai). - Corrige o erro esporádico
Logical error: 'Database <name> not found'gerado porDataLakeConfiguration::getCatalogquando uma tabela com engineIcebergé 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_tableshabilitado. 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_bytesinflado (e os bytes/s derivados exibidos emsystem.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 porN / 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 = 1depois que outro gravador (como a função de tabelaicebergLocal/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 (0paraint) quando lido novamente pelo Spark ou outros leitores Iceberg. #105862 (groeneai). - Corrige exclusões posicionais merge-on-read do
Icebergv2 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 cicloDETACH+ATTACHou uma reinicialização do servidor, fazendo com que todos osINSERTsubsequentes falhassem comLocal 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
Icebergcontendo tabelas eram incorretamente reportados como vazios. #106301 (LefterisXefteris). - Corrigida uma exceção
NOT_FOUND_COLUMN_IN_BLOCKao consultar uma tabela Iceberg ou S3 com umWHEREcomposto contendoIS NOT NULLem uma coluna que não está na listaSELECT, usando o leitor nativo Parquet V3. #106443 (tiandiwonder). - Corrigido o relatório de progresso inflado ao ler tabelas Iceberg com filtros
_fileou_path. Antes, o progresso detotal_bytes_to_readincluí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 tabelaIcebergcujos 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 janelaiceberg_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_ERRORem 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 umschema-idexistente a um esquema diferente entre versões de metadados. Esses metadados agora são rejeitados comICEBERG_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 maisICEBERG_SPECIFICATION_VIOLATIONpara 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 directoryao listar um diretório de armazenamento de objetos em disco local (por exemplo, uma tabela Iceberg em um discolocal) 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_VIOLATIONao 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 edecimal(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 oORDER BYde armazenamento sintetizado era construído a partir do nome bruto da coluna e não era analisado, resultando emSYNTAX_ERROR. #110233 (groeneai). - Corrige a leitura de tabelas Paimon que contêm uma coluna
ARRAYouMAPanulável. Essas tabelas não podiam ser lidas porque o mapeador de esquema envolvia o tipo composto emNullable, o que o ClickHouse não permite; assim, tantoDESCquantoSELECTfalhavam comNested type Array(Nullable(Int32)) cannot be inside Nullable type. Uma coluna composta anulável agora é mapeada para um tipo composto nãoNullable, e um valorNULLé 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,s3ou 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 umSELECTcom a flagrecursive_withdefinida, mas sem uma expressãoWITH. #105433 (groeneai). - Corrigido o pushdown de filtro para
ParqueteORCem predicadosIN (subquery), permitindo a eliminação de grupos de linhas, páginas e filtros Bloom em leituras defile,url,s3e armazenamento de objetos. #105863 (arsenmuk). - Corrigida a exceção
LOGICAL_ERRORdurante 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
s3ignorava silenciosamente umapartition_strategyposicional 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çãohive) aceitava silenciosamente{_partition_id}em caminhos de tabela deS3e armazenamento de objetos, em vez de gerarBAD_ARGUMENTS. #107437 (LefterisXefteris). - Corrigido o problema em que
s3e outras funções de tabela de armazenamento de objetos geravamLOGICAL_ERRORem vez deBAD_ARGUMENTSquando 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 tabelas3/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 Requiredde serviços Azure: o transporte HTTP do Azure baseado em Poco agora defineContent-Lengthcom 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/AzureQueuecomenable_hash_ring_filtering = 1quando 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 deEXPLAIN. Todas as formas de localizadorS3agora mascaramsession_token, secrets do Google ADC, valores deextra_credentials/headersem 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 tabelas3/s3Clustercom 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 dadosS3,BACKUP ... TO S3e o motor de banco de dadosBackup. Além disso, argumentos secretos deencrypt/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 TREEeEXPLAIN actions. #109768 (Algunenano). - Corrige o modo ordenado de
S3Queue/AzureQueuecom 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 perfilObjectStorageQueueBucketLockLostOwnership), 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 TABLEao enviarCREATE TABLE ... TO INNER UUID '...'sem uma cláusulaENGINEpor HTTP ou pelo protocolo nativo. O mesmo bug também causava o crash do cliente. O analisador agora informa corretamente o erroBAD_ARGUMENTS, em vez de desreferenciar um ponteiro nulo. #105579 (groeneai). - Corrigido um crash do servidor ao consultar tabelas DeltaLake com
allow_experimental_delta_kernel_rsativado e uma credencial ou opção contendo bytes inválidos (a FFI do Rust entrava em pânico ao atravessar o limiteextern "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égioSELECTviafile(),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_privilegesemissing_privilegesdesystem.query_logpodiam 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
decodeHTMLComponentao decodificar strings que contêm as entidades HTML expansíveis≫⃒ou≪⃒, que podia ser explorado por qualquer usuário com um únicoSELECT. #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 dePREWHERE. Uma consulta lida comapply_mutations_on_fly = 1podia contaminar o cache, fazendo com que uma consulta posterior comapply_mutations_on_fly = 0e 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 dePREWHERE: 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
windowFunnelao 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 únicoSELECT. #107412 (uwezkhan). - Corrigido o problema em que
currentUser(),user(),SESSION_USEReauthenticatedUser()eram avaliados como uma string vazia durante a gravação de inserts assíncronos (comasync_insert = 1). Isso afetava expressões de colunaDEFAULT/MATERIALIZEDe 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 QUOTAesystem.quota_usageagora exibem todas as quotas aplicadas ao usuário atual. #107664 (alexey-milovidov). SYSTEM RESET DDL WORKERagora requer o novo privilégioSYSTEM RESET DDL WORKER. Antes, qualquer usuário autenticado (inclusive usuáriosreadonly) podia executá-lo e redefinir repetidamente o estado do worker de DDL, bloqueando DDLsON CLUSTER. #108460 (groeneai).- Corrigida a identificação de usuários por
ssl_certificatepara que um único wildcard*corresponda exatamente a um componente do nome (RFC 6125 6.4.3). Antes, um wildcard em um assuntoCNou SANDNS:(por exemplo,*.corp.example.com) também correspondia a nomes com vários rótulos, comoevil.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 SANsURI:permanece inalterada. #108472 (groeneai). - Os comandos do MySQL wire protocol
COM_FIELD_LIST(mysql_list_fields) eCOM_INIT_DB(USE database) agora aplicam o mesmo controle de acesso que seus equivalentes em SQL (SHOW COLUMNS/DESCRIBEeUSE). 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égioSHOW DATABASES. #108508 (groeneai). - Corrigida a correspondência de
http_forbid_headerspara não diferenciar maiúsculas de minúsculas. Os nomes de cabeçalhos HTTP não diferenciam maiúsculas de minúsculas, portanto proibirAuthorizationagora também bloqueiaauthorization,AUTHORIZATIONe outras variações de maiúsculas e minúsculas. Os padrõesheader_regexpconfigurados 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')eDESCRIBE 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
DataLakeCatalogcriado por uma versão anterior (25.12 ou anterior) com umauth_headermalformado não podia ser anexado após a atualização para 26.2 ou posterior, impedindo a inicialização do servidor. Oauth_headeragora é validado apenas emCREATEe, emATTACH, 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_hostsarabbitmq_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 umCREATEexecutado pelo próprio servidor local, a estrutura agora é inferida no contexto do usuário, portanto é necessário terSHOW COLUMNSna tabela de destino, como já ocorre com o engineRemote. UmCREATEreproduzido da fila DDL (ON CLUSTERou dentro de um banco de dadosReplicated) 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 umCREATEexecutado localmente pelo próprio servidor, a estrutura agora é inferida no contexto do usuário, portanto é necessária a permissãoSHOW COLUMNSna tabela de destino, como já ocorre comMergeeRemote. UmCREATEreproduzido da fila de DDL (ON CLUSTERou dentro de um banco de dadosReplicated) 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
RESTOREde 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 discosS3e armazenamento de objetos, fazendo com que objetos grandes fossem criados com a classe padrãoSTANDARD. O nome da opção agora é aceito comos3_storage_classes3_storage_class_namepara 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 (comouse_native_copy), o que fazia com que as configurações de um disco fossem ignoradas paraBACKUP/RESTOREaté 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_storageno formato legado. #106784 (jkartseva). - Corrigido o
BACKUPparaAzureBlobStorage: 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 destinosS3agora usam solicitações exatas deHeadObject, 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 comuse_same_s3_credentials_for_base_backup = 1ou 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 aRESTOREcom a configuraçãobase_backup. Backups criados por versões anteriores com credenciais incorporadas continuam podendo ser restaurados. #107357 (pamarcos). - Corrigido o
RESTOREde tabelasReplicatedMergeTreepara 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,URLetc.) sem umapartition_strategyexplícita volta a implicar a estratégiawildcard, independentemente defile_like_engine_default_partition_strategy. Isso restaura a compatibilidade retroativa para DDLs anteriores à versão 26.6 que passaram a falhar comBAD_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
Keeperapós falhas de gravação, garantindo que snapshots parciais sejam removidos com segurança e que as gravações possam ser repetidas sem avançarlatest_snapshot_meta. #105779 (antonio2368). - Corrige falhas do
Keeperdurante 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_streamera definida como um valor diferente do padrão (o padrão é 0, ou seja, desativa o pipelining de solicitaçõesappend_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, portantononeera ignorado silenciosamente. Agora,nonedesativa 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 explicitamentenonedeixarã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(ezk_latest_snapshot_sizeemmntr) 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 consultaALTERfalhar 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,oretc.), 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 corretamente0, em vez de falhar com um erro de divisão por zero. #103157 (fastio). - Corrige uma finalização inesperada do servidor quando
runningAccumulateera chamado em uma função de agregação que retorna seu próprio estado. #105085 (antaljanosbenjamin). - Corrige
getServerSettingpara retornar o valor efetivo atual das configurações do servidor que podem ser alteradas em tempo de execução (comomax_server_memory_usage,mark_cache_size,max_concurrent_queries, tamanhos de pools de threads etc.), em conformidade com o reportado porsystem.server_settings. #105172 (alexey-milovidov). - Corrige a exceção
NOT_FOUND_COLUMN_IN_BLOCKao combinarORDER BY ... WITH FILL INTERPOLATEeLIMIT N BYcom o analisador habilitado. #105481 (yakov-olkhovskiy). - Corrige uma exceção do servidor (erro lógico
Trying to execute PLACEHOLDER action) quando uma CTEMATERIALIZEDcujo corpo é uma subconsulta correlacionada é usada no lado direito deIN. 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 emFROM. #105518 (groeneai). - Corrige o fato de
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=falsenã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_EXPRESSIONao usarINTERPOLATE ()(vazio) com um prefixo de ordenação emORDER BYeuse_with_fill_by_sorting_prefixhabilitado. 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 deINTERPOLATE (col)quando nomeado explicitamente. #106001 (yakov-olkhovskiy). - Estados malformados de
AggregateFunction(uniqTheta, ...)provenientes da entradaRowBinaryou de parâmetros de consulta agora são rejeitados comCORRUPTED_DATA, em vez de encerrar o servidor. #106260 (groeneai). - Corrige uma falha e um possível erro
NOT_FOUND_COLUMN_IN_BLOCKquando a otimização baseada em restrições (optimize_using_constraints) é usada com subconsultas correlacionadas. #106349 (Algunenano). - Corrige a exceção
NUMBER_OF_COLUMNS_DOESNT_MATCHao consultar uma tabelaDistributedcom duas ou mais colunas ALIAS expandidas para a mesma expressão (por exemplo, ambas definidas comotoString(x)), ou quando a mesma expressão é usada tanto como referência a uma coluna ALIAS quanto diretamente na lista SELECT, com uma cláusulaORDER 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 demultiIfpara um argumento de função de tabela, por exemplo,numbers(multiIf(*, ...), 2). A consulta agora rejeita o padrão não resolvível comUNSUPPORTED_METHOD. #106647 (groeneai). - Rejeita padrões glob de
fileproblemá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 geramTOO_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 tabelainputé encapsulada em uma CTE não MATERIALIZED referenciada em mais de um ponto da consulta. A consulta agora é rejeitada com um erro claroINVALID_USAGE_OF_INPUTdurante 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
TRUNCATEouDROPem uma tabelaEmbeddedRocksDBcujo identificador do RocksDB foi liberado, por exemplo, uma tabelaread_onlycujo diretório de dados foi esvaziado por umTRUNCATEanterior. #106940 (groeneai). - Corrige uma exceção (
std::length_errorreportada comoLOGICAL_ERROR) ao ler de uma função de tabela*Cluster, comourlCluster, com uma configuraçãomax_streams_for_files_processing_in_cluster_functionsmuito 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 umINSERTquando duas visões materializadas na mesma tabela de origem gravam na mesma tabela de destino e uma visão dependente lê esse destino, commaterialized_views_squash_parallel_insertshabilitado. #107027 (groeneai). - Corrigida uma exceção
LOGICAL_ERRORao inserir em uma tabela DeltaLake com colunas que não correspondem ao esquema de gravação (por exemplo, uma colunaNestedque é achatada em subcolunas ou uma função de tabela com um subconjunto explícito de colunas). Esses inserts agora falham com um erroINCOMPATIBLE_COLUMNSexibido 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ênciaREFRESH ... 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 comotoStringouconcaté aplicada a uma colunaVariantouDynamicque 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 umINSERTassíncrono em uma tabelaAliasquandouse_strict_insert_block_limitsestava 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 BYou umINDEXde omissão) continha um operadorINcom 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
DISTINCTque 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
DeltaLakeapó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 chavePARTITION BYe uma subconsultaIN/NOT INenvolvida 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) comlog_formatted_queries = 1. #107570 (groeneai). - Corrige uma falha do servidor ao ler uma visão materializada cujo destino é uma tabela
Distributedenquanto a consulta é executada comenable_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
odbcejdbce 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/dbde uma coleção nomeada passada pararemote()/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
_distanceagora retornam um erro apropriado em vez de falhar comLOGICAL_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
quantileTDigestera usada como chave deGROUP BYe 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 umINSERTpassa por uma visão materializada dependente cujo destino é umAliase 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
INSERTno mecanismoFileou na função de tabelafileadiciona dados a um arquivo não vazio em um formato que não aceita acréscimos, comoAvro. 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. EsseINSERTagora é rejeitado comCANNOT_APPEND_TO_FILE, como já ocorre para um caminho simples. #112839 (groeneai). - Corrige o travamento de
DROP TABLEeSYSTEM STOP VIEWquando 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
TimeSeriescujo nome é ordenado lexicograficamente antes dos nomes de suas tabelas internas, por exemplo, uma tabela chamada-ts, ou ao remover uma visão materializada declarada comENGINE = TimeSeries. A remoção causava um deadlock na própria proteção DDL e não podia ser cancelada comKILL QUERY. #114953 (groeneai).
Outras correções de bugs
- As funções
like,ilike,notLike,notILikeematchagora oferecem suporte a texto pesquisado constante com padrão não constante (por exemplo,'foo' LIKE pattern_column), o que antes geravaILLEGAL_COLUMN. #100479 (Onyx2406). - Corrigido o erro
NOT_FOUND_COLUMN_IN_BLOCKao 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, comomax_bytes_per_secondemax_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_bytesera silenciosamente ignorado durante a análise deINSERTquandomax_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,WriteBufferFromHDFSnão esvaziava seu buffer de trabalho emfinalize(), fazendo com que os últimos atéDBMS_DEFAULT_BUFFER_SIZEbytes de cada arquivo fossem silenciosamente perdidos, incluindo o rodapéPAR1do Parquet. A leitura desses arquivos retornavaNot 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 comjoin_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
sumIfcom diferentes condiçõesIN (...). #104765 (Ergus). - Corrigido
deltaSumTimestampretornando resultados incorretos para tipos inteiros com sinal que cruzam o zero. #104830 (thevar1able). - Corrigido o erro
Logical error: 'Metadata is not initialized'gerado porDELETE FROMem uma tabelaIceberg,DeltaLakeouHudirecé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 KEYouSETTINGSdo engine) sem umENGINEagora geramBAD_ARGUMENTS, em vez de reanexar silenciosamente a tabela com sua definição armazenada e descartar as cláusulas fornecidas pelo usuário. AsSETTINGSde sessão no nível da consulta (comolog_comment) continuam sendo aplicadas. UseATTACH TABLE t;para reanexar com os metadados armazenados ouALTER TABLE t MODIFY SETTING ...apósATTACHpara 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
Dynamicde uma tabelaMemorycomprimida apósALTER. #105464 (Avogar). - Incluído
skip_first_linesna chave do cache de esquema para formatosWithNames. #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_selectestá 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_modee, 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
Templateapós linhas malformadas. #105735 (niyue). - Corrigida a formatação de
SYSTEM INSTRUMENT ADDpara que os argumentos do manipulador sejam separados por um único espaço, e rejeitadas listas inválidas de argumentos de instrumentaçãoSLEEPcom 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 TABLEque falhavam silenciosamente para chaves de partição Bool. #106004 (Avogar). - Corrigidos
JSONExtractRaweJSONHaspara 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 deSHOW DICTIONARIES. #106105 (Avogar). - Corrigidos resultados incorretos em consultas a tabelas cujo
ORDER BYcontém uma função monotonicamente decrescente, como(c0 / -42)ouintDiv(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
DDSketchmalformados durante a inserção. #106236 (yariks5s). - Corrigida a consistência do cache do sistema de arquivos após downgrades de
SLRUcom falha, evitando que entradas permanecessem presas em estado de remoção. Também foram corrigidos o redimensionamento do cache divididoSystem/Datae 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
Float16subnormais paraFloat32(por exemplo, ao lê-los de arquivos.npydo 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 gerarINDEX_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
NaNou 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
Avromalformados 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 TIESeLIMIT WITH TIESfracionário não respeitavam a collation deORDER BY ... COLLATEao 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
DISTINCTem ordem eLIMIT BYem ordem (incluindoLIMIT BYnegativo), 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
DataPageV2no leitor nativo de Parquet, um estouro de pilha em arquivos Parquet com esquemas profundamente aninhados e alocações que ignoravammax_memory_usageao 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/permissiveem minúsculas porSHOW 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,
DETACHouATTACH) em tabelas com uma colunaLowCardinality(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 eramNULL, 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_usera sempre zero eread_rows/read_byteseram subcontados emsystem.processors_profile_logesystem.query_logpara 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: 49em compilações de release) que ocorria quando uma ramificação deUNION/INTERSECT/EXCEPTlia uma coluna serializada comoSparse, 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 BYsobreUNION ALLcomoptimize_read_in_ordereread_in_order_use_virtual_rowhabilitados. #107053 (vdimir). - Corrigido um erro de sintaxe quando uma cláusula
FORMAT,SETTINGSouINTO OUTFILEsegueSHOW ROW POLICIESouSHOW MASKING POLICIES(por exemplo,SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai). - Corrigido o problema em que
trimLeft,trimRightetrimBoth(e os aliasesltrim,rtrim,trim) lançavamTOO_LARGE_STRING_SIZEquando 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,quantileExactInclusiveequantilesExactInclusiveque podia produzir resultados incorretos para entradasInt64abrangendo 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 BYsobreUNION ALLcomoptimize_read_in_orderhabilitado quando o pipeline de união era reduzido devido às configurações demax_streams_for_union_step; a redução agora é ignorada quando o plano depende de streams de saída ordenados deUNION. #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 FILLquando uma coluna de ORDER BY anterior à coluna de preenchimento usa uma ordenaçãoCOLLATE. 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
nanouinf) é passado como argumento de timestamp/duração das funções de tabelaprometheusQuery/prometheusQueryRange. Esse argumento agora geraBAD_ARGUMENTSem vez de produzir um timestamp inválido. #107417 (groeneai). - Corrige resultados incorretos da otimização
optimize_rewrite_aggregate_function_with_ifpara funções de agregação que preservam valores de payloadNULL(a família*_respect_nulls:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls). A otimização não reescreve maisf(if(cond, x, NULL))para a forma-Ifdessas 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/J8.2.0 e versões mais recentes (incluindo 9.x). O campoinfodo pacoteOKagora é 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: 49em compilações de lançamento) que ocorria quando ramificações irmãs de umUNION/INTERSECT/EXCEPTdiferiam apenas no predicadoWHEREe o predicado de uma das ramificações era avaliado como constante para uma colunaConst. #107719 (groeneai). - A leitura de dados
ArroweArrowStreamcom colunasStringouBinaryvazias produzidas pelo Apache Arrow Java anterior à versão 19.0.0 (incluindo Apache Spark) não gera maisINCORRECT_DATA. #107764 (Algunenano). - Blocos Native malformados cujo discriminador
Variantreferencia uma variante inexistente agora são rejeitados com segurança. #107991 (uwezkhan). - Corrigida uma regressão de desempenho na leitura de colunas
Dynamiccom várias threads. #107997 (Avogar). - A configuração obsoleta de lago de dados
storage_catalog_urlagora é corretamente rejeitada pela validação do catálogo (anteriormente, apenasstorage_catalog_typeestorage_aws_access_key_ideram 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 opcionaldatasetcom o erroNo 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_objectnão funcionava com caminhos tipados em JSON. #108218 (Avogar). - Corrigido comportamento indefinido (ponteiro nulo passado para
memcpy) nas funçõesdetectCharsetedetectLanguageUnknownquando 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_BLOCKem consultas que usam as colunas virtuais_part_starting_offset/_part_offsetem WHERE junto com materialização tardia. #108287 (vdimir). - Ocultados argumentos secretos de funções como
encrypt,decrypteHMACna saída deEXPLAIN actions,EXPLAIN headereEXPLAIN PIPELINEquandoformat_display_secrets_in_show_and_selectestá desabilitado (o padrão). #108386 (Algunenano). CREATE OR REPLACEagora é executado com êxito para uma view materializada atualizável quando seu destinoTOjá pertence a essa mesma view. Destinos pertencentes a outra view continuam sendo rejeitados. #108392 (evillique).- Restrito o caminho do modelo de
catboostEvaluateao diretóriouser_files, assim como emfile()e nas fontes de dicionário. Anteriormente, a função aceitava qualquer caminho do sistema de arquivos sem verificar se ele estava contido emuser_files, o que permitia verificar a existência de arquivos e acionar leituras fora deuser_files. Agora, os modelos devem estar localizados emuser_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
uniqExactcomGROUPING SETS,ROLLUPouCUBEemax_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
getClientHTTPHeaderagora 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çalhoauthorizationagora é 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 deinsert_deduplication_tokeneram 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 COLUMNnão faça mais o lote inteiro falhar. #111108 (Felixoid). - Corrigido o
CREATE OR REPLACEde um dicionário por um objeto de outro tipo: a operação falhava comCANNOT_DETACH_DICTIONARY_AS_TABLEapó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 columnsque podia ocorrer quando a otimização de divisão de filtro (query_plan_split_filter) era executada em uma cláusulaWHEREcujo nome da coluna de filtro também era o nome de uma coluna de entrada. A otimização deixava uma coluna interna__split_filterno cabeçalho de saída do ramo, que então divergia do ramo irmão de uma operação de conjunto, comoINTERSECTouUNION. #111930 (groeneai). - Corrigidos resultados incorretos para filtros ou expressões
ORDER BYque usamtoStringcom valoresTime,Time64ouDateTimeem fusos horários com horário de verão. Também foi restaurada a otimização de leitura em ordem paraORDER BYem um prefixo da chave de ordenação da tabela e para conversões deStringemNullable(String). #113291 (vdimir). - Corrigido o
ATTACHde uma tabelaKafkaquandokafka_num_consumersexcede 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
formatRowNoNewlineque 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).