Version 26.5 de ClickHouse, 2026-05-21. Présentation, Vidéo
Changement incompatible avec les versions précédentes
- Les valeurs par défaut de
date_time_input_formatetcast_string_to_date_time_modeont été remplacées debasicparbest_effort. Les requêtes qui ne parvenaient auparavant pas à analyser des chaînes de date/heure non basiques (par ex.2024 April 4,Apr 15, 2020 10:30:00) peuvent désormais aboutir par défaut. Pour conserver l’ancien comportement d’analyse strict, définissez ces paramètres surbasic(ou utilisezcompatibility). #89334 (Alexey Milovidov). - Le nom d’élément de
Tuplenullest désormais interdit, car il entre en conflit avec le nom de sous-colonne utilisé pour les null maps deNullable, ce qui entraîne une résolution ambiguë des sous-colonnes. #98377 (Alexey Milovidov). - Ajout des paramètres
dynamic_disk_allow_from_env,dynamic_disk_allow_from_zk,dynamic_disk_allow_includepour interdire l’utilisation defrom_env,from_zketincludedans les disques dynamiques. Il s’agit d’un changement incompatible avec les versions précédentes, car il interdit désormais par défaut un comportement qui était auparavant autorisé par défaut. #99138 (Kseniia Sumarokova). - Vous ne pouvez plus utiliser le lecteur et le writer Parquet obsolètes basés sur Arrow. L’implémentation native sera utilisée à la place. #100949 (Alexey Milovidov).
SHOW CREATE TABLE tprivilégie désormais la table temporaire lorsque des tables permanente et temporaire nomméestexistent toutes deux et qu’aucune base de données n’est spécifiée, conformément au comportement existant deDESCRIBE TABLE. En outre, la syntaxeDESCRIBE TEMPORARY TABLEest désormais prise en charge. #100966 (Alexey Milovidov).- La valeur par défaut de
http_max_fieldsa été réduite de 1,000,000 à 1,000 et celle dehttp_max_field_name_sizede 128 KB à 4 KB afin de limiter l’utilisation de la mémoire en phase de pré-authentification par les connexions HTTP. Ajout des paramètreshttp_max_request_header_sizeethttp_headers_read_timeout. Les utilisateurs qui s’appuyaient sur les anciennes limites plus élevées peuvent les rétablir via les paramètres. #103285 (Sema Checherinda). - Ajout d’une colonne imbriquée
histogramsàsystem.metric_logqui capture un instantané de chaque métrique d’histogramme enregistrée par ligne, avec un nouveau paramètresystem_metric_log_show_zero_values_in_histogramspour contrôler l’émission des valeurs zéro. Cela rend la tablesystem.histogram_metric_logobsolète. #103770 (Miсhael Stetsyuk). CASTversDateTimeouDateTime64sans fuseau horaire explicite préserve désormais le fuseau horaire de son argument source (lorsque la source est unDateTime/DateTime64avec un fuseau horaire explicite), conformément au comportement des fonctionstoDateTime/toDateTime64. Ferme #55072. #104433 (Alexey Milovidov).- Suppression de la table function
kql. UtilisezSET dialect = 'kusto'pour exécuter des requêtes dans le dialecte KQL. #105101 (Alexey Milovidov). - Les window functions
RANKetDENSE_RANKrejettent désormais les arguments et lèventNUMBER_OF_ARGUMENTS_DOESNT_MATCH, conformément au standard SQL. Auparavant, des requêtes telles queRANK(x) OVER (ORDER BY id)étaient acceptées silencieusement, l’argument étant ignoré. Pour rétablir l’ancien comportement permissif, définissezallow_rank_dense_rank_arguments = 1. Ferme #49526. #104324 (Groene AI).
Nouvelle fonctionnalité
- Ajout d’un nouveau paramètre
max_bytes_ratio_before_external_join, calqué surmax_bytes_ratio_before_external_group_byetmax_bytes_ratio_before_external_sort. Il exprime le seuil de spill sur disque pour les hash joins sous forme de fraction de la mémoire disponible ; combiné au seuil absolumax_bytes_before_external_join, c’est le plus petit des deux seuils qui s’applique. #103862 (Alexey Milovidov). Le paramètrenew max_bytes_ratio_before_external_joinest désormais activé par défaut à 0.5, commemax_bytes_ratio_before_external_group_byetmax_bytes_ratio_before_external_sort. Les hash joins basculent automatiquement vers grace hash join dès que les données du côté droit dépassent la moitié de la mémoire système disponible (lorsque des limites mémoire sont configurées). #104285 (Alexey Milovidov). - Ajout de la fonction de table
filesystem. Elle permet de représenter la structure d’un répertoire sous forme de table, et d’interroger avec SQL les métadonnées et le contenu des fichiers. À l’origine #42039 par @perst20. Voir #42039. Voir #50208. #53610 (Alexey Milovidov). - Permet de passer des noms de fonction seuls à des fonctions d’ordre supérieur comme
arrayMap,arrayFilter, etc. Par exemple,arrayMap(negate, [1, 2, 3])est désormais équivalent àarrayMap(x -> negate(x), [1, 2, 3]). #101033 (Alexey Milovidov). - Ajout du paramètre
send_table_structure_on_insert_with_inline_dataet de l’option client--inline-insert-datapour permettre au serveur d’analyser lui-même les données INSERT inline via le protocole natif, en évitant l’aller-retour nécessaire pour récupérer la structure de la table et en améliorant les performances pour de nombreux petits inserts. #101034 (Alexey Milovidov). - Ajout des fonctions
tokenizeQueryethighlightQuerypour la tokenisation des requêtes SQL et la coloration syntaxique.tokenizeQueryrenvoie les tokens du lexer avec leurs offsets en octets et leurs types ;highlightQueryrenvoie des plages de coloration syntaxique basées sur le parser avec des catégories de surlignage (keyword, identifier, function, number, string, etc.). #101054 (Alexey Milovidov). - Ajout du paramètre
url_basepour résoudre les URL relatives dans la fonction de tableurlet le moteur de tableURL, conformément à la RFC 3986. #101113 (Alexey Milovidov). - Prise en charge des valeurs négatives dans la clause
LIMIT BYpour sélectionner des lignes à partir de la fin de chaque groupe plutôt que du début. Par exemple,LIMIT -2 BY idrenvoie les deux dernières lignes parid. Les offsets négatifs (LIMIT -1 OFFSET -1 BY id) et les signes mixtes (LIMIT -2 OFFSET 1 BY id) sont également pris en charge. #103222 (Nihal Z. Miaji). - Prise en charge de la fonction
json_valuepour produire des sorties entupleetarray, afin d’améliorer les performances de plusieurs requêtes JSON. #78362 (kevinyhzou). Prise en charge de l’argument JSONPath multi-cheminsTuple/ArraydansJSON_VALUE,JSON_EXISTSetJSON_QUERY, par @KevinyhZou. #101102 (Alexey Milovidov). - Introduction d’un nouveau paramètre
kafka_autodetect_client_rack. Lorsqu’il est défini, il détecte la zone de disponibilité via les mécanismes du cloud et la propage comme paramètreclient.rackdelibrdkafkaafin d’éviter les communications inter-zones. #81323 (Ilya Golshtein). - Ajout du type d’événement
Readàsystem.blob_storage_logpour suivre les opérations de lecture du stockage objet, contrôlé par le nouveau paramètreenable_blob_storage_log_for_read_operations. #96867 (Alexey Milovidov). - Les utilisateurs peuvent désormais voir les watches ZooKeeper émises par
clickhouse-servergrâce à la nouvelle tablesystem.zookeeper_watches. #99277 (Den Kalantaevskii). - Ajout de l’événement de profil
Shards, qui comptabilise le nombre de shards impliqués dans les distributed queries, totalisé sur l’ensemble des tables. #99470 (Alexey Milovidov). - Les UDF
WASMpeuvent être déclaréesDETERMINISTICet faire l’objet d’un repliement de constantes. #100005 (Vasily Chekalkin). - Ajout du paramètre
parallel_replicas_prefer_local_replica: lorsqu’il est désactivé, les répliques parallèles sont sélectionnées uniquement par l’algorithme de load balancing, ce qui permet même aux queriesmax_parallel_replicas = 1d’être dirigées vers un autre hôte. #100139 (Alexey Milovidov). - Ajout des server settings
{disk,storage,http}_connections_rcvbufet{disk,storage,http}_connections_sndbufpour contrôler la taille des tampons des sockets TCP sur les HTTP connections sortantes, ce qui permet aux opérateurs de surcharger l’autotuning du noyau et de plafonner l’utilisation mémoire par connexion. #100478 (Sema Checherinda). - Prise en charge de
CREATE OR REPLACE MATERIALIZED VIEWavec la même sémantique de permutation atomique queCREATE OR REPLACE TABLE. Fonctionne avec les tables internes, les tablesTO,POPULATE,REFRESHetON CLUSTER. #100539 (DQ). - Ajout des histogram metrics
s3_read_request_duration_microsecondsets3_read_request_bytespour observer la durée de vie des connexions des requêtes GET S3 et le volume d’octets consommés, visibles danssystem.histogram_metricset sur le Prometheus endpoint. #102058 (Sema Checherinda). - Ajout des table engines
Paimon,PaimonS3,PaimonAzure,PaimonHDFSetPaimonLocalavec prise en charge de l’Incremental read, reposant sur le suivi de progression des snapshots Keeper. Le mode incrémental ne renvoie que les nouvelles lignes depuis le dernier snapshot committed. Des lectures delta ciblées d’un snapshot sont disponibles viapaimon_target_snapshot_id, ainsi que des limites de snapshots par requête viamax_consume_snapshots. Le metadata refresh en arrière-plan est configurable avecpaimon_metadata_refresh_interval_sec. Contrôlé parallow_experimental_paimon_storage_engine. #102343 (XiaoBinMu). - Ajout d’un nouveau paramètre de Kafka table,
kafka_map_virtual_columns_on_write. Lorsqu’il est activé, les colonnes nommées_key,_timestamp,_headers.nameet_headers.valuedans le schéma de la Kafka table sont produites comme clé, timestamp et headers correspondants du message Kafka lors deINSERT, et sont exclues du message payload. #103243 (Alexey Milovidov). - Ajout des requêtes
SYSTEM PAUSE VIEW [db.]nameetSYSTEM PAUSE VIEWSpour les vues matérialisées actualisables. Contrairement àSYSTEM STOP VIEW,SYSTEM PAUSE VIEWn’interrompt pas l’actualisation en cours — l’actualisation déjà lancée est autorisée à aller jusqu’au bout, et seules les actualisations suivantes sont empêchées. L’annulation se fait viaSYSTEM START VIEWouSYSTEM START VIEWS, qui effacent désormais de manière uniforme les états arrêté et en pause. #103252 (Nikita Mikhaylov). - Ajout de la fonction
regexpPosition(avec les alias compatibles PostgreSQLregexpInstretregexp_instr) qui renvoie la position en octets de la N-ième correspondance regex dans une chaîne. Prend en charge le décalage de départ, le mode retour après correspondance, les flags regex et la sélection du groupe de capture. #104172 (Abhinav Agarwal). - Nouvelles fonctions
isPrimeetisProbablePrimepour les tests de primalité.isPrimerenvoie un résultat exact pour les entiers non signés jusqu’àUInt64.isProbablePrimeprend également en chargeUInt128etUInt256; pour ces types plus larges,0signifie assurément composé et1signifie probablement premier. Le deuxième argument facultatif deisProbablePrime,rounds, contrôle le niveau de confiance (plafonné à256) ; la valeur par défaut de25itérations borne le taux de faux positifs pour un composé aléatoire à moins de10^-15, etisProbablePrimepeut être annulée. #104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji). clearet/cleareffacent désormais le terminal dans les outils en ligne de commande clickhouse, au lieu d’être exécutés comme une requête erronée. #104318 (Tyler Hannan).- La fonction de table
filepeut désormais accepter unArray(String)de chemins dans les requêtesSELECT. #104442 (Yue). - Ajout des colonnes
deterministicethigher_orderà la tablesystem.functions. #104479 (Pedro Ferreira). - Ajout d’un paramètre facultatif de variante d’encodage à
bech32Encode(bech32/bech32m) et d’un mode de décodage brut àbech32Decodepour l’encodage d’adresses non-SegWit (par ex. Cosmos SDK, Injective, Osmosis). #98986 (Yash ). - Vous pouvez désormais écrire des données au format
AvroConfluent, qui était auparavant limité à l’entrée. Cela permet de produire directement depuis ClickHouse des messages Avro encadrés par Confluent Schema Registry, par exemple lors de l’écriture vers Kafka. Le schéma est automatiquement enregistré dans le registre. Utilisez le nouveau paramètreoutput_format_avro_confluent_subjectpour spécifier le nom du sujet. #101935 (János Benjamin Antal). - Ajout de la fonction
prettyPrintJSONpour mettre en forme une chaîne JSON dans un format lisible par l’humain. Utile pour les tableaux de bord ou les rapports, où le formatage nécessitait auparavant une étape supplémentaire côté client. Clôt #62523. #102594 (Dmitry Prokofyev). - Ajout de
STRING_AGGcomme alias insensible à la casse degroupConcat, pour la compatibilité avec PostgreSQL / le SQL standard. #105125 (Alexey Milovidov). - Les résultats de chaque sous-requête peuvent désormais être mis en cache indépendamment à l’aide de
SETTINGS use_query_cache = truesur des sous-requêtes spécifiques, sans mettre en cache l’intégralité de la requête englobante. Un nouveau paramètre,query_cache_for_subqueries = true, permet de propager en masseuse_query_cacheà toutes les sous-requêtes. Remarque :use_query_cachesur la requête englobante ne se propage plus automatiquement aux sous-requêtes. #99804 (Vincent Voyer). - Ajout de la coloration syntaxique basée sur un lexer dans l’éditeur de requêtes de l’interface web (
play.html), calquée sur les couleurs declickhouse-client. #105105 (Alexey Milovidov).
Fonctionnalité expérimentale
- Ajout d’une interface de terminal web expérimentale à
/webterminal, qui fournit dans le navigateur une session interactiveclickhouse-clientvia WebSocket. Désactivée par défaut ; activez-la avec le paramètre serveurallow_experimental_webterminal. Voir ici. #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov). - Le moteur
Kafka2(expérimental, avec un stockage des offsets basé sur Keeper) prend désormais en charge les requêtesSELECTdirectes ainsi que le paramètrekafka_commit_on_select. #100276 (Alexey Milovidov). - Les UDF
WASMpeuvent désormais convertir un plus grand nombre de types numériques : les entiers plus petits en entiers plus larges (par ex.Int8versUInt64), et n’importe quel entier en nombre à virgule flottante (par ex.Int32versFloat32). #100435 (Vasily Chekalkin). - Prise en charge de la fonction
LIKEdans la requêteDELETE FROM system.webassembly_modules. #104397 (Vladimir Cherkasov). - Prise en charge des types géo pour
Iceberg. #103113 (Konstantin Vedernikov). - Ajout de la prise en charge des instructions préparées au serveur ArrowFlight SQL. #103047 (Yakov Olkhovskiy).
- Robustesse du parseur KQL (pour la prise en charge du langage Kusto) améliorée grâce à la préservation de la profondeur du parseur et des compteurs de retours arrière entre les étapes du parseur KQL, afin que les limites du parseur soient suivies de manière cohérente pour les requêtes KQL complexes. #103528 (Yakov Olkhovskiy).
Amélioration des performances
- Réutilisation du cache de métadonnées du footer Parquet lors de la lecture de fichiers Parquet locaux via la table function
fileou le table engineFile. Auparavant, le cache n’était consulté que pour les backends de stockage objet. #104260 (Alexey Milovidov). - Propagation de
ORDER BY ... LIMIT nà travers les jointuresLEFT/RIGHTlorsque la clé de tri ne référence que des colonnes du côté préservé par la jointure, ce qui limite le nombre de lignes que l’entrée de ce côté doit produire avant la jointure. Contrôlé par le nouveau paramètrequery_plan_top_k_through_join(activé par défaut). #104268 (Alexey Milovidov). - Activation par défaut des paramètres
use_top_k_dynamic_filteringetuse_skip_indexes_for_top_kafin d’améliorer les performances des requêtesORDER BY ... LIMIT N. #99537 (Alexey Milovidov). Restriction par défaut deuse_top_k_dynamic_filteringaux colonnes de tri de longueur fixe, afin d’éviter des régressions sur les requêtesORDER BY <var-length-column> LIMIT Noù le coût de comparaison du seuil pour chaque ligne dépasse les gains d’E/S. Le comportement précédent reste disponible via le nouveau paramètreuse_top_k_dynamic_filtering_for_variable_length_types. #104216 (Alexey Milovidov). - Utilisation de la fonctionnalité oversize-arena de
jemallocpour réduire les défauts de page. #103958 (Nikita Taranov). - Limitation du nombre de streams actifs simultanément dans
UNION ALLafin de réduire le pic d’utilisation mémoire. #100176 (Alexey Milovidov). - Légère optimisation du userspace page cache. #100300 (Alexey Milovidov). Désormais, le userspace page cache est toujours meilleur que l’OS page cache.
- Les lectures à froid depuis le stockage objet via le userspace page cache (
use_page_cache_for_object_storage = 1) sont désormais nettement plus rapides, car les défauts de cache consécutifs sont regroupés en une seule requête HTTP au lieu d’une requête par blocpage_cache_block_size. #104230 (Alexey Milovidov). - Accélération de l’analyse d’index impliquant des conversions de type et l’application de fonctions. Closes #55653. #100366 (Alexey Milovidov).
- Accélération des requêtes volumineuses sur les tables
Mergeportant sur un très grand nombre de tables sous-jacentes. Closes #32465. #100369 (Alexey Milovidov). - Suppression de la vtable des types de champs de paramètres, ce qui réduit d’environ 28x la taille de copie de
Settingset améliore la localité du cache grâce à une organisation en tableaux typés pour tous les types de paramètres. #102269 (Raúl Marín). - Ajout des paramètres
max_threads_min_free_memory_per_threadetmax_insert_threads_min_free_memory_per_threadpour réduire automatiquement le parallélisme des requêtes lorsque le serveur manque de mémoire libre. #100383 (Alexey Milovidov). - Réduction de l’utilisation mémoire sur les systèmes disposant de peu de mémoire (< 4 GiB). #100389 (Alexey Milovidov).
- Ajout de
OptimizeTrivialGroupByLimitPass. Pour les requêtes trivialesSELECT ... FROM t GROUP BY k LIMIT n(sansHAVING,ORDER BYni window functions), l’analyzer définit désormaismax_rows_to_group_by = n + offsetavecgroup_by_overflow_mode = 'any', de sorte que l’aggregation s’arrête dès quenclés distinctes ont été produites, au lieu de regrouper l’ensemble des données en entrée. Contrôlé par le nouveau paramètreoptimize_trivial_group_by_limit_query(activé par défaut). #104473 (Amos Bird) (Alexey Milovidov). - Index min-max implicite au niveau du granule pour les virtual columns
_part_offsetet_block_number, y compris pour les projections. Permet un pruning rapide des granules en fonction des prédicats sur les colonnes virtuelles. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko). - Pour la famille de méthodes d’aggregation
prealloc_serialized, précalcule les hash par ligne pendant la passe de sérialisation par batch et les utilise pour (a) éviter de recalculer le hash dansemplaceKey/findKeyet (b) effectuer un software prefetch du bucket de la ligne suivante. Accélère l’aggregation multi-clés de chaînes/sérialisée en masquant la latence des défauts de cache de la hash table. #104475 (Amos Bird) (Alexey Milovidov). - Query condition cache pour les tables
Iceberg. #102115 (Konstantin Vedernikov). - Optimise
cramersV,cramersVBiasCorrected,theilsUetcontingencylorsqu’ils sont utilisés avec des window functions. Corrige #83521. #93384 (Nihal Z. Miaji). - Ajout d’une query optimization qui réécrit
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N)endictGet('dict', 'a', key), évitant de récupérer des dictionary attributes inutiles. Contrôlé par le paramètreoptimize_dictget_tuple_element(activé par défaut). #100186 (Alexey Milovidov). - Active le buffering pour les étapes de tri sur l’initiateur pour les distributed queries avec tri. #100661 (Nikita Taranov).
- Amélioration des performances pour
partial_mergeJOIN. #100945 (Artem Zuikov). - Réduction légère de la surallocation mémoire dans
partial_mergeJOIN. #100963 (Artem Zuikov). - Optimise les allocations/deallocations en mettant en cache les paramètres de sampling au lieu de parcourir toute la hiérarchie du traqueur mémoire. #101267 (Azat Khuzhin).
- Réduit le surcoût des allocations mémoire lors des multipart uploads S3 en préallouant les conteneurs internes de suivi. #101799 (Gagan Dhakrey).
- Ajoute un software prefetch dans la phase de probe du hash join afin de réduire la latence d’accès mémoire pour les grandes hash tables, contrôlé par le paramètre
enable_software_prefetch_in_join. #102444 (Xiaozhe Yu). - Optimisation du layout de
MemoryTracker, avec un gain de performances d’environ 25 %. #103464 (Azat Khuzhin). - Réécriture des prédicats
coalesce(a, b, ...) <op> constetifNull(a, b) <op> constavant l’analyse des index, afin que la clé primaire par colonne et les skip indexes sur chaque argument puissent élaguer les granules. Contrôlé par le nouveau paramètreallow_key_condition_coalesce_rewrite(activé par défaut). #103468 (Manuel). - Amélioration significative des performances des requêtes lors de la lecture de catalogs Iceberg avec de gros fichiers de métadonnées JSON grâce à l’optimisation du traitement des slashs échappés. #103998 (Mohaidoss).
- Évite le surcoût de l’index uncompressed cache lorsque le cache est désactivé (paramètre serveur
index_uncompressed_cache_size = 0, valeur par défaut). #104063 (Michael Kolupaev). - Correction des requêtes
ORDER BY ... LIMITavec une petite limite qui lisaient un nombre excessif de granules lorsqu’elles étaient combinées avec un filtreWHEREpeu sélectif. Auparavant, tout filtre au-dessus d’une lecture dans l’ordre désactivait le découpage des tâches par plage de marques, de sorte que le pipeline ne pouvait pas annuler entre les granules et lisait la part entière pour chaque flux. #104112 (Vladimir Cherkasov). - Correction de l’absence de réutilisation du cache des tailles de hash table après réordonnancement des côtés du JOIN. #104131 (Nikita Taranov).
- Lorsque
fsync_after_insertest activé, le fsync des fichiers de part est désormais effectué en parallèle via l’IO thread pool, ce qui accélère la finalisation des insertions sur les wide tables. Le chargement complet de ClickBenchhitsest environ 22 % plus rapide. #104137 (Alexey Milovidov). - Vectorisation de
find_first_symbols,find_first_not_symbols,find_last_symbols_or_null,find_last_not_symbols_or_nulletsplitIntosur AArch64 à l’aide de NEON. Auparavant, ces helpers n’avaient un chemin SIMD que sur x86 (SSE2 / SSE4.2) et retombaient sur une boucle scalaire sur ARM. Accélère le parsing TSV d’environ 2x, les fonctions d’URL etsplitByChard’environ 1,3x sur le dataset ClickBenchhits; le parsing de JSON très denses (cadence de champs inférieure à 16 octets) régresse légèrement, conformément au compromis SSE2 existant. #104228 (Alexey Milovidov). - La lecture de données via une colonne
ALIAStriviale (par ex.some_alias['key']oùsome_alias ALIAS m) emprunte désormais le même chemin de lecture par sous-colonne qu’une référence directe à la colonne sous-jacente, rétablissant d’importantes économies d’E/S pour les colonnes aliaséesMap,Array,TupleetNullable. #104245 (Raúl Marín). - Réduction de la contention sur les verrous dans le chemin de lecture asynchrone du système de fichiers distant en rendant
AsyncReadCounterslock-free par requête. #104374 (Nikita Mikhaylov). - Plan de requête légèrement amélioré pour le scan ordonné des projections. #103723 (Mikhail Artemenko).
- Extension de
optimizeUseNormalProjectionspour gérer également un cas spécifique où rien n’était filtré, mais où la clé de tri de la projection peut supprimer l’étape de tri du plan de requête. #104680 (Mikhail Artemenko). - Permet au sucre syntaxique
json.path[]et aux indications de type explicites de fonctionner correctement sur des pathsJSONtypés. #99179 (Pavel Kruglov). - Optimise
json.path[N].nested.path(qui se développe entupleElement(tupleElement(json.path[N], 'nested'), 'path')) enjson.path[].nested.path[N], ce qui permet de lire beaucoup moins de données. #99802 (Pavel Kruglov). - Optimise les vérifications d’accès
SHOW TABLESdanssystem.partsen déplaçant les vérifications de grants au niveau de la base de données hors de la boucle sur les tables. #100860 (Shaohua Wang). - Supprime une vérification d’accès
SHOW TABLESredondante par table dans la voie rapideSELECT name/SELECT database, namedesystem.tables. #100881 (Shaohua Wang). - Active la compilation JIT sur macOS. #100947 (Alexey Milovidov).
- Évite de différer la policy de ligne après
FINALlorsqu’elle dépend uniquement des colonnes de clé de tri et qu’elle est déterministe, et évite aussi le reportPREWHEREcorrespondant qu’elle imposait dans ce cas. #102884 (Yarik Briukhovetskyi). - Ajoute la prise en charge de
hasAnyethasAllcomme prédicats de filtre dans les index de texte. #103266 (Anton Popov). - Redirige l’état du tas MergeTree de longue durée de vie (métadonnées par part et par table) vers une arena jemalloc dédiée, exposée via les métriques asynchrones
jemalloc.mergetree_arena.*. Réduit la fragmentation de l’arena par défaut en régime stabilisé et évite que les survivants par part n’immobilisent des pages qui pourraient autrement expirer. #104136 (Raúl Marín). - Améliore la gestion des timeouts du client ZooKeeper sous forte charge lorsque de nombreuses requêtes sont pipelinées sur une seule session. Le client ZooKeeper utilise désormais un timeout basé sur la progression : tant que des données sont reçues du serveur dans
session_timeout_ms, l’attente est prolongée. Un plafond strict de3 * session_timeout_mspar requête continue de borner la latence côté appelant. Ferme #100466. #104351 (Antonio Andelic). - Déplace les indicateurs de trace par événement dans un tableau séparé et les alloue à la demande, réduisant ainsi le surcoût du tracing
ProfileEvents. #105030 (Azat Khuzhin). - Ajoute
compareTrackAtpourColumnDecimal, ce qui améliore les performances de comparaison des colonnesDecimal. #105110 (Artem Zuikov). - Ajoute une implémentation SIMD de
MD5(AVX2/AVX512) qui calcule le hash de plusieurs entrées en parallèle, améliorant ainsi le débit. #105161 (Joanna Hulboj).
Amélioration
- Amélioration de la sortie d’aide de toutes les applications ClickHouse :
--helprenvoie désormais systématiquement le code de sortie0, affiche sa sortie surstdout, etclickhouse --helpau niveau racine liste toutes les sous-commandes. Ajout d’une option--no-sudopourclickhouse start/restart(utile dans Docker), ainsi que d’une sous-commandeclickhouse help. Suite de #58244 par @qoega. #98148 (Alexey Milovidov). - La valeur par défaut de
input_format_column_name_matching_modepasse dematch_caseàauto. Les formats d’entrée qui font correspondre les noms de colonnes en entrée au schéma de la table (JSONEachRow,CSVWithNames,JSONColumns,BSONEachRow,RowBinaryWithNames, etc.) tentent désormais d’abord une correspondance sensible à la casse, puis basculent vers une correspondance insensible à la casse si aucune correspondance sensible à la casse n’est trouvée. Le comportement strict précédent est conservé souscompatibility. #104320 (Alexey Milovidov). - Ajout de
STDDEVcomme alias insensible à la casse destddevSamppour la compatibilité PostgreSQL/standard SQL. #105120 (Alexey Milovidov). - Ajout de
array_to_stringcomme alias insensible à la casse dearrayStringConcatpour la compatibilité PostgreSQL. #105121 (Alexey Milovidov). - Ajout de
unnestcomme alias insensible à la casse dearrayJoinpour la compatibilité PostgreSQL (forme d’appel de fonction). #105124 (Alexey Milovidov). - La barre de progression de
clickhouse-clientaffiche désormais, à côté de la RAM, les données temporaires utilisées sur disque (par ex. pour le tri externe, l’agrégation ou JOIN), avec en plus une ventilation par hôte pour les requêtes distribuées. #105190 (Alexey Milovidov). - Ajout de
system.predicate_statistics_log, un nouveau journal échantillonné de la sélectivité des filtres de prédicat et de l’élagage des granules d’index MergeTree par requête. Désactivé par défaut ; à activer via le paramètre serveurpredicate_statistics_sample_rate. Nécessaire pour les recommandations automatiques d’index et de projections. #98727 (Yarik Briukhovetskyi). - Autorise l’omission du shard local lorsqu’une table est manquante et que
skip_unavailable_shardsest activé. #100141 (Alexey Milovidov). - Ajout d’avertissements au démarrage (visibles dans
system.warnings) lorsqu’un ensemble mdraid Linux est en cours de resynchronisation ou se trouve dans un état dégradé, car ces deux situations peuvent affecter les performances des E/S disque ou indiquer des défaillances de disque. #100941 (Alexey Milovidov). - Les UDFs WASM apparaissent désormais dans
system.functionsavec les colonnesorigin(WasmUserDefined),syntax,argumentsetreturned_valuecorrectement renseignées à partir de leurs métadonnées de type ClickHouse. Auparavant, elles étaient soit absentes, soit listées en double avec une origine incorrecte. #101053 (Vasily Chekalkin). - La fonction de table
generate_seriesprend désormais en charge des valeurs de pas négatives pour générer des séquences décroissantes, par ex.SELECT * FROM generate_series(99, 0, -1). #101056 (Alexey Milovidov). - Correction des exceptions
Context has expiredlevées par certaines fonctions (dotProduct,formatRow,structureToCapnProtoSchema/structureToProtobufSchema, fonctions définies par l’utilisateur) lorsqu’elles sont utilisées dans des chemins d’exécution différée, tels que les expressionsDEFAULT/MATERIALIZEDet les paramètres du moteur de table, en veillant à ce que ces fonctions conservent une référence forte au contexte lorsque nécessaire. #101109 (Alexey Milovidov). - Correction d’erreurs logiques
Cache limits violatedintempestives sur des priorités créées avec des limites à zéro (comme la priorité du filesystem cache par requête utilisée lorsqueenable_filesystem_query_cache_limitest activé). #101428 (Alexey Milovidov). - Détection automatique de la région pour les endpoints
s3express. #101520 (Pradeep Chhetri). - Prise en charge des identifiants de champ pour les data files lors des écritures
Iceberg. Clôt #102322. #102362 (Konstantin Vedernikov). - Le panneau de gauche de la web UI (
play.html) défile désormais indépendamment, reste visible lorsque la page défile, et un clic sur une table fait défiler jusqu’à la zone de requête. #102498 (Alexey Milovidov). - Permet d’ouvrir l’interface Play dans un nouvel onglet via Ctrl/Cmd/Shift+clic ou clic du milieu sur le logo ClickHouse dans le panneau de gauche. #102501 (Alexey Milovidov).
- Nouvelles metrics pour suivre la mémoire utilisée par les primary keys des projections et l’index granularity des projections sur l’ensemble des tables. #102587 (Narasimha Pakeer).
- Application de
max_network_bandwidth_for_useretmax_network_bandwidth_for_all_usersaux lectures/écritures sur remote filesystem. #103080 (Azat Khuzhin). - Amélioration de la résilience des backups lorsque les Refreshable Materialized Views sont constamment rafraîchies, en prenant les décisions à partir de l’état instantané des tables plutôt que d’un état global. #103384 (Nikita Mikhaylov).
SELECT * FROM system.databasesrépertorie désormais toujours les databases du data lake catalog, indépendamment du paramètreshow_data_lake_catalogs_in_system_tables. Auparavant, elles étaient masquées par défaut, ce qui était incohérent avecSHOW DATABASES, qui les affichait toujours. #103444 (Alsu Giliazova).- Alignement de la valeur par défaut du server setting
concurrent_threads_soft_limit_ratio_to_coresdans le code sur la valeur fournie dansconfig.xml(2), afin que le scheduler de threads concurrentmax_min_fairpar défaut limite les threads de query processing à 2x le nombre de cœurs dès le départ, même lorsque leconfig.xmlfourni n’est pas utilisé. #103446 (Alexey Milovidov). - Robustesse améliorée du sanitizer dans le parser et dans certains cas limites des fonctions de chaîne, grâce à la gestion des entrées vides dans
getURLScheme, à l’évitement de l’arithmétique sur pointeur nul dans les vérificationsmax_query_sizedeLexer::nextToken, et à l’arrêt anticipé de l’évaluation de sous-séquence UTF-8 sur des haystacks vides avant le décodage. #103489 (Yakov Olkhovskiy). - Amélioration de la justesse de l’inférence de monotonie pour
divide(0, x)etintDiv(0, x): auparavant, ces fonctions étaient systématiquement considérées comme monotones, alors que0 / xn’est pas monotone sur tout intervalle incluant 0, car0 / 0n’est pas défini (NaN/Infpourdivide, exception de division par zéro pourintDiv). Cette hypothèse erronée amenaitKeyCondition::applyMonotonicFunctionsChainToRangeà produire des intervalles avecleft > right, ce qui déclenchait uneLOGICAL_ERRORInvalid binary search result in MergeTreeSetIndexdans les builds de débogage lorsqu’une expressionIN/NOT INsur la clé primaire encapsulait la clé dansdivide(0, key)ouintDiv(0, key). Les builds de release n’étaient pas affectés — l’assertion est conditionnée par#ifndef NDEBUG. #103621 (Groene AI). - Remplacement des métriques asynchrones
HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95}par un histogramme à bucketshttp_pool_tcp_buf_bytes(labelsgroup,direction) danssystem.histogram_metrics. Les métriques asynchrones de total par groupe sont conservées. #103704 (Sema Checherinda). - Les paramètres du serveur
{disk,storage,http}_connections_{rcvbuf,sndbuf}sont désormais indiqués comme modifiables sans redémarrage danssystem.server_settings. Leurs valeurs peuvent être mises à jour viaSYSTEM RELOAD CONFIG; le mécanisme d’application à l’exécution était déjà en place depuis #100478. #103772 (Sema Checherinda). - Ajout de la prise en charge des symboles résolus (
Array(String)) dansflameGraph. #103816 (Azat Khuzhin). - Le client CLI peut désormais spécifier
<rainbow_parentheses>false</rainbow_parentheses>dans sa config, dans les environnements où les couleurs du terminal nuisent à la lisibilité des parenthèses (de même,clickhouse formatprend désormais en charge--no_rainbow_parentheses). #103851 (Larry Snizek). - Correction de la recherche UTF-8 insensible à la casse dans
MultiVolnitskyen annulant les insertions partielles deputNGramen cas d’échec et en basculant les needles en échec vers des searchers de repli, afin d’éviter un état incohérent. #103864 (Yakov Olkhovskiy). - Implémentation de
sched_getcpuviarseqTLS dans musl avec compatibilité glibc. #104016 (Azat Khuzhin). - Une refreshable materialized view Replicated en mode APPEND ne sera plus rafraîchie deux fois si la connexion à ZooKeeper est brièvement perdue pendant le rafraîchissement. #104051 (Michael Kolupaev).
- Les tables Distributed sans liste de colonnes explicite peuvent désormais valider les clés de sharding par rapport à la structure inférée de la table distante. #104111 (Yue).
- Correction du REST catalog avec le path
Azureabfss. #104120 (Konstantin Vedernikov). - Les paramètres d’authentication
role_arnetrole_session_namesont désormais pris en compte dans le client de snapshot S3 de Keeper, ce qui permet aux téléversements de snapshots d’utiliser une authentication STS basée surAssumeRole. #104140 (Alexey Milovidov). - Corrige une fuite de mémoire lors de l’exécution de requêtes avec des CTE
MATERIALIZED. #104153 (Alexey Milovidov). - Corrige l’exception
lowerUTF8/upperUTF8lors du traitement de grands jeux de données non ASCII (p. ex. lors de la création d’index de texte), lorsque le tampon de sortie accumulé dépasse 2 GiB ; rejette les lignes individuelles excessivement longues avec un message d’erreur clair. #104229 (Shaohua Wang). - Renforce le chargement des statistiques de colonnes de MergeTree face aux défaillances d’E/S transitoires afin d’éviter la désactivation permanente des optimisations fondées sur les statistiques pour les parts affectées. #104372 (zoomxi).
INSERT INTO ... SELECT FROM input(...)ne nécessite plus le grantCREATE TEMPORARY TABLE. #104470 (Alexey Milovidov).- Ajoute un nouveau paramètre MergeTree
concurrent_part_removal_threshold_for_remote_disk(par défaut16), utilisé à la place deconcurrent_part_removal_thresholdlorsqu’au moins une part en cours de suppression est stockée sur un disk distant. Le seuil précédent de100pouvait faire en sorte queDROP TABLEet d’autres opérations de suppression de parts sur des backends d’object storage restent bloqués pendant des dizaines de secondes, car les suppressions étaient effectuées en série alors que chacune correspond à un aller-retour réseau distinct. Le nouveau paramètre fait emprunter bien plus tôt le chemin de suppression en parallèle sur le stockage distant, tout en laissant inchangé le comportement sur disk local. #104676 (Groene AI). - Le nouveau paramètre
defer_partition_pruning_after_final(par défaut1) permet de désactiver le comportement introduit en 26.3 consistant à ne pas appliquer le partition pruning sousFINAL. Définissez-le sur0pour rétablir le partition pruning d’avant la version 26.3 — nettement plus rapide sur les workloads de journaux d’événements où les lignes ayant la même PK ne peuvent pas s’étendre sur plusieurs partitions.compatibility = '26.2'le bascule automatiquement à0. #104705 (Nikita Fomichev). - Corrige
intExp2, qui renvoyait des résultats erronés pour les entrées hors plage (shifts>= 64sous JIT, et entiers dont la valeur absolue dépasseINT_MAXsur les deux chemins de code). #105054 (Raúl Marín). - Met entre guillemets les arguments shell construits à partir des options CLI et des entrées analysées dans
clickhouse installetclickhouse git-import, afin que les paths, les noms d’utilisateur/groupe et les hashes de commit contenant des espaces ou des métacaractères shell soient correctement gérés. #105232 (Raúl Marín). - Le table engine
Aliasn’est désormais plus Experimental et est disponible sans le paramètreallow_experimental_alias_table_engine. #103488 (Alexey Milovidov). - Ajoute l’option
--queries-formatàclickhouse-benchmarkpour choisir entre le format d’entrée par défaut, avec échappement des tabulations et une requête par ligne (tsv), et l’analyse de l’entrée standard comme un script contenant plusieurs requêtes séparées par;(script). #99972 (Aleksandr Musorin). - Les opérateurs de Tuple appliqués élément par élément
tuplePlus,tupleMinus,tupleMultiply,tupleDivide,tupleModulo,tupleIntDivettupleIntDivOrZerosont désormais variadiques et acceptent deux tuples ou plus de même taille, avec une application élément par élément selon un left-fold. Auparavant, ils n’acceptaient que deux arguments exactement. #104659 (Aruj Bansal). - Ajout d’une nouvelle interface web intégrée à
/processors-profilequi visualise sous forme de carte de chaleur le pipeline de toute requêteSELECTpassée, à partir desystem.query_logetsystem.processors_profile_log. Chaque processeur est coloré en fonction de sonelapsed_uset affiche, au survol, des statistiques par processeur (lignes, octets, temps d’attente). #104614 (Nikita Mikhaylov). - Le réglage
query_plan_use_logical_join_step(et son aliasquery_plan_use_new_logical_join_step) est désormais obsolète et n’a plus aucun effet ; l’étape de jointure logique est désormais toujours utilisée. #104017 (Vladimir Cherkasov). - Le champ de saisie
userdansplay.htmlet les autres pages web intégrées (dashboard.html,jemalloc.html,merges.html,binary.html,webterminal.html) n’est plus prérempli avec le texte littéraldefault. Il affiche désormais un texte indicatifuseret reste vide par défaut. Lorsqu’il est laissé vide, la page n’envoie pas de paramètre d’URLuser=(et le JSON d’authentification de WebTerminal omet le champuser) ; le serveur applique donc son comportement habituel de repli vers l’utilisateurdefault, et les identifiants HTTP fournis par d’autres canaux (X-ClickHouse-User, HTTP Basic, configuration<handler><user>propre au handler) ne sont plus écrasés. #105254 (Alexey Milovidov). - Lecteur
ORC: dissociation de la lecture basée sur les offsets (readBigAt) deuse_prefetch, afin que les données encodées EC surHDFSpuissent être lues correctement même lorsqueuse_prefetch = false(par exemple par Gluten). #103348 (zhanglistar). - Les fichiers téléchargés depuis
play.htmlau formatCSVWithNamesutilisent désormais l’extension.csv. #103737 (JackFielding). - Validation des entrées renforcée pour le catalogue BigLake. #105117 (Konstantin Vedernikov).
Correction de bug (dysfonctionnement visible par l’utilisateur dans une version stable officielle)
- Corrige le formatage incohérent en mémorisant si une expression était entre parenthèses. #92340 (Alexey Milovidov).
- Corrige la justesse de la comparaison entre les types Decimal et Float. #94293 (zoomxi).
- Autorise les arguments positionnels dans les requêtes distribuées. #94359 (simonmichal).
- Corrige un échec d’assertion dans
DatabaseCatalog::updateDependencieslors de la suppression puis de la recréation d’une vue matérialisée portant le même nom ; corrige également la perte silencieuse des dépendances de vue lors deRENAME TABLEouEXCHANGE TABLESlorsque les dépendances référentielles étaient vides. #98779 (Alexey Milovidov). - Corrige un arrêt du serveur (échec d’assertion dans
DatabaseCatalog::getTableImpl) qui survenait lors de la création d’une table viaON CLUSTERavec un UUID identique à celui d’une base de données existante. #98861 (xiaohuanlin). - Corrige l’utilisation des skip indexes lors de la lecture des données (avec le paramètre
use_skip_indexes_on_data_readactivé) et des patch parts existantes créées par des lightweight updates. #99543 (Alexey Milovidov). - Corrige l’exception “Not-ready Set” lorsqu’un filtre avec
IN (subquery)est déplacé vers PREWHERE par l’optimiseur de requêtes. #100375 (Alexey Milovidov). - Corrige l’erreur “Cannot find column” lors de l’utilisation conjointe de
ADD COLUMNetRENAME COLUMNdans une même instructionALTER TABLE. #100387 (Alexey Milovidov). - Corrige les vues mêlant les opérateurs
UNIONetINTERSECT/EXCEPT, qui renvoyaient des résultats incorrects aprèsDETACH/ATTACHou un redémarrage du serveur. #100390 (Alexey Milovidov). - Corrige l’exception “Trying to execute PLACEHOLDER action” qui pouvait survenir lors de tests de charge avec l’AST fuzzer lorsqu’une sous-requête corrélée apparaissait dans une clause IN. #100398 (Alexey Milovidov).
- Corrige une exception de type logical error lors de l’insertion dans une table Iceberg avec une colonne
Datepartitionnée par les transformationsyear,monthouday. #100404 (Alexey Milovidov). - Corrige l’utilisation d’un skip index avec des données incompatibles après qu’un
ALTER TABLE MODIFY COLUMNa modifié le type de la colonne, ce qui pouvait provoquer des plantages du serveur dans les builds avec sanitizer ou des résultats de requête incorrects. #100526 (Alexey Milovidov). - Corrige une fuite d’identifiants dans
query_logpour les table functionspaimonCluster,paimonS3Cluster,paimonAzureClusteretdeltaLakeS3. #100529 (JIaQi Tang). - Corrige le risque que
DROP TABLEsur des tables du moteur Kafka reste bloqué indéfiniment en raison d’un interblocage dansrd_kafka_consumer_close. #100604 (Alexey Milovidov). - Remplace la liste
source_table_enginescodée en dur par une résolution à l’exécution viaStorageFactoryetDatabaseFactory. Ajoutesource_access_typeàDatabaseFactory::EngineFeaturesafin queCREATE DATABASEavec des moteurs source (PostgreSQL, MySQL, S3, etc.) exige les mêmes droits d’accès aux sources queCREATE TABLE. Corrige le cas oùGRANT TABLE ENGINE ON *échouait avectable_engines_require_grant=false. Clôt #71544. #100746 (pufit). - Corrige un crash du serveur lors de la lecture d’une table dont la colonne
ALIAScontenait une sous-requête corrélée imbriquée dans un appel de fonction (par ex.ALIAS toString(intDivOrZero(x, (SELECT ...)))).CREATE TABLEetALTER TABLErejettent désormais toute sous-requête, à n’importe quelle profondeur, dans les expressions de colonneDEFAULT/ALIAS/MATERIALIZED, avecTHERE_IS_NO_DEFAULT_VALUE. Auparavant, la validation superficielle acceptait les sous-requêtes imbriquées, si bien que le cas corrélé provoquait un crash à la lecture et que le cas imbriqué non corrélé semblait fonctionner, mais pouvait entraîner un comportement inattendu ; les deux sont désormais rejetés au moment du DDL. #100753 (Groene AI). - Corrige un crash du serveur (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode) pouvant se produire lors de l’utilisation de requêtes avec des sous-requêtes corrélées sur des tables ayant des définitionsCONSTRAINT ... ASSUME, lorsque les paramètresoptimize_substitute_columnsetconvert_query_to_cnfsont activés. #100756 (Groene AI). - Corrige une exception pouvant se produire lors de l’insertion d’une ligne dans une colonne JSON, lorsque la ligne introduisait un nouveau champ dynamique en parallèle d’un champ typé avec une valeur incompatible, puis que la colonne était utilisée comme clé de GROUP BY. #100758 (Jimmy Aguilar Mena).
- Corrige le contournement silencieux de l’ordonnancement des E/S des workloads pour les écritures vers S3 / le stockage objet passant par le chemin
DiskObjectStorageTransaction(utilisé par les disquess3_with_keeperet explicitement lorsqueuse_fake_transaction=false). Auparavant, les écritures INSERT dans des tables MergeTree sur ces disques ignoraient la limitationCREATE RESOURCE/CREATE WORKLOAD, car le lien vers la ressource n’était jamais injecté dansWriteSettingspour le chemin d’écriture transactionnel. #100777 (JIaQi Tang). - Corrige une collision du cache de schéma partagé entre
ProtobufetProtobufList: lire d’abord un message au formatFORMAT Protobuf, puis au formatFORMAT ProtobufList, pouvait échouer, carProtobufListforçait le schéma mis en cache vers sa forme enveloppe.ProtobufListretombe désormais sur le type de message mis en cache lorsqu’aucun schéma d’enveloppe n’est disponible. #100849 (Callum Cooper). - Corrige un heap-buffer-overflow dans le pont Rust CXX dû à une incompatibilité d’ABI de
std::exception. #100931 (Azat Khuzhin). FunctionVariantAdaptorlève désormaisILLEGAL_TYPE_OF_ARGUMENTlorsque toutes les alternativesVariantsont incompatibles avec une fonction, au lieu de renvoyer silencieusementNullable(Nothing). Auparavant, un prédicatWHERE function(variant_col)dans lequel aucun type alternatif n’était compatible renvoyait 0 ligne sans erreur, tandis que le contexteSELECTéquivalent levait déjà correctement une erreur. #100939 (Vasily Chekalkin).TRUNCATE ALL TABLESn’échoue plus lorsque la base de données contient des vues. #100943 (Alexey Milovidov).- Corrige l’optimisation
optimize_rewrite_array_exists_to_hasafin de gérer correctement les cas d’incompatibilité de type (par ex. Date vs String) et la réactive par défaut. #100944 (Alexey Milovidov). - Corrige la priorité des paramètres S3 afin que les paramètres de disque de
storage_configurationremplacent la section globale<s3>, et que les paramètres au niveau utilisateur/profil/requête remplacent les deux. #100975 (Alexey Milovidov). - Corrige la sérialisation sparse qui perdait le signe du zéro négatif (-0.0) pour les colonnes BFloat16, Float32 et Float64. #100983 (Takumi Hara).
- Corrige deux bugs dans l’analyseur de géométrie WKT utilisé lors de la lecture de fichiers GeoParquet et Arrow encodés en WKT : les géométries
MULTILINESTRINGétaient incorrectement analysées commePolygon(ce qui provoquait une exception pour les typed columns et une corruption silencieuse des données pour les colonnesGeometrymixtes), et une chaîne WKT mal formée sans mot-clé de type déclenchait un comportement indéfini au lieu d’une erreur propre. #100997 (Vasily Chekalkin). - Corrige les requêtes
grouping/GROUPING SETSsur des tables Distributed avec un seul shard qui échouaient avec “Method executeImpl is not supported for ‘grouping’ function”. #101030 (Alexey Milovidov). - Corrige
LOGICAL_ERROR“Column identifier is already registered” dans le planificateur, qui pouvait survenir lorsque la même expression de table était traitée plusieurs fois. #101048 (Alexey Milovidov). - Corrige l’exception LOGICAL_ERROR “Column identifier is already registered” lorsque le paramètre
additional_result_filterest utilisé avec des requêtes UNION ou EXCEPT. #101051 (Alexey Milovidov). - Corrige un crash du serveur (Logical error: Bad cast from ColumnVector to ColumnNullable) lors de l’utilisation de
* APPLYavec des fonctions d’agrégation etgroup_by_use_nulls=1avec GROUPING SETS, ROLLUP ou CUBE. #101062 (Groene AI). - Corrige une boucle infinie lorsque
input_format_csv_skip_first_linesouinput_format_tsv_skip_first_linesdépasse le nombre de lignes du fichier. #101111 (Alexey Milovidov). - Corrige un accès hors limites dans l’optimisation de lazy materialization, qui pouvait provoquer une exception dans les versions de débogage. #101144 (Alexey Milovidov).
- Corrige l’inférence de type dans les CTE récursives : les types de colonnes sont désormais élargis itérativement via
getLeastSupertypeentre les parties non récursive et récursive duUNION ALLjusqu’à convergence, évitant ainsi un dépassement d’entier dans des expressions telles quex + 1. #101155 (Alexey Milovidov). - Limite à 256 MiB les paramètres de taille de bloc de compression MergeTree (max_compress_block_size, min_compress_block_size, marks_compress_block_size, primary_key_compress_block_size) afin d’éviter un crash du serveur lorsque des valeurs extrêmes sont définies via CREATE TABLE SETTINGS. #101159 (Groene AI).
- Corrige un crash LOGICAL_ERROR dans
QueryAnalyzer::resolve()lorsqu’une ROW POLICY utilise une sous-requête scalaire dans sa clauseUSING(par ex.USING (SELECT 1)). Clôt #100695. #101263 (Groene AI). - Corrige un comportement indéfini dans
MergeTreeDataPartWriterCompact::cancellorsqu’une allocation de stream échoue. #101292 (Alexey Milovidov). - Corrige un cas où le fuseau horaire n’était pas inclus lors de l’affectation dans l’instruction ALTER. Clôt #101328. En lien avec https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
- Corrige un crash du serveur (LOGICAL_ERROR) pour les requêtes INSERT SELECT avec ORDER BY ALL lorsque le pipeline SELECT produit plusieurs streams. #101443 (Groene AI).
- Corrige des résultats de requête incorrects causés par le réordonnancement des join, qui poussait un filtre de INNER JOIN (ne référant que le côté préservé d’un outer join) dans la clause ON de l’outer join. #101504 (Vladimir Cherkasov).
- N’applique pas la lazy materialization pour les plans avec arrayJoin, ce qui pouvait empêcher le respect de la limit. Clôt #101608. #101644 (Vladimir Cherkasov).
- Corrige des résultats de requête JOIN incorrects lorsque l’optimisation
mergeFilterIntoJoinConditionsupprimait silencieusement une condition d’égalité WHERE avec des types incompatibles. #101652 (Xiaozhe Yu). - Corrige l’indice de test
error, qui ne fonctionnait pas pour les erreurs de syntaxe/d’analyse — auparavant,-- { error SYNTAX_ERROR }sur une requête mal formée échouait avec “Expected server error” au lieu de correspondre à l’erreur d’analyse côté client. #101675 (Groene AI). - Corrige le fait que
INTO OUTFILE ... TRUNCATEn’utilisait pas réellement un renommage atomique — l’écriture se faisait directement dans le fichier d’origine au lieu d’un fichier temporaire, si bien qu’en cas d’échec de la requête, le contenu d’origine était détruit. Désormais, les données sont écrites dans un fichier temporaire, puis renommées uniquement en cas de succès. #101884 (Pablo Marcos). - Corrige une exception
Unsupported DeltaLake type: varchar(n)lors de la lecture de tables Delta Lake dont le schéma contient des types de colonnes varchar(n) ou char(n). Ces types sont désormais mappés vers String, conformément à la manière dont le protocole Delta Lake les stocke sous forme de simples tableaux d’octets dans Parquet. #101973 (Flavio Malavazi). - Corrige une perte silencieuse de données lors de la lecture d’archives tar depuis S3 avec
schema_inference_mode=unionet des schémas Parquet hétérogènes — le parquet metadata cache réutilisait à tort les metadata du premier fichier pour tous les fichiers suivants de l’archive. #101990 (Ahaan Limaye). - Corrige un crash du serveur (LOGICAL_ERROR) lors de l’exécution de ALTER TABLE UPDATE/DELETE sur des tables Iceberg lorsqu’aucun SELECT ou INSERT n’avait été exécuté au préalable sur la table pendant la même durée de vie du serveur. #102113 (Alexey Milovidov).
- Corrige un possible crash lorsqu’une requête ALTER est exécutée sur des tables d’une base de données en mémoire (par ex. des tables temporaires). #102360 (Den Kalantaevskii).
- Correction de
formatQuery, qui produisait des grants dupliqués tels queGRANT FILE ON *.*, FILE ON *.* TO xau lieu deGRANT FILE ON *.* TO x, lors du formatage de grants READ/WRITE rétrocompatibles sur la même source. #102411 (Groene AI). - Corrige une perte de parallélisme pour l’agrégation après des requêtes
read-in-orderlorsquemax_streams_to_max_threads_ratioest supérieur à 1. #102467 (Alexey Milovidov). - Correction d’un crash (
LOGICAL_ERROR: Unknown virtual column) lors de la sélection de sous-colonnes (comme.nullpour Nullable,.size0pour Array, des éléments de tuple ou des clés/valeurs de map) depuis une table utilisant le table engine Buffer. #102470 (Groene AI). - Corrige l’exception “Cannot fold actions for projection” dans l’optimisation du réordonnancement des jointures lorsqu’un LEFT/RIGHT JOIN avec
join_use_nullsest combiné à d’autres jointures impliquant plus de deux tables. #102516 (Alexey Milovidov). - Correction d’un overflow silencieux dans les opérations scalaires pointwise sur numericIndexedVector (par ex.
numericIndexedVectorPointwiseAdd) lorsque le scalaire est hors plage. Ces entrées lèvent désormaisINCORRECT_DATAau lieu de renvoyer des valeurs corrompues. #102546 (FriendLey). - Corrige un formatage AST incohérent pour INSERT avec SAMPLE et OFFSET au niveau de la requête. Clôt #102523. #102547 (zoomxi).
- Corrige l’exception
LOGICAL_ERRORdansgroupConcatlors de la désérialisation d’un état de fonction d’agrégation malformé. #102558 (Christoph Wurm). - Désormais, les caractères parasites en fin de valeurs CSV Time64 ne sont plus acceptés avec
input_format_csv_use_default_on_bad_values=0. Clôt #102490. #102596 (Yarik Briukhovetskyi). - Corrige l’exception UNKNOWN_ELEMENT_OF_ENUM lors de l’insertion de la valeur par défaut dans une colonne JSON avec des paths typés Enum. Clôt #102359. #102687 (Pavel Kruglov).
- Corrige la corruption de columns_substreams.txt lors du renommage d’une colonne dans certains cas. Clôt #102259. #102689 (Pavel Kruglov).
- Corrige l’insertion dans le type de données Time lors du parsing JSON. Clôt #102016. #102690 (Pavel Kruglov).
- Corrige l’encodage hexadécimal de l’échantillon de contenu dans les noms de fichiers de schéma mis en cache. Clôt #101904. #102703 (Pavel Kruglov).
- Correction d’une violation de l’ordre de tri (crash en débogage, corruption silencieuse des données en release) lors d’une fusion
SummingMergeTreelorsque la cléORDER BYest une expression de hachage sur une colonneFloat32contenant des valeurs NaN de signalisation. #102791 (Groene AI). - Rend
DETACH DATABASE ... SYNCet d’autres opérations qui appellentwaitDetachedTableNotInUseannulables viaKILL QUERYet réactives à l’arrêt du serveur, évitant ainsi des blocages indéfinis lorsqu’une requête concurrente conserve une référence à une table. #102804 (Antonio Andelic). - Correction d’un résultat potentiellement incorrect pour
ANY RIGHT JOIN. #102893 (Nikita Taranov). - Correction de l’échec des requêtes S3 avec
ios_base::clear: unspecified iostream_category errorau lieu d’être retentées, en raison du fait que PocoBufferedStreamBuf::flushBufferne gérait pas les écritures partielles depuis la couche socket. #102894 (Sema Checherinda). - Correction de l’échec de la fonction de table
input('auto')via l’interface HTTP dans les requêtes INSERT SELECT. #102902 (Miсhael Stetsyuk). - Désactivation de l’optimisation triviale LIMIT avec les politiques de lignes/additional_table_filters (pour permettre une analyse d’index parallèle). #102921 (Azat Khuzhin).
- Masque la clé secrète dans la fonction SQL
HMAC. Correction de #102927. #102997 (Mikhail f. Shiryaev). - Correction de l’exception
MULTIPLE_EXPRESSIONS_FOR_ALIASlevée sur des requêtes distribuées qui référencent plusieurs fois le même appel àquantile(par ex. dansSELECT,HAVINGetORDER BY) avecoptimize_syntax_fuse_functionsactivé. #103014 (tanner-bruce). - Corrige un cas détecté par la CI où un set non prêt était transmis lorsque le filtre dépend de la colonne de gauche. Clôt #102966. #103029 (Yarik Briukhovetskyi).
- Correction de castOrNull vers JSON dans certains cas. Clôt #101818. #103036 (Pavel Kruglov).
- Correction de
SELECT DISTINCTqui renvoyait silencieusement des résultats incomplets lorsqu’une projection agrégée correspondait à la requête et que certaines parties de la table n’avaient pas de données de projection (par ex. la projection avait été ajoutée à une table contenant déjà des données, etMATERIALIZE PROJECTIONn’avait pas été exécuté). Clôt #102951. #103052 (Nihal Z. Miaji). - Correction de l’exception
TOO_FEW_ARGUMENTS_FOR_FUNCTIONlorsqu’un prédicatWHEREtel queAND(OR(A, A), A)se réduit à un seul argument de premier niveau lors de l’extraction des expressions communes dans l’analyseur. #103072 (Peng). - Correction de l’erreur logique
Function writeSlice expects same column types for GenericArraySlice and GenericArraySinkdéclenchée lors de l’évaluation deif/ifNullsur des tuples, des maps ou des arrays contenant un élémentQBit.ColumnQBit::structureEqualscomparait à tort le tuple interne d’une colonneQBità l’enveloppe externe de l’autre, si bien que des colonnesQBitstructurellement identiques étaient considérées comme différentes. #103084 (Groene AI). DETACH DATABASEavecdatabase_atomic_wait_for_drop_and_detach_synchronouslyrespecte désormaisKILL QUERYau lieu de rester bloqué indéfiniment lorsqu’une référence à une table est conservée. #103095 (Alexey Milovidov).- Correction d’un segfault lors de la suppression d’un module WASM à l’aide d’un prédicat qui n’est pas un identifiant (par ex.
WHERE 1=1). #103101 (Joe Redfern). - Correction d’une rupture de compatibilité ascendante où d’anciens clients échouaient avec
UNEXPECTED_PACKET_FROM_SERVERlors d’un insert dans un server plus récent viaremote()ou des distributed tables, en raison de l’appel inconditionnel àsendProgressà la fin deprocessInsertQuery. #103148 (Sema Checherinda). - Avec IN, un second argument tuple non constant ne doit pas CAST les éléments du tuple vers le type du membre de gauche, car cela peut provoquer un overflow. Clôt #103055. #103169 (Yarik Briukhovetskyi).
- Correction d’une utilisation de valeur non initialisée dans une fonction du protocol. #103187 (Pavel Kruglov).
- Correction de
LOGICAL_ERROR(Bad cast … to ColumnLowCardinality) lors de l’analyse d’index MergeTree lorsqu’une clauseWHEREcompare une key columnLowCardinalityà une constante cast vers un type contenant unLowCardinalityimbriqué (par exempleVariant(LowCardinality(Date), String)). #103211 (Groene AI). - Correction de
Logical error: 'index < bucket_count'dans la famille d’aggregate functionstimeSeries*ToGrid(par ex.timeSeriesResampleToGridWithStaleness,timeSeriesChangesToGrid,timeSeriesResetsToGrid,timeSeriesRateToGrid) lorsqu’elle est appelée avec des paramètres de timestamp extrêmes qui feraient déborder l’arithmétique signée sur 64 bits lors du calcul du nombre de buckets. Le nombre total de buckets de grille est également limité à 16 millions afin d’éviter des allocations mémoire accidentellement massives dues à des entrées malveillantes. #103223 (Groene AI). - Correction de l’exception
Logical error: 'Port is already connected'lors de l’expansion du pipeline dans le cheminFINALlazy deReplacingMergeTree. Le bug affectait les queries avecquery_plan_optimize_lazy_final = 1lorsqueReadFromMergeTree::initializePipelineinsérait des transformations internes (par ex. unResize) qui reliaient entre eux les processors du sous-pipeline, ce qui amenaitLazyUnorderedReadFromMergeTreeSource::expandPipelineà tenter de connecter des ports de sortie déjà connectés. #103230 (Groene AI). - Correction de résultats erronés de
LIMIT BYetDISTINCTlorsque l’entrée est unUNION ALLde subqueries triées. L’optimiseur de query plan traitait à tort une telle union comme globalement triée, ce qui entraînait le renvoi de lignes supplémentaires. #103231 (Nihal Z. Miaji). - Correction d’un crash possible lors du calcul des statistiques dans le Map type avec lazy replication. Clôt #102390. #103273 (Pavel Kruglov).
- Corrige une data race dans les sources de dictionnaires ClickHouse, MySQL, PostgreSQL et XDBC, où
clone() constlit etisModified() constécrit dans la même chaîneinvalidate_query_response. #103277 (Miсhael Stetsyuk). - Corrige une détection incorrecte de la monotonie pour
Date32. Clôt #101265. #103283 (Yarik Briukhovetskyi). - Limite à 64 KB les chaînes du paquet TCP Hello de pré-authentification et ajoute le paramètre serveur
handshake_timeout_millisecondspour limiter la durée totale du handshake, afin d’empêcher des clients non authentifiés de consommer une quantité excessive de mémoire ou de monopoliser des threads indéfiniment. #103284 (Sema Checherinda). - Corrige le cas où, dans les statistiques ColumnIndex de Parquet, min_value > max_value pour les colonnes String. #103334 (Saurabh Kumar Ojha).
- Corrige la gestion incorrecte des lignes NULL pour les entrées
Nullable(Tuple(...))dansflattenTupleettupleToNameValuePairs.flattenTuplepréserve désormais la null map externe afin que les lignes NULL restent NULL.tupleToNameValuePairschange désormais le type de valeur du résultat enNullable(T)lorsque c’est possible quand l’entrée estNullable(Tuple(...)), afin que les lignes NULL produisent[('a', NULL), ('b', NULL)]au lieu de[('a', 0), ('b', 0)]. Lorsque le type d’élément ne peut pas être encapsulé dansNullable(par exempleArray), des valeurs par défaut sont utilisées à la place de NULL. Clôt #103312. #103383 (Nihal Z. Miaji). - Vérifie les données Dynamic aplaties malformées dans le Native format. #103392 (Pavel Kruglov).
- Corrige un RPC périmé provoquant un blocage de la réplication après une synchronisation par snapshot. #103406 (Seva Potapov).
- Corrige un arrêt du serveur dû à
LOGICAL_ERROR“Cannot pop N rows from X” (dans les builds de débogage / avec sanitizer) lors de la lecture d’un document BSON malformé contenant une valeur dont le type BSON est incompatible avec le type de colonne cible dans une colonneNullable(T)ouArray(Nullable(T)). La ligne malformée produit désormais une exceptionILLEGAL_COLUMNpropre, comme prévu. #103418 (Groene AI). - Corrige un arrêt du serveur dans
arrayFilletarrayReverseFilllorsqu’ils sont appliqués à une colonneArray(String)dont la première ligne est vide, avec une lambda constante à false. La boucle aggregate / sous-tableau provoquait un underflow d’un indexsize_tversSIZE_MAX, ce qui entraînait ensuite une lecture hors limites dansColumnString::doInsertManyFrom. Même famille de bugs que #12263. #103424 (Groene AI). - Corrige les erreurs ACCESS_DENIED / UNKNOWN_TABLE dans les RMV APPEND en aval avec SQL SECURITY DEFINER lorsqu’un EXCHANGE d’un RMV REPLACE en amont bascule l’identité du stockage cible en cours de résolution. #103427 (Alexander Gololobov).
- Renseigne la colonne
_timeà partir de la fonction de tableurl. #103437 (Nikita Taranov). - Correction d’une lecture potentiellement hors limites dans le chemin de décompression du codec
ALPlors du traitement d’une entrée malformée avec une largeur de bit invalide. #103457 (Raufs Dunamalijevs). - Correction d’un bug où
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ...pouvait perdre le nom du cache lors du formatage de la requête, ce qui amenait les nœuds distants à synchroniser tous les caches du système de fichiers au lieu du seul cache demandé. #103469 (Asish Kumar). - Correction du traitement d’un chemin encodé en URL dans
deltaLakeAzure. Clôt #103509. #103525 (Smita Kulkarni). - Correction d’un heap-use-after-free lors de la multiplication d’un état
AggregateFunctionpar un entier (par ex.quantilesExactState(...) * N). La boucle d’exponentiation par dichotomie fusionnait l’état avec lui-même, ce qui n’est pas défini lorsque lemergede la fonction d’agrégation réalloue son stockage interne. Clôt STID 0988-40af. #103536 (Groene AI). - Correction d’un
LOGICAL_ERRORrare “Part X intersects previous part Y” déclenché au démarrage d’une tableReplicatedMergeTreelorsque deux parts vides inattendues sur disque avaient des plages de blocs qui se chevauchaient sans que l’une contienne l’autre. L’exception interrompait le thread d’attachement de la table et empêchait son démarrage. #103537 (Groene AI). - Correction de
Logical error: Incorrect mark rows for part ...(assertion de débogage uniquement) déclenché par des mutations sur des tablesMergeTreeavec une granularité d’index non adaptative (index_granularity_bytes = 0) dont la dernière mark de données était incomplète (cas reproduit de la manière la plus fiable viaDETACH/ATTACHsuivi d’un lightweightDELETE). #103538 (Groene AI). - Correction du cas où
clickhouse-localrenvoyait silencieusement 0 ligne lors de la lecture des pseudo-fichiers/procet/sysvia la fonction de tablefile()(par ex.SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')). #103548 (Ashrith Bandla). - Correction de la gestion de l’argument
max_string_lengthpour le moteur de tableGenerateRandom. #103550 (Alex Kuleshov). - Correction du masquage des identifiants imbriqués dans les logs. #103552 (Vitaly Baranov).
- Correction de la détection de SVE utilisant des instructions SVE lorsqu’elles ne sont pas disponibles. #103568 (Raúl Marín).
- Correction de l’analyse des arguments de stockage de
GenerateRandom. #103574 (Konstantin Bogdanov). - Correction d’une boucle infinie dans
WITH FILLpour des données commençant par ±inf. #103580 (Konstantin Bogdanov). - Corrige
JSONExtractdans un typeVariant, qui tronquait silencieusement les nombres JSON à partie fractionnaire. Auparavant,JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)')renvoyaitInt64=3etJSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)')renvoyaitInt64=3, en supprimant la partie fractionnaire. La valeur fractionnaire est désormais préservée sans perte : un membreFloat64/Decimalla prend en charge lorsqu’il est présent, sinon un membreStringcapture le JSON d’origine. Les typesVariantne contenant que des membres entiers (par ex.Variant(Int64, Int32)) et l’extraction directe d’entiers (JSONExtract(json, 'Int64'),JSONExtractInt, etc.) restent inchangés. #103620 (Groene AI). - Corrige
SYSTEM INSTRUMENT REMOVEsans arguments, qui produisaitstd::bad_optional_access(code d’erreur 1001) au lieu deSYNTAX_ERROR(code d’erreur 62). #103622 (Pablo Marcos). - Corrige une erreur logique / un comportement indéfini dans les
window viewwindowIDettumblelorsqu’elles sont appelées avec une chaîne de fuseau horaire comme 3e argument. #103641 (Alexey Milovidov). - La journalisation du client S3 traite désormais les réponses HTTP 400 qui incluent un en-tête x-amz-bucket-region non vide (région de signature SigV4 incorrecte) comme un simple cas informatif de mauvaise région, avec une ligne de journal plus explicite au lieu du chemin générique de type erreur. Le fournisseur d’identifiants d’identité web STS n’est ajouté à la chaîne d’identifiants S3 que lorsque l’identité web est configurée, ce qui réduit les avertissements parasites pour les déploiements qui ne l’utilisent pas. Clôt #99140. #103673 (MeltonSmith).
- Corrige
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTSpour qu’il réussisse silencieusement lorsque la base de données n’existe pas, conformément au comportement existant pour une table manquante et au précédent établi parDROP TABLE IF EXISTS. Auparavant, la requête levaitUNKNOWN_DATABASEmalgréIF EXISTS. Clôt #103629. #103689 (Groene AI). - Corrige l’erreur logique
Arguments of 'plus' have incorrect data typeslevée parFunctionBinaryArithmetic::executeImpl2lorsqu’une tableMergeTreeavaitArray(LowCardinality(...))dans sa clé de tri et qu’une clauseWHEREutilisaitplus/minusentre cette colonne et une constanteArrayd’un type d’élément différent.KeyCondition::getMonotonicityForRangesupprime désormaisLowCardinalityrécursivement avant d’invoquer le dispatch numérique interne. #103701 (Groene AI). - Corrige une condition de concurrence lors du redimensionnement dynamique du cache dans 26.1+. #103702 (Kseniia Sumarokova).
- Corrige un problème où les index de saut
textetbloom_filtersur des colonnesALIASdont l’expression contenait une lambda avec des constantes capturées (par ex.arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m)))étaient silencieusement ignorés. #103708 (Anton Popov). - Corrige
positionetpositionCaseInsensitiveavec unstart_posproche deUINT64_MAX, qui pouvaient se bloquer ou provoquer une faute de segmentation en raison d’un dépassement dans l’arithmétique des pointeurs. #103766 (Raúl Marín). - Corrige un comportement indéfini lors de l’analyse de dateTime avec une double partie fractionnaire. #103773 (Yarik Briukhovetskyi).
- Correction d’une régression affectant l’exactitude des données dans la version 26.x :
ifetmultiIfcompilés en JIT avec un type de résultatDecimalet un littéral nonDecimal(entier ou flottant) dans l’une des branches renvoyaient silencieusement une valeur inférieure d’un facteur10^scale. Le chemin lent (sans JIT) n’était pas affecté. Solution de contournement pour les versions concernées :SET compile_expressions = 0. #103809 (Groene AI). - Corrige la transmission du tokenizer depuis le text index vers les fonctions prises en charge. #103826 (Elmi Ahmadov).
- Corrige des résultats erronés de
numbers,generate_serieset d’autres sources similaires respectant les plages lorsque la clauseWHEREutiliseINouNOT INsur un tuple dont les éléments se dédupliquent en une seule Key column (par exemple,WHERE tuple(number, number) NOT IN (tuple(1, 2))). Clôt #103660. #103835 (Groene AI). - Maintient le pic réel de mémoire du hash join avec spilling automatique sous
max_bytes_before_external_join. Auparavant, la préallocation pilotée par les statistiques, le doublement sur place de la hash table et les buckets en mémoire non bornés deGraceHashJoinpouvaient chacun faire dépasser à la query la limite configurée et déclencherMEMORY_LIMIT_EXCEEDED. #103838 (Alexey Milovidov). - Corrige un blocage à l’arrêt de
clickhouse-locallorsque les logs système (commetext_logoufilesystem_cache_log) sont configurés.SystemLogs::flushImplappelaitBaseDaemon::instance().flushTextLogs(), ce qui levaitstd::bad_casten dehors declickhouse-serveret laissait les threads de sauvegarde actifs jusqu’à ce quepthread_cond_destroybloque la destruction des files de logs système. #103874 (Alexey Milovidov). - Rejette les requêtes CTE
MATERIALIZEDdont le body aboutit à des column types inférés différents selon les références, avec une erreurTYPE_MISMATCHexplicite au lieu de faire planter le server avec uneLOGICAL_ERRORBad cast. Cela se produisait auparavant lorsque le body de la CTE référençait des identifiants de la portée externe (par exemple, un alias de la projection de la subquery appelante) qui étaient intégrés comme des constantes différentes selon la référence. #103879 (Groene AI). - Corrige une utilisation d’une valeur non initialisée dans les optimiseurs de query plan de conversion de JOIN (
tryConvertAnyOuterJoinToInnerJoin,tryConvertAnyJoinToSemiOrAntiJoin) lorsque le filter au-dessus d’unANYOUTERJOINcontient une fonction non deterministic telle querand,nowourowNumberInAllBlocks. L’optimiseur ne tente plus de constant-fold de tels filtres et laisse le JOIN inchangé, ce qui empêche aussi les conversions incorrectes enINNER/SEMI/ANTI JOINqui pouvaient supprimer silencieusement des rows. #103880 (Groene AI). - Corrige un use-after-free dans
StorageKafka2qui pouvait faire planter le server lorsqu’une session Keeper est remplacée pendant que le consumer détient des verrous éphémères de topic-partition. #103890 (Groene AI). - Correction d’une
LOGICAL_ERROR“Primary key type mismatch” levée lors d’une jointure avec une tableEmbeddedRocksDBviaJOIN ... USING (key)contre une subquery dont la Key column a un type différent (par ex.Nullable(UInt64),Int64,Decimal) de la primary key du stockage. Le planner refuse désormaisDirectKeyValueJoinen cas d’incompatibilité de type et se rabat surHashJoin, qui gère la conversion de type. #103928 (Groene AI). SET max_threads = DEFAULT(et de même pourmax_final_threadsetmax_parsing_threads) ne perd plus l’état auto. Auparavant, après la réinitialisation de l’un de ces paramètres,system.settingsaffichait le nombre de cœurs résolu (par ex.32) au lieu de'auto(32)', et le serveur se comportait comme si la valeur avait été explicitement définie. #103991 (Groene AI).- Correction de
SIZES_OF_ARRAYS_DONT_MATCHlors de la lecture de colonnesAggregateFunction(topK(N), String)dont l’alpha_sizepersisté avait été augmenté par un cycle deserialize+serialize antérieur à la version 25.12. #104002 (Raúl Marín). - Correction d’une vulnérabilité d’injection SQL dans les sources de dictionnaire PostgreSQL, Cassandra et XDBC : les clés de chaîne contenant des guillemets simples étaient échappées avec
\'(backslash), que ces backends interprètent comme un backslash littéral plutôt que comme une séquence d’échappement, ce qui permettait d’injecter du SQL arbitraire dans les requêtes de lookup de dictionnaire.ExternalQueryBuilderémet désormais l’échappement SQL standard''pour ces backends ; les sources de dictionnaire ClickHouse et MySQL continuent d’utiliser l’échappement par backslash. #104009 (Shaohua Wang). - Correction d’une incompatibilité de type possible dans l’agrégation lorsqu’un type de colonne était modifié vers ou depuis LowCardinality et que la projection min-max n’était pas reconstruite. #104013 (Nikita Taranov).
- Correction d’une boucle infinie d’optimisations de requête causée par l’absence de propagation de la prévention de suppression des colonnes inutilisées lors de la fusion des expressions. #104083 (János Benjamin Antal).
- Correction de
LOGICAL_ERRORdansStreamingStorageRegistry::renameTablelors du renommage par lot de tables de streaming (S3Queue, Kafka, RabbitMQ), en utilisant un suivi d’identité basé sur l’UUID plutôt que sur le nom. #104101 (Nikita Taranov). - Correction de résultats erronés lorsqu’une CTE construite avec
UNION ALLcontenait une brancheSELECT DISTINCTet que la requête externe ne projetait qu’un sous-ensemble des colonnes de la CTE. Le nouveau passRemoveUnusedProjectionColumnsPassde l’analyzer supprimait à tort la colonne non référencée de la projectionDISTINCTinterne, ce qui fusionnait en une seule des lignes qui auraient dû rester distinctes (même valeur dans la colonne projetée mais valeur différente dans la colonne supprimée). #104114 (Groene AI). - Correction de plusieurs problèmes de justesse dans des cas limites du paramètre
optimize_inverse_dictionary_lookup, où l’optimisation pouvait supprimer silencieusement des lignes ou masquer des exceptions. Ferme #103270. Ferme #103085. #104133 (Nihal Z. Miaji). - Correction d’une écriture hors limites lors de la désérialisation de l’état
quantileTiming. #104141 (Alexey Milovidov). - Correction d’un comportement indéfini lorsqu’une valeur
Float64hors plage est convertie vers un type entier large (UInt64,Int64,Int128,UInt128,Int256,UInt256). Auparavant, les valeurs égales àFloat64(numeric_limits<T>::max())(qui s’arrondit à une valeur supérieure au maximum réel) contournaient la vérification des limites et produisaient un UB lors du cast suivant. Cela affectait l’analyse des paramètres des fonctions d’agrégation (topK,histogram,uniqUpTo,groupArrayInsertAt, etc.), ainsi que les paramètres de type entier viaSET <setting> = <Float64>. Ferme #103817. #104154 (Groene AI). - Corrige l’exception
LOGICAL_ERROR“Unexpected return type from comparison. ExpectedUInt8. GotConst(Nullable(UInt8))” lors de la comparaison d’unTuple(Tuple(Nullable(...)))imbriqué (ou plus profondément) avec un littéralString. Le type de retour de la comparaison est désormais correctement inféré enNullable(UInt8), conformément au comportement à l’exécution. #104171 (Groene AI). - Corrige un arrêt du serveur (
UndefinedBehaviorSanitizer: reference binding to null pointer, segfault dans les builds de release) surSELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr>lorsquequery_plan_optimize_lazy_final = 1. L’étape de lecture lazy-FINAL non intersectante perdait la colonneis_deleteddans son en-tête de sortie, car PREWHERE la consommait en entrée sans la réexposer en sortie. L’étapeaddIsDeletedFilteren aval déréférençait alors un pointeurActionsDAG::Nodenul. #104177 (Groene AI). - Lors de l’appel de la table system.failpoints, un failpoint était utilisé, ce qui pouvait le désactiver. #104237 (Pedro Ferreira).
- Corrige
MemorySanitizer: use-of-uninitialized-valuedans les fonctionsdetectLanguage*lorsque l’entrée contient un caractère UTF-8 se terminant exactement à la limite du buffer. #104257 (Raúl Marín). - Corrige une logical error (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage) qui interrompait l’analyse des arguments des table functions et engines de data lake (icebergS3,deltaLakeS3, etc.) lorsqu’ils étaient appelés avecSETTINGS disk = '...'sur un disk dont l’object storage sous-jacent est encapsulé par un décorateur tel qu’un filesystem cache. Corrige aussi #89300. #104258 (Groene AI). - Corrige l’analyse des expressions d’indice entre parenthèses sur des colonnes nommées
values, par exemple(values['a']), afin qu’elles ne soient plus interprétées comme des expressions de table SQL standardVALUES. #104312 (Desel72). - Corrige un arrêt du serveur/
LOGICAL_ERRORdans le thread d’eviction en arrière-plan du filesystem cache (SLRUFileCachePriority::collectEvictionInfo) qui pouvait se produire lorsquekeep_free_space_size_ratiooukeep_free_space_elements_ratioétait suffisamment élevé pour déclencher une eviction alors que toutes les cache entries avaient déjà été promues dans la protected queue du SLRU (file probationary vide). #104313 (Groene AI). - Corrige les exceptions (
NOT_FOUND_COLUMN_IN_BLOCK,LOGICAL_ERROR,AMBIGUOUS_COLUMN_NAME) lors de l’utilisation de projections avec des vues UNION ALL, des window functions ou des collisions de noms entre alias et colonnes. Régression introduite par #88798. #104317 (Amos Bird). - Corrige un possible underflow dans l’analyse des arrays Postgres. #104322 (Grant Holly).
- Les fonctions qui renvoient un type non
Nullable(commeArray,TupleouMap) acceptent désormais des argumentsNullable. Les fonctions concernées incluentextractAll,extractAllGroups,extractAllGroupsHorizontal,extractAllGroupsVertical,extractGroups,splitByChar,splitByString,splitByRegexp,splitByWhitespace,splitByNonAlphaetalphaTokens. Les lignes d’entréeNULLproduisent la valeur par défaut du type de résultat (par ex. un tableau vide) au lieu de lever l’erreur “Nested type is not allowed inside Nullable type”. #104326 (Alexey Milovidov). - Correction des statistiques Iceberg pour les tables partitionnées. Cela clôt #104321. #104329 (Konstantin Vedernikov).
- Correction d’une erreur logique fatale au démarrage du serveur sur macOS (et sur des builds jemalloc similaires), où
Jemalloc::verifySetupsignalait à tort une incohérence dejemalloc_enable_background_threadsparce que les mallctls optionnelsbackground_thread/max_background_threadssont absents ; la vérification est désormais ignorée lorsque ces mallctls ne sont pas disponibles, etgetValuene laisse plus la sortie non initialisée en cas d’échec. Clôt #102183. #104330 (SAYON DEEP). - Correction d’une régression où des requêtes
SELECTavecmax_rows_to_read_leafetread_overflow_mode_leaf = 'throw'pouvaient lever à tortTOO_MANY_ROWS, même lorsqu’un skip index aurait réduit le volume lu sous la limite leaf. Les paramètres symétriques non-leaf (max_rows_to_read/read_overflow_mode) étaient déjà pris en charge. #104331 (Groene AI). toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,CASTversUUIDetNullable(UUID),accurateCastOrNullversUUID, ainsi que les formats d’entrée qui analysent un UUID depuis du texte (Avro,MsgPack,JSONExtract, …) rejettent désormais les chaînes de la bonne longueur mais contenant des caractères non hexadécimaux. Auparavant, ces entrées étaient silencieusement transformées en UUID fabriqués en lisant au-delà de la fin de la table de correspondance des chiffres hexadécimaux ; désormais,toUUIDlèveCANNOT_PARSE_UUID, et les variantesOr*renvoientNULL/ le zero UUID / la valeur par défaut fournie. #104370 (Groene AI).- Correction de
Bad castLOGICAL_ERRORdanscaseWithExpression(et en SQLCASE expr WHEN ... THEN ... ELSE ...) lorsque le supertype des seules branches THEN et le supertype de l’ensemble (THEN + ELSE) se retrouvent dans des stockagesColumnDecimaldifférents — par exemple, des valeurs THEN(UInt16, Int8)avec un ELSE deDecimal(9, 2). Clôt #104335. #104378 (Groene AI). - Les défaillances internes signalées via
logExceptionBeforeStart(flushes d’insertions asynchrones, refresh de vues matérialisées, erreurs d’analyse levées lors de requêtes internes) incrémentent désormais correctement les ProfileEventsFailedInternalQuery,FailedInternalSelectQueryetFailedInternalInsertQuery, en plus des compteurs visibles par l’utilisateurFailedQuery,FailedSelectQueryetFailedInsertQuery. Auparavant, ces compteurs internes restaient à zéro pour les défaillances survenant avant le début de l’exécution de la requête, ce qui sous-estimait une grande catégorie de défaillances internes. #104399 (Groene AI). - Corrige l’erreur
Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}levée lorsqu’un query parameter est utilisé dans le paramètrebase_backupd’une instructionBACKUPouRESTORE(par ex.BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)). La régression a été introduite dans26.1.5par la PR #99205. Clôt #103324. #104413 (Groene AI). - Corrige un arrêt brutal du serveur lors des écritures
IcebergLocal/IcebergS3quandALTER TABLE ... DROP COLUMNest suivi d’unINSERTaveciceberg_metadata_staleness_mssupérieur à zéro.ALTERinvalide désormais le cache local des fichiers de métadonnées Iceberg, afin que les lectures et écritures suivantes prennent en compte le nouveau schéma. #104419 (Groene AI). - Corrige
DROP ROLE,DROP USER,DROP SETTINGS PROFILE,DROP ROW POLICY,DROP QUOTAetDROP MASKING POLICYafin de supprimer les références à l’entité supprimée de toute autre access entity qui la référençait (par ex. la listeDEFAULT ROLEd’un utilisateur, la listeTOd’un settings profile, les bénéficiaires d’une row policy) et de persister ce nettoyage sur disque. Auparavant, l’état en mémoire semblait correct, carSHOW CREATEfiltre les UUID inconnus, mais les fichiers.sqlsur disque conservaient des entrées orphelinesID('<dropped-uuid>'), et les références réapparaissaient au redémarrage suivant du serveur, provoquant des erreursACCESS_ENTITY_NOT_FOUNDlors de l’exécution de distributed query. #104427 (Groene AI). - Corrige un arrêt brutal du serveur déclenché par
azureBlobStorage, le moteurAzureBlobStorageet DeltaLake sur Azure avec une connection string dont l’URLBlobEndpointcomporte un port vide, non numérique ou hors plage (par ex.BlobEndpoint=http://host:abc/). Le serveur renvoie désormais une erreurBAD_ARGUMENTSpropre au lieu de s’interrompre dans les builds debug/sanitizer. #104460 (Groene AI). - Autorise l’utilisation d’un identifiant non quoté comme nom d’utilisateur dans les table functions
remoteetremoteSecure, comme c’est déjà le cas pour les arguments de database et de table. Auparavant, une telle query échouait avec une erreur d’authentication trompeuse faisant référence à l’utilisateurdefault. #104465 (Alexey Milovidov). - Corrige
Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N)déclenchée lorsque le corps d’une user-defined function SQL contient unUNION ALLimbriqué entre parenthèses (par ex.CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))). #104477 (Groene AI). - Corrige
uniqThetaIntersect, qui renvoyait la cardinalité du premier argument au lieu de0lorsque le deuxième argument est un étatuniqThetavide — par exemple le résultat deuniqThetaMergeStateIf(s, predicate)lorsque le prédicat exclut chaque ligne. #104529 (Groene AI). - Correction de
SHOW TABLESetsystem.tables, qui tronquaient silencieusement la liste pour les bases de donnéesDataLakeCatalogadossées à des catalogues REST Iceberg (iceberg-rest,onelake,biglake). Lorsque le serveur de catalogue paginait la réponselist-tablesoulist-namespaces(par exemple Microsoft Fabric / OneLake au-delà d’environ 50 tables par espace de noms), les tables des pages suivantes devenaient silencieusement invisibles pourSHOW TABLESetsystem.tables, alors qu’elles restaient interrogeables via unSELECTdirect.RestCatalogsuit désormais le jeton de continuationnext-page-tokendéfini par la spécification OpenAPI REST d’Iceberg, en cohérence avec le comportement existant dePaimonRestCatalogetUnityCatalog. #104531 (Groene AI). - La fonction de table
inputdéduit désormais sa structure à partir de la clauseFORMATde la requêteINSERTenglobante lorsque ce format possède un schéma fixe (LineAsString,RawBLOB,JSONAsString, etc.), de sorte que les utilisateurs n’ont plus à répéter la structure sous la formeinput('line String')pour ces formats. #104532. #104533 (Groene AI). - Mise à jour du type de données des champs dans l’historique d’Iceberg, de
Int32àInt64. Ferme #94176. #104579 (Smita Kulkarni). - Correction de
Inconsistent AST formattingLOGICAL_ERRORlors de l’analyse syntaxique d’un appel de fonction dans lequel une lambda suit une virgule, par exempleSELECT substring(x, `x` -> `x`). L’analyseur fusionnait auparavant silencieusement les arguments précédents avec le côté gauche de la lambda, produisant un appel à argument unique qui ne pouvait pas être réanalysé pour redonner le même AST. Il préserve désormais l’arité d’origine de la fonction. #104626 (Groene AI). CHECK TABLE tdonne désormais priorité à une tableTEMPORARYplutôt qu’à une table permanente du même nom lorsqu’aucun qualificatif de base de données n’est fourni, conformément à la priorité déjà utilisée parSHOW CREATE TABLE,DESCRIBE TABLE,OPTIMIZE TABLEetALTER TABLE. Auparavant,CHECK TABLE tignorait complètement les tables temporaires, ce qui entraînait un échec avecUNKNOWN_TABLEsur une table temporaireLogouFile, alors même que ces moteurs prennent en chargeCHECK. Suite de #100966. #104637 (Groene AI).- Correction de la boucle d’arrêt et de redémarrage de Keeper lorsque
get /keeper/availability_zoneest envoyé avecquorum_reads=trueà un Keeper sans<placement>configuré. #104663 (myeongjun). - Correction d’une condition de concurrence TOCTOU dans
FutureSetFromTuple::buildOrderedSetInplaceprovoquant une erreur logique. #104673 (Miсhael Stetsyuk). - Correction de plusieurs fonctions qui renvoyaient des résultats différents pour la même entrée selon que les arguments étaient passés sous forme de colonnes ou de constantes :
bitRotateLeft/bitRotateRight(comptes de décalage aux limites),length(FixedString)/concatWithSeparatoravec des entréesLowCardinality(Nullable),roundDownsur NaN etrightUTF8sur de l’UTF-8 invalide. #104710 (Raúl Marín). - Correction de
anyHeavy, qui renvoyait une valeur non dominante lorsque la valeur la plus fréquente était la valeur par défaut de la colonne et que les données étaient réparties sur plusieurspartsMergeTree(chemin de lecture de colonnes creuses). #104712 (Raúl Marín). - Corrige plusieurs défauts dans la gestion des contraintes de paramètres : les contraintes
MergeTreeSettingsdéclarées sur le nom canonique d’un paramètre pouvaient être contournées en écrivant via un alias de ce paramètre ; la vérification de contraintedisallowed_valueslançait une exception sur les chemins de limitation (requêtes secondaires, workersON CLUSTER, vuesSQL SECURITY DEFINER) au lieu d’ignorer silencieusement la modification. #104737 (Raúl Marín). - Corrige une exception
LOGICAL_ERROR(Metadata is not initialized) levée parOPTIMIZE TABLE,ALTER TABLE ... DELETE,ALTER TABLE ... ADD COLUMNet d’autres variantes deALTERsur une tableIceberg/IcebergLocal/DeltaLake/Hudiattachée à la demande dont les métadonnées n’avaient pas encore été chargées (généralement après un redémarrage du server, ou après l’échec d’une précédente écriture de métadonnées ayant laissé sur disque un fichier de métadonnées corrompu). L’opération s’exécute désormais normalement si les métadonnées se chargent correctement, ou expose l’échec de chargement sous-jacent sous la forme d’une exception ordinaire visible par l’utilisateur, au lieu d’interrompre le server dans les builds debug / sanitizer. #104738 (Groene AI). - Corrige un segfault dû à un bug de use-after-free dans
AvroConfluentRowInputFormat. #104751 (Miсhael Stetsyuk). - Les variantes scalaires de
numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDivide,numericIndexedVectorPointwiseEqualetnumericIndexedVectorPointwiseNotEquallèvent désormaisINCORRECT_DATAlorsqu’elles sont appelées avec un scalaireUInt64supérieur àInt64::max. #104784 (FriendLey). - Corrige un bug où la redéfinition manuelle d’un paramètre via son alias (par ex.
SET enable_analyzer = 1au lieu deSET allow_experimental_analyzer = 1) après l’application d’un paramètrecompatibilitypouvait être annulée par une modification ultérieure du paramètrecompatibility. #104829 (Raúl Marín). - Corrige la désactivation du logger AWS après https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d. #104837 (Konstantin Bogdanov).
- Corrige trois fonctions supplémentaires qui renvoyaient des résultats différents pour une même entrée selon que les arguments étaient fournis sous forme de colonnes ou de constantes :
transform(et, par son intermédiaire,caseWithExpression) avec une valeur par défaut constanteDate/Date32/Enum/FixedString, les opérateurs de comparaison entre unStringet unFixedStringconstant, etif/ifNull/nullIfavec une brancheFixedStringsous une condition constante. #104858 (Raúl Marín). - Corrige l’arrêt du server avec
Bad cast from type DB::ColumnConst to DB::ColumnNullablelors du partition pruning pour les tablesMergeTreelorsque la partition expression contient une chaîne de fonctions qui se réduit à une unique valeur constante (commefloor(NULL, toRelativeYearNum(...))). #104861 (Groene AI). - Corrige une data race
ThreadSanitizerdans le constructeur par copie deContextData:table_function_resultsétait copié depuis l’objet source sans prendretable_function_results_mutex, de sorte qu’un writer concurrent deContext::executeTableFunctionpouvait entrer en concurrence avec la lecture non synchronisée dans le constructeur par copie. #104879 (Groene AI). - Corrige les vérifications de cohérence des data parts pour les types à structure dynamique et détecte les
columns_substreams.txtcorrompus. Nouvelle soumission de https://github.com/ClickHouse/ClickHouse/pull/103858 avec des modifications supplémentaires. #104888 (Pavel Kruglov). - Correction d’une condition de concurrence entre DROP et UNDROP dans DatabaseCatalog. #104915 (Azat Khuzhin).
- Correction du redimensionnement dynamique du filesystem cache avec des segments partiellement téléchargés, y compris la restauration de la comptabilisation après un échec d’éviction. #104921 (Antonio Andelic).
DETACH TABLEsur une temporary table (sans le mot-cléTEMPORARY) renvoie désormais correctementSYNTAX_ERROR, conformément au comportement deDETACH TEMPORARY TABLE. Auparavant, cela définissait silencieusement un indicateur interneis_detached, puis se terminait sans erreur. Pour supprimer une temporary table, utilisezDROP TEMPORARY TABLEouDROP TABLE(ce dernier résout la temporary table viaContext::ResolveExternal). Clôt #103475. #104943 (Groene AI).- La table function
filesystemrespecte désormaismax_memory_usage/max_server_memory_usagelors du chargement du contenu des fichiers. Auparavant, des lectures de contenu volumineuses ou de nombreuses lectures parallèles pouvaient dépasser la limite sans leverMEMORY_LIMIT_EXCEEDED, puis se faire tuer par l’OOM killer. #104956 (Alexey Milovidov). - Correction d’un
LOGICAL_ERRORdéclenché lors du filtrage desystem.detached_tablessuruuid(par ex.SELECT count() FROM system.detached_tables WHERE uuid = '...'). La query renvoie désormais le résultat attendu au lieu d’interrompre le server. #104979 (Groene AI). flattenTuplene lève plus deLOGICAL_ERRORlorsqu’elle est appelée sur un tuple dont la structure imbriquée ne contient que des feuillesTuple()vides (par ex.Tuple(c0 Array(Tuple()))ouTuple(c0 Tuple())). De telles entrées produisent désormais une exceptionILLEGAL_TYPE_OF_ARGUMENTvisible par l’utilisateur, expliquant que le résultat de l’aplatissement serait un tuple vide. #104989 (Groene AI).- Correction d’un arrêt brutal du server et d’un bug produisant des résultats incorrects en silence lors de l’exécution de queries sur
loop(remote(...))(ou toutloop()encapsulant un storage pouvant différer l’aggregation) avecGROUP BY. Le planner externe ajoutait auparavantMergingAggregatedStepen fonction de l’étape de processing signalée par le storage interne, maisLoopSourcematérialise toujours son select interne avecQueryProcessingStage::Completeet émet de simples chunks de colonnes, si bien queMergingAggregatedTransformdéclenchait unLOGICAL_ERROR(Chunk info was not set for chunk in MergingAggregatedTransform) avecenable_parallel_replicas = 1et supprimait silencieusement l’aggregation externe dans les autres cas. #105001 (Groene AI). clickhouse-benchmark --reconnect(forme simple, sans valeur) a été involontairement cassé en 25.4 par une modification qui transformait--reconnecten option entière, nécessitant une valeur. Cette forme fonctionne désormais à nouveau et équivaut à--reconnect=1(reconnexion à chaque query). #105006 (Groene AI).- Correction d’une sortie JSON mal formée pour les noms de colonnes se terminant par des séquences UTF-8 incomplètes. #105012 (Pablo Marcos).
- Correction d’une perte silencieuse de données après
EXCHANGE TABLESouCREATE OR REPLACE TABLEsur la source table d’une vue matérialisée. L’arête de dépendance entre la vue matérialisée et sa table source est désormais conservée sur le nom d’origine afin qu’elle continue à se déclencher lors des inserts. Régression introduite par #98779 ; rétablit le comportement antérieur à la régression. #105029 (Sema Checherinda). - Correction de
CANNOT_COMPILE_CODE Could not find symbol __fixunsdftilors de la compilation JIT d’expressions convertissant unFloatenUInt128, commetoUInt128(<Float64 expression>). Les builtins non signés de compiler-rt pour la conversion de flottants en entiers 128 bits manquaient dans le résolveur de symboles JIT. Corrige #105031. #105048 (Raúl Marín). - Correction de l’absence d’affichage par
clickhouse-localdes messages de log d’une requête en échec lorsquesend_logs_levelest défini. #105067 (Alexey Milovidov). - Correction de résultats incorrects lorsque la même vue paramétrée est référencée plus d’une fois dans la même requête avec des valeurs d’argument différentes. Auparavant, l’analyseur regroupait ces appels en un seul, supprimant silencieusement tous les filtres sauf le premier. #105170 (Alexey Milovidov).
- Correction de l’affichage en double de la ligne
TOTALSen bas du tableau de résultats dans l’interface webplay.html. #103803 (Alexey Milovidov). - Rejet des vecteurs non finis (
NaN,±Inf) lors de la recherche vectorielle (qu’il s’agisse des vecteurs recherchés ou des vecteurs de référence) ; ils provoquaient auparavant un comportement indéfini dansusearch. #104079 (Groene AI). - PromQL : correction de l’opérateur d’agrégation pour les vecteurs vides. #104425 (Vitaly Baranov).
- PromQL : correction de la gestion des erreurs dans l’API de requête Prometheus. #104741 (Vitaly Baranov).
- Correction d’une condition de concurrence dans
MergeTreeTransaction::afterCommitoù, après une perte de connexion entre l’écriture duCSNde commit dans ZooKeeper et la finalisation de la transaction, la réponseCOMMITpouvait parvenir au client avant que les nouveauxcreation_csn/removal_csnne deviennent visibles danssystem.parts. #104708 (Tuan Pham Anh). - Correction d’une croissance exponentielle de la mémoire dans l’analyseur KQL lors de la conversion d’un indexage de tableaux imbriqués (
arr[arr[arr[...]]]). #105142 (Alexey Milovidov). - Correction de résultats incorrects pour
RIGHT ANY JOINlorsque la table de droite comporte plusieurs lignes par clé et que le bloc de sortie est scindé en raison de limites de taille. Corrige #99431. #102064 (Vladimir Cherkasov). - Vérification du dépassement de pile dans le lecteur
Avrolors de la désérialisation de types imbriqués. #102417 (Pavel Kruglov). - Correction de lignes dupliquées dans
system.completionspour les paramètresMergeTree— chaque nom de paramètre apparaissait deux fois, cargetMergeTreeSettingsetgetReplicatedMergeTreeSettingsétaient tous deux exportés malgré des noms de paramètres identiques. Corrige #102013. #102015 (Groene AI). - Correction de
StorageObjectStorageQueue(S3Queue,AzureQueue), qui bloquait l’arrêt tant que les fichiers partiellement traités n’avaient pas été entièrement lus depuis l’object storage. La source interrompt désormais immédiatement la lecture lors de l’arrêt ; la déduplication garantit que les lignes déjà envoyées vers la table de destination avant l’arrêt ne sont pas dupliquées lorsque le fichier est retenté au démarrage suivant. #103126 (Tuan Pham Anh). - Correction des inserts multi-blocs dans le table engine
Aliasavecinsert_deduplication_token, afin que tous les blocks soient conservés. #103246 (Enric Calabuig). - Correction de
JSONHasetJSONExtractBoolsur les columnsJSONnatives, qui renvoyaient la valeur extraite (convertie enUInt8) au lieu de0/1. #103313 (zxuhan7). - Protection du input format
CustomSeparatedcontre les données malformées ou malveillantes qui omettentformat_custom_row_after_delimiter. La détection d’en-tête, l’inférence de schéma et les lignes avec un nombre variable de columns accumulaient auparavant des fields sans limite et pouvaient allouer plusieurs gigaoctets de mémoire avant d’échouer. Les lectures échouent désormais avecINCORRECT_DATAdès qu’une seule ligne contient plus de 1,000,000 fields. #103404 (Groene AI). - Correction de
RESTOREdes tablesMergeTreereplicated, afin que l’attachement des parts restaurées utilisebackup_restore_keeper_max_retriesau lieu du budget habituel de tentatives Keeper pour les insert. #104610 (Pablo Marcos). - Correction de résultats erronés pour
WHERE p AND <LowCardinality(Nullable(int)) constant>sur les tablesMergeTree. Auparavant, de telles queries renvoyaient zéro ligne, car le part pruning déduisait une valeur par défautNULLdu typeLowCardinality(Nullable(...))et synthétisait une gardenotEquals(x, NULL), ce qui élaguait chaque part. #104767 (Groene AI). - Correction d’un résultat d’aggregation incorrect lors d’un regroupement par une fonction non injective d’une column qui est aussi la partition key (par ex.
PARTITION BY aavecGROUP BY intDiv(a, 2)oua % 2). Les values provenant de partitions différentes mais correspondant au même groupe n’étaient pas fusionnées, ce qui produisait des lignes de groupe dupliquées avecallow_aggregate_partitions_independently = 1. #104869 (Nihal Z. Miaji). - Correction d’une condition de concurrence dans le transfert de snapshot de
Keeper, où un snapshot pouvait être supprimé ou déplacé pendant son envoi à un follower en cours de récupération. #104941 (Antonio Andelic). - Correction d’un bug silencieux produisant des résultats erronés dans
hilbertEncodeetmortonEncode, où un premier argumentTuplenon constant (masque de plage) utilisait les values de la ligne 0 pour piloter le décalage de bits de chaque ligne. Les fonctions calculent désormais les values du masque pour chaque ligne, de sorte que le résultat ne dépend plus du fait que l’entrée soit constante ni de la taille du block. #104992 (Groene AI). - Correction de
clickhouse-local, qui ignorait silencieusement la configuration au niveau utilisateur (profiles,users,quotas, paramètres de contrôle d’accès) lorsque le configuration file était détecté automatiquement à partir de./clickhouse-local.xml,~/.clickhouse-local/config.xmlou/etc/clickhouse-local/config.xml. Auparavant, ces paramètres n’étaient appliqués que lorsque--config-fileétait passé ou que./config.xmlexistait dans le current directory ; désormais, tous les chemins de discovery se comportent de manière cohérente. #105008 (Groene AI). - Correction d’un problème où les colonnes
BFloat16renvoyaient silencieusement zéro correspondance lorsqu’elles étaient comparées à un littéral de chaîne (par ex.WHERE bf16_col = '49.9'). #105042 (Raúl Marín). - Correction de
CLEAR COLUMNet de la gestion du TTL pendant les merges pourSummingMergeTree,AggregatingMergeTreeetCoalescingMergeTreelorsque les colonnes requises pour le merge sont absentes ou expirées. Clôt #101953. #105203 (Antonio Andelic). - Correction d’une situation de concurrence entre
DNSCacheUpdater::runetContext::reloadClusterConfiggrâce à l’ajout d’une vérification explicite contre les valeurs nulles pourshared->clusters_configavant son déréférencement. #105220 (Mikhail f. Shiryaev). - Correction de l’analyse
best_effortdes dates et heures pourtoDateTime64avec une précisionmsetns. #105233 (Kaviraj Kanagaraj). - Correction de
OSIOWaitMicroseconds, qui signalait l’attente d’E/S sur toute la durée de vie du thread au lieu de l’attente d’E/S par query. #105246 (Mikhail f. Shiryaev). - Le table engine
Hudigénère désormaisINCORRECT_DATA(une exception normale au niveau de la query) au lieu deLOGICAL_ERRORlorsqu’un fichier Parquet dans le répertoire de la table ne respecte pas la convention de nommage Hudi[FileId]_[FileWriteToken]_[Timestamp].[extension]. Auparavant, de tels noms de fichiers provoquaient une exception dans les builds de débogage. #105266 (Groene AI). - Correction d’un interblocage dans
ParallelFormattingOutputFormaten cas d’échec de planification : lorsquescheduleFormatterThreadForUnitWithNumberlève une exception (par ex.CANNOT_SCHEDULE_TASK), l’unité restait dans l’étatREADY_TO_FORMATsans thread de formatage pour la traiter, ce qui entraînait un blocage. L’appel de planification est désormais encapsulé danstry/catchet tout échec est redirigé viaonBackgroundExceptionafin que le collector s’arrête proprement. #105275 (Azat Khuzhin). - Correction d’une perte silencieuse de données dans les async inserts
Distributedlors de la récupération après un arrêt anormal : si le dernier fichier.bind’un batch sauvegardé était intact mais qu’un fichier intermédiaire était corrompu,DistributedAsyncInsertBatch::recoverBatchne validait que l’en-tête du dernier fichier, puissendBatchmarquait l’ensemble du batch — y compris les fichiers intacts — comme défectueux, entraînant la perte de leurs rows. L’en-tête de chaque fichier est désormais validé individuellement afin que seul le fichier réellement défectueux soit déplacé versbroken/et que les rows restantes atteignent le shard distant. #105281 (Groene AI). - Correction d’une régression dans
clickhouse extract-from-config --try: lorsque la config utilisait des attributsfrom_envet n’avait pas d’élémentinclude_from(ou en avait un pointant vers un fichier manquant), toutes les substitutionsfrom_envétaient silencieusement ignorées et renvoyaient des chaînes vides. Cela cassait la découverte du port dans le point d’entrée Docker en 26.2.5. Clôt #101704. #105283 (Groene AI). - Correction d’un échec de
INSERT INTOdans une tableSQLite, avec une erreur de syntaxe SQLite, lorsque la valeur insérée est unEnum, unJSONou uneAggregateFunctiondont la représentation textuelle contient une apostrophe. Le paramètreoutput_format_values_escape_quote_with_quoteest désormais respecté par les sérialisations correspondantes (auparavant, seulsStringetFixedStringle respectaient). #105285 (Groene AI). - Correction de
Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists, déclenchée par des requêtes distribuées avecallow_push_predicate_ast_for_distributed_subqueries = 1(par défaut) lorsqu’un tupleGLOBAL INcorrespond à une sous-requête dont la projection contient des noms de colonnes en double, par ex.(x, y) GLOBAL IN (SELECT number, number FROM numbers(5)). #105290 (Groene AI). - Correction de
reinterpretversArray(LowCardinality(...)), qui renvoyait à l’exécution une erreurNOT_IMPLEMENTEDtrompeuse ; la fonction renvoie désormaisILLEGAL_TYPE_OF_ARGUMENTlors de la vérification des types. #105301 (Raúl Marín). minMap/maxMap(forme tableau) etminMappedArrays/maxMappedArraystraitent désormaisNaNde manière cohérente avecORDER BY:NaNest traité en dernier (renvoyé uniquement lorsque toutes les valeurs sontNaN). Auparavant, les résultats dépendaient de la position deNaNdans les données en raison de la sémantique de comparaison non ordonnée d’IEEE 754, et ne concordaient pas avec la forme à argumentMapdeminMap/maxMap, corrigée dans #100448. #105331 (Raúl Marín).- Correction d’une fuite de mémoire dans le cache
ColumnsDescriptionpropre à chaque table pour les tables de la familleMergeTreeavec des colonnesNested. Les entrées n’étaient jamais évincées au fil des cyclesALTER ADD COLUMN/DROP COLUMNlorsqueshare_nested_offsets = 1(par défaut). #105376 (Groene AI). - Correction de l’exception
BAD_ARGUMENTS“C’est un bug ! Seuls les types entiers sont pris en charge par__bitWrapperFunc”, déclenchée lorsqu’unSELECTavec un index de sautTYPE set(N)comporte un atomeWHEREdont le type de résultat estFloat,BFloat16ou tout autre type non entier (par exempleWHERE c0 + 0.1ouWHERE log(c0)). Dans ce cas, l’index de saut repasse désormais par le chemin de filtre normal. #105384 (Groene AI).
Amélioration de la compilation/des tests/du packaging
- Ne plus utiliser les bibliothèques et fichiers d’en-tête système de
compiler-rt. Résout #91475. #102857 (Konstantin Bogdanov). - Actualiser l’image de base Docker distroless pour corriger des CVE OpenSSL dans
libssl3t64. #103583 (Rahul Nair). - Récupérer de manière fiable la clé GPG lors des releases en chaînant plusieurs serveurs de clés Ubuntu, au lieu de subir des dépassements de délai sur
keyserver.ubuntu.com. #103834 (Mikhail f. Shiryaev). - Supprimer et interdire les vérifications
CMakeà la compilation (check_*,try_compile,try_run). Le compilateur et la chaîne d’outils étant fixes, la détection de fonctionnalités à la configuration est inutile et désormais bloquée à l’échelle du projet ; tout comportement spécifique à une version doit être explicitement conditionné parCMAKE_CXX_COMPILER_VERSION. #103980 (Alexey Milovidov). - Mettre à jour
libarchivede 3.8.6 à 3.8.7. #104047 (Robert Schulze). - Mettre à jour
mongo-c-driververs la version 2.3.0. #104300 (Raúl Marín). - Mettre à jour les dépendances LLVM pour 22.x. #104381 (Joshua Carp).
- Permettre la compilation sur macOS et FreeBSD des classes du client intégré et du descripteur PTY en utilisant les fonctions POSIX portables
posix_openpt/grantpt/unlockpt, et en supprimant les gardes#ifspécifiques à Linux. #104436 (Alexey Milovidov). - Mettre à niveau
librdkafkavers la version 2.14.1. #105222 (János Benjamin Antal).
Version de ClickHouse 26.4, 2026-04-30. Présentation, Vidéo
Changement incompatible avec les versions précédentes
- L’opérateur
INutilise désormais une sémantique de valeur exacte pour le typeBool: seules les valeurs0et1de l’ensemble correspondent à des valeursBool. Auparavant, les valeurs numériques supérieures à255dans l’ensembleINétaient incorrectement ramenées àtruelors de la comparaison avecBool, si bien queSELECT CAST(1, 'Bool') IN (256)renvoyait 1. Désormais, il renvoie correctement0. Clôt #92980. #93115 (Ashrith Bandla). - La bibliothèque H3 a été mise à jour vers la v4, ce qui améliore la précision des calculs de longueur, de surface et d’autres mesures. Ce changement n’est pas rétrocompatible, car les nouveaux résultats diffèrent des précédents. #100348 (Alexey Milovidov).
- Interdit l’utilisation de
SELECTcomme identifiant non délimité dans un élément de la liste d’expressionsWITH. #101059 (Aruj Bansal). - Ce correctif modifie la manière dont la table Merge gérera les colonnes virtuelles. Si la table sous-jacente contient
_tableou_database, ces colonnes seront lues depuis le stockage ; sinon, elles seront remplies après l’étape de lecture à l’aide de l’étape d’expression. #101742 (Mikhail Artemenko). - L’opérateur
INrejette désormais aussi les conversionsDecimalavec perte à l’intérieur des types composites (Tuple,Array,Map), ce qui aligne son comportement sur celui des comparaisons scalaires de premier niveau. Auparavant, les vérifications de précision ne s’appliquaient qu’aux valeurs scalaires de premier niveau : par exemple,CAST('33.3', 'Decimal64(1)') IN (33.33)renvoyait correctement0, maisCAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])renvoyait incorrectement1, car la conversion avec perte se produisait à l’intérieur d’unArray. Désormais, les deux cas renvoient correctement0. #101812 (Nihal Z. Miaji). - Les valeurs par défaut de
http_max_fieldsont été réduites de 1,000,000 à 1,000 et celles dehttp_max_field_name_sizede 128 KB à 4 KB afin de limiter l’utilisation mémoire avant authentification par les connexions HTTP. Les paramètreshttp_max_request_header_sizeethttp_headers_read_timeoutont été ajoutés. Les utilisateurs qui dépendent des anciennes limites plus élevées peuvent les rétablir via les paramètres. #103285 (Sema Checherinda).
Nouvelle fonctionnalité
- Ajout du spilling automatique pour les hash joins et les parallel hash joins, en les convertissant en grace hash join lorsque la limite mémoire est atteinte. Ce comportement est contrôlé par
max_bytes_before_external_join. #97813 (János Benjamin Antal). - Ajout de la prise en charge d’Arrow Flight SQL. #91170 (Yakov Olkhovskiy).
- Ajout de la prise en charge de l’Incremental read pour les table engines
Paimon, avec suivi de progression des snapshots via Keeper, y compris des lectures delta ciblées de snapshots viapaimon_target_snapshot_id, et extension de la couverture des tests pour les scénarios de type mapping, de partition pruning et d’Incremental read. #93655 (XiaoBinMu). - La fonction
stemn’est plus expérimentale (auparavant, il fallait activer le paramètreallow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). Vous pouvez désormais facilement appliquer la racinisation à tous les mots/tokens des colonnesString,FixedString,Array([Fixed]String),Nullable,LowCardinalityetConstavec la fonctionstem. #99137 (Jimmy Aguilar Mena). - Implémentation d’un nouveau comportement pour
max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rows,min_insert_block_size_byteslors du squashing, sous le paramètre de compatibilitéuse_strict_insert_block_limits. #94207 (Kirill Kopnev). - Ajout de la fonction
arrayAutocorrelation(arr [, max_lag]), qui calcule l’autocorrélation normalisée d’un tableau numérique pour chaque décalage. Prend en charge les types de tableaux d’entiers, de flottants et de décimaux. #94776 (Wenyu Chen). - Ajout de la fonction SQL
obfuscateQuery. Ferme #98010. #98305 (Xuewei Wang). - Ajout de la prise en charge des types Map et JSON/Object comme dictionary attributes. Les dictionnaires peuvent désormais stocker et récupérer des types complexes, notamment Map(String, String), Map(String, Array(String)), JSON et Nullable(JSON), dans les layouts FLAT et HASHED. #98627 (yanglongwei).
- Ajout de deux nouveaux MergeTree settings —
replicated_fetches_min_part_leveletreplicated_fetches_min_part_level_timeout_seconds— qui permettent aux répliques d’éviter de récupérer auprès de leurs pairs des parts fraîchement insérées (non fusionnées), réduisant ainsi la surcharge de réplication lors d’une ingestion intensive. #98625 (tanner-bruce). - Ajout de la prise en charge des skip indexes MergeTree pour les JSON columns à l’aide de JSONAllPaths avec les types d’index bloom_filter, tokenbf_v1, ngrambf_v1 et text (inversé), permettant de sauter des granules en fonction de l’ensemble des JSON paths présents dans chaque granule. #98886 (Pavel Kruglov).
- La fonction
printfprend désormais en charge les format strings non constants, ce qui permet d’utiliser des motifs de format différents pour chaque ligne selon les valeurs des colonnes. #98991 (Yash ). - Ajout d’un nouvel index de projection,
commit_order, qui réorganise les données dans l’ordre d’insertion. #99004 (Mikhail Artemenko). - Ajout de la fonction
highlight, qui entoure les occurrences des termes de recherche dans une chaîne de texte avec des balises HTML (par défaut<em>/</em>). Prend en charge la correspondance ASCII insensible à la casse, la fusion automatique des correspondances qui se chevauchent et des balises d’ouverture/fermeture personnalisées. #99131 (Peng). - Mise en œuvre de quotas par hash de requête normalisée pour protéger les services ClickHouse publics contre les abus. 1. Prise en charge de
NORMALIZED_QUERY_HASHcomme type de quota key — avec des buckets de quotas distincts pour chaque requête normalisée unique, de sorte queCREATE QUOTA q KEYED BY normalized_query_hashsuit chaque requête distincte indépendamment. 2. Prise en charge deQUERIES_PER_NORMALIZED_HASHcomme type de ressource de quota — limite le nombre maximal d’exécutions d’une même requête normalisée au cours d’un intervalle, de sorte queMAX queries_per_normalized_hash = 100empêche qu’un même query pattern soit exécuté plus de 100 fois. #99586 (Alexey Milovidov). - Les utilisateurs peuvent désormais écrire des requêtes avec
NATURAL JOIN, qui met automatiquement en correspondance toutes les colonnes portant le même nom et déduplique ces colonnes dans le résultat. #99840 (Peter Nguyen). - Prise en charge de
SET TIME ZONE 'tz'comme alias deSET session_timezone. #99883 (phulv94). - Ajout de la prise en charge des requêtes paramétrées dans l’interface web (
play.html) : les query parameters comme{name:Type}sont détectés et des champs de saisie s’affichent pour permettre de renseigner leurs valeurs. #100041 (Alexey Milovidov). - Prise en charge de la clause SQL standard
VALUEScomme expression de table dansFROM, par ex.SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). - Ajout d’unités compatibles PostgreSQL à l’opérateur
EXTRACT:EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADE,MILLENNIUM. Correction également deEXTRACT(WEEK FROM date), qui renvoyait auparavant une erreur. #100274 (Alexey Milovidov). - Ajout de la prise en charge des littéraux d’intervalle composés conformes au standard SQL avec qualificateurs de plage
TO, par ex.INTERVAL '1:30' HOUR TO MINUTE. Ils sont décomposés en interne en sommes d’intervalles. #100453 (Desel72). - Ajout de metrics asynchrones pour la mémoire tampon TCP du noyau, en réception et en émission (
sk_rmem_alloc,sk_wmem_alloc), des sockets du pool de connexions HTTP, rapportées sous forme de percentiles p50/p75/p90/p95 et de totaux par groupe de connexions. #100575 (Sema Checherinda). - Ajout d’une interface web de profiling jemalloc pour ClickHouse Keeper, disponible à l’adresse
/jemallocsur le port HTTP control. #100606 (murphy-4o). - Mise en œuvre de la commande
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'pour les modes ordered et unordered. #100709 (Bharat Nallan). - Ajout de la fonction
JSONAllValues, qui renvoie toutes les valeurs d’une colonneJSONsous forme deArray(String), avec des valeurs sérialisées en représentation textuelle et ordonnées par nom de chemin. Ajout de la prise en charge d’un text index pour l’expressionJSONAllValuessur les colonnesJSON. Lorsqu’un text index est créé surJSONAllValues(json_column), il est automatiquement utilisé pour filtrer les requêtes sur les sous-colonnesJSON(par exemple,json_column.key1 = 'value'). #100730 (Anton Popov). - Ajout d’un nouveau paramètre
input_format_column_name_matching_mode, qui permet différents niveaux de sensibilité à la casse pour les input formats. #99346 (manerone). - Ajout de la commande
watchàclickhouse-keeper-client, avec prise en charge des watches dans les commandesget,existsetls. #100834 (Den Kalantaevskii). - Ajout de la requête
getChildrenRecursive(ListRecursive) à ClickHouse Keeper et de la commandelsràclickhouse-keeper-client. Cela résout #99916. #100998 (Konstantin Vedernikov). - Ajout de la nouvelle fonction
arrayTranspose, qui prend un tableau bidimensionnel (matrice) et le transpose :SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]]). #101214 (Vitaly Baranov). - Le paramètre
auto_statistics_types mergetreea désormais pour valeur par défaut'minmax, uniq'— des statistiques minmax et uniq sont automatiquement créées pour toutes les colonnes adaptées dans les nouvelles tables -materialize_statistics_on_inserta désormais pour valeur par défaut false — les statistiques sont maintenant construites lors des merges plutôt qu’au moment de l’insert, ce qui réduit la surcharge des insertions. UtilisezSET materialize_statistics_on_insert = 1pour restaurer l’ancien comportement. #101275 (Han Fei). - Ajout du paramètre de refresh
prefer_dependency_replicapour les chaînes de dépendances de materialized views afin de réduire les données manquantes dues au retard de réplication entre replicas. #101591 (Seva Potapov). - Ajout d’une fonction
hasPhrase(aliasmatchPhrase) pour la recherche de phrases (séquences continues de jetons). La recherche se fait en brute-force, c.-à-d. qu’elle n’est pas encore prise en charge par le text index. #101997 (Elmi Ahmadov). - Ajout des histogram metrics
s3_read_request_duration_microsecondsets3_read_request_bytespour observer la durée de vie des connexions des requêtes GET S3 et le volume d’octets consommés, visibles danssystem.histogram_metricset sur le Prometheus endpoint. #102058 (Sema Checherinda). - Les valeurs
DateetDate32peuvent désormais être ajoutées à des valeursTimeetTime64à l’aide de l’opérateur+, produisant un résultatDateTimeouDateTime64. Par exemple,SELECT toDate('2024-01-15') + toTime('14:30:25')renvoie2024-01-15 14:30:25. Le résultat est calculé dans le session timezone, et les résultats hors plage sont gérés conformément au paramètredate_time_overflow_behavior. Résout #95914. #102421 (Nihal Z. Miaji). - Le text index est désormais GA et reste activé indépendamment du paramètre
compatibility, ce qui évite toute désactivation inattendue lors des restaurations depuis une sauvegarde ou en compatibility mode. #101518 (Nikita Fomichev).
Fonctionnalité expérimentale
- Ajout de
ALTER TABLE ... EXECUTE remove_orphan_filespour les tables Iceberg afin d’identifier et de supprimer du stockage objet les fichiers non référencés. #99127 (murphy-4o). - Ajout du paramètre
query_plan_optimize_join_order_randomize, qui randomise les statistiques utilisées pour réordonner les jointures, ce qui est utile pour les tests. #100643 (Vladimir Cherkasov). - Ajout de la prise en charge des fonctions d’IA dans ClickHouse, permettant aux utilisateurs d’appeler des points de terminaison OpenAI et Anthropic à l’aide de SQL.
aiGenerateest incluse comme première fonction de ce type. #100831 (George Larionov). - Ajout des fonctions d’IA
aiClassify,aiExtractetaiTranslatepour utiliser des API de LLM dans ClickHouse. #100832 (George Larionov). - Ajout de
system.histogram_metric_log, une nouvelle table système qui crée périodiquement des instantanés de toutes les métriques d’histogramme (par ex. les latences S3/Azure, les durées des étapes de traitement des requêtes Keeper). De plus, la colonnevaluedesystem.histogram_metricsdevientFloat64, car ce type est plus flexible et plus compatible avec le modèle de données Prometheus. #103046 (Miсhael Stetsyuk). La structure de la table est susceptible d’être modifiée dans les versions futures.
Amélioration des performances
- ClickHouse peut désormais effectuer le pruning de data parts entières dans les requêtes SELECT à partir des statistiques min/max. #94140 (zoomxi).
- Réduit la contention sur les verrous lors des opérations readonly sur les tables ReplicatedMergeTree avec des mutations terminées. #95771 (Eduard Karacharov).
- Respecte
optimize_read_in_orderlors de la lecture des projections. Clôture #89453. #95885 (Andrey Zvonov). - Série de petites améliorations pour le hash join et le concurrent hash join. #96663 (Yarik Briukhovetskyi).
- Optimise la transformation
DISTINCTen désactivant l’optimisation des colonnesLowCardinalitylorsque les données d’entrée sont presque toutes distinctes. #97113 (Nihal Z. Miaji). - Optimisation des performances des requêtes
LIKEsignalée dans #97723. Ces requêtes peuvent désormais utiliser des index de texte. #98149 (Elmi Ahmadov). - Les fonctions mathématiques vectorisées (
exp,log,sigmoid,tanh) sont désormais accélérées sur AArch64 (avec NEON/SVE), ainsi que sur FreeBSD/Darwin, où elles utilisaient auparavant un fallback scalaire plus lent. #98230 (Raúl Marín). - Les requêtes filtrant sur les colonnes de clé primaire de
MergeTreeavec des alternances regexp sur des chaînes littérales, telles que^(abc-1|abc-2), peuvent désormais utiliser le pruning de clé primaire lorsque les alternatives partagent un préfixe commun. #98988 (Yash ). - Généralise le filtrage dynamique top-k de
ORDER BY ... LIMITpour prendre en charge les typesNullable,StringetCOLLATE. #99033 (murphy-4o). - Accélère le hash join sur des clés
Int32etInt64de petite plage grâce à une hash table à index direct. #99275 (Hechem Selmi). - Requêtes discontinues plus rapides pour les colonnes
LowCardinalityavec un seul dictionnaire. #99285 (Ivan Babrou). - Accélère les fonctions
var*Stableetstddev*Stablepour les colonnesFloat64en dévirtualisant la boucle interne. Remarque : cela active des optimisations du compilateur (FMA/registres) qui modifient les résultats en virgule flottante au niveau des ULP. #99460 (Riyane El Qoqui). - Utilise l’encodage base58 optimisé de Firedancer pour les entrées de 32/64 octets (automatiquement pour
base58Encode). Permet d’utiliser le décodage base58 optimisé si le résultat décodé fait 32/64 octets (explicitement avecbase58Decode('...', 32)ou équivalent). #99461 (Joanna Hulboj). - Active des optimisations basées sur les sections de l’éditeur de liens (
-ffunction-sections,-fdata-sections,--icf=all) afin de réduire la taille du binaire et d’améliorer l’utilisation du cache d’instructions. #99474 (Alexey Milovidov). - Corrige le scaling négatif pour les requêtes courtes avec agrégation sur des machines dotées de nombreux cœurs. Lorsqu’une requête lit peu de marks, le pipeline ne s’étend plus jusqu’à
max_threadsaprès l’agrégation, ce qui évite le surcoût lié à des streams en grande partie vides. #99493 (Alexey Milovidov). - Améliore les performances des requêtes avec répliques parallèles en sélectionnant correctement la taille de la tâche de lecture. #99801 (Nikita Taranov).
- Autorise le prefetch lors de la lecture d’un fichier distant via le cache de pages en espace utilisateur. #99919 (Alexey Milovidov).
- Évite le calcul inutile de la sous-colonne
.sizedeStringlors de l’énumération des sous-colonnes. #99941 (Pavel Kruglov). - Rend la barre de progression de clickhouse-client moins saccadée lors d’une utilisation depuis un hôtel avec des clusters comportant un très grand nombre de répliques. #100145 (Alexey Milovidov).
- Démarre
MemoryWorkerdansclickhouse-locallorsque le cache de pages est activé, afin que le cache de pages en espace utilisateur puisse être effectivement utilisé. #100306 (Alexey Milovidov). - Optimise les requêtes en propageant la clause
LIMITdans leUNION ALL. #100364 (Alexey Milovidov). - Ajoute la prise en charge de la compilation JIT pour les comparaisons de colonnes
StringetFixedStringdansORDER BY, améliorant les performances du tri en phase de fusion de 6 à 17 % pour les clés de tri fortement basées sur des chaînes. Coécrit avec @lgbo-ustc. #100577 (Raúl Marín). - Lorsque
read_in_order_use_virtual_rowest activé avec le nouveau paramètreread_in_order_use_virtual_row_per_block, les informations de frontière des lignes virtuelles sont désormais émises après chaque block lu depuisMergeTree, ce qui permet à la fusion de reprioriser les sources en cours de stream pour les parts dont les données sont entièrement filtrées parWHERE/PREWHERE/JOIN. Ferme #99945. #100603 (Vladimir Cherkasov). - Conversion plus rapide de
FloatversStringpour les grandes valeurs entières en étendant le chemin rapideitoaavec un arrondi compatible avec dragonbox. #100649 (Raúl Marín). - Remplace
dragonboxparzmijpour une conversion deFloatenString1,5 à 3 fois plus rapide. #100650 (Raúl Marín). - Accélère la conversion de
Int128/UInt128en chaîne en remplaçant la division logicielle par la réduction de Barrett et en déroulant la boucle de conversion. #100671 (Raúl Marín). - Évite de lancer des threads redondants dans la fusion parallèle de
uniqExact. #100686 (Jiebin Sun). - Ajoute une fusion parallèle par lots pour
uniqExact. #100687 (Jiebin Sun). - Améliore la parallélisation des requêtes avec des views simples (reposant sur une table
MergeTreesous-jacente) exécutées avec des répliques parallèles. #100815 (Igor Nikonov). - Ajoute la prise en charge des répliques parallèles sur les vues simples (y compris les vues
UNION ALLéligibles sur des tablesMergeTree) lorsqueparallel_replicas_allow_view_over_mergetree=1. Cela permet de paralléliser la requête externe de la vue plutôt que la requête interne, ce qui accroît la parallélisation des requêtes entre les nœuds. #100958 (Igor Nikonov). - Optimise la lecture dans l’ordre de la clé primaire pour
full_sorting_mergelorsque des filtres avecINsont présents dans le plan de requête. #101261 (Nikita Taranov). - Optimise les allocations/désallocations en mettant en cache les paramètres d’échantillonnage au lieu de parcourir toute la hiérarchie du memory tracker. #101267 (Azat Khuzhin).
- Corrige une régression importante des performances d’INSERT lorsque
deduplicate_insert = 'enable'(par défaut depuis la version 26.2) en reportant le calcul du hash des données du squashing vers le sink et en utilisant le hachage par lots des colonnes viaupdateHashWithValueRange, ce qui réduit le surcoût d’environ 2,5 s à environ 0,5 s pour 5 M de lignes avec 22 colonnes. #101494 (Sema Checherinda). - Réduit le surcoût des verrous profilés en utilisant
try_lockpour éviter de mesurer les acquisitions sans contention et en supprimant la mesure du temps de détention. #101502 (Antonio Andelic). - Remplace les intrinsics AVX-512 écrites à la main dans
arrayDotProductpar des boucles auto-vectorisables indépendantes de la plateforme, avec ajout de la prise en charge d’AVX2 et d’ARM NEON. #101571 (Peng). - Améliore les performances de
INSERT VALUESpour les colonnesMap,ArrayetTuplelorsque les valeurs sont transmises sous forme de chaînes échappées (par ex.'{\'key\':1}'), en évitant un recours inutile au parser d’expressions SQL. #102119 (Joanna Hulboj). - Corrige une utilisation excessive du CPU par le table engine
RabbitMQ. #102711 (Jaap Elst). - L’optimiseur de l’ordre des JOIN déduit désormais les prédicats transitifs d’équi-jointure à partir des conditions de jointure existantes. Par exemple, avec
A.x = B.x AND B.x = C.x, l’équivalenceA.x = C.xest reconnue, ce qui permet à l’optimiseur d’envisager des jointures directes entre des tables connectées transitivement. Cela peut améliorer la qualité du plan pour les schémas en étoile et en flocon, où les tables de dimension sont reliées par une table de faits commune. La fonctionnalité est contrôlée par le nouveau paramètreenable_join_transitive_predicates(désactivé par défaut). #98479 (Alexander Gololobov). - Optimise
TRUNCATE DATABASE TABLES LIKEen pré-annulant les merges en parallèle. #98597 (Shaohua Wang). - Ajoute la prise en charge de la monotonie pour la multiplication, ce qui permet le pruning par clé primaire pour les expressions
key * constant. #98983 (Amos Bird). - Les dictionnaires de cache ne prennent plus de verrou exclusif dans
hasKeys; cela réduit la contention sur les verrous en utilisant un verrou partagé pour les lectures du cache. #100796 (liuguangliang). - Intègre en ligne la sous-requête VIEW dans le query tree afin de permettre l’application de davantage d’optimisations à la VIEW. #100830 (Dmitry Novik).
- Optimise le chargement du cache au démarrage du serveur. #101500 (Kseniia Sumarokova).
- Implémenter la matérialisation paresseuse des colonnes pour ReplacingMergeTree avec FINAL lorsque le prédicat est suffisamment sélectif. #101647 (Nikolai Kochetov).
- Réactiver l’optimisation
optimize_rewrite_array_exists_to_has(désactivée par défaut depuis la version 23.10). Elle réécritarrayExists(x -> x = elem, arr)enhas(arr, elem), bien plus rapide, et évite désormais correctement cette réécriture lorsque le type d’élément du tableau etelemne sont pas compatibles avechas(par ex.DatevsString), ce qui permet aux requêtes qui échouaient auparavant de continuer à fonctionner. Clôt #71431. #100944 (Alexey Milovidov).
Amélioration
- Sortie
EXPLAIN PLAN pretty=1améliorée : affichage des colonnes de sortie de la requête de niveau supérieur, des libellés/symboles des relations de join avec le nombre estimé de lignes de résultat et la localité, ainsi que des colonnes de sortie pour chaque étape de type join/source. Les changements couvrent la partie Information Deficit de #98117. #99462 (Kirill Kopnev). - Ajout du paramètre de table MergeTree
share_nested_offsets(par défauttrue). Lorsqu’il est défini surfalse, les colonnes Array avec des noms à points (par ex.n.a,n.b) sont traitées comme des colonnes indépendantes au lieu de partager des fichiers d’offsets et de vérifier l’égalité des tailles de tableaux selon l’ancienne sémantiqueNested. #98416 (Amos Bird). - Les utilisateurs peuvent désormais spécifier plusieurs méthodes d’authentification dans la configuration users.xml/yaml (en SQL, cela a toujours été possible). #91998 (Flip-Liquid).
- Rechargement automatique des connexions inter-nœuds Raft utilisant TLS. #93455 (Evgeny).
- Extension de
cast_keep_nullablepour fonctionner avec les types Dynamic/JSON. Lorsqu’il est activé, le CAST de NULL depuis des types pouvant être Nullable renvoie NULL ; sinon, NULL déclenche l’erreurCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov). - Réduction de l’empreinte mémoire des structures de données internes (objets
ISerialization) grâce à l’introduction d’un pool d’objets. #96563 (Nikita Mikhaylov). - Ajout de la prise en charge des champs
passwordetidentityà la config XML de keeper-client. #96800 (Grigorii Sokolik). - Amélioration des écritures
Icebergpour Unity Catalog. #98162 (Konstantin Vedernikov). - Ajout du paramètre
finalize_projection_parts_synchronouslypour permettre la finalisation synchrone des projection parts pendant INSERT, réduisant le pic d’utilisation mémoire pour les tables comportant de nombreuses projections tout en conservant par défaut le comportement asynchrone existant. #98228 (Amos Bird). - Ajout de la colonne
projections_duration_msàsystem.part_log, qui enregistre pour chaque projection la durée des opérations de merge/rebuild en millisecondes. #98292 (Amos Bird). - Amélioration de l’annulation des queries utilisant ExpressionTransform et NumbersRangedSource via KILL QUERY et l’annulation de query (Ctrl+C) dans clickhouse-client. #98908 (Roman Vasin).
- Remplacement de la liste codée en dur
source_table_enginespar une recherche à l’exécution viaStorageFactory::getAllStorages(). Cela ajoute des vérifications d’accès pour certains table engines manquants et clôt #71544. #98984 (pufit). - Ajout d’un paramètre pour contrôler le comportement en cas d’incompatibilité de type pour Variant et Dynamic (déclencher une exception ou renvoyer NULL). #99085 (Bharat Nallan).
- Améliore la compatibilité avec
Iceberget Spark : corrige les incohérences de gestion des chemins dues à l’utilisation conjointe des chemins de stockage et des chemins de métadonnées ; impose que les tablesIcebergenregistrent un emplacement de table qui soit soit une URL, soit un chemin absolu ; ajoute un mécanisme de repli pour le calcul de la taille des fichiers dansAzure, car certains lecteurs ClickHouse ne prennent pas en charge le comptage des octets après parcours ; gèreversion-hint.txtde manière compatible avec Spark ; introduit des abstractions au niveau des types afin de réduire à l’avenir les risques de confusion entre types de chemins ; ajoute des tests pourAzureetLocalqui vérifient l’interopérabilité entre moteurs sans téléversement ni téléchargement intermédiaires ; corrige l’utilisation des suppressions par position, qui reposait auparavant sur des heuristiques d’inférence de chemin là où cette approche n’est pas appropriée. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik). - Corrige une possible condition de concurrence dans
IPartitionStrategy::cached_result, introduite dans https://github.com/ClickHouse/ClickHouse/pull/92844. #99400 (Arthur Passos). - Les utilisateurs peuvent désormais écrire des types de données Interval de ClickHouse au format Arrow. #99519 (Peter Nguyen).
- Ajoute la prise en charge native de l’importation et de l’exportation des types de données
UUIDaux formatsArrowetParquet. Les utilisateurs peuvent désormais interroger et transférer directement des données UUID entre ClickHouse et d’autres outils de données, sans conversion manuelle en chaîne ni solution de contournement. Ajoute également l’inférence logique automatique pour les UUID de premier niveau, ainsi que la prise en charge d’indices de schéma explicites pour les UUID imbriqués. #99521 (Ivan). - Prend en charge les archives
7zsur le stockage objet. Clôt #70968. #99600 (Alexey Milovidov). - Ajoute les ProfileEvents
ObjectStorageListedObjects,ObjectStorageGlobFilteredObjects,ObjectStoragePredicateFilteredObjectsetObjectStorageReadObjectspour l’introspection du pipeline de listage et de lecture des fichiers du stockage objet (S3,Azure, etc.). #99778 (Sema Checherinda). - Corrige l’échec de la fonction de table
mergeavec l’erreurUNKNOWN_IDENTIFIERlors de l’interrogation de colonnes qui ne sont pas présentes dans toutes les tables distribuées/distantes sous-jacentes. #99833 (Alexey Milovidov). - Le temps de commit est désormais inclus dans la métrique du temps total d’exécution des mutations pour ReplicatedMergeTree. Il avait été perdu après #96376. #99936 (alesapin).
- Ajoute un journal en écriture anticipée pour les objets blob en attente de suppression dans
MetadataStorageFromDisk, ce qui améliore la durabilité et la cohérence entre les métadonnées et le stockage objet distant lors de la suppression d’objets. #100019 (Maksim Kita). - Désactive AI SQL generation (commande
??) dans le client embarqué (protocoles SSH et WebSocket) afin d’empêcher l’accès aux variables d’environnement du serveur. #100290 (Alexey Milovidov). - Modifie l’interface des inserts Iceberg avec le catalogue. Déprécie les paramètres :
storage_catalog_type,storage_aws_access_key_id, etc. #100334 (Konstantin Vedernikov). - Rendre les tabulations sous forme de 4 espaces lors du collage dans clickhouse-client. Corrige #100405. #100416 (Raúl Marín).
- Éviter de parcourir l’ensemble du catalogue distant du data lake pour les suggestions de table « Maybe you meant … » lorsque
show_data_lake_catalogs_in_system_tablesest désactivé. #100452 (Alsu Giliazova). - Appliquer
distributed_index_analysis_min_indexes_bytes_to_activateaprès l’élagage des partitions. #100477 (Azat Khuzhin). - Correction d’un échec d’assertion dans le push down du bloom filter Parquet lors de l’utilisation de clauses IN/NOT IN vides. #100543 (zoomxi).
- Les statistiques de colonnes MinMax stockent désormais les valeurs minimale et maximale sous forme de Field (typé) au lieu de Float64. Le format sérialisé inclut le nom du type de la colonne avec les valeurs. La version du fichier de statistiques passe à V2 ; les fichiers écrits par des versions antérieures nécessitent une re-matérialisation (ALTER TABLE … MATERIALIZE STATISTICS ALL). Corrige #53140. #100605 (Han Fei).
- Mise à jour de
cppkafkapour inclure le correctif d’interblocage lors de la fermeture du consumer. #100612 (Azat Khuzhin). - Les informations d’objet utilisées pour analyser les data files dans Iceberg contiennent désormais le nombre de lignes du fichier et sa taille en octets, extraits du manifest file. #100645 (Daniil Ivanik).
- Ajout du paramètre de configuration
use_separate_cache_arenapour contrôler la séparation de l’Arena mémoire du cache. #100664 (Seva Potapov). - Ajoute la prise en charge native de l’import des data types
StringViewetBinaryViewd’Apache Arrow dans les colonnesStringde ClickHouse, ce qui améliore la compatibilité pour l’ingestion basée sur Arrow. #100762 (Ivan). - Certains server settings du Keeper server sont désormais rechargés à chaud si le config file est modifié à l’exécution : max_requests_batch_size, max_requests_batch_bytes_size, max_request_size, quorum_reads. #100773 (Michael Kolupaev).
- Incrémente les profile events
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytesdans les builds de release. #100899 (Pavel Kruglov). - Le suivi de la mémoire avec cgroupv2 exclut désormais
slab_reclaimablede la mémoire du noyau, ce qui fournit une mesure plus précise de l’utilisation de la mémoire non récupérable. #100901 (Antonio Andelic). use_partition_pruning = 0désactive désormais aussi l’élagage des indexMinMaxet l’optimisation de comptage sur les colonnes de clé de partition, en plus de désactiver l’élagage basé sur les clés de partition. #100904 (Nihal Z. Miaji).pretty=1dansEXPLAIN [PLAN]affiche désormais les expressions dans un format lisible. #100927 (Kirill Kopnev).accurateCastOrNulletaccurateCastOrDefaultprennent désormais en charge les types ciblesTuple, y compris lesTuplesimbriqués avec des élémentsNullable. Auparavant, ces fonctions rejetaient les ciblesTuplecarTuplene pouvait pas être utilisé dansNullable. Clôt #100820. #100942 (Nihal Z. Miaji).- Correction de la duplication des graphiques dans l’interface Play lors du basculement entre les thèmes clair et sombre. #101058 (Alexey Milovidov).
- Mise à jour de chdig vers v26.3.1 (interface perfetto, sparklines dans le résumé pour CPU/Memory/Merges/Queries, system.warnings, recherche regexp dans les logs). #101092 (Azat Khuzhin). Mise à jour de chdig vers v26.4.3 (améliorations de perfetto, corrections pour le partage via pastila.nl, diffs de flamegraph, modification des paramètres en temps réel). #103145 (Azat Khuzhin).
- Vous pouvez désormais ajouter une virgule finale dans la clause
WITHavant une requêteSELECT. #101093 (Aruj Bansal). - Ajout du paramètre MergeTree
compress_per_column_in_compact_partspour contrôler l’organisation des blocs compressés dans les parts compactes. Quand sa valeur esttrue(par défaut, ce qui préserve le comportement actuel), chaque colonne démarre un nouveau bloc compressé, ce qui permet une décompression sélective. Quand sa valeur estfalse, toutes les colonnes d’une granule sont regroupées dans le même bloc compressé, ce qui améliore le taux de compression et les performances de lecture pour les charges de travail qui lisent toujours toutes les colonnes. #101114 (Amos Bird). - Afficher l’infobulle d’informations sur la table dans l’interface Play uniquement au survol du nom de la table, et non de toute la ligne. #101118 (Alexey Milovidov).
- Ajout d’icônes spécifiques aux moteurs et amélioration de l’UX de la liste des tables dans la barre latérale de l’interface Play. #101134 (Alexey Milovidov).
- Prise en charge de
Nullable(Tuple)pour les formatsArrow,ArrowStream,ORCet l’ancien formatParquet. #101272 (Nihal Z. Miaji). - Affichage de la ligne TOTALS en pied de tableau dans l’interface web (play.html). #101286 (Alexey Milovidov).
- Prise en charge du mode multi-requêtes dans l’interface web (
play.html) : exécutez plusieurs requêtes à la fois, avec exécution parallèle des requêtes de typeSELECTet affichage des résultats par requête. #101290 (Alexey Milovidov). - Correction du redimensionnement des colonnes dans l’interface web play.html après la refactorisation de la table de résultats en composant web. #101295 (Alexey Milovidov).
- Ajout de la possibilité de limiter le nombre de flushes du profil jemalloc sur MEMORY_LIMIT_EXCEEDED par intervalle de temps. #101396 (Azat Khuzhin).
- Ajout des paramètres de Keeper
nuraft_streaming_mode(par défautfalse),nuraft_max_log_gap_in_streametnuraft_max_bytes_in_flight_in_stream. Résout #90743. #101427 (Kseniia Sumarokova). - Ajout de la métrique asynchrone
CGroupMemoryUsedWithoutPageCache, qui signale l’utilisation de la mémoire du cgroup en excluant à la fois le cache de pages de l’OS du noyau et le userspace page cache de ClickHouse, à l’image deMemoryResidentWithoutPageCache. La description de la métriqueCGroupMemoryUseda également été clarifiée. #101513 (Francesco Ciocchetti). - Ajout d’un sucre syntaxique au niveau du parser pour la syntaxe de fonction
OVERLAYstandard SQL. La fonctionoverlayexiste déjà ; cela ajoute la prise en charge de la forme basée sur des mots-clés utilisantPLACING,FROMetFORcomme séparateurs. #101681 (Desel72). - Ajout de l’alias de colonne
INDEX_LENGTHà la table systèmeinformation_schema.tables, par analogie avec les alias existants en majuscules dans cette table. #101705 (Robert Schulze). - La table système
information_schema.tablesignore désormais les parties de table inactives. Cela rend les valeurs de taille de table affichées plus réalistes. #101706 (Robert Schulze). - La fonction
ngramsrejette désormais les longueurs de ngram invalides. Exemple :SELECT ngrams('abc', 0)renvoie maintenant une erreur. #101922 (Robert Schulze). - Suite à #91820 et #90837 : filtrer les algorithmes non pris en charge dans le message d’erreur ; exécuter les tests spécifiques à FIPS dans les builds FIPS. #102067 (Mikhail f. Shiryaev).
- Limitation de la hauteur des cellules à trois lignes dans l’interface web (
play.html), avec des cellules dépliables au clic. #102154 (Alexey Milovidov). - Ajout d’une nouvelle option permettant de forcer le style (virtuel/chemin) pour les S3 endpoints. Résout #82019 ; #76007 Suite de https://github.com/ClickHouse/ClickHouse/pull/83168. #102378 (Konstantin Vedernikov).
- Le paramètre
restore_replace_external_engines_to_nullignore désormais également la restauration des databases utilisant des engines externes (par ex.DataLakeCatalog,MySQL,PostgreSQL,S3) au lieu d’échouer ou d’initier des connexions externes. #102400 (Nikita Fomichev). - Ajout de la prise en charge de l’index analysis pour les text index de la fonction
hasPhrasevia le modeHINT. #102438 (Elmi Ahmadov). - Traiter STATISTICS comme read-only dans ColumnDependency pour corriger LOGICAL_ERROR lors de MATERIALIZE STATISTICS ALL. #102627 (Konstantin Bogdanov).
- Créer et peupler
system.asynchronous_metric_logen mode keeper-as-server. #102664 (Miсhael Stetsyuk). - Ajout de l’option de configuration
default_system_log_flush_policy.skip_alias_columnspour permettre d’omettre les colonnes ALIAS des tables de log système, ce qui corrige le problème des logs système sur S3 qui refusent les colonnes ALIAS. #102669 (Miсhael Stetsyuk). - Ne pas activer les statistiques automatiques pour les tables système. Elles ont rarement l’occasion d’en tirer parti. #102862 (Han Fei).
- Prise en charge du tokenizer
arraypour l’optimisation de LIKE. #102880 (Elmi Ahmadov). - Envoyer MemoryAllocatedWithoutCheck même dans les builds de release. #103064 (Azat Khuzhin).
- Exposer
untracked_memorypar thread danssystem.stack_trace. #103065 (Azat Khuzhin).
Correction de bug (dysfonctionnement visible par l’utilisateur dans une version stable officielle)
- Corrige l’erreur
Block structure mismatch in streamcausée par des colonnes inutiles renvoyées par la lazy materialization. Corrige #95191. #96682 (Nikolai Kochetov). - Corrige une erreur logique dans une requête de policy de masquage des données avec
ON CLUSTER. #97594 (Bharat Nallan). - Corrige un bug lors de l’utilisation d’Unity Catalog avec GCS. #98456 (Melvyn Peignon).
DataLakeCatalogrespecte désormais la configurationhttp_forbid_headersdu serveur lors de la validation du paramètreauth_header. #98827 (Michael Anastasakis).- Corrige les appels N+1 à
HeadObjectpour les globs S3 avec expansion d’accolades. #99219 (Konstantin Bogdanov). - Valide les modifications de paramètres dans les requêtes CREATE lorsque l’engine lui-même prend aussi en charge des settings. #99279 (János Benjamin Antal).
- Corrige l’échec de
ALTER TABLE UPDATE/DELETEavec l’erreurMissing columnslorsqu’une table possède une colonne MATERIALIZED dont l’expression dépend d’une colonne EPHEMERAL. #99281 (Yash ). - Les informations d’authentification dans les chaînes de connexion JDBC, ODBC et NATS sont désormais masquées dans les query logs et la sortie de
SHOW CREATE, ce qui évite l’exposition accidentelle d’informations sensibles. Pour les chaînes de connexion au format URI (par ex.{scheme}://{user}:{password}@{host}), seule la partie mot de passe est masquée, tandis que le reste reste visible pour faciliter le débogage. Le paramètrenats_tokenest désormais lui aussi masqué. #99344 (János Benjamin Antal). - Corrige
parseDateTimeBestEffort, qui interprétait incorrectement les mots commençant par des préfixes de mois au format DD-month-YYYY. Closes #99345. #99350 (Pavel Kruglov). - Corrige l’ignorance de TABLE_UUID_MISMATCH en l’absence de l’analyzer. #99380 (Azat Khuzhin).
- Corrige un bug où des settings explicites envoyés avec
compatibilitydans la même requête pouvaient être ignorés silencieusement lorsque leur valeur correspondait à la valeur par défaut du serveur. #99402 (Raufs Dunamalijevs). - Corrige des cas où des nombres avec des zéros initiaux dans le path de partitioning Hive provoquaient des erreurs. Corrige #98801. #99458 (Yarik Briukhovetskyi).
- Corrige un heap-use-after-free lorsqu’une table est supprimée de façon concurrente avec une requête de lecture en cours d’exécution (19 occurrences dans la CI au cours des 90 derniers jours). #99483 (Alexey Milovidov).
- Corrige un bug dans Keeper où une read request pouvait rester bloquée (provoquant l’expiration de la session) si une autre session sans lien sur le même serveur était fermée exactement au mauvais moment. #99484 (Michael Kolupaev).
- Valide la structure des colonnes avant d’appliquer les patchs. #99531 (Seva Potapov).
- Corrige l’échec d’assertion
rows_sourceslors d’une fusion verticale lorsqueSYSTEM STOP/START MERGESest activé et désactivé rapidement pendant la fusion d’une table avec des colonnesDynamic. #99532 (Alexey Milovidov). - Corrige un partition pruning incorrect pour
toWeek()qui faisait que les queries avecWHERE toWeek(date, mode) = Nrenvoyaient des résultats vides pour les semaines 49 à 52 sur des tables partitionnées partoYYYYMM(date). #99542 (Takumi Hara). - Corrige une exception dans les fonctions opérant sur ColumnReplicated avec des lignes non référencées produites par JOIN. #99564 (Hechem Selmi).
- Corrige le fait que
CLEAR COLUMNne reconstruisait pas les projections et ne réévaluait pas les colonnes matérialisées qui dépendent de la colonne effacée, ce qui pouvait provoquer des exceptions ou une corruption des données lors des fusions suivantes. #99565 (Desel72). - Corrige une exception (
Bad get: has Tuple, actual type String) dansConditionSelectivityEstimatorlorsqu’une query utilise IN avec un seul query parameter scalaire (par ex.WHERE col IN ({p:String})) sur une table qui a des column statistics et avecuse_statisticsactivé. #99614 (Ilya Yatsishin). - Une part avec des projections inconnues ne doit pas être marquée comme perdue définitivement. #99623 (Sema Checherinda).
- Corrige une rare exception de logical error pendant une fusion verticale lorsque
SYSTEM STOP MERGESetSYSTEM START MERGESsont exécutés de manière concurrente. #99628 (Desel72). - Corrige une référence pendante dans injectRequiredColumns provoquant un plantage pendant la fusion. #99679 (Tuan Pham Anh).
- Corrige un comportement indéfini dans le lecteur Avro format lors de la lecture de numeric values qui dépassent le column type cible. Désormais, les queries échouent en cas de dépassement au lieu de produire silencieusement des valeurs incorrectes. #99697 (asyablue22).
- Corrige l’analyse des guillemets de style shell dans les arguments de la table function
executable. #99794 (Nikita Semenov). - Corrige un arrêt à tort dans
NativeReaderlors de la désérialisation d’un flux au Native format avec une incohérence du nombre de lignes :LOGICAL_ERRORest remplacé parINCORRECT_DATAafin que l’erreur soit traitée comme une erreur de données au lieu de déclencherabort()dans les builds sanitizer/debug. #99822 (Rahul Nair). - Corrige l’arrêt du processus lors de la désérialisation d’une colonne
Tuplelorsque le type de sérialisation dans le flux binaire estDETACHED. #99823 (Rahul Nair). - Corrige une fausse exception
LOGICAL_ERRORlors du redimensionnement dynamique du filesystem cache en raison d’une race condition dans la promotion de la sous-file SLRU. #99850 (Alexey Milovidov). - Corrige les queries d’async insert qui signalaient
written_rows,read_rowsetresult_rowsà zéro dansquery_loget la sortie du client. #99879 (Sema Checherinda). - Correction de l’exception “Bad cast from type X to Y” dans
KILL QUERYlorsque la requête interne sur les tables système renvoie des colonnes encapsulées dansColumnConst. #99881 (Alexey Milovidov). - Correction d’une erreur logique avec une sous-requête corrélée dans un argument
untuple. #99917 (Vladimir Cherkasov). - Corrige une exception lors de l’appel à
right,rightUTF8ou à d’autres fonctions de sous-chaîne avec une longueur égale à INT64_MIN (-9223372036854775808), ce qui provoquait auparavant un comportement indéfini en raison d’un dépassement de capacité d’entier. Les fonctions signalent désormais correctement une erreur ARGUMENT_OUT_OF_BOUND. #99934 (Jimmy Aguilar Mena). - Désormais, ClickHouse devrait gérer correctement les tables de type Spark (où chaque fichier a soit un chemin absolu complet, soit un chemin relatif par rapport au chemin commun de la table). Corrige #92348. #99935 (alesapin).
- Correction de l’exception “Inconsistent AST formatting” pour
ALTER TABLE ... MODIFY QUERYavec des sous-requêtes imbriquées contenantSETTINGSlorsque l’instructionALTERcontient elle aussiSETTINGS. #99938 (Nikita Mikhaylov). - Annule #97114 “Move join step row estimation before check for 1 child” en raison d’une suspicion de régression des performances. #99957 (Alexander Gololobov).
- Corrige un bug où ClickHouse pouvait ignorer des fichiers si l’en-tête
Content-Lengthétait absent de la réponse à leur requête HEAD (par exemple, en raison d’un transcodage décompressif dans GCS). #99971 (Yarik Briukhovetskyi). - Correction d’un échec d’assertion (exception dans les builds de débogage, résultats incorrects dans les builds de release) lors de la multiplication des états d’agrégat
NumericIndexedVectorpar une constante entière paire, causé par un auto-XOR sur des bitmaps Roaring aliasés danspointwiseAddInplace. #99976 (Desel72). - Empêche l’exception
Unexpected return typedans l’ancien pushdown de filtre à travers desJOIN USINGchaînés lorsque les types de clé changent après les conversions de jointure. #99999 (Alexey Milovidov). - Correction de l’exception
LOGICAL_ERROR“Unexpected node type for table expression … Actual IDENTIFIER” lorsqu’une sous-requête scalaire est utilisée dans un argument de fonction de table non résolu, par exempleSELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1))). #100014 (Alexey Milovidov). - Correction de l’échec de
INSERTavecVALUESlorsque les données étaient suivies d’un commentaire SQL final (--ou/* */) sur la ligne suivante. Le commentaire est désormais ignoré au lieu d’être analysé comme une autre ligne. #100016 (Pratima Patel). - Correction d’une exception dans
arrayRemovelors de la comparaison de tuples avec des composantes NULL. #100017 (Alexey Milovidov). - Corrige une fuite de données entre utilisateurs dans
system.asynchronous_inserts: tout utilisateur disposant deSELECTsur la table pouvait voir des entrées d’async insert en attente appartenant à d’autres utilisateurs. Les entrées sont désormais filtrées en fonction de l’utilisateur courant, sauf si celui-ci possède le privilègeSHOW_USERS. #100024 (Shaohua Wang). - Corrige le cas où le cast de Time64 vers UInt64 pouvait limiter les valeurs à 24 heures. #100025 (Yarik Briukhovetskyi).
- Corrige un plantage du serveur local lorsque CREATE DICTIONARY comporte une définition avec une valeur de liste contenant une fonction inexistante. #100036 (Yakov Olkhovskiy).
- Corrige l’impossibilité pour les formats
CSVetMsgPackd’analyser correctementNullable(Tuple). Clôt #99753. #100038 (Nihal Z. Miaji). - Corrige l’échec de
CREATE VIEWavecUNKNOWN_IDENTIFIERlors de l’utilisation d’un alias d’expression de fonction dans WITH (par ex.tuple(...)) comme opérande droit deIN. #100042 (Peng). - Corrige l’échec des aggregate functions de séries temporelles (par ex.
timeSeriesResampleToGridWithStaleness) avecILLEGAL_TYPE_OF_ARGUMENTlorsqu’elles sont utilisées avecinitializeAggregationouAggregatingMergeTreeavec des parallel replicas. #100053 (Alexey Milovidov). - Corrige le traitement des valeurs négatives dans NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
- Corrige le fait que les fonctions
accurateCastOrDefaultetto*OrDefaultne préservaient pas le type de colonne Const pour les entrées constantes. #100132 (Alexey Milovidov). - Les query parameters omis avec le type
LowCardinality(Nullable(T))prennent désormais correctement la valeur NULL par défaut, commeNullable(T). #100144 (Denys Melnyk). - Corrige l’utilisation d’une valeur non initialisée dans StringSearcher.h. #100225 (Konstantin Bogdanov).
- Autorise l’annulation des subqueries scalaires et d’autres pipelines d’analyse via Ctrl+C. Auparavant, appuyer sur Ctrl+C pendant l’exécution d’une subquery scalaire longue n’avait aucun effet tant que celle-ci n’était pas terminée. Corrige également la barre de progression et les statistiques JSON afin qu’elles indiquent correctement les lignes lues pendant l’exécution de la subquery scalaire, à la fois dans
clickhouse-clientetclickhouse-local. Coécrit avec @YjyJeff. #100230 (Raúl Marín). - Corrige une exception
LOGICAL_ERRORdans les queries impliquant des colonnesDynamicavec des CROSS JOIN et des Runtime Filters, due au fait queColumnVariant::filterpartageait des pointeurs de variant column au lieu de les cloner dans le chemin d’optimisationhasOnlyNulls. Clôt https://github.com/ClickHouse/ClickHouse/pull/100147. #100234 (Pavel Kruglov). - Corrige un bug sur les Array de Variant qui pouvait réinterpréter le data type lors de l’appel des fonctions
arrayFirst/arrayLast. Par exemple, auparavant,Array(Variant(Date, Bool))était converti enBoolalors que le variant type sous-jacent réel étaitDate. #100255 (timothygk). - Quelques modifications mineures apportées aux fonctions : les fonctions h3 valident désormais mieux les bornes ; readWKB vérifie les limites de taille (nouveau paramètre :
max_wkb_geometry_elements) ; les fonctions de génération aléatoire limitent désormais le nombre maximal d’itérations dans leurs calculs. Complément à #93543. #100270 (Alexey Milovidov). - Correction d’un problème où cutURLParameter pouvait ignorer à tort des paramètres lorsqu’ils apparaissaient comme sous-chaînes d’autres paramètres. #100280 (Nikita Semenov).
- Correction d’une exception lorsque le paramètre de chemin de fichier des métadonnées Iceberg contient un octet nul. #100283 (Alexey Milovidov).
- Correction du nombre quadratique de requêtes exécutées lorsque
distributed_index_analysisest utilisé avec des prédicats contenant des sous-requêtesIN. #100287 (Anton Popov). - Correction de l’exception “Block structure mismatch” lors de l’utilisation de
GROUP BY ... WITH TOTALS HAVINGcombiné àUNION DISTINCTet à des expressions Nullable. #100293 (Alexey Milovidov). - Correction de l’exception LOGICAL_ERROR dans
estimateCompressionRatiolorsque le paramètreblock_size_bytesest extrêmement élevé. #100298 (Alexey Milovidov). - Correction de l’exception “Inconsistent AST formatting” dans les versions de débogage lors de l’utilisation de
GROUP BY CUBE(...) WITH ROLLUPou de combinaisons similaires. #100376 (Alexey Milovidov). - Correction d’une exception lors de la création d’une vue avec des alias de colonnes et des requêtes
SELECT *ouEXCEPT/INTERSECT. #100386 (Alexey Milovidov). - Correction de
DROP TABLE, qui restait bloqué indéfiniment sur des tables utilisant le moteur Kafka lorsque des consommateurs restaient bloqués dans un rééquilibrage après une erreur de heartbeat. #100388 (Alexey Milovidov). - Correction de l’exception
ReadBuffer is canceled. Can't read from it.dans les opérations de sauvegarde/restauration utilisant des archives zip. #100400 (Alexey Milovidov). - Correction de l’exception
TOO_MANY_ROWSpour les requêtesSELECT count()avecmax_rows_to_read/force_primary_keylorsque les données sont réparties sur plusieurs parts avec des limites de granules non alignées. #100408 (Alexey Milovidov). - Correction de
system.completionsafin de filtrer correctement les bases de données, les tables et les colonnes selon les droits d’accès dans toutes les combinaisons de grant : par table, par base de données et revoke par colonne. #100432 (Shaohua Wang). - Correction d’un SEGFAULT dans NuRaft dû à une condition de concurrence. #100444 (Pablo Marcos).
min/max/argMin/argMaxtraitent désormais NaN de manière cohérente avecORDER BY: NaN est toujours ignoré (et n’est renvoyé que si toutes les valeurs sont NaN). Auparavant, les résultats dépendaient de la position de NaN dans les données, en raison de la sémantique de comparaison non ordonnée d’IEEE 754. #100448 (Raúl Marín).- Correction d’un bug de copier-coller où
delta_lake_snapshot_end_version, défini sansdelta_lake_snapshot_start_version, était ignoré silencieusement au lieu de produire une erreurBAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar). StorageRabbitMQ::shutdownn’est pas idempotente (elle accède inconditionnellement à des pointeurs faibles, puis détruit les pointeurs partagés correspondants), mais elle est désormais appelée deux fois : une fois dansStreamingStorageRegistry, puis dansDatabaseCatalog. Ce correctif rend la méthode idempotente et ajoute des vérifications défensives de nullité. #100455 (Miсhael Stetsyuk).- Correction de l’exception
LOGICAL_ERRORlors de l’utilisation deaccurateCastOrNullavec le type cibleQBit. #100470 (Raufs Dunamalijevs). - Correction de l’exception LOGICAL_ERROR “Stream … not found” lors d’un insert dans une table contenant des colonnes
Array(JSON)imbriquées, dans des wide parts avecoptimize_on_insert=0. #100475 (Pavel Kruglov). - Validation des chemins d’entrée de fichier dans les métadonnées de sauvegarde afin de rejeter les traversées de répertoires, les chemins absolus et les noms vides pendant
RESTORE. #100483 (Pablo Marcos). - Correction du non-fonctionnement de la syntaxe
LIMIT m OFFSET n WITH TIES. Cette syntaxe est équivalente àLIMIT n, m WITH TIES, qui fonctionnait déjà. #100491 (Nihal Z. Miaji). - Correction de l’exception “No set is registered for key” lors de l’utilisation de
INavec des colonnesNullable(Tuple)ayant des champs nommés et des élémentsLowCardinality. #100523 (Alexey Milovidov). - Correction d’un heap-buffer-overflow dans usearch
sorted_buffer_gt::insert()qui pouvait provoquer un crash ou corrompre silencieusement la mémoire pendant une recherche de similarité vectorielle. #100537 (Dustin Healy). - Correction de
EXECUTE AS, qui ignorait les clausesFORMATetINTO OUTFILEspécifiées dans la requête. #100538 (pufit). - Correction d’un formatage AST incohérent pour SAMPLE avec OFFSET au niveau de la requête. Clôt #100576. #100579 (Pavel Kruglov).
- Correction du Polaris catalog avec Azure. Depuis la version 25.12, ce catalogue avec Azure ajoutait le bucket au début du chemin. Par exemple
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path>au lieu deabfss://polaris-polaris@<some_url>.windows.net/<other-path>. Cette PR supprime le bucket du chemin. #100583 (Konstantin Vedernikov). - Correction d’une exception d’incompatibilité de type dans transform lorsque la colonne
defaultest const sur certains blocs. Clôt #100574. #100616 (Pavel Kruglov). - Corrige des cas de NOT_FOUND_COLUMN_IN_BLOCK où la partie SELECT de la projection contient des colonnes qui n’existent pas dans la partie SELECT d’origine de la requête. Clôt #100194. #100623 (Yarik Briukhovetskyi).
- Vérifie que les dimensions de forme du format Npy sont cohérentes avec la taille du fichier et les limites de dépassement afin d’éviter des dénis de service provoqués par des fichiers
.npymalveillants avec des dimensions démesurées. Rejette également les formes vides et limite la mémoire par ligne à 2 GiB. #100625 (Raúl Marín). - Corrige la non-prise en compte de
session_timezonelors de l’analyse de valeursDateTimependant les async inserts (TCP) et tous les inserts via HTTP. #100647 (Sema Checherinda). - Permet de passer une clé de sharding à
cluster()etclusterAllReplicas()table functions lorsqu’une table function est utilisée comme source (par ex.cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy). - Corrige un crash du serveur (échec d’assertion) lors de l’utilisation de fonctions d’agrégation paramétriques avec le combinateur Array et des arguments NULL, comme
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot). - Corrige une exception lors du calcul du supertype commun pour des tuples vides et non vides avec
use_variant_as_common_typeactivé. #100699 (Antonio Andelic). - Le serveur ne échoue plus au démarrage lorsqu’un disque Azure blob storage est configuré mais que le endpoint est temporairement inaccessible (par ex. en cas d’échec DNS). #100701 (Raúl Marín).
- Corrige un comportement indéfini dans
positiveModulolorsque le diviseur non signé ne peut pas être représenté dans le type de résultat signé. #100705 (Raúl Marín). - Corrige un crash du serveur (erreur logique “Unexpected return type from __topKFilter”) lorsque
use_top_k_dynamic_filteringest activé et que la colonneORDER BYest de typeDynamicouVariant. #100742 (Groene AI). - Corrige un crash du serveur lors de l’utilisation de la fonction
has()avec PREWHERE/WHERE sur une clé Tuple contenant des éléments LowCardinality. #100760 (Groene AI). - Corrige l’échec d’assertion
file_offset_of_buffer_end <= getFileSize()(exception dans les builds de débogage) lors de la lecture de tablesLogouStripeLogsur S3 object storage avec des écritures concurrentes. #100763 (Alexey Milovidov). - Corrige une exception dans l’estimateur de sélectivité des statistiques lorsqu’une WHERE clause contient une expression de fonction (par ex. toDecimal64(col, 3)) sur une table avec les statistiques activées. L’estimateur ignore désormais ces prédicats au lieu de tenter un transtypage invalide. #100764 (Han Fei).
- Corrige un cas rare où une jointure avec réordonnancement peut produire un résultat incorrect. #100790 (Yarik Briukhovetskyi).
- Corrige les types d’argument
AggregateFunctionincorrects dans le comptage trivial optimisé, qui provoquaient une exceptionNUMBER_OF_ARGUMENTS_DOESNT_MATCHlors de requêtes sur des expressions commecount(v0 + v1)sur des tables distribuées. #100794 (YjyJeff). - Certains catalogues pouvaient afficher des secrets dans la section
SETTINGSdu résultat de la requêteselect * from system.databases. Cette PR empêche désormais ce comportement. #100800 (Konstantin Vedernikov). - Corrige un comportement indéfini (débordement d’entier signé) dans
toStartOfIntervallors de l’utilisation d’intervalles Week, Quarter ou Year avec un argument origin et des valeurs d’intervalle extrêmes. #100817 (Raúl Marín). - Corrige l’impossibilité, pour les combinateurs de fonctions d’agrégation
If,Distinct,DistinctIf,IfStateavec un type de retourTupleet un ou plusieurs argumentsNullable, de lire d’anciens états sérialisés après l’introduction deNullable(Tuple). Clôt #98917. #100826 (Nihal Z. Miaji). - Corrige un segfault dans s3Cluster et les requêtes distribuées dû à une utilisation après libération dans le pool de connexions. #100837 (Konstantin Bogdanov).
- Corrige un segfault dû au déréférencement d’un pointeur nul lors du chargement des dictionnaires pendant l’arrêt du serveur.
Context::getUserDefinedSQLObjectsStorage(qui déréférenceuser_defined_sql_objects_storage) est appelé par les threads des dictionnaires en concurrence avec le thread principal appelantContext::shutdown(qui définituser_defined_sql_objects_storageà null). Il faut s’assurer de désactiver les mises à jour futures dans le chargeur de dictionnaires, d’arrêter les requêtes de dictionnaire en cours et de joindre les threads de chargement des dictionnaires, le tout avant d’exécuterContext::shutdown. Comme pour les requêtes normales. #100839 (Miсhael Stetsyuk). - Corrige un débordement de tampon dans
ULIDStringToDateTimelorsque l’entrée contient des octets non ASCII. #100843 (Konstantin Bogdanov). - Corrige un plantage (
LOGICAL_ERROR) lors d’une requête sur une tableMerge(ou la fonction de tablemerge()) qui encapsule plusieurs tables, dont une tableDistributed, avecdistributed_group_by_no_merge=1activé. #100859 (Groene AI). - Cast_keep_nullable, lorsqu’il est activé, ne lèvera pas d’exception lors du transtypage d’une valeur null dynamique vers variant. #100864 (Seva Potapov).
- Corrige les commandes
get,existsetlsdeclickhouse-keeper-client, qui affichaient des messages d’erreurwatch_iden double sur stdout au lieu de stderr. #100893 (Mohammad Lareb Zafar). - Corrige une exception dans
intDiv/intDivOrZerosur des tableaux de tuples Nullable, par ex.SELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín). - Évalue les arguments de moteur pour
StorageAliasavant d’enregistrer la définition, afin que des expressions commecurrentDatabase()soient résolues en littéraux avant d’être enregistrées dans la base de données. #100902 (Nikolay Degterinsky). - Correction de
processAndOptimizeTextIndexFunctionslorsquequery_plan_merge_expressions = 0, quandExpressionStepse trouve directement au-dessus deReadFromMergeTree. Corrige #100879. #100909 (Jimmy Aguilar Mena). - Mise à jour de replxx pour inclure la correction d’un accès hors limites dans do_complete_line. #100925 (Azat Khuzhin).
- Correction de résultats incorrects lorsqu’un JOIN avec l’optimisation shard-by-PK utilise le cache des conditions de requête et que certaines parts sont filtrées par des conditions mises en cache. #100926 (Groene AI).
- Correction de
divideetintDiv, qui renvoyaientILLEGAL_DIVISIONlorsqu’ils étaient utilisés dans des expressions de filtre pendant l’analyse des index dans certains cas. #100928 (Nihal Z. Miaji). - Correction des erreurs “La table cible n’existe pas” pour les vues matérialisées avec tables internes lors du démarrage asynchrone, dues à un ordre incorrect des dépendances au démarrage. #100946 (Nikolay Degterinsky).
- Correction d’un comportement indéfini (débordement d’entier signé) dans parseDateTimeBestEffort lors de l’analyse de chaînes datetime comportant plus de 18 chiffres de fraction de seconde. #100948 (Vasily Chekalkin).
- Correction d’un crash lors de l’utilisation d’un index de recherche textuelle avec une clause
INcontenant une sous-requête de tuple, par exempleWHERE (id, str) IN (SELECT (id, str) FROM ...), ou lorsque le nombre de colonnes dans la sous-requête ne correspond pas au tuple à gauche deIN. #100959 (Anton Popov). - Correction d’un crash lors de la construction d’un dictionnaire Polygon à partir d’une table
MergeTreeutilisant une sérialisation sparse des colonnes. #100964 (Anton Popov). - Correction de l’erreur logique “Invalid action query tree node” lors de l’utilisation de
INTERSECT ALL/UNION ALLavec des expressions évaluées comme constantes. #100977 (Alexey Milovidov). - Correction de l’impossibilité, pour la fonction d’agrégation
sumCountOrDefaultavec un ou plusieurs argumentNullable, de lire d’anciens états sérialisés après l’introduction deNullable(Tuple). Clôt #100882. #101021 (Nihal Z. Miaji). - Correction d’un crash (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) dans les algorithmes de fusion lorsque la réplication paresseuse des colonnes (enable_lazy_columns_replication) produit des colonnesColumnReplicatedqui se retrouvent dans des pipelines de fusion avec tri avec des entrées arrivant tardivement. #101036 (Groene AI). - Correction de l’erreur
UNKNOWN_IDENTIFIERincorrecte lorsque le même alias est utilisé pour plusieurs expressions dansSELECT; l’erreur correcteMULTIPLE_EXPRESSIONS_FOR_ALIASest désormais renvoyée. #101040 (Alexey Milovidov). - Correction des colonnes ALIAS de types
DateTime/DateTime64qui n’appliquaient pas la conversion de fuseau horaire lorsque le fuseau horaire déclaré diffère de celui de l’expression. #101043 (Alexey Milovidov). - Correction des politiques de ligne qui n’étaient pas enregistrées dans
query_logpour les vues, les sous-requêtes etINSERT ... SELECT. Bien que les politiques de ligne aient été appliquées lors de la planification de la requête, elles n’étaient pas transmises des sous-planificateurs au planificateur parent pour la journalisation. Les politiques de ligne (pour la journalisation uniquement) sont désormais conservées dansQueryAccessInfo, afin que les planificateurs et sous-planificateurs puissent tous les deux les renseigner. #101044 (Narasimha Pakeer). - Correction d’une exception dans
DirectJoinMergeTreeEntitylorsque les blocks du pipeline contiennent des colonnesColumnConstfusionnées avec des colonnes ordinaires. #101046 (Alexey Milovidov). - Correction d’un espace superflu dans le formatage des alias de colonnes CTE (
WITH t (a, b)→WITH t(a, b)). #101049 (Alexey Milovidov). - Correction d’un échec des fonctions de table
remote/clusteravec des fonctions de table imbriquées commemergelorsque l’analyseur est activé. #101055 (Alexey Milovidov). - Correction de
OFFSETappliqué deux fois dans les requêtes distribuées lorsqueprefer_localhost_replica=1, ce qui produisait moins de lignes que prévu. #101071 (Nihal Z. Miaji). - Correction d’un plantage lors de l’utilisation du format
Regexpavec une expression régulière invalide dans le paramètreformat_regexp. #101074 (Nihal Z. Miaji). - Correction de l’erreur “Illegal type Decimal64 of start parameter” pour les fonctions d’agrégation de séries temporelles lors de l’utilisation de
serialize_query_plan=1avec des répliques parallèles. #101083 (Groene AI). - Correction d’une exception dans
optimizeLazyMaterializationlorsqu’une projection avec PREWHERE est utilisée avecORDER BY ... LIMIT. #101115 (Anton Popov). - Correction d’un plantage du serveur (SIGABRT) lors de l’utilisation de fonctions d’agrégation avec le combinator
Null, réservé à un usage interne (par ex.sumNull,avgNull), et avec le paramètreaggregate_functions_null_for_empty = 1activé. #101147 (Groene AI). - Correction d’un use-after-free dans le chemin d’écriture du cache du système de fichiers, qui pouvait entraîner des lectures depuis une mémoire déjà libérée lors de la journalisation des segments de fichier terminés (détecté par MemorySanitizer dans BuzzHouse). #101161 (Groene AI).
- Correction d’un plantage du serveur avec “Trying to attach external table to a ready set without explicit elements” lorsque l’analyse d’index distribuée rencontre un prédicat GLOBAL IN dont le set a été construit sans éléments explicites. #101178 (Groene AI).
- Correction des fonctions d’agrégation
MAX/MINsur des colonnesDecimal, qui renvoyaient des résultats incorrects lorsque la compilation JIT est activée (une fois le seuil de compilation atteint). #101203 (Raúl Marín). - Correction de la désactivation permanente des optimisations
minmax_count_projectionet des optimisations triviales deCOUNT(*)après un lightweight delete, même après la fusion de toutes les parts portant un masque de lightweight delete. #101212 (Anton Popov). - Corrige un cas pouvant entraîner l’erreur logique
Having zero bytes, ...du cache, lorsqu’un objet distant est écrasé entrelistetread, ce qui produisait auparavant des métadonnées d’objet obsolètes. #101219 (Kseniia Sumarokova). - Corrige un crash du serveur (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) lors d’une requête sur une table MergeTree avec
ORDER BY CAST(lc_column, 'Type'), lorsquelc_columnest de type LowCardinality. #101220 (Groene AI). - Corrige le nettoyage des processing nodes obsolètes dans
S3Queue. #101230 (Kseniia Sumarokova). - Corrige un comportement indéfini dans mergeTreeAnalyzeIndexes() en cas d’argument
optimizationsinvalide. #101253 (Azat Khuzhin). - Corrige l’exception
Logical error: 'partitions_count > 0'lors de l’exécution d’instructionsALTER TABLE UPDATEconsécutives sur une table Iceberg partitionnée. #101278 (Desel72). - Corrige des résultats de requête erronés lorsqu’une constante entière de grande taille (par ex. 256, 2147483648) est utilisée comme prédicat booléen dans une WHERE clause avec AND sur des tables MergeTree. Par exemple,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648renvoyait incorrectement 0 au lieu de correspondre à toutes les lignes. #101287 (Groene AI). - Corrige les insert-select depuis un cluster delta lake avec replicated merge tree. #101299 (Konstantin Vedernikov).
- Corrige un crash avec “Logical error: Reading from materialized CTE before materialization” lorsqu’une sous-requête scalaire référence une chaîne de materialized CTE dépendantes. #101305 (Groene AI).
- Corrige une data race sur
storage_iddansIStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky). - Corrige le formatting et le clonage de l’AST BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
- Corrige un crash LOGICAL_ERROR “Current component is empty” lors d’une requête sur
system.part_moves_between_shardsavecenforce_keeper_component_trackingactivé. #101462 (Groene AI). - Corrige une faute de segmentation dans DataTypeDynamic::create() lorsque le fuzzer génère un AST de type Dynamic mal formé. #101464 (Groene AI).
- Génère une erreur lorsque
delta_lake_snapshot_versionou les paramètres de version CDF sont utilisés sans DeltaKernel activé, au lieu de renvoyer silencieusement des données erronées. #101489 (Desel72). - Corrige l’exception
NOT_FOUND_COLUMN_IN_BLOCKlors de l’utilisation de ARRAY JOIN avec JOIN USING et du paramètreanalyzer_compatibility_join_using_top_level_identifieractivé. Ferme #101240. #101507 (Vladimir Cherkasov). - Correction de la boucle de retry d’INSERT Iceberg qui échouait lorsque la table avait été créée avec
iceberg_metadata_file_pathet que la version cible des métadonnées existait déjà. #101548 (Groene AI). - Suppression de Nullable de la colonne de résultat dans arrayIntersect et les fonctions associées afin d’éviter une incohérence de sérialisation/désérialisation. #101569 (George Larionov).
- Correction d’un crash du serveur (LOGICAL_ERROR) lors d’un SELECT sur une vue matérialisée reposant sur le table engine IcebergLocal. #101577 (Groene AI).
- Correction d’un message d’erreur incorrect lors de l’appel à
intExp10avec un argument NaN — il indiquaitintExp2au lieu deintExp10. #101582 (Krishna Chaitanya). - Correction du fait que
allow_statistics=0ne bloquait pasALTER TABLE ADD STATISTICSetALTER TABLE DROP STATISTICSaprès la refactorisation de #100288. #101585 (Krishna Chaitanya). - Correction de l’échec de
KeeperMapCREATE TABLEavec “Cannot create metadata for table” lorsque des nœuds ZooKeeper résiduels issus d’un drop partiel antérieur à la version 25.1 ne contenaient pas le nœuddrop_lock_version. #101623 (Antonio Andelic). - Correction d’une possible erreur logique lors de la lecture des sous-colonnes de Map. Ferme #100769. Ferme #101336. #101641 (Pavel Kruglov).
- Correction de la priorité d’une correspondance exacte de sous-colonne sur une correspondance par préfixe dans
getSubcolumnDataafin d’éviter un crash potentiel. Ferme #101271. #101645 (Pavel Kruglov). - Correction d’un crash (LOGICAL_ERROR: “ColumnUnique can’t contain null values”) lors de la comparaison d’une colonne
LowCardinalityavec une constante NULL de typeVariantalors queuse_variant_default_implementation_for_comparisonsest désactivé. #101690 (Groene AI). - Ajout d’une protection contre les flux vides dans Bzip2ReadBuffer afin qu’il renvoie EOF au lieu de lever UNEXPECTED_END_OF_FILE lorsque le flux interne est vide. #101691 (ClickGap AI Bot).
- Correction du texte de description inversé pour la colonne
alterabledanssystem.s3_queue_settingsetsystem.azure_queue_settings— les significations de0et1ont été permutées pour correspondre au comportement réel du code. #101703 (ClickGap AI Bot). - Correction du fait que positiveModulo(tuple, number) était incorrectement dirigé vers la division au lieu du modulo. #101709 (ClickGap AI Bot).
- Correction d’un crash lorsque
thread_pool_sizeest configuré sur un disk enveloppé par un cache. Auparavant,FileCacheSettings::loadFromConfig()rejetaitthread_pool_sizecomme un setting inconnu, empêchant le serveur de démarrer. Ce setting est un paramètreIDiskvalide qui contrôle le nombre de threads utilisés pour les opérations de copie de disk à disk lors des déplacements de parts en arrière-plan. #101712 (Francisco). - Correction de la création de dictionnaire
RANGE_HASHED, qui acceptait silencieusement un attribut de plageMAXinexistant et utilisait une configuration de type incorrecte lorsque les attributs de plage min et max avaient des types différents. Le bug provenait d’une erreur de copier-coller dansbuildRangeConfiguration, qui recherchaitmin_attr_nameau lieu demax_attr_namepour l’attribut max. #101732 (Yakov Olkhovskiy). - Correction d’un crash de type use-after-free dans le scheduler de lease CPU lorsque le temporisateur d’attente survit au worker thread dont il référence
ProfileEvents::Counters. #101761 (Antonio Andelic). - Correction d’un bug dans les fonctions arrayLevenshteinDistanceWeighted et arraySimilarity. Clôt #101725. #101767 (Mikhail f. Shiryaev).
- Correction de l’API de requête Prometheus, qui ignorait les corps de formulaire POST. #101794 (James Cunningham).
- Correction d’une exception s’échappant du destructeur S3
Client::~Clientet provoquant l’arrêt du serveur. #101798 (Gagan Dhakrey). - Correction d’un use-after-scope dans la désérialisation en parallèle des paths dynamiques du type
Object, qui pouvait provoquer des crashs lors de la lecture de tables comportant de nombreux paths dynamiques. #101823 (Antonio Andelic). - Correction d’une sortie incorrecte dans la fonction
formatDateTimeavec le formatter%Wsous certains paramètres de formatting (non par défaut). #101847 (Robert Schulze). - Correction d’un faux négatif de
shouldPatchFunctiondansSYSTEM INSTRUMENT ADDlorsque la chaîne recherchée apparaît d’abord dans un argument de template du nom de symbole démêlé. #101885 (Pablo Marcos). - Correction de la perte du registre UDF lorsque la session ZooKeeper expire pendant le refresh périodique — toutes les user-defined functions pouvaient devenir indisponibles jusqu’à ce qu’un full refresh réussisse. #101891 (Nikita Fomichev).
- Correction de la description de
system.codecspourAES_256_GCM_SIV, afin d’indiquerAES-256au lieu deAES-128. #101917 (Jimmy Aguilar Mena). - Correction de l’utilisation d’Extremes incorrects dans un min-max index créé sur une JSON column, entraînant un résultat de query erroné. Clôt #101700. #101918 (Pavel Kruglov).
- Le tokenizer
splitByStringrejette désormais les chaînes de séparation vides. #101928 (Robert Schulze). - Correction de
materialize_skip_indexes_on_merge=false, qui ne désactivait pas les text indexes (full-text) pendant le merge. Auparavant, seuls les skip indexes non textuels (minmax, set, bloom_filter) étaient désactivés ; les text indexes continuaient à être construits, gaspillant du CPU et des E/S. #101932 (Groene AI). - Le tokenizer
sparseGramsgénérait des tokens plus longs que la longueur maximale fournie (à cause d’un+2codé en dur dans l’implémentation). #101934 (Elmi Ahmadov). - Corrige un SIGSEGV dans
MergeTreeDataPartWriterWide::cancellorsqu’un constructeur de flux lève une exception pendantaddStreams, laissant une entrée nulle danscolumn_streams. #101936 (Antonio Andelic). - Corrige une exception lors de requêtes sur des tables Merge ou Distributed avec un index full-text et des conditions de filtrage combinées mêlant
has*Tokenset LIKE, lorsquequery_plan_direct_read_from_text_indexest activé. #101939 (Jimmy Aguilar Mena). - Corrige un comportement indéfini lors de l’analyse de paquets Query du protocole natif contenant des valeurs
QueryProcessingStagenon valides. #101972 (Raúl Marín). - Ferme la connexion TCP lorsqu’une exception se produit pendant l’analyse de la requête initiale afin d’éviter la lecture de données parasites depuis un flux désynchronisé. #101989 (Raúl Marín).
- Corrige un bug de concurrence SLRU dans le filesystem cache 26.1+, qui peut entraîner une logical error de réservation d’espace. En build de débogage, cela peut également provoquer l’échec de l’assertion :
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.. #101991 (Kseniia Sumarokova). - Corrige une exception lors de la conversion d’une chaîne contenant des données supplémentaires vers le type vide
Tuple(). #102011 (Alexey Milovidov). - Corrige un ordre de lignes incorrect dans les requêtes qui utilisent ORDER BY avec l’algorithme de jointure grace_hash. Les requêtes concernées pouvaient renvoyer des résultats dans le mauvais ordre, produisant silencieusement une sortie incorrecte. #102036 (János Benjamin Antal).
- Corrige une LOGICAL ERROR (Unexpected size of index type) pouvant se produire dans des requêtes RIGHT JOIN et FULL JOIN lorsque le paramètre
max_bytes_in_joinétait défini. #102042 (Jimmy Aguilar Mena). - Corrige les cas où Time avec des valeurs négatives renvoyait un résultat erroné lors d’une comparaison avec DateTime. Clôt #101670. #102056 (Yarik Briukhovetskyi).
- Corrige un crash lors de l’actualisation d’une UDF, causé par
ZooKeeperRetriesControlqui retentait sur une session ZooKeeper obsolète (expirée) sans la renouveler. #102059 (Nikita Fomichev). - Corrige l’absence d’espaces lors du formatage d’un unlock snapshot. clôt https://github.com/clickhouse/clickhouse/issues/101723. #102063 (Han Fei).
- Corrige un crash (SIGSEGV) lors d’une requête sur une vue avec une WHERE clause, lorsque la requête interne produit des colonnes de types différents de ceux des métadonnées de la vue (par ex. Nullable issu d’un LEFT JOIN avec
join_use_nulls). #102085 (Miсhael Stetsyuk). - Corrige des entrées de
VectorSimilarityIndexCachequi n’étaient jamais évincées après la suppression d’une part, en raison de clés de cache incohérentes. #102152 (Seva Potapov). - Envoie un NACK pour les messages corrompus lors de l’utilisation du stockage RabbitMQ. #102157 (Seva Potapov).
- Corrige une erreur logique lors de l’analyse d’une chaîne de tuple vide invalide. #102289 (Nihal Z. Miaji).
- Corrige des résultats d’agrégation incorrects (lignes dupliquées) lors de l’utilisation de
optimize_aggregation_in_order=1avec des colonnes GROUP BY ordonnées différemment de la clé de tri de la table. #102299 (Groene AI). - Corrige un plantage dans
IcebergLocalALTER TABLE ... UPDATElors de l’utilisation du format Avro, causé par l’absence de déballage des types enveloppesLowCardinality/Nullableavant la sérialisation. #102337 (Desel72). - Corrige une faute de segmentation dans les mutations sur des colonnes matérialisées sans expression. Ferme #102185. #102342 (zoomxi).
- Correction de Coalescing merge tree pour le type tableau. Cela ferme #89509. #102384 (Konstantin Vedernikov).
- Corrige une faute de segmentation (ou
LOGICAL_ERRORdans les builds de débogage) lors de la lecture de fichiers Parquet avec le pushdown du filtre de Bloom activé et des conditions d’égalité/inégalité dans la clause WHERE. Le plantage était dû à un accès mémoire hors limites lors de la récupération des données du filtre de Bloom par le préchargeur Parquet, et pouvait également entraîner des résultats de requête erronés non déterministes. #102385 (Groene AI). - Corrige un abandon
LOGICAL_ERRORlors du redimensionnement dynamique du cache du système de fichiers SLRU, causé par des statistiques d’éviction partagées entre les sous-files d’attente et un chemin de récupération incorrect pour les candidats en échec. #102396 (Antonio Andelic). - Corrige l’échec d’initialisation, sur un nouveau replica, des tables alias sans table cible dans la base de données Replicated. Ferme #101320. #102397 (Nikolay Degterinsky).
- Corrige une lecture hors limites dans les fonctions de recherche de chaînes (
countSubstrings,position, etc.) lors de la recherche d’un needle composé entièrement d’octets nuls. #102401 (Raúl Marín). - Les paramètres d’index de texte intégral (
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read) ne sont plus désactivés lorsque le paramètrecompatibilitypointe vers une version antérieure à 26.1. Auparavant, cela pouvait empêcherSharedDatabaseCatalogde créer des tables avec des index de texte intégral. #102422 (Nikita Fomichev). - Corrige une lecture hors limites dans
printfavec un%final. #102472 (Raúl Marín). - Corrige une exception chassert
ReadBuffer is canceleddans les builds de débogage dans AsynchronousMetrics, causée par le fait que le retour en arrière ne réinitialisait pas l’indicateur d’annulation du buffer. #102524 (Yuri Fedoseev). - Corrige
hasToken/hasTokenOrNullavec des needles composés uniquement de séparateurs (par ex.'()','!!!') sur des colonnes dotées d’un index de texte intégral : auparavant, l’index ignorait silencieusement tous les granules au lieu de leverBAD_ARGUMENTS(pourhasToken) ou de renvoyerNULL(pourhasTokenOrNull). #102544 (Jimmy Aguilar Mena). - Corrige les OOM sur de très grosses requêtes multi dans Keeper. Pour le tracing OpenTelemetry, nous allouons systématiquement >1 KiB pour les spans OpenTelemetry dans les objets
ZooKeeperRequest, ce qui signifie que, pour des requêtes multi vraiment énormes, nous essayons d’allouer >10 GiB de mémoire supplémentaire. Pour corriger cela, nous conservons désormais les données partagées en mémoire statique et utilisonsstd::unique_ptrà la place destd::optionaldansZooKeeperOpentelemetrySpans. #102586 (Miсhael Stetsyuk). - Corrige le gonflement de la CurrentMetric de
NamedCollectionprovoqué parCREATE NAMED COLLECTION IF NOT EXISTSsur des collections existantes, ainsi que l’absence d’initialisation pour les collections chargées depuis la config ou le stockage SQL au démarrage. Clôt #102507. #102598 (Pablo Marcos). - Corrige une exception dans
getStructureOfRemoteTablelorsque le shard local renvoie des colonnes vides en raison d’un DDL concurrent. #102604 (Alexey Milovidov). - Corrige une exception
LOGICAL_ERRORlorsque plusieurs requêtes concurrentesCREATE TABLE IF NOT EXISTSciblent la même tableS3Queuedans une base de données Shared. #102610 (Nikita Taranov). - Corrige le crash
LOGICAL_ERROR« Unexpected number of rows in column subchunk » dans le lecteur natif Parquet V3 lors de la lecture de colonnes Nullable avec un filtre WHERE. #102628 (Groene AI). - Corrige la description de l’événement de profil
AzureWriteMicroseconds, qui indiquait « read » au lieu de « write ». #102639 (Miсhael Stetsyuk). - Corrige un problème avec la politique de lignes qui provoque l’exception « Not found column in block » dans certains cas particuliers. #102648 (Yarik Briukhovetskyi).
- Corrige une exception du serveur dans ClusterDiscovery lorsqu’un cluster statique (défini dans la config) n’avait temporairement aucun nœud actif. #102661 (Kseniia Sumarokova).
- Corrige une inférence erronée du type de données date en cas de dépassement après ajustement du fuseau horaire. Clôt #102601. #102674 (Pavel Kruglov).
- Corrige le blocage infini de
SYSTEM WAIT VIEWlorsque la vue matérialisée actualisable est supprimée alors que l’attente est en cours. #102681 (Nikolay Degterinsky). - Corrige CASE avec une expression Dynamic qui renvoyait ELSE pour toutes les lignes. Clôt #102511. #102684 (Pavel Kruglov).
- Corrige la sérialisation du type Dynamic aplati avec des types de données encodés en binaire. Clôt #101911. #102692 (Pavel Kruglov).
- Corrige le fait que format_schema_source=‘query’ ignorait silencieusement les résultats sur plusieurs lignes. Clôt #101905. #102698 (Pavel Kruglov).
- Signale le code de sortie réel via le client SSH au lieu de ramener toutes les erreurs à
1. Résout #101741. #102700 (Konstantin Bogdanov). - Corrige la perte des en-têtes HTTP pour les handlers de requêtes dynamiques/prédéfinies. Résout #101846. #102706 (Konstantin Bogdanov).
- Applique une correction d’échantillonnage de Poisson aux heap profiles jemalloc réduits afin de correspondre à la sortie de jeprof. Auparavant, le format réduit sous-estimait les tailles d’allocation réelles car il ne tenait pas compte de la probabilité d’échantillonnage. #102759 (Antonio Andelic).
- Corrige le crash dans la fonction
hasPhraseavec un argumentNULL. #102802 (Nikita Taranov). - Corrige un crash du serveur (SIGSEGV) lors de la lecture de fichiers Avro avec des schémas récursifs contenant des références cycliques à des types symboliques. Ces schémas sont désormais détectés et rejetés avec un message d’erreur clair, au lieu de provoquer un crash. #102853 (Groene AI).
- Corrige un crash du serveur (assertion LOGICAL_ERROR) lorsqu’une fonction sur une colonne
Variantatteint une limite mémoire ou rencontre une autre exception sans rapport avec une conversion de type lors du transtypage du résultat dansFunctionVariantAdaptor. L’exception est désormais propagée correctement au lieu d’être classée à tort comme une erreur interne. #102855 (Groene AI). - Corrige un crash du serveur dans les builds debug/sanitizer lorsqu’une
std::length_errorest levée pendant l’inférence de schéma (par exemple à cause de valeurs extrêmes deinput_format_msgpack_number_of_columnsou de données d’entrée malformées). #102859 (Groene AI). - Fait en sorte que la représentation de null dans la sérialisation des colonnes répliquées et creuses respecte les paramètres (par exemple
format_tsv_null_representation). #102888 (Hechem Selmi). - Rétroporté dans #103499 : corrige les requêtes S3 qui échouaient avec
ios_base::clear: unspecified iostream_category errorau lieu d’être retentées, parce que PocoBufferedStreamBuf::flushBufferne gérait pas les écritures courtes depuis la couche socket. #102894 (Sema Checherinda). - Corrige le fait que les optimisations
minmax_count_projectionet les optimisations triviales deCOUNT(*)restaient désactivées de façon permanente après un lightweight delete, même après la fusion de toutes les parties portant un masque de lightweight delete. #102900 (Anton Popov). - Corrige des crashes aléatoires dans jemalloc dus à LTO. #102913 (Azat Khuzhin).
- Optimise les chaînes de OR de row policy en IN dans le nouvel analyseur. #102915 (Azat Khuzhin).
- Corrige une corruption des métadonnées jemalloc causée par la libération du page cache avec un alignement incorrect, ce qui peut entraîner des crashes. #102918 (Azat Khuzhin).
- Les INSERT simples sans vues matérialisées ne demandent plus un nombre excessif de slots et de threads ConcurrencyControl (
max_threadsau lieu demax_insert_threads), ce qui évite la famine de slots CC et l’explosion du nombre de threads sur les clusters avec un fort débit d’INSERT. #102961 (Sema Checherinda). - Réintroduction d’ArrowMemoryPool pour permettre de lever MEMORY_LIMIT_EXCEEDED et éviter un OOM du noyau. #102999 (Azat Khuzhin).
- Correction de la prise en compte de
cast_string_to_date_time_modepourCASTversNullable(DateTime). Clôt #101840. #103035 (Pavel Kruglov). - Ajout de la prise en charge des colonnes
ALIASdans l’optimisation de lecture directe de l’index de texte. #103037 (Anton Popov). - Rétroporté dans #103454 : correction de
SELECT DISTINCT, qui renvoyait silencieusement des résultats incomplets lorsqu’une projection d’agrégation correspondait à la query et que certaines parts de la table ne contenaient pas de données de projection (par ex. si la projection avait été ajoutée à une table contenant déjà des données et queMATERIALIZE PROJECTIONn’avait pas été exécuté). Clôt #102951. #103052 (Nihal Z. Miaji). - Correction de résultats erronés renvoyés par
WHERE x AND toNullable(N)sur des tablesMergeTreelorsqueNest un entier plus large queUInt8(par ex.256,65535,2147483648ou tout entier négatif). Le filtre écartait à tort toutes les lignes, carsplitFilterNodeForAllowedInputsutilisait un zéroNULLlors de la conversion en booléen du resteNullabled’unANDréduit, ce qui transformait la comparaison enNULLselon la logique ternaire. #103077 (Groene AI). - Correction du type d’argument incorrect signalé dans les messages d’erreur des fonctions de recherche de chaînes (par ex.
locate,position) lorsque les arguments sont passés dans l’ordre inversé (locate(needle, haystack)avecfunction_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov). - Correction d’un blocage indéfini de waitForPause lorsque disableFailPoint est appelé alors qu’aucun thread n’est en pause sur le failpoint. #103119 (Shaohua Wang).
- Limitation à 64 KB des chaînes du paquet TCP Hello avant authentification, et ajout du server setting
handshake_timeout_millisecondspour limiter la durée totale du handshake, afin d’empêcher des clients non authentifiés de consommer excessivement de la mémoire ou de monopoliser des threads indéfiniment. #103284 (Sema Checherinda). - Correction de Parquet ColumnIndex lorsque les stats indiquent min_value > max_value pour des colonnes String. #103334 (Saurabh Kumar Ojha).
- Vérification de la présence de données Dynamic aplaties mal formées au format Native. #103392 (Pavel Kruglov).
- Remplissage de la colonne
_timeà partir de la table functionurl. #103437 (Nikita Taranov). - Correction de la détection SVE, qui utilisait des instructions SVE lorsqu’elles n’étaient pas disponibles. #103568 (Raúl Marín).
Amélioration de la compilation/des tests/du packaging
- La dépendance Libstemmer (Snowball) utilise désormais la version plus récente v3.0.1. #99256 (Jimmy Aguilar Mena).
- Randomisation des paramètres dans clickhouse-test :
use_skip_indexes_for_top_k,use_top_k_dynamic_filtering,query_plan_max_limit_for_top_k_optimization. #91782 (Nikita Fomichev). - Implémentation d’un test de stress pour les fonctions, afin de vérifier la solidité de leurs différentes propriétés. #93543 (Michael Kolupaev).
- Fournit sa propre configuration CMake pour
llvm-projectau lieu d’importer celle d’upstream. #97453 (Konstantin Bogdanov). - Randomisation de davantage de paramètres
optimize_*dans l’infrastructure de test afin d’améliorer la couverture des passes d’optimisation des requêtes. #97547 (Alexey Milovidov). - Utilise la toolchain Rust nightly-2026-03-22. #98602 (Konstantin Bogdanov).
- Utilise
wasmtimev42.0.1. #98603 (Konstantin Bogdanov). - Utilise
llvm-project22.1.1. #98882 (Konstantin Bogdanov). - Remplace
SANITIZE_COVERAGE(callbacks personnalisés du sanitizer, granularité au niveau des symboles) par la couverture source LLVM (WITH_COVERAGE,-fprofile-instr-generate -fcoverage-mapping) pour le pipeline nightly de couverture par test. Le serveur lit désormais ses propres informations de couverture dans les sections ELF au démarrage et collecte des tuples(file, line_start, line_end)par test via une nouvelle commandeSYSTEM SET COVERAGE TEST 'name'. La sélection des tests dans les checks CI ciblés utilise des requêtes par plage de lignes sur une nouvelle table CIDBchecks_coverage_lineset classe les tests candidats selon le nombre de lignes modifiées du diff qu’ils couvrent. #99513 (Nikita Fomichev). - Corrige une erreur d’édition de liens de llvm-libc avec un build en -O0. #100023 (Zheguang Zhao).
- Corrige deux messages d’erreur au démarrage du conteneur lorsque la configuration ne contenait pas les paramètres
logger.logetlogger.errorlog(par ex. lorsque tous les messages de log doivent être envoyés vers STDOUT/STDERR). #100239 (Simon). - Préfère
ld64.lldauldd’Apple (cctools-port ld64) pour les builds macOS. Cela devrait réduire significativement les temps d’édition de liens sur Darwin, car le ld64 de cctools-port est très lent avec-ffunction-sectionset-dead_strip. Revient àldsild64.lldn’est pas disponible. #100275 (Alexey Milovidov). - Tests pour s’assurer que les répertoires n’enregistrent aucun secret (REST + Glue). #100307 (Konstantin Vedernikov).
- Répète les tests récemment modifiés avec différents paramètres randomisés. #100385 (Alexey Milovidov).
- Suivre les dépendances de fichiers
#embeddans CMake et activer le mode de dépendance de ccache pour garantir des reconstructions correctes. #100411 (Alexey Milovidov). - Ajouter des tests de validité pour les requêtes TPC-H. #100580 (Raufs Dunamalijevs).
- Utiliser
aws-sdk-cpp1.11.771. #100582 (Konstantin Bogdanov). - Autoriser les fichiers XML de tests de performance à référencer des fichiers de requêtes SQL externes et des paramètres via l’attribut file. #100747 (Raufs Dunamalijevs).
- Corriger la compilation avec
-march=x86-64-v4en ajoutant l’inclusion manquante deTargetSpecific.hdansLowerUpperImpl.h. #100932 (Alexey Milovidov). - Corriger la compilation sur gentoo en ajoutant
--no-default-configà cxxflags. #100973 (Isak Ellmer). - Ajout de
utils/auto-bisect/— un framework de bissection basé sur shell qui télécharge des binaires CI précompilés et exécute un script de test fourni par l’utilisateur afin de trouver le premier commit ayant introduit une régression, sans nécessiter de compilation locale. #100989 (Nikita Fomichev). - Désactiver ThinLTO par défaut dans CMake afin que les compilations locales des développeurs ne l’activent plus implicitement. Les builds de release de la CI ne sont pas affectés, puisqu’ils transmettent explicitement
-DENABLE_THINLTO=1. #101041 (Alexey Milovidov). - Ajouter le benchmark TPC-DS SF1 aux tests de performance. #101209 (Raufs Dunamalijevs).
- Ajout de tests sans état pour les lightweight deletes de MergeTree, couvrant : le cycle de vie du flag
has_lightweight_delete, l’exactitude deCOUNT(*)avecoptimize_trivial_count_query, l’intégrité des colonnesMATERIALIZED/DEFAULT, la récupération du flagReplicatedMergeTree,read_in_orderavec des lignes supprimées, plusieurs cycles de suppression/fusion, le masquage de la colonne_row_exists, la diversité des prédicats et l’application de RBAC pourALTER DELETE. #101792 (Nikita Fomichev). - Les images Docker distroless sont désormais publiées avec des variantes ubuntu et alpine pour les releases taguées. #101941 (Rahul Nair).
- Les stack traces affichent désormais des chemins relatifs simples et propres (par ex.
src/Common/Exception.cpp) au lieu de chemins pollués par le répertoire de build (par ex../ci/tmp/fast_build/./src/Common/Exception.cpp). #102000 (Raúl Marín). - Ajouter un Style check CI qui rejette les fichiers de plus de 5 Mo commités dans le repository, avec une whitelist pour les données de test légitimes déjà présentes. Supprimer le fichier
zookeeper_log.parquetinutilisé de 14 Mo. #102080 (Raúl Marín). - Supprimer environ 400 directives
#includeinutilisées des headers afin de réduire les temps de compilation. #102585 (Raúl Marín). - Utiliser
wasmtimev43.0.1. #102603 (Konstantin Bogdanov). - Utilisation d’
openssl3.5.6. #102606 (Konstantin Bogdanov). - Utilisation d’
xz5.8.3. #102607 (Konstantin Bogdanov). - Mise à niveau de l’image Docker distroless de base, de Debian 12 (glibc 2.36, OpenSSL 3.0) vers Debian 13 (glibc 2.41, OpenSSL 3.5), ce qui réduit la surface d’exposition aux CVE à zéro vulnérabilité exploitable. #101678 (Rahul Nair).
Version de ClickHouse 26.3 LTS, 2026-03-26. Présentation, Vidéo
Changement incompatible avec les versions précédentes
- Revenir à une version antérieure après une mise à niveau peut entraîner une perte de données. Propage les versions de sérialisation des types de données aux types de données imbriqués. Par exemple, la version de sérialisation de String
with_size_streamne s’appliquait auparavant qu’aux colonnes String de premier niveau et aux éléments de Tuple. Désormais, elle s’applique à tout type String à l’intérieur de n’importe quel type imbriqué, commeArray/Map/Variant/JSON/etc. Ce comportement est contrôlé par le paramètre MergeTreepropagate_types_serialization_versions_to_nested_types, désormais activé par défaut. Après ce changement, les nouvelles data parts créées ne peuvent plus être lues par les versions antérieures, mais les anciennes parts peuvent être lues par la nouvelle version sans problème. La mise à niveau est sûre, mais pas le retour à une version antérieure : si vous devez revenir en arrière après une mise à niveau vers 26.3, les données écrites par 26.3 dans des colonnes avec des types imbriqués seront illisibles ! Voir #101429 pour plus de détails. #94859 (Pavel Kruglov). - Supprime le type de skip index
hypothesis. Il s’agissait d’une fonctionnalité expérimentale obscure, d’une utilité pratique limitée. La création de tables avecINDEX ... TYPE hypothesisproduit désormais une erreur. #96874 (Alexey Milovidov). - Supprime la fonction expérimentale
detectProgrammingLanguage. #99567 (Alexey Milovidov). - Corrige la priorité de l’opérateur
NOTpour l’aligner sur le standard SQL :NOTa désormais une priorité plus faible queIS NULL,BETWEEN,LIKEet les opérateurs arithmétiques. Par exemple,NOT (x) IS NULLest maintenant analysé commeNOT (x IS NULL)au lieu de(NOT x) IS NULL. Cela peut modifier le résultat des requêtes qui s’appuyaient sur le comportement précédent (non standard). #97680 (Alexey Milovidov). - Corrige les métadonnées des projections normales afin que les projections avec des clés de tri sur plusieurs colonnes soient correctement reconnues. S’appuie sur #90429. #91352 (Amos Bird).
- Corrige le non-respect du paramètre replace_long_file_name_to_hash par les fichiers de skip index, ce qui provoquait des erreurs “File name too long” et empêchait la lecture d’index aux noms longs. Les noms de fichiers des skip indexes sont désormais hachés lorsqu’ils dépassent max_file_name_length, comme pour les fichiers de colonnes. Ce changement est rétrocompatible (les nouveaux serveurs lisent les anciennes parts), mais un retour à une version antérieure — ou des serveurs plus anciens lors d’une rolling upgrade — peut faire ignorer les index aux noms longs. #97128 (Raúl Marín).
- Active async insert par défaut. ClickHouse regroupera désormais par défaut toutes les petites insertions en batch. Ce paramètre est défini dans compatibility. Si vous définissez
compatibility=<version less than 26.2>, la valeur par défaut restera l’ancienne,false. Vous pouvez désactiver/activer async inserts à plusieurs niveaux : dans la config des profils utilisateurs, pour la session, pour la requête ou pour la table MergeTree. #97590 (Sema Checherinda). - Modifie la valeur par défaut de
mysql_datatypes_support_level, qui passe de vide àdecimal,datetime64,date2Date32, ce qui active par défaut le mapping correct de MySQLDATEversDate32, deDECIMAL/NUMERICversDecimal, et deDATETIME/TIMESTAMPavec précision versDateTime64. Auparavant, les colonnes MySQLDATEétaient mappées versDate, qui ne peut pas représenter les dates antérieures au 1970-01-01, ce qui entraînait une corruption des données. #97716 (Alexey Milovidov). - Accepter une liste de noms de parts au lieu d’une expression régulière pour
mergeTreeAnalyzeIndexes{,UUID}, car les expressions régulières sont lentes (Fonctionnalité expérimentale). #98474 (Azat Khuzhin). - La valeur par défaut de
stderr_reactionpasse dethrowàlog_lastpour les UDF exécutables. Les UDF qui écrivent des avertissements sur stderr n’échouent plus lorsque le code de sortie est 0. Les exceptions liées au code de sortie incluent désormais le contenu de stderr. #99232 (Xu Jia).
Nouvelle fonctionnalité
- Ajout de la sérialisation par buckets pour les colonnes Map dans MergeTree (
map_serialization_version = 'with_buckets'). Les clés sont réparties dans des buckets basés sur le hachage afin que la lecture d’une seule clé (m['key']) ne lise qu’un seul bucket au lieu de toute la colonne, ce qui apporte une accélération de 2 à 49x pour les lookups sur une seule clé selon la taille de la map. Le nombre de buckets et la stratégie de répartition peuvent être contrôlés par de nouveaux MergeTree settings :map_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficientetmap_buckets_min_avg_size. #99200 (Pavel Kruglov). - Prise en charge des CTE matérialisées. Permet d’évaluer les CTE une seule fois pendant l’exécution de la requête et de stocker leurs résultats dans des tables temporaires. Résout #53449. #94849 (Dmitry Novik).
- Autorise certaines fonctions SQL standard sans parenthèses pour des raisons de compatibilité, comme
NOW. Résout #52102. #95949 (Aly Kafoury). - Vous pouvez désormais utiliser la fonction de tri naturel sous la forme
naturalSortKey(s). #90322 (Nazarii Piontko). - Vous pouvez désormais utiliser une entrée JSON/Object native avec les fonctions JSONExtract. Résout #88370. #96711 (Fisnik Kastrati).
- Si un query parameter est de type
Nullableet n’est pas spécifié, nous supposerons que sa valeur estNULL. #93869 (Vikash Kumar). - Prise en charge d’un auxiliary ZooKeeper pour la database
Replicated. #95590 (RinChanNOW). - Prise en charge de la fonction
haspour le JSON type afin de vérifier l’existence d’un chemin, comme pour Map. #96927 (DQ). - Ajout de la table function
mergeTreeTextIndex(database, table, index), qui permet de lire directement des données depuis un text index. Cette fonction peut être utilisée pour l’introspection ou pour effectuer des aggregations sur les données de l’index textuel. #97003 (Anton Popov). - Ajout du MergeTree setting
table_readonlypour marquer les tables comme read-only, empêchant les inserts et les modifications. #97652 (Alexey Milovidov). - Ajout du new setting
use_partition_pruninget de l’aliasuse_partition_key. Définissez-le surfalsepour désactiver le partition pruning basé sur la partition key. #97888 (Nihal Z. Miaji). - Implémente
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')pour les Iceberg tables. #97904 (murphy-4o). #99130 - Autorise chaque entrée
type=httpdans<protocols>à spécifier une clé<handlers>personnalisée pointant vers une section de config<http_handlers_*>distincte, ce qui permet d’appliquer des règles de routage HTTP différentes selon le port. #98414 (Amos Bird). - Ajout de l’option
pretty=1àEXPLAINpour une sortie indentée en arborescence, et decompact=1pour regrouper les étapesExpression, ce qui rend les query plans plus lisibles. #98500 (Kirill Kopnev). - Ajout du paramètre serveur
restore_access_entities_with_current_grants. Lorsqu’il est activé, les utilisateurs/rôles restaurés depuis des backups voient leurs grants limités à ce que l’utilisateur effectuant la restauration est autorisé à accorder (même sémantique queGRANT CURRENT GRANTS), au lieu d’échouer avecACCESS_DENIED. #98795 (pufit). - Ajout des fonctions
caseFoldUTF8etremoveDiacriticsUTF8pour le repliement de casse Unicode et la suppression des signes diacritiques. #98973 (George Larionov). - Ajout de la fonction de chaîne
normalizeUTF8NFKCCasefoldpour la normalisation Unicode NFKC_Casefold, qui combine la normalisation NFKC avec le repliement de casse. #99276 (George Larionov). - Ajout du tokenizer
asciiCJKpour les full-text indexes et de la fonctiontokens. Il découpe le texte selon les règles Unicode de délimitation des mots : les mots ASCII sont formés avec des caractères connecteurs (tiret bas, deux-points, point, apostrophe), tandis que les caractères Unicode non ASCII deviennent des tokens d’un seul caractère. #99357 (Amos Bird). - Ajout des settings
max_skip_unavailable_shards_numetmax_skip_unavailable_shards_ratiopour limiter le nombre de shards pouvant être ignorés silencieusement lorsqueskip_unavailable_shardsest activé. Si le nombre ou la proportion de shards indisponibles dépasse le threshold configuré, une exception est levée au lieu de renvoyer silencieusement des résultats incomplets. #99369 (Alexey Milovidov). - Les utilisateurs peuvent désormais utiliser le keyword
SOMEpour les expressions de subquery. Il se comporte exactement commeANY. #99842 (Artem Kytkin). - Ajout du setting
output_format_trim_fixed_stringpour supprimer les null bytes de fin des valuesFixedStringdans les output formats textuels. #97558 (NeedmeFordev). - Prise en charge des expressions de table join entre parenthèses dans la clause FROM, par exemple
SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - Implémentation de la fonction
toDaysInMonth: elle renvoie le nombre de jours du mois correspondant à la date spécifiée. #99227 (Vitaly Baranov).
Fonctionnalité expérimentale
- Ajout de la prise en charge expérimentale des fonctions définies par l’utilisateur (UDF) basées sur WebAssembly, ce qui permet d’implémenter une logique de fonction personnalisée en WebAssembly et de l’exécuter dans ClickHouse. Remerciements particuliers à Alexey Smirnov pour sa contribution à la prise en charge du backend Wasmtime. #88747 (Vladimir Cherkasov). Améliorations incrémentales de la prise en charge des UDF WASM. #99373 (Vasily Chekalkin).
- Ajout de la prise en charge des dialectes SQL externes à l’aide de la bibliothèque
polyglot. #99496 (Alexey Milovidov). - Ajout du codec de compression
ALPpour nombres à virgule flottante (sans fallback ALP_rd pour les doubles non compressibles). #91362 (Nazarii Piontko). - Ajout de la prise en charge expérimentale des indications de type différées pour les colonnes
JSON. Lorsqu’elle est activée viaallow_experimental_json_lazy_type_hints, l’instructionALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)qui se contente d’ajouter ou de modifier des indications de type s’exécute instantanément comme une opération limitée aux métadonnées, sans réécrire les données historiques. Les indications de type sont appliquées au moment de l’exécution des requêtes pour les anciennes parties, puis matérialisées lors des INSERTs et des fusions en arrière-plan. #97412 (tanner-bruce). - Activation des lectures parallèles avec le moteur de table YTsaurus. #97343 (MikhailBurdukov).
Amélioration des performances
- Améliore les performances des lacs de données. Dans les versions précédentes, la lecture depuis le stockage objet ne redimensionnait pas le pipeline en fonction du nombre de threads de traitement. Cela apporte des gains de plusieurs ordres de grandeur (~40x) sur les machines multicœurs. #99548 (Alexey Milovidov).
- Désormais, la relation entre
enable_parallel_replicasetautomatic_parallel_replicas_modeest la suivante. Une requête ne peut utiliser des répliques parallèles que sienable_parallel_replicas > 0. De plus, siautomatic_parallel_replicas_mode=1, la décision d’utiliser des répliques parallèles est prise lors de la planification, sur la base des statistiques collectées au préalable. Siautomatic_parallel_replicas_mode=0, les répliques parallèles seront utilisées pour toutes les requêtes prises en charge, indépendamment des statistiques. Une exception notable concerne les insert-select distribués avec répliques parallèles : dans ce cas, les requêtes seront toujours exécutées comme siautomatic_parallel_replicas_mode=0. #97517 (Nikita Taranov). - Autorise l’élagage de partitions lorsque le prédicat contient n’importe quel opérateur de comparaison (
=,<,>,!=) et que la clé de partition est encapsulée dans une chaîne de fonctions déterministes (par exemple,PARTITION BY xet des prédicats commecityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026outoYYYYMM(x) != 2026utiliseront tous la clé de partition pour l’élagage). Résout #28800. #98432 (Nihal Z. Miaji). - Autorise l’optimisation de lecture ordonnée et l’élagage par clé primaire lorsque le type cible de
CASTestNullableet que la conversion est monotone ; par exemple, avecPRIMARY KEY x, ClickHouse peut utiliser l’optimisation de lecture ordonnée pourORDER BY x::Nullable(UInt64)et appliquer l’élagage par clé primaire à des prédicats tels queWHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji). - Autorise l’élagage d’index et le pushdown des filtres lorsqu’une colonne entière est comparée à un littéral flottant ; par exemple, des prédicats comme
WHERE x < 10.5peuvent désormais utiliser la clé primaire pour l’élagage, et des filtres tels queprime < 1e9ounumber < 1e5sont maintenant poussés vers les fonctions de tableprimes()etnumbers()au lieu de provoquer une exécution non bornée. Résout #85167. #98516 (Nihal Z. Miaji). - Ajout d’un nouveau cache SLRU pour les métadonnées Parquet afin d’améliorer les performances de lecture en supprimant la nécessité de retélécharger des fichiers uniquement pour lire leurs métadonnées. #98140 (Grant Holly).
- Prend en charge l’inversion des côtés des jointures ANTI, SEMI et FULL en fonction des statistiques de l’optimiseur. #97498 (Hechem Selmi).
- Optimise le skipping des granules pour
pointInPolygonavec de grands polygones et corrige le fait que l’analyse d’index depointInPolygonpouvait lever une exception lors de l’élagage par clé primaire. #91633 (Nihal Z. Miaji). - Améliore les performances de la fonction
levenshteinDistance. #94543 (Joanna Hulboj). - Optimise les conversions par lot du type Decimal en évitant les appels de fonction pour chaque élément. #95923 (Konstantin Bogdanov).
- Les tables Iceberg prennent désormais en charge le préchargement asynchrone des métadonnées via le paramètre de table
iceberg_metadata_async_prefetch_period_ms, qui préalimente périodiquement le cache de métadonnées. De plus, le paramètre de requêteiceberg_metadata_staleness_mspermet aux requêtes SELECT d’utiliser les métadonnées en cache si elles sont plus récentes que le seuil d’obsolescence spécifié, ce qui évite les appels au catalogue Iceberg pendant le traitement des requêtes. #96191 (Arsen Muk). - Le mode ordered de
S3Queueutilise S3 ListObjectsV2 StartAfter pour éviter de relister l’historique complet du préfixe, réduisant ainsi les appels à ListObjects. #96370 (Venkata Vineel ). - Réduction de la consommation mémoire pour la déduplication des insertions. En général, le block d’origine est nécessaire à la déduplication, mais pour une insertion synchrone, il peut être omis, ce qui permet d’économiser durablement de la mémoire. #96661 (Sema Checherinda).
- Utilisation d’une valeur spécifique à l’architecture pour la taille des lignes de cache au lieu d’une valeur codée en dur de 64. #97357 (Nikita Taranov).
- Lecture dans le Dictionary de l’index de texte légèrement optimisée, avec une amélioration des performances globales de l’analyse de l’index de texte. #97519 (Anton Popov).
- Accélération de la décompression
LZ4des blocks de 16 octets sur ARM. #97774 (Raúl Marín). - Refactorisation de la tokenization vers une nouvelle interface haute performance, remplaçant l’ancienne API de type itérateur afin de prendre en charge SIMD et les tokenizers Stateful. Fait partie de #90268. #97871 (Amos Bird).
- Amélioration des performances de l’analyse de l’index de texte pour les requêtes avec des conditions combinées impliquant à la fois des colonnes indexées et non indexées. Auparavant, l’optimisation de sortie anticipée lors de l’analyse de l’index était désactivée à tort dans de tels cas. #98096 (Anton Popov).
- Amélioration des performances des requêtes avec des expressions constantes qui génèrent des Array ou des maps très longs. #98287 (Alexey Milovidov).
- Correction de l’analyse des conditions sur la clé pour les clés primaires
DateTime64comparées à des constantes entières, ce qui empêchait auparavant tout Granule pruning. #98410 (Amos Bird). - Le paramètre
optimize_syntax_fuse_functionsest activé par défaut. #98424 (Alexey Milovidov). - Optimisation de la aggregate function
avgWeightedgrâce à l’utilisation d’accumulateurs locaux au lieu d’un store-forwarding par ligne via l’aggregate state, avec un gain de performances pouvant atteindre 27 % pour les entrées Nullable. #98793 (Antonio Andelic). - Améliore les performances et réduit la consommation mémoire des window functions parallèles dans certains scénarios, ainsi que pour les workloads
arrayFoldavec de grands Array. Cela peut également réduire la pression liée aux défauts de page et améliorer la stabilité sous des limites mémoire strictes pour les requêtes concernées. #98892 (filimonov). - Amélioration des performances des merges triés. #99013 (Artem Zuikov).
- Optimisation de
INTERSECT ALLetEXCEPT ALL. #99097 (Raufs Dunamalijevs). - Prise en charge de l’optimisation
read_in_order_use_virtual_rowpour les lectures en ordre inverse. #99198 (Vladimir Cherkasov). - Réduction de la contention du cache dans les JOIN
RIGHTetFULLen vérifiant si JoinUsedFlags est défini avant l’écriture. #99274 (Hechem Selmi). - Optimisation de
PrefetchingHelper::calcPrefetchLookAheaden remplaçant les calculs en virgule flottante par une arithmétique entière, ce qui améliore l’organisation du cache d’instructions et réduit le surcoût en cycles dans les boucles d’agrégation. #99327 (Riyane El Qoqui). - Réduction de la consommation mémoire de Keeper en remplaçant
absl::flat_hash_setparCompactChildrenSetpour stocker les nœuds enfants. Le nouveau conteneur stocke 0 ou 1 enfant en ligne, sans allocation sur le tas, ce qui couvre la majorité des nœuds Keeper. Cela réduit la taille deKeeperMemNodede 144 à 128 octets. #99860 (Antonio Andelic). - Les projections agrégées sont désormais correctement prises en charge dans les vues. Corrige #32753. #88798 (Amos Bird).
- Prise en charge de l’optimisation de conversion de jointure OUTER en INNER avec
join_use_nulls. Ferme #90978. #95968 (Vladimir Cherkasov). - Amélioration de la lecture des sous-colonnes grâce à un calcul correct des tailles avant lecture. Cela réduit l’utilisation de la mémoire et accélère la lecture des sous-colonnes. #96251 (Pavel Kruglov).
- Les caches de marks, de données non compressées et de pages utilisent désormais des arènes jemalloc distinctes afin d’éviter la fragmentation mémoire lorsque des allocations de courte durée, par exemple pour les requêtes, sont mélangées à des allocations plus longues pour les caches. #96812 (Seva Potapov). #98812. #99021
- Les tables avec des règles
DELETE TTLpeuvent désormais utiliser l’algorithme de fusion verticale. #97332 (murphy-4o). - Application des index de saut de données pendant l’analyse distribuée des index. #97767 (Azat Khuzhin).
- Les marks des index secondaires sont désormais préchauffés lorsque le paramètre
prewarm_mark_cacheest activé (chargés dans le cache des index marks lors des fetches de data parts et au démarrage de la table). #97772 (Anton Popov). - Réduction du verrouillage dans le contrôle d’accès. #97894 (Nikita Taranov).
- Lorsque apply_row_policy_after_final ou apply_prewhere_after_final est activé, les conditions AND composées dans les row policies et PREWHERE sont désormais décomposées pour extraire les atomes de clé de tri en vue de l’analyse de l’index de clé primaire. Auparavant, si un filtre différé contenait à la fois des prédicats sur la clé de tri et hors clé de tri (par ex. x > 1 AND y != ‘foo’), l’expression entière était exclue de l’analyse des index. Désormais, les atomes de clé de tri (comme x > 1) sont extraits et utilisés pour l’élagage des granules, même à partir d’expressions AND imbriquées. #98513 (Yarik Briukhovetskyi).
- Réduit la contention des verrous dans MergeTreeBackgroundExecutor en permettant de libérer les ressources des tâches sans acquérir le verrou. Ferme #93620. #98604 (Dmitry Novik).
- Corrige une consommation mémoire excessive (~514 MiB) lors de l’auto-détection du format à la lecture de données non Arrow (par ex. du JSON depuis
urloufilesans format explicite), due au fait que le lecteur ArrowStream interprétait à tort les premiers octets comme une longueur de métadonnées énorme. #98893 (Konstantin Bogdanov).
Amélioration
- Permet d’analyser des fichiers GeoParquet contenant différents types Geo dans une même colonne. #97851 (Mark Needham).
- Introduction de la fonction SQL
tokensForLikePattern, qui découpe en tokens les motifs LIKE tout en respectant la sémantique des caractères génériques :%et_sont traités comme des caractères génériques, les caractères génériques échappés (\%,\_) comme des littéraux, et les tokens adjacents à des caractères génériques non échappés sont ignorés. #97872 (Amos Bird). - Ajout d’un placeholder
{_schema_hash}pour le moteur de table S3, qui insère un hash des définitions de colonnes de la table dans le chemin S3. #98265 (Miсhael Stetsyuk). SymbolIndex,addressToSymbol,system.symbolsetbuildIdfonctionnent désormais sur macOS grâce à l’analyse des tables de symboles Mach-O. #99014 (Alexey Milovidov).- La table
system.stack_tracefonctionne désormais sur macOS, ce qui permet l’introspection des stack traces de tous les threads du serveur. #98982 (Alexey Milovidov). - Ajout de l’option de config LDAP par serveur
<follow_referrals>(valeur par défaut :false) pour contrôler si le client LDAP suit les referrals. Désactiver le suivi des referrals évite les timeouts et les blocages lors des recherches à partir d’un base DN à la racine d’un domaine Active Directory. Les log messages liés aux referrals passent dewarnàtrace. #96765 (paf91). - Nous suivons désormais tous les data skipping indices utilisés pendant l’exécution d’une query dans la table query_log, dans une nouvelle colonne nommée
skip_indices. Corrige #78676. Auteur original : @pheepa. #87862 (Grant Holly). - Les indications ACCESS_DENIED ne révèlent plus les noms de colonnes, sauf si l’utilisateur est autorisé à afficher toutes les colonnes requises ; les noms de base de données et de table restent visibles dans l’indication. #91067 (filimonov).
- Ajout d’un thread de nettoyage dédié pour MergeTree afin d’éviter les retards de nettoyage en cas de forte charge de merge. Cela résout #86181. #91574 (Amos Bird).
- Recharge la config du cluster si les IP du hostname du serveur local ont changé, au lieu de celles de n’importe quel hôte. Corrige #81215, #70156 et #65268. #93726 (Zhigao Hong).
- Permet à optimize_aggregators_of_group_by_keys d’optimiser correctement les aggregate functions dans les queries GROUPING SETS. #93935 (Xiaozhe Yu).
- Keeper-bench : signale les errors dans les metrics et génère un fichier JSON de metrics pour le mode —input-request-log. #95748 (Mohammad Lareb Zafar).
- Ajout de la clause ROLE à CREATE USER. #97074 (Vitaly Baranov).
- Vous pouvez désormais définir les paramètres
internal_replicationpour un cluster créé par la base de données Replicated. #97228 (Pervakov Grigorii). - Le nouveau paramètre
allow_nullable_tuple_in_extracted_subcolumnscontrôle si les sous-colonnesTuple(...)extraites deTuple,Variant,DynamicetJSONsont renvoyées sous la formeNullable(Tuple(...))(NULLpour les lignes avec valeur manquante) ou sous la formeTuple(...)(valeurs de tuple par défaut pour les lignes avec valeur manquante). Désactivé par défaut, ce paramètre ne peut être modifié qu’en redémarrant le serveur. #97299 (Nihal Z. Miaji). - Ajout d’informations sur les filtres différés en tant qu’élément distinct dans la sortie de la requête EXPLAIN (lors de l’utilisation de Row Policies/PREWHERE avec FINAL). En lien : #91065. #97374 (Yarik Briukhovetskyi).
- Activation par défaut de
type_json_allow_duplicated_key_with_literal_and_nested_object. Cela permet d’éviter les erreurs liées aux clés dupliquées lors de l’analyse de JSON tels que{"a" : 42, "a" : {"b" : 42}}, que ClickHouse peut formater à partir des données JSON d’origine{"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov). - Amélioration de Keeper :
find_super_nodesest une commande très utile pour le débogage d’une croissance inattendue du nombre de nœuds dans Keeper. Malheureusement, s’il existe plusieurs super-nœuds, il est presque impossible d’en trouver plus d’un, car la commande reste bloquée indéfiniment lors du parcours des nœuds enfants du premier super-nœud rencontré. Cette PR interdit de parcourir les nœuds enfants des super-nœuds. #97819 (pufit). - Prise en charge initiale de l’autocomplétion pour
clickhouse-keeper-client. #97828 (Konstantin Bogdanov). - Vidage des tampons de logging asynchrone en cas de crash. #97836 (Azat Khuzhin).
- Activation par défaut de la fonctionnalité d’usurpation d’identité (voir EXECUTE AS target_user). #97870 (Vitaly Baranov).
- Amélioration de l’annulation des requêtes avec le table engine SQLite via KILL QUERY et l’annulation de requête (Ctrl+C) dans clickhouse-client. #97944 (Roman Vasin).
- Ajout du paramètre serveur
jemalloc_profiler_sampling_ratepour contrôlerlg_prof_samplede jemalloc et l’exposer comme métrique asynchronejemalloc.prof.lg_sample. #97945 (Antonio Andelic). - Prise en charge des weights dans l’implémentation d’une file bornée concurrente. #97962 (Daniil Ivanik).
- Ajout de sslmode aux keys autorisées pour les dictionary sources PostgreSQL. Auparavant, sslmode ne figurait pas dans la liste d’autorisation
dictionary_allowed_keysde PostgreSQLDictionarySource.cpp, ce qui rendait impossible la configuration du mode SSL pour les connexions de dictionnaires PostgreSQL. Cela empêchait les dictionnaires de se connecter aux serveurs PostgreSQL qui exigent SSL (par exemple AWS RDS, qui l’impose par défaut), car la connexion échouait lors de la négociation TLS et le serveur rejetait le fallback non chiffré. #98014 (mcalfin). - Affiche une erreur claire « no such file » lorsqu’un chemin de fichier inexistant est passé à
clickhouseouclickhouse-local, au lieu d’un message générique déroutant. #98048 (Raúl Marín). - Les index de texte peuvent désormais être créés sur des colonnes
Nullable([Fixed]String)etArray(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena). - Évite la suppression des collections nommées dont dépendent les sources de dictionnaire. #98127 (Pablo Marcos).
- Active l’algorithme de jointure
grace_hashpour les requêtes avec totaux. #98144 (János Benjamin Antal). - Annule plus tôt les fusions en arrière-plan dans DROP DATABASE pour ordinary shared merge tree. #98161 (Shaohua Wang).
- Améliore l’annulation des requêtes avec MongoDB et MySQL via KILL QUERY et l’annulation de requête (Ctrl+C) dans clickhouse-client. #98187 (Roman Vasin).
- Supprime NetlinkMetricsProvider et utilise exclusivement procfs pour la collecte des métriques taskstats par thread. La collecte basée sur Netlink est problématique dans les environnements conteneurisés et présente une latence en queue plus élevée en cas de contention. #98229 (Amos Bird).
- Remanie la gestion des fichiers manifestes Iceberg pour corriger les problèmes de mise en cache de ces fichiers. #98231 (Daniil Ivanik).
- Désormais, les cas où la clé de tri de la table peut être une expression comme
toDate(time)sont pris en compte, et il est possible de décider de ne pas différer ce type d’expression si elle fait partie des filtres. #98237 (Yarik Briukhovetskyi). - Ajoute une nouvelle métrique
MaxAllocatedEphemeralLockSequentialNumberpour le numéro séquentiel maximal alloué aux znodes de verrouillage éphémères dans ZooKeeper. #98243 (Miсhael Stetsyuk). - Met à jour ClickStack vers la version 2.20.0. #98252 (Aaron Knudtson).
- Ajout d’un nouvel événement de profil
KeeperRequestTotalWithSubrequestsqui compte individuellement chaque sous-requête au sein d’une requête multiple, offrant une meilleure visibilité sur la charge réelle de Keeper. L’événement existantKeeperRequestTotalcontinue de compter chaque requête multiple comme une seule requête. #98348 (Antonio Andelic). SYSTEM RELOAD DICTIONARIESrecharge désormais les dictionnaires dans l’ordre topologique afin que les dictionnaires s’alimentant à partir d’autres dictionnaires voient des données à jour après le rechargement. #98356 (Alexey Milovidov).- Redémarre le cache de statistiques après modification du paramètre MergeTree. #98520 (Han Fei).
- Seules les répliques « vivantes » (auxquelles on peut se connecter) participent à l’analyse distribuée des index. #98521 (Azat Khuzhin).
- Ajoute un paramètre
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(désactivé/autorisé par défaut) qui interdit l’utilisation de profils de paramètres définis dans la configuration (à l’exception du profildefault) pour les utilisateurs définis en SQL. #98662 (Alexander Tokmakov). - Limite le nombre de nœuds utilisés par l’heuristique automatique des répliques parallèles au nombre réel de nœuds du cluster (au lieu du seul paramètre
max_parallel_replicas). #98668 (Nikita Taranov). - Implémente les requêtes spéculatives et la lecture asynchrone pour l’analyse distribuée des index. #98724 (Azat Khuzhin).
- La désérialisation des états binaires
AggregateFunctionexige désormais de consommer l’intégralité de l’entrée. Si des octets de fin superflus sont présents, ClickHouse lève une exception au lieu d’accepter des données d’état mal formées. #98786 (Nihal Z. Miaji). - Fait en sorte que TRUNCATE DATABASE réagisse à l’annulation d’une requête. #98828 (Shaohua Wang).
- Améliore
keeper-benchavec le pipelining des requêtes, une période de préchauffage, des statistiques par opération, des graines reproductibles et une meilleure gestion des erreurs. #98906 (Antonio Andelic). - Prend en charge la clause SAMPLE dans l’analyse distribuée des index. #98931 (Azat Khuzhin).
- Affiche le titre du graphique dans le tableau de bord même lorsque la requête renvoie un résultat vide ou rencontre une erreur. #98975 (Yash ).
- Les messages d’erreur de l’analyseur n’affichent plus toutes les colonnes d’une table (ce qui pouvait produire des exceptions de plus de 150 KB). Les listes de colonnes sont désormais limitées à 10 entrées. #99002 (Yash ).
- Renvoie correctement les statistiques de colonnes des sous-requêtes avec jointures afin que la requête parente puisse les utiliser pour réordonner les jointures. #99096 (Alexander Gololobov).
- Marque immédiatement la session ZooKeeper comme expirée lorsque la finalisation commence, au lieu d’attendre que le thread d’envoi se termine. Cela permet aux autres threads d’établir une nouvelle session sans délai. #99102 (Raúl Marín).
- Utilise davantage de fonctions mathématiques de LLVM-libc :
exp,exp2,expm1,fabs,fabsl,floor,fmodl,log,log2,logf,pow,scalbn,scalbnl,copysignl,nan,nanf,nanl, ainsi que les constantes partagéesexplogxf. #99118 (Konstantin Bogdanov). - Réduit l’utilisation de la mémoire et corrige un risque de sortie dupliquée dans le format
collapseddesystem.jemalloc_profile_text. #99121 (Antonio Andelic). - Ajoute la colonne
is_subrequestàsystem.aggregated_zookeeper_logpour séparer les requêtes autonomes des sous-requêtes à l’intérieur des requêtes Multi/MultiRead. Auparavant, les sous-requêtes étaient agrégées dans les mêmes groupes que les requêtes autonomes et, comme chaque sous-opération était journalisée avec la durée totale de la multi-requête, la latence moyenne devenait trompeuse. Les sous-requêtes ont désormais une latence nulle. #99169 (Miсhael Stetsyuk). - Autoriser la commande
ALTER TABLE MODIFY COLUMN x TTL ...sans spécifier le type de colonne. #99208 (Nikolay Degterinsky). - Ignorer les requêtes Keeper obsolètes pour les sessions déjà déconnectées, afin d’éviter des allers-retours Raft inutiles. Le nombre de sessions terminées conservées est plafonné par le paramètre de coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic). - Prise en charge d’un text index construit sur
mapValues(map)avec l’opérateurIN. #99286 (Anton Popov). - Prise en charge de l’autocomplétion de type shell dans clickhouse keeper-client (prise en charge de la complétion d’arguments entre guillemets, p. ex.
'foo ba', des arguments échappés, p. ex.foo\ ba, et affichage parlsdes nœuds entre guillemets lorsqu’ils contiennent des espaces). #99312 (Azat Khuzhin). - Empêcher la commande Keeper
mntrde se bloquer en raison d’une contention sur les verrous. #99472 (Antonio Andelic). - Réduire la contention sur les verrous dans le dispatcher de Keeper en invoquant les callbacks et en répartissant les requêtes de lecture hors de la portée du mutex, et ajouter des gardes de verrou profilés pour l’observabilité. #99751 (Antonio Andelic).
- Tolérer l’absence de padding à la fin du dernier bloc des fichiers Parquet. #99857 (Seva Potapov).
Correction de bug
- Corrige la manière dont la cible d’une table Alias est enregistrée en tant que dépendance DDL lorsqu’elle n’est pas entièrement qualifiée : elle est désormais enregistrée avec la base de données de la table Alias plutôt qu’avec la base de données de session. #95175 (Enric Calabuig).
- Corrige un résultat erroné ou une exception lors de la lecture des sous-colonnes de colonnes ALIAS. #95408 (Pavel Kruglov).
- Corrige une colonne manquante lorsqu’un alias d’identifiant non standard est utilisé dans un JOIN avec l’ancien analyseur. Corrige #25594, #47288 et #53263. #95679 (Zhigao Hong).
- Corrige un plantage dans les fonctions du dialecte Kusto
bin(),bin_at(),extract()etindexof()lorsque des arguments vides sont fournis. #95736 (NeedmeFordev). - Interdit le montage de local_object_storage (utilisé par les datalakes au-dessus du système de fichiers local et éventuellement par LocalDisk) ailleurs que dans user_files_path dans clickhouse-client. #96201 (Daniil Ivanik).
- Dans le moteur de table
DeltaLake, corrige une condition de concurrence logique lors d’un changement de version du snapshot et supprime les rechargements de snapshot lourds et redondants. #96226 (Kseniia Sumarokova). - Corrige une erreur logique lors de l’attachement d’une part dans MergeTree s’il y a eu plusieurs renommages successifs entre le détachement et l’attachement. #96351 (Alexey Milovidov).
- Corrige un bug où des paramètres explicites envoyés avec
compatibilitydans la même requête pouvaient être ignorés silencieusement lorsque leur valeur correspondait à la valeur par défaut du serveur. #97078 (Raufs Dunamalijevs). - Corrige le fait que le client signalait
NETWORK_ERRORau lieu de la véritable erreur d’analyse (avec le bon numéro de ligne) lorsqu’un INSERT avec parsing parallèle rencontrait des données invalides. #97339 (Alexey Milovidov). - Corrige le fait que la fonction d’agrégation
sumCountne pouvait pas lire les anciens états sérialisés après l’introduction deNullable(Tuple). Clôt #97370. #97502 (Nihal Z. Miaji). - Corrige une exception dans une comparaison de tuples impliquant des éléments de type
Nothing(par ex. une comparaison avec des éléments de tupleNULL) lorsqu’elle est utilisée avecGROUPING SETSetORDER BY. #97509 (Alexey Milovidov). - Corrige le calcul non déterministe de
uncompressed_hashpour les parts Compact de MergeTree lorsque plusieurs codecs de compression sont utilisés, ce qui pouvait entraîner un comportement incorrect de déduplication. #97522 (Alexey Milovidov). - Corrige une erreur logique liée à un stream manquant lors d’un INSERT SELECT avec JSON et des buckets dans les données partagées. Clôt #97331. #97523 (Pavel Kruglov).
- Correction des exceptions
MEMORY_LIMIT_EXCEEDEDsignalées à tort commeCORRUPTED_DATAlors des merges de SummingMergeTree et CoalescingMergeTree. #97537 (János Benjamin Antal). - Correction de l’exception “Context has expired” pour les sous-requêtes corrélées contenant des fonctions de table comme
url(). #97544 (Alexey Milovidov). - Correction des exceptions et des comportements incorrects dans
optimize_syntax_fuse_functionsavec les projections d’agrégation, les types Date et la préservation des noms de colonnes. #97545 (Alexey Milovidov). - Suppression d’une query rewrite incorrecte de
replaceRegexpOneversextract, qui produisait des résultats erronés lorsque l’expression régulière ne correspondait pas ; correction également d’une exception lorsquereplaceRegexpOneest utilisé avecGROUP BY ... WITH CUBEetgroup_by_use_nulls=1. #97546 (Alexey Milovidov). - Correction de
DROP DATABASEavecdatabase_atomic_wait_for_drop_and_detach_synchronously, qui pouvait rester bloqué indéfiniment lorsque la requête était interrompue. #97586 (Alexey Milovidov). - Correction de
KILL QUERY, qui ne pouvait pas arrêter des requêtes bloquées lors de la générationWITH FILL, du chargement de dictionnaires viadictGetou deALTER DELETEavecmutations_sync=1surReplicatedMergeTree. #97589 (Alexey Milovidov). - La fonction de table
loopappelait directementinner_storage->read(), en contournant la couche d’interpréteur où sont appliquées les row policies, les autorisations au niveau des colonnes et les autres contrôles de sécurité. Cela permettait à un utilisateur soumis à des row policies de lire toutes les lignes vialoop(table), même lorsqu’un SELECT direct renvoyait zéro ligne. #97682 (pufit). - Correction d’un partition pruning incorrect lors de l’utilisation de valeurs DateTime64 antérieures à l’époque Unix avec la fonction
toDate(). #97746 (Yarik Briukhovetskyi). - Après ce correctif,
hasPartitionIdrenverra false si une autre partition avec un ID de partition plus élevé existe dans l’ensemble des data parts. #97748 (Mikhail Artemenko). - Correction de crashs possibles lors de la lecture de granules vides dans les advanced shared data en JSON. Closes #97563. #97778 (Pavel Kruglov).
- Correction de
Cannot schedule a fileLOGICAL_ERRORsur unINSERTdansDistributed, en raison d’une concurrence entreDROPetINSERT. #97822 (Azat Khuzhin). - Correction d’un crash/assert du serveur ClickHouse lors d’un appel à
mapContainsKey/mapContainsKeyLikeavec l’index de sauttokenbf_v1. #97826 (Shankar Iyer). - Correction des exceptions LOGICAL_ERROR causées par
LowCardinalitydans des types composés (Variant,Dynamic,Tuple) dansconcatWithSeparator,format, les sous-requêtesIN,GLOBAL INet les jointures avec runtime filters. #97831 (Raúl Marín). - Correction de l’exception
LOGICAL_ERRORChunk info was not set for chunk in MergingAggregatedTransformlors de l’utilisation deARRAY JOINavec la table functionmerge()sur plusieurs tables Distributed combinées avecGROUP BY. #97838 (Raúl Marín). - Correction d’un plantage du serveur (
std::terminate) provoqué par une exception non interceptée dans le destructeur du pool de connexions HTTP lorsque la limite stricte du groupe de connexions est atteinte en cas de forte concurrence. L’exceptionHTTP_CONNECTION_LIMIT_REACHEDpouvait s’échapper de~PooledConnectionlors du retour d’une connexion dans le pool, entraînant unSIGABRT. #97850 (Antonio Andelic). - Correction d’un résultat incorrect lorsque l’algorithme
grace_hashest utilisé avec des jointures non équi et que le bloc de gauche ne peut pas être traité entièrement en raison des contraintes de taille sur le résultat de la jointure. #97866 (János Benjamin Antal). - Correction d’une dégradation des performances dans l’analyse des métadonnées DeltaLake introduite dans #96686. #97880 (Kseniia Sumarokova).
- Correction d’une data race dans le client ZooKeeper entre sendThread et receiveThread. #97887 (Pablo Marcos).
- Correction d’un bug qui empêchait l’utilisation d’une CTE avec des insertions distribuées via SELECT. Suite de https://github.com/ClickHouse/ClickHouse/pull/87789. Clôt #95837. #97889 (Yarik Briukhovetskyi).
- Correction d’une exception levée par
CachedOnDiskReadBufferFromFile::readBigAt. Clôt #97325. #97890 (Kseniia Sumarokova). - Correction de l’exception
LOGICAL_ERRORdans le moteurAliasavec des colonnes matérialisées, due à une incompatibilité entre colonnes. Clôt #97907. #97921 (Kai Zhu). - Correction d’une perte de données de Keeper après redémarrage lors de l’utilisation d’Azure Blob Storage avec les métadonnées
s3_plainpour le stockage des logs. #97987 (Antonio Andelic). - Correction d’une mauvaise compilation JIT de la fonction
signpour les types entiers plus larges queInt8: les valeurs en dehors de l’intervalle -128..127 pouvaient produire un signe incorrect. #98012 (Alexey Milovidov). - Correction de l’exception
DUPLICATE_COLUMNet de NULL silencieux lors de la lecture de tables Delta Lake utilisant le mode de mappage de colonnes “name” avec des champs de struct dont les noms contiennent des points (par ex.STRUCT<`a.foo`: STRING, `b.foo`: STRING>). #98013 (Caio Ishizaka Costa). - Correction d’une mutation après une lightweight update et des index secondaires. #98044 (Raúl Marín).
- Correction d’un résultat incorrect pour les requêtes FINAL lors du mélange de skip indexes sur clé primaire et hors clé primaire. #98097 (Raúl Marín).
- Application des vérifications
READ ON FILEpour le scalaire file() et DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky). - Corrige un crash où l’exécution d’une requête sur des fichiers avec un motif glob (par exemple,
file('dir/**', 'LineAsString')) levait une exception du système de fichiers non gérée (STD_EXCEPTION) si le répertoire contenait un lien symbolique orphelin. Les liens symboliques orphelins sont désormais ignorés silencieusement, et la requête renvoie les résultats de tous les fichiers valides. #98143 (Mark Andreev). - Corrige un segfault dans l’optimisation du plan de requête lors de la conversion d’une jointure externe en jointure interne avec
arrayJoindans une expression de filtre. #98147 (Alexey Milovidov). - Corrige le dysfonctionnement du format
ProtobufListavec le moteur Kafka, dû au fait que l’état de lecture n’était pas réinitialisé entre les messages. #98151 (Alexey Milovidov). - Corrige une erreur logique avec analyzer_compatibility_join_using_top_level_identifier et ARRAY JOIN, clôt #98164. #98179 (Vladimir Cherkasov).
- Définit le composant
Watchpour les réponses watch dansaggregated_zookeeper_logau lieu de le laisser vide. #98202 (Antonio Andelic). - Si les colonnes de la clé de partition ne sont pas incluses dans la clé de tri, l’élagage des partitions pouvait ignorer à tort des partitions contenant des lignes qui auraient dû être retenues lors de la déduplication FINAL. #98242 (Yarik Briukhovetskyi).
- Corrige l’erreur logique “Bad cast from type DB::ColumnConst to DB::ColumnArray” dans
kql_array_sort_asc/kql_array_sort_desclorsqu’elles sont appelées avec des arguments de tableau constants. #98251 (Alexey Milovidov). - Corrige un accès hors limites dans
ColumnConst::getExtremesqui pouvait provoquer un crash lorsqueextremes = 1est activé. #98263 (Alexey Milovidov). - Corrige un interblocage potentiel lorsque deux opérations concurrentes
MOVE PARTITIONtravaillent sur la même paire de tables dans des directions opposées. #98264 (Alexey Milovidov). - Le serveur HTTP renvoie désormais un message d’erreur dans le corps de la réponse pour les réponses 400 Bad Request causées par des en-têtes mal formés, au lieu d’un corps vide. #98268 (Alexey Milovidov).
- Corrige des résultats erronés avec l’analyse d’index distribuée (fonctionnalité expérimentale) et le cache des conditions de requête. #98269 (Azat Khuzhin).
- Corrige l’exception LOGICAL_ERROR “Invalid binary search result in
MergeTreeSetIndex” déclenchée par la conversiontoDatesur des colonnes de clé contenant des données franchissant le seuil de 65535. #98276 (Alexey Milovidov). - Corrige l’exception
LOGICAL_ERRORlorsqu’une RIGHT JOIN encapsulée dans une CROSS JOIN est permutée par l’optimisationquery_plan_join_swap_tabledans le chemin de code hérité de l’étape de jointure. #98279 (Alexey Milovidov). - Vérifie les données corrompues lors de la désérialisation de
DDSketchafin d’éviter les segfaults, les exceptions, les boucles infinies et les OOM lors de la lecture d’états de fonctions d’agrégationquantilesDDcorrompus. #98284 (Alexey Milovidov). - Corrige LOGICAL_ERROR “Trying to execute PLACEHOLDER action” lorsque des colonnes corrélées issues de requêtes englobantes sont référencées à l’intérieur de fonctions lambda telles que
arrayMap. #98285 (Alexey Milovidov). - Corrige une exception d’erreur logique dans
caseWithExpressionlorsque l’expressionCASEimpliquematerialize(NULL)ou d’autres argumentsNullable(Nothing). #98290 (Alexey Milovidov). - Corrige une exception de conversion de type incorrecte lors du filtrage de la colonne virtuelle
_tabledans la fonction de tablemerge. #98291 (Alexey Milovidov). - Corrige un échec sporadique de déduplication où des réinsertions étaient dédupliquées à tort en raison d’un ordre de nettoyage incohérent entre les répertoires ZooKeeper
blocks/etdeduplication_hashes/. #98293 (Alexey Milovidov). - Corrige une exception lorsque
ORDER BY ... WITH FILLest utilisé avecLIMIT BY. #98361 (Alexey Milovidov). - Corrige une corruption silencieuse des données lors de l’insertion d’une colonne Parquet/Arrow
Datedans une colonneEnum— la conversion de type incompatible est désormais correctement rejetée au lieu de stocker des valeurs d’énumération invalides. #98364 (Alexey Milovidov). - Corrige une exception lors de la lecture d’un fichier Arrow avec une colonne
Arraydans une table comportant une colonneNested. #98365 (Alexey Milovidov). - Corrige les mutations
MATERIALIZE INDEXetMATERIALIZE PROJECTIONqui restaient bloquées lorsque l’index ou la projection était supprimé avant la fin de la mutation. #98369 (Alexey Milovidov). - Corrige une exception lors de la lecture depuis
Nullable(Tuple(...))lorsqu’un nom d’élément de Tuple entre en conflit avec la sous-colonne Nullablenull. #98372 (Alexey Milovidov). - Corrige l’exception “Column … query tree node does not have valid source node” lors d’une jointure entre une table
Merge(encapsulant une tableDistributed) et une autre table. #98376 (Alexey Milovidov). - Corrige la conversion incorrecte de Parquet
BoolversFixedStringdans le lecteur natif V3, qui produisait des octets bruts au lieu d’une représentation textuelle. #98378 (Alexey Milovidov). - Corrige
tryGetColumnDescriptionpour filtrer les sous-colonnes selon la nature de la colonne parente, de manière cohérente avec les autres méthodes de recherche de colonnes. #98391 (Alexey Milovidov). - Accepte les informations d’identification base64 sans padding dans l’authentification HTTP Basic. Certains clients HTTP omettent le caractère de padding final
=dans l’en-têteAuthorization: Basic, ce qui provoquait auparavant des échecs d’authentification. #98392 (Amos Bird). - Correction de résultats incorrects de partition pruning après la fusion de parts avec des colonnes de clé de partition
Nullable, en raison de bornes erronées dans l’index min-max. #98405 (Amos Bird). - Correction d’une exception rare dans l’exécuteur du pipeline, pouvant se manifester par
Received signal 6(uniquement dans les versions de débogage), lorsque l’expansion du pipeline entrait en concurrence avec l’annulation de la requête. #98428 (Alexey Milovidov). - Correction de l’exception “Column identifier is already registered” lorsque
count_distinct_optimizationest utilisé avec une clauseQUALIFY. #98433 (Alexey Milovidov). - Correction de l’exception “cannot be inside Nullable type” lors de l’utilisation de
IN/NOT INavec des arguments de colonneLowCardinality(par ex.a NOT IN (b)oùaestLowCardinality(String)). #98443 (Alexey Milovidov). - Correction de l’exception “Pipeline stuck” dans les jointures
full_sorting_merge, causée par un interblocage dansPingPongProcessorlorsque l’optimisationFilterBySetOnTheFlycréait une dépendance circulaire avecMergeJoinTransform. #98454 (Alexey Milovidov). - Correction de l’exception
LOGICAL_ERROR“Projection cannot increase the number of rows in a block” lors de la fusion de parts avec un TTL qui supprime toutes les lignes et une projection d’agrégation avec une cléGROUP BYconstante. #98458 (Alexey Milovidov). - Correction d’une exception d’erreur logique lorsque
CROSS JOINest utilisé avecINNER JOIN USING. #98459 (Alexey Milovidov). - Correction d’un déréférencement de pointeur nul dans
dictGetOrDefaultlorsque l’argument de clé estNullable. #98460 (Alexey Milovidov). - Correction d’une exception dans les requêtes
DISTINCTlors de l’utilisation de projections d’agrégation, lorsquematerializeprovoque des différences de typeLowCardinalityentre la requête et la projection. #98462 (Alexey Milovidov). - Correction de l’exception LOGICAL_ERROR lorsque
arrayJoinest utilisé dans une expression de filtre avec OUTER JOIN etjoin_use_nullsactivé. #98464 (Alexey Milovidov). - Correction d’une exception d’erreur logique “Replica decided to read in WithOrder mode, not in ReverseOrder” lors de l’utilisation de répliques parallèles avec
optimize_aggregation_in_order. #98467 (Alexey Milovidov). - Correction d’un problème où ClickHouse Keeper déconnectait les clients Java ZooKeeper après une requête
addWatch. Le client Java attend un corpsErrorResponsede 4 octets dans la réponse àaddWatch, mais Keeper envoyait un corps vide, provoquant uneEOFExceptionet la déconnexion de la session. Cela cassaitCuratorCached’Apache Curator ainsi que toute application Java utilisant des watches persistants. Corrige #98079. #98499 (Antonio Andelic). - Correction des métriques Keeper
zk_followersetzk_synced_followers, qui ne diminuaient pas lorsqu’un follower tombait en panne. Ajout des nouvelles métriqueszk_learnersetzk_synced_non_voting_followersà la commande à quatre lettresmntr. Corrige #54173. #98504 (Antonio Andelic). - Correction d’une exception LOGICAL_ERROR dans
renameAndCommitEmptyPartsqui pouvait survenir lorsqueTRUNCATE TABLEs’exécute en concurrence avecOPTIMIZE TABLElors de l’utilisation de transactions MergeTree. #98508 (Alexey Milovidov). - Correction du port Raft sécurisé de Keeper, qui ignorait
cipherListetdhParamsFilede la configurationopenSSLet utilisait toujours les valeurs par défaut au lieu de celles spécifiées par l’utilisateur. Ferme #51188. #98509 (Antonio Andelic). - Correction de messages de log Keeper trompeurs tels que “Receiving request for session X took 9963 ms”, où le temps indiqué correspondait en réalité à une attente inactive dans
poll()entre les heartbeats, et non à l’exécution de l’opération elle-même. Corrige #79026. #98510 (Antonio Andelic). - Correction d’un résultat inattendu avec read_in_order_use_virtual_row et les fonctions monotones, ferme #97837. #98514 (Vladimir Cherkasov).
- Correction de
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'lors de l’utilisation dePREWHEREavec une sous-requêteINsur des tables MergeTree. #98522 (Alexey Milovidov). - Correction des connexions TCP de Keeper qui empêchaient l’arrêt gracieux du serveur en ne répondant pas au signal d’arrêt. #98525 (Alexey Milovidov).
- Correction de l’exception “Sorting column wasn’t found in the ActionsDAG’s outputs” lorsque
query_plan_convert_join_to_inest activé avecquery_plan_merge_expressions = 0. #98526 (Alexey Milovidov). - Correction de l’échec de la source de dictionnaire MongoDB avec les named collections. Ferme #97840. #98528 (Pablo Marcos).
- Correction de LOGICAL_ERROR lorsque Identifier est vide après substitution des paramètres. #98530 (Pervakov Grigorii).
- Correction d’un interblocage du pipeline lors de l’utilisation de
sort_overflow_mode = 'break'avec des fonctions de fenêtre. #98543 (Alexey Milovidov). - Correction du rollback de colonne dans le moteur Buffer lors du traitement d’une exception pendant l’ajout d’un nouveau block. L’ancienne logique pouvait entraîner un état en mémoire corrompu des colonnes. #98551 (Pavel Kruglov).
- Correction de l’exception
Bad cast from type ColumnConst to ColumnDynamicdans la comparaison null-safe (<=>/IS NOT DISTINCT FROM) avec des colonnesDynamicouVariantconstantes etNULL. Correction également deIS DISTINCT FROMavecDynamic/VariantvsNULL, qui renvoyait auparavant toujours 0 à tort. #98553 (Alexey Milovidov). - Correction de l’utilisation de l’index de texte avec d’autres skip indexes. Auparavant, des logical errors telles que “Trying to get non-existing mark” pouvaient être levées lorsqu’un filtre de requête utilisait simultanément un index de texte et d’autres skip indexes classiques. #98555 (Anton Popov).
- Correction de la logical error “TABLE_FUNCTION is not allowed in expression context” lorsqu’une table function avec un alias apparaît plusieurs fois dans le même scope de requête (par exemple dans les clauses
PREWHEREetQUALIFY). #98557 (Alexey Milovidov). - Correction de la distributed index analysis avec des expressions (et pas seulement des colonnes) dans la PK (ce qui entraînait l’absence de filtrage des granules redondants sur les répliques distantes). #98561 (Azat Khuzhin).
- Interdiction de supprimer une colonne lorsque ses subcolumns sont utilisées dans les expressions default/alias d’autres colonnes, et utilisation de l’analyzer pour les expressions par défaut lors d’un alter drop column. #98569 (Nikita Mikhaylov).
- Correction des requêtes S3 réessayées à tort sur des erreurs non réessayables (y compris
HTTP_CONNECTION_LIMIT_REACHED) dans le client HTTP. #98598 (Sema Checherinda). - Correction d’un overflow decimal lors du partition pruning avec DateTime64. #98628 (Yarik Briukhovetskyi).
- Correction de deux bugs dans la compilation JIT d’expression : une erreur de copier-coller dans le type checking de
nativeCastqui rendait inaccessibles les branches de cast entier-vers-entier et float-vers-float, ainsi qu’unnullptrTargetMachine incorrect transmis à LLVMPassBuilder, empêchant l’enregistrement des passes d’optimisation spécifiques à la cible. #98660 (Alexey Milovidov). - Correction d’un contournement RBAC qui permettait aux utilisateurs de DESCRIBE n’importe quelle table via
remote(),remoteSecure(),cluster()ouclusterAllReplicas()pointant vers localhost, sans nécessiter le privilegeSHOW_COLUMNS. #98669 (pufit). - Correction de l’exception
BAD_GETet de résultats de requête incorrects lorsqu’une expression non booléenne (par ex.sin(col)) est utilisée à la fois dans WHERE et SELECT avec un JOIN, en raison d’une optimisation de filter push-down corrompant des nœuds DAG partagés. #98681 (Alexey Milovidov). - Correction de LOGICAL_ERROR “Replica decided to read in Default mode, not in WithOrder” lors de l’utilisation de
read_in_order_through_joinavec des parallel replicas. #98685 (Alexey Milovidov). - Correction de l’exception “Bad cast from type
DB::TableFunctionNodetoDB::QueryNode” lors de l’utilisation de la table functioninputcomme argument deremote. #98694 (Alexey Milovidov). - Correction de la résurrection d’outdated data parts causée par un nettoyage incorrect de covering parts vides. #98698 (Shaohua Wang).
- Correction d’une exception dans
LogicalExpressionOptimizerPasslorsqu’une fonction booléenne dans une comparaisonequalsrenvoie un typeVariant. #98712 (Alexey Milovidov). - Correction de
parseDateTimeBestEffort, qui analysait incorrectement les mots commençant par des préfixes de mois ou de jours de la semaine. Résout #97965. #98742 (Pavel Kruglov). - Correction de l’exception
UNKNOWN_IDENTIFIERlors des requêtes sur la fonction de tablemerge()ou le moteurMergeappliqués à des tables avec des colonnes JSON ayant des paramètres différents (par ex. des champsSKIPdifférents) et des colonnes ALIAS référençant des sous-chemins JSON, avec le nouvel analyseur activé. Résout #97812. #98753 (Pavel Kruglov). - Correction de l’optimisation
optimize_skip_unused_shardsavec l’analyseur lorsque le stockageDistributedest utilisé dans uneView. #98754 (Nikolai Kochetov). - Correction de l’accès aux sous-colonnes d’un tuple par leur nom (par ex.
SELECT x.apourTuple(a UUID, b Int32)) pour les tables externes transmises via--externaldansclickhouse-client. Résout #96925. #98755 (Pavel Kruglov). - Correction de l’exception
reverseUTF8sur une entrée UTF-8 invalide (tronquée). #98770 (Alexey Milovidov). - Correction de la détection de l’utilité d’un skip index de type Set avec un prédicat OR avec false (c.-à-d. or(x, 0)). #98776 (Azat Khuzhin).
- Correction d’une exception
LOGICAL_ERROR(incompatibilité de structure de block dansremoveUnusedColumns) pouvant se produire avecFINAL+PREWHERE+ une expressionWHEREconstante + des agrégats indépendants des colonnes commecount(). #98778 (Alexey Milovidov). - Les entrées de
system.trace_logpour les rechargements automatiques des Dictionaries ClickHouse ont désormais des Query id non vides. #98784 (Miсhael Stetsyuk). - Correction d’un crash pouvant entraîner le déréférencement d’un pointeur nul dans des tables système créées entre le moment où un instantané des tables est pris dans l’appel
IDatabaseTablesIterator::table()et celui où les tables sont modifiées par un autre thread lors d’une itération ultérieure. #98792 (Grant Holly). - Correction de
SYSTEM START REPLICATED VIEW, qui ne réveillait pas la tâche de refresh. #98797 (Pablo Marcos). - Correction de l’exception “Inconsistent table names” lors de l’utilisation de la fonction de table
view()contenant des JOIN imbriqués dans un autre JOIN (uniquement avec l’ancien analyseur). #98809 (Alexey Milovidov). - Correction de l’ajustement de RLIMIT_SIGPENDING (via pending_signals). #98829 (Azat Khuzhin).
- Correction d’une exception lors de la composition de
loopavec des cluster table functions. #98860 (Konstantin Bogdanov). - LEFT ANTI JOIN avec plusieurs colonnes de clé de jointure renvoyait des résultats incorrects lorsque
enable_join_runtime_filters=1(valeur par défaut). #98871 (Alexander Gololobov). - Correction de
WITH FILL STALENESS, qui produisait des lignes remplies en trop lorsque les données étaient lues en plusieurs chunks (par ex. avec unindex_granularityfaible). #98895 (Alexey Milovidov). - Correction de l’erreur LOGICAL_ERROR « RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B ». #98900 (Azat Khuzhin).
- Correction d’une dérive du suivi mémoire causée par l’absence de rollback après des allocations échouées, par le comportement indéfini de
nallocx(0)et par une erreur de décalage d’une unité dans le suivi du pic global. Extension du suivi pour couvrir les buffers circulairesio_uring. #98915 (Antonio Andelic). - Interdiction d’attacher des tables locales de data lake en dehors des chemins utilisateur, et pas seulement d’en créer. #98936 (Daniil Ivanik).
- Correction d’une race condition pouvant provoquer une exception « ReadBuffer is canceled » dans les requêtes utilisant
urlClusterou des cluster table functions similaires. #98955 (Alexey Milovidov). - Correction de l’exception
LOGICAL_ERRORdans les fonctions financières (financialNetPresentValue,financialInternalRateOfReturn, etc.) lorsque des arguments de typeBFloat16sont passés. #98958 (Alexey Milovidov). - Correction du fait que les skip indexes (et les conditions de clé primaire) n’étaient pas appliqués aux colonnes ALIAS lorsque la fusion des expressions du query plan est désactivée (
query_plan_merge_expressions = 0ouquery_plan_enable_optimizations = 0). #98960 (Peng). - Incrémente
InsertQueryProfileEvent pour les async inserts. Clôt #98626. #98962 (Narasimha Pakeer). - Correction de l’exception « Inconsistent KeyCondition behavior » dans les builds de débogage lorsque la clé primaire contient des valeurs flottantes NaN, en faisant en sorte que
accurateLessetaccurateEqualstraitent NaN de manière cohérente avec l’ordre de tri de ClickHouse. Clôt #98075. #98964 (Alexey Milovidov). - SummingMergeTree n’additionne plus les colonnes Bool (ni les autres colonnes de type domain). Les valeurs Bool sont conservées telles quelles au lieu d’être additionnées arithmétiquement. #98976 (Yash ).
- Correction de l’exception Scalar doesn’t exist qui se produisait lors de l’interrogation d’un shard distant avec
optimize_const_name_sizeactivé etenable_scalar_subquery_optimization= 0. Les grandes constantes remplacées par des références__getScalardans la requête distante n’étaient pas envoyées au shard, ce qui provoquait l’échec de la requête. #98979 (andriibeee). - Corrige
NOT_FOUND_COLUMN_IN_BLOCKpour certaines requêtes avecGROUP BYet des expressions incluant une recherche inverse dans un Dictionary, des comparaisons de conversionDate/DateTimeet des comparaisons de tuples. Clôt #98888. #98980 (Nihal Z. Miaji). - Correction d’un comportement indéfini (déréférencement de pointeur nul) lors de la modification d’une colonne version/sign/is_deleted en
EPHEMERALouALIASdans les moteurs MergeTree. De telles modifications sont désormais correctement rejetées. #98985 (Alexey Milovidov). - Correction d’un problème où
system.grantsomettait les paramètres d’expression régulière pour les privilègesURLetS3dans la colonneaccess_object. #98987 (DQ). - Correction des lectures Iceberg BigLake : les identifiants ADC sont désormais transmis au client GCS S3 (ce qui corrige les erreurs 403), les identifiants OAuth2 sont encodés dans l’URL avant l’envoi (ce qui corrige les échecs d’authentification pour les jetons contenant des caractères spéciaux), et le parcours des espaces de noms ne s’interrompt plus sur les réponses HTTP 400 de BigLake. #98998 (Nikita Fomichev).
- Correction de
clickhouse-clientqui ne parvenait pas à changer de fuseau horaire lorsque la variable d’environnementTZutilisait une syntaxe de chemin de fichier POSIX (par ex.TZ=:/etc/localtime). #99000 (Yash ). - Corrige un pruning incorrect ou insuffisant lorsque
startsWith,LIKEetNOT LIKEsont utilisés avec une colonneFixedString. De plus, la fonction de transtypage deFixedStringversStringpeut désormais effectuer le pruning des granules lorsqu’elle est appliquée à une colonne clé. Clôt #98940. #99001 (Nihal Z. Miaji). - Correction de
windowFunnelavecstrict_deduplication, qui renvoyait un niveau incorrect lorsqu’un événement dupliqué était rencontré. #99003 (Yash ). - Corrige un bug où EXISTS ignorait les clauses LIMIT et OFFSET dans les sous-requêtes, provoquant des résultats incorrects lorsque la sous-requête ne renvoyait aucune ligne en raison d’un offset ou d’une limite à zéro. Clôt #88722. #99005 (andriibeee).
- Corrige l’exception “Block structure mismatch” lorsque l’optimisation de descente de filtre rencontre une expression AND qui se résout par court-circuit en une constante avec
GROUPING SETS. #99010 (Alexey Milovidov). - Corrige une exception lors de la lecture de patch parts (lightweight updates) sans colonne
_part_offsetdans le plan de requête. #99023 (Alexey Milovidov). - Une requête comme
SELECT * FROM table WHERE pk_id = '', oùpk_idest la clé primaire et de typeString, utilisera désormais correctement l’index de clé primaire pour filtrer les granules. #99027 (Shankar Iyer). - Corrige l’exception
DEPENDENCIES_NOT_FOUNDdans le moteur Kafka lorsqu’une vue matérialisée est détachée pendant que le thread d’arrière-plan traite un flux de données. #99028 (Alexey Milovidov). - Corrige une exception lors de la création d’une table avec une colonne
EPHEMERALportant le même nom qu’une colonne virtuelle (par ex._part_offset). #99031 (Alexey Milovidov). - Corrige le message trompeur “inflate failed: buffer error” lors de la lecture de fichiers compressés inexistants via la fonction de table
url()avec des motifs glob. Renvoie désormais un résultat vide, comme prévu, lorsquehttp_skip_not_found_url_for_globsest activé. #99034 (Alexey Milovidov). - Corrige un plantage du serveur (std::terminate) lors de l’exécution de
ALTER TABLE ... DROP PARTsur une patch part après une modification du schéma (par ex. ADD COLUMN). Le plantage était dû à l’absence de colonnes système (_part) dans les métadonnées de la coverage part vide, ce qui entraînait une exception non interceptée à l’intérieur d’un NOEXCEPT_SCOPE. #99036 (Peng). - Le processus du serveur ClickHouse pouvait planter si une exception de dépassement de memory limit était levée pendant une lecture disque mise en cache. Ce problème est désormais corrigé. #99042 (Shankar Iyer).
- Corrige
LOGICAL_ERRORlors de l’interrogation d’une table comportant à la fois une ROW POLICY et une colonne ALIAS avecdictGet. Le problème était dû à un accès prématuré à l’expression de table pendant la résolution de la colonne ALIAS dans le nouvel analyseur. #99065 (Peng). - Corrige une erreur de dépassement de limites lorsque l’utilisateur tente d’interroger uniquement des colonnes virtuelles d’une table Iceberg avec le format Avro pour les données. Il s’agit d’un scénario extrêmement rare, donc il n’est pas considéré comme critique. Corrige #88238. #99080 (alesapin).
- Corrige un segfault dans un CTE récursif avec
remote()+view(). #99081 (Konstantin Bogdanov). - Ignore l’analyse d’index supplémentaire inutile lorsque l’optimisation read-in-order est appliquée. #99084 (Vladimir Cherkasov).
- Corrige un plantage déclenché par une exception de memory limit levée pendant l’application d’une patch part. #99086 (Anton Popov).
- Corrige une assertion de débogage dans
DDLWorker, causée par unfirst_failed_task_nameobsolète après la suppression d’une entrée ZooKeeper pendant la récupération après réinitialisation. #99099 (Antonio Andelic). - Corrige la reconstruction des index de texte lors des merges avec TTL. #99107 (Anton Popov).
- Corrige un plantage dans la query
ALTER TABLE ... REMOVE SETTINGSpour le table engine Iceberg. Corrige #86330. #99108 (alesapin). - Corrige un bug dans l’optimisation
query_plan_convert_any_join_to_semi_or_anti_join, qui renvoyait un résultat incorrect pour les lignes sans correspondance. Lié à : https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi). - Corrige l’exception LOGICAL_ERROR dans
ASTColumnsExceptTransformer::transform. #99119 (Pablo Marcos). - Corrige un contournement du RBAC qui permettait aux utilisateurs d’obtenir la structure d’une table via
DESCRIBE TABLEouCREATE TABLE ASsur des fonctions de table (mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc(), etc.) sans disposer des privilèges d’accès à la source requis. Pour les fonctions qui déduisent le schéma à partir de serveurs distants, cela permettait aussi de déclencher des connexions sortantes (SSRF) sans autorisation. #99122 (pufit). - Corrige un crash de Keeper (segfault dans NuRaft) lors d’une reconfiguration dynamique et d’un transfert de leadership. #99133 (JIaQi Tang).
- Corrige un crash lors de l’utilisation d’une Buffer table avec SAMPLE lorsque la destination ne le prend pas en charge. #99141 (Kseniia Sumarokova).
- Corrige une LOGICAL_ERROR due à un ordre de colonnes incohérent dans les patch parts. #99164 (Pablo Marcos).
- Corrige un crash très rare lorsqu’une Iceberg table contient des fichiers de formats mixtes (ORC et Parquet). Corrige #88126. #99168 (alesapin).
- Corrige le fait que max_execution_time ne s’appliquait pas aux opérations de backup/restore. #99205 (Kseniia Sumarokova).
- Corrige le fait que
insert_deduplication_tokenétait ignoré silencieusement pour les requêtesINSERT SELECTsansORDER BY ALL. Auparavant, la déduplication était entièrement désactivée pour lesINSERT SELECTnon triés, même lorsqu’un token utilisateur explicite était fourni. Désormais, fournirinsert_deduplication_tokensuffit à activer la déduplication, indépendamment deORDER BY ALL. #99206 (Desel72). - Corrige des vérifications d’accès excessives lors de l’optimisation
InverseDictionaryLookupPassen vérifiant l’autorisationCREATE_TEMPORARY_TABLEune seule fois avant le passage, au lieu de le faire pour chaque nœud visité. #99210 (Mikhail Artemenko). - Corrige
clickhouse format --obfuscate, qui produisait du SQL invalide en obscurcissant les types de skip index, les noms de compression codec, les noms de database engine et les définitions de dictionary layout/source. #99260 (Raúl Marín). - Corrige un bug où, dans certains cas, la comparaison entre les types Time[64] et DateTime[64] prêtait à confusion ; désormais, dans ce type de cas, les valeurs Time[64] sont converties en DateTime[64] en ajoutant
1970-01-01comme partie date. #99267 (Yarik Briukhovetskyi). - Applique les contraintes de settings dans le worker DDL pour les distributed DDL queries. #99317 (Pablo Marcos).
- Corrige des problèmes mineurs liés à l’authentification TOTP : l’option CLI
--one-time-passwordavec un mot de passe vide, ainsi que la validation des valeurs de configuration<digits>et<period>. #99322 (Vladimir Cherkasov). - Corrige l’erreur logique
unordered_map::at: key not founddans le format de sortie Avro lors de la sérialisation de colonnesEnum8/Enum16contenant des valeurs absentes de la définition de l’enum. #99332 (Desel72). - Correction de
CHECK TABLEavec une sérialisation sparse à l’intérieur deTupleavecDynamic. Closes #96588. #99351 (Pavel Kruglov). - Correction d’une validation trop stricte du préprocesseur d’index de texte. #99359 (Anton Popov).
- Correction de la compatibilité lors de la mise à niveau de tables répliquées avec des index minmax implicites de la version 25.10 vers des versions plus récentes. #99392 (Raúl Marín).
- Suppression de la prise en charge des fonctions négatives (
notEquals,notLike,notIn) dans l’analyse des index de texte. Ces fonctions ne pouvaient jamais ignorer de granules ; analyser l’index pour elles ne faisait donc qu’ajouter un surcoût, sans aucun bénéfice. #99393 (Anton Popov). - Correction de
optimize_skip_unused_shardsavec le nouvel analyseur lorsqu’une tableDistributedétait utilisée dans une sous-requêteIN. #99436 (Nikolai Kochetov). - Correction d’un heap-use-after-free dans
INTERSECT/EXCEPTlorsque la requête produit des noms de colonnes en double. #99471 (Alexey Milovidov). - Correction d’une erreur logique dans
ALTER TABLE ... DROP PARTlorsqu’un paramètre de requête typé est utilisé pour le nom de la part. #99489 (Alexey Milovidov). - Correction de l’exception
NOT_FOUND_COLUMN_IN_BLOCKlorsqu’un prédicat d’index de texte (par exemplehasAllTokens) est référencé à la fois dans les clausesSELECTetWHEREvia un alias. #99504 (Anton Popov). - Correction de résultats incorrects lors de l’utilisation de
hasAllTokensavecORsur des colonnes ayant des index de texte distincts. #99505 (Anton Popov). - Initialisation du page cache dans
clickhouse-localafin que le paramètrepage_cache_max_sizeprenne effet. #99510 (Alexey Milovidov). - Correction d’un rare marquage incorrect d’une part de données comme corrompue, suivi de son détachement après une requête
DETACH/ATTACH TABLE. #99529 (Anton Popov). - Correction de l’exception
std::length_errorlors de l’interrogation de tables système vides au format Pretty via l’interface HTTP. #99541 (Alexey Milovidov). - Correction de
LOGICAL_ERRORlors de l’utilisation deALTER TABLE ADD COLUMNpour créer une colonneEPHEMERALportant le même nom qu’une colonne virtuelle (par exemple_part_offset). #99549 (Alexey Milovidov). - Correction du fait que les entrées
VectorSimilarityIndexCachen’étaient jamais évincées après la suppression d’une part en raison d’une discordance des clés de cache. #99575 (Seva Potapov). - Interdiction de lire les credentials Google à partir d’un fichier local. Ce paramètre n’est pas sûr, car il permet de lire d’autres credentials si le chemin du fichier est connu. #99584 (Konstantin Vedernikov).
- Correction d’une dégradation des performances dans l’analyseur. Suppression des colonnes inutilisées dans ARRAY JOIN. #99587 (Dmitry Novik).
- Correction de la lecture de l’index de texte dans une table avec des lightweight deletes existants et des politiques de lignes. #99661 (Anton Popov).
- Correction d’un déréférencement de
nullptrdans le lecteur Parquet lorsque le chemin de filtrage dans le décodeur rencontre des pages filtrées. Clôt #99676. #99677 (Alexey Milovidov). - Correction d’un déplacement incorrect dans AsynchronousReadBufferFromFileDescriptor avec O_DIRECT. Clôt #99358. #99678 (Pavel Kruglov).
- Correction d’un heap-buffer-overflow dans
CompressionCodecT64et d’un arrêt du processus dansCompressionCodecMultiplelors de la décompression de données compressées mal formées. Ces deux problèmes ont été découverts par de nouvelles cibles libFuzzer. Les codecs lèvent désormais une exception au lieu de provoquer un plantage. #99680 (Rahul). - Le traitement est désormais retardé jusqu’à ce que le serveur ait terminé le chargement de toutes les tables. #99700 (Seva Potapov).
- Correction du contournement de
RemoteHostFilterpar la source de dictionnaire MySQL pour les paramètres DDL inline. #99720 (Shaohua Wang). - Correction d’une erreur logique lors de l’itération sur les tables du lac de données dans
system.tables. #99739 (Konstantin Vedernikov). - Correction de l’analyse des prédicats avec la fonction
INdans l’index de texte avec préprocesseur. Correction également d’une collision entre les tokens recherchés dans l’index de texte, qui pouvait entraîner des résultats incorrects. #99755 (Anton Popov). - Correction d’une boucle infinie lors de la lecture de fichiers au format
Npyavec des dimensions négatives dans la forme. #99812 (Desel72). - Correction d’un global-buffer-overflow dans la fonction
CRC32sur des argumentsFixedStringlorsqu’elle est évaluée avec zéro ligne pendant le calcul de l’en-tête du plan de requête. #99835 (Alexey Milovidov). - Correction d’un plantage (déréférencement de pointeur nul) lors de l’exécution de
ALTER TABLE ... MODIFY COLUMN ... COMMENTsur des tables Iceberg. #99838 (Desel72). - Correction du paramètre
aggregate_functions_null_for_emptypour qu’il fonctionne avec des fonctions d’agrégation renvoyant des types nonNullable, commeArrayouMap(par exemplegroupArray,sumMap). #99839 (Alexey Milovidov). - Correction de l’exception LOGICAL_ERROR dans la fonction
midpointlorsqu’elle est appelée avec un mélange de types entiers signés et non signés. #99867 (Alexey Milovidov). - Correction de l’exception “Block structure mismatch” dans les requêtes avec clause HAVING, lorsque l’expression de filtre contient à la fois un agrégat encapsulé dans une fonction produisant NULL et
materialize(0). #99915 (Alexey Milovidov). - Corrige l’échec d’assertion dans
sipHash128Keyed(et dans des fonctions de hachage avec clé similaires) lorsque l’argument de données est un Map dont les clés sont des tableaux ou d’autres types de tableaux imbriqués. #99921 (Alexey Milovidov). - Corrige l’exception
LOGICAL_ERROR“Not-ready Set” dans la fonctionINlors de l’optimisation du plan de requête avecconvertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
Amélioration de la compilation/des tests/du packaging
- Réduction du temps de compilation par suppression d’inclusions lourdes de fichiers d’en-tête et déplacement des instanciations de modèles coûteuses hors des en-têtes. #97893 (Raúl Marín).
- Réduction du temps de compilation des fonctions arithmétiques et des en-têtes associés en réduisant les matrices de dispatch des modèles et en supprimant des inclusions lourdes. #98204 (Raúl Marín).
- Utilisation de
mongo-c-driver2.2.2. #98304 (Konstantin Bogdanov). - Utilisation de
postgresREL_18_3. #98306 (Konstantin Bogdanov). - Activation de l’allocateur jemalloc pour les builds UBSan afin d’éviter l’accumulation de RSS due au mauvais comportement de restitution de mémoire de malloc dans glibc. #98444 (Alexey Milovidov).
- Utilisation du mangling de symboles Rust v0 et suppression des symboles internes de la bibliothèque PRQL afin de réduire l’inflation des noms de symboles provenant des bibliothèques de combinators de parsing. #98446 (Alexey Milovidov).
- Ajout de la suite de benchmark TPC-H et du README TPC-DS à
tests/benchmarks. #98495 (Raufs Dunamalijevs). - Ajout de tests de correction pour les 99 requêtes TPC-DS. #99204 (Raufs Dunamalijevs).
- Ajout d’un test d’intégration reproduisant le bug d’une réplique hors ligne avec DDL CREATE TABLE + ALTER (#44070), marqué comme échec attendu. #99259 (Raufs Dunamalijevs).
- Intégration de jemalloc avec le préfixe
je_et suppression de l’utilisation de l’option —wrap de l’éditeur de liens. #99342 (Azat Khuzhin).
Version de ClickHouse 26.2, 2026-02-26. Présentation, Vidéo
Changement incompatible avec les versions précédentes
- La déduplication est désormais activée par défaut pour tous les inserts. Elle était auparavant désactivée pour les async inserts et pour les MV, mais activée pour les sync inserts. L’objectif est d’avoir les mêmes valeurs par défaut pour les deux modes d’insert. Si vous avez explicitement désactivé la déduplication sur votre cluster, vous devez définir explicitement
deduplicate_insert='backward_compatible_choice'pour conserver l’ancien comportement. Même chose pourdeduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda). - Format de stockage des statistiques amélioré. Toutes les statistiques sont désormais stockées dans un seul fichier. #93414 (Anton Popov). Si vous n’avez pas explicitement activé les statistiques de table, vous pouvez ignorer ce point.
- Limitation des métadonnées en mémoire de S3(Azure)Queue. Les system tables sont renommées de
azure_queueenazure_queue_metadata_cacheet desystem.s3queueens3queue_metadata_cache. #95809 (Kseniia Sumarokova). - Auparavant, l’application d’une fonction à une colonne
Variantrenvoyait silencieusement des NULL lorsqu’un sous-type de variant était incompatible avec la fonction ; désormais, une exception est levée, ce qui peut casser des requêtes qui reposaient sur ce comportement silencieux avec NULL. #95811 (Bharat Nallan). - Les colonnes
DATEprovenant de PostgreSQL sont désormais inférées commeDate32dans ClickHouse (dans les versions précédentes, elles étaient inférées commeDate, ce qui entraînait un overflow pour les valeurs hors d’une plage étroite). L’insertion de valeursDate32dans PostgreSQL est désormais autorisée. Closes #73084. #95999 (Alexey Milovidov). - La sémantique du paramètre
do_not_merge_across_partitions_select_finala été clarifiée. Auparavant, la fonctionnalité pouvait être activée automatiquement lorsque le paramètre n’était pas explicitement défini dans les configs. Cela a provoqué de la confusion à plusieurs reprises et, malheureusement, conduit à certains problèmes en production. Désormais, les règles sont plus simples :do_not_merge_across_partitions_select_final=1active la fonctionnalité sans condition. Sido_not_merge_across_partitions_select_final=0, alors le mode automatique est utilisé uniquement si le nouveau paramètreenable_automatic_decision_for_merging_across_partitions_for_final=1, et n’est pas utilisé sinon. Afin de préserver autant que possible l’ancien comportement, les valeurs par défaut ont été définies surdo_not_merge_across_partitions_select_final=0etenable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov). - Lors de la création d’une table S3 avec des colonnes explicitement spécifiées, ClickHouse vérifie désormais que ces noms de colonnes existent bien dans le schéma du fichier distant. Les requêtes qui fonctionnaient auparavant avec des noms de colonnes non concordants échoueront désormais au moment de la création de la table. This closes #96089. #96194 (Konstantin Vedernikov).
- Interdire l’utilisation de subqueries dans ORDER BY et les autres key expressions de table. #96847 (Alexey Milovidov).
- Activer
apply_row_policy_after_finalpar défaut. Initialement, lorsqueoptimize_move_to_prewhere_if_final=0, ROW POLICY et PREWHERE respectaient tous deux FINAL et étaient appliqués après FINAL. Ce comportement a été rompu par #87303, qui ignoraitoptimize_move_to_prewhere_if_finalpour le filtre ROW POLICY. Pour corriger cela, cette PR active le paramètreapply_row_policy_after_finalintroduit dans #91065. Avecapply_row_policy_after_finalactivé, ROW POLICY continuera par défaut à respecter FINAL, comme auparavant. Cette PR introduit un changement non rétrocompatible, car elle modifie le comportement pouroptimize_move_to_prewhere_if_final=1. Désormais, pour que ROW POLICY soit appliqué avant FINAL, il faut utiliserapply_row_policy_after_finalau lieu deoptimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov). - Le type
Dateest désormais sérialisé en tant que type natifdate32d’Arrow dans les formats Arrow/ArrowStream, au lieu deuint16. Des outils comme PyArrow reconnaîtront désormais correctement la colonne comme étant de type date. L’ancien comportement peut être restauré avec le paramètreoutput_format_arrow_date_as_uint16. La lecture des anciens fichiers Arrow qui utilisaientuint16pour les colonnesDatereste prise en charge. #96860 (Alexey Milovidov).
Nouvelle fonctionnalité
- Les utilisateurs peuvent désormais utiliser ClickStack (une UI d’observability) directement depuis ClickHouse, ce qui est utile pour le débogage et le développement local. #96597 (Aaron Knudtson).
- Prise en charge du mot de passe à usage unique basé sur le temps (TOTP) comme méthode d’authentification. #71273 (Vladimir Cherkasov).
- Ajout du paramètre de base de données
lazy_load_tables. Lorsqu’il est activé, les tables ne sont pas chargées au démarrage de la base de données — unStorageTableProxyléger est créé à la place et le véritable table engine est matérialisé lors du premier accès. #96283 (xiaohuanlin). - Ajout du paramètre
input_format_max_block_wait_mspour émettre des blocs de données en cas de timeout et autorisation du traitement des données restantes lorsqu’une connexion HTTP est fermée de manière inattendue. #94509 (Mostafa Mohamed Salah). - Intégration du catalog Google BigLake. Cela clôt #95339. #97104 (Konstantin Vedernikov).
- Ajout de la table système
system.tokenizers, qui affiche tous les tokenizers disponibles. #96753 (Robert Schulze). - Ajout de la nouvelle table système
system.user_defined_functionspour surveiller l’état de chargement et la configuration des UDF. #90340 (Xu Jia). - Ajout de la table
system.jemalloc_stats, qui expose les statistiques de l’allocateur mémoire jemalloc (viamalloc_stats_print) afin de diagnostiquer l’utilisation mémoire sur les serveurs compilés avec jemalloc. Ajout également d’un endpoint HTTP/jemalloc.htmlsur la ClickHouse HTTP interface pour une visualisation interactive de ces statistiques. #97077 (Antonio Andelic). - Ajout de la table
system.jemalloc_profile_textpour lire et analyser les heap profiles jemalloc. Le format de sortie est contrôlé par le paramètrejemalloc_profile_text_output_format(raw, symbolized ou collapsed ; collapsed par défaut). La résolution des frames inline est contrôlée parjemalloc_profile_text_symbolize_with_inline(lorsqu’il est activé, les frames inline sont incluses au prix d’une symbolization plus lente ; lorsqu’il est désactivé, elles sont ignorées pour une sortie plus rapide). Pour le format collapsed,jemalloc_profile_text_collapsed_use_countcontrôle si les stacks sont pondérées par le nombre d’allocations actives (true) ou par les octets actifs (false, par défaut). Cela facilite le profiling mémoire et la visualisation en flame graph des heap profiles jemalloc. Corrige #93248. #97218 (Antonio Andelic). - Ajout du paramètre
default_dictionary_database, qui permet à ClickHouse de résoudre les external dictionaries référencés sans qualificatif de base de données dans une base de données par défaut spécifiée. Cela simplifie la migration des dictionaries globaux définis en XML vers des dictionaries par base de données définis en SQL, permettant ainsi aux requêtes de dictionnaire existantes (par ex. dictGet(‘name’, …)) de continuer à fonctionner sans modification. #91412 (Dmitrii Plotnikov). - Prise en charge de ZooKeeper auxiliaire pour
DatabaseReplicated. #91683 (RinChanNOW). - Implémentation de la nouvelle table function
primeset de la nouvelle table systèmesystem.primes, qui contient des nombres premiers par ordre croissant. Clôt #90839. #92776 (Nihal Z. Miaji). - Les async inserts prennent en charge le quorum parallèle. Les données insérées sont répliquées sur le quorum. Si des doublons sont détectés, la requête attend que les données précédemment insérées soient elles aussi répliquées. #93356 (Sema Checherinda).
- Ajout des fonctions
colorOKLABToSRGBetcolorSRGBToOKLABpour convertir une valeur de sRGB vers OKLAB et inversement. #93361 (Pranav Tiwari). - Nouveau paramètre
deduplicate_insert, qui remplaceinsert_deduplicateetasync_insert_deduplicate. #94413 (Sema Checherinda). - Le paramètre serveur
insert_deduplication_versionpermet de migrer vers un hash de déduplication unifié. #95409 (Sema Checherinda). - Ajout de la fonction de hachage
xxh3_128. #96055 (Raúl Marín). - Ajout de la requête
OPTIMIZE <table> DRY RUN PARTS <part names>pour simuler des merges sans valider la part résultante. Cela peut être utile à des fins de test : vérifier la validité des merges dans la nouvelle version, reproduire de manière déterministe des bogues liés aux merges et mesurer de manière fiable les performances des merges. #96122 (Anton Popov). - Ajout d’une nouvelle vérification activée par défaut via le paramètre
check_named_collection_dependenciesafin d’éviter la suppression de named collections utilisées par des tables. #96181 (Pablo Marcos). - Ajout de
system.fail_pointspour inspecter les failpoints existants sur le serveur et voir s’ils sont activés ou non. Cela aidera à automatiser les tests. #96762 (Pedro Ferreira). - Ajout de l’accès basé sur les rôles au Glue catalog. Utilisez les paramètres
aws_role_arnet, éventuellement,aws_role_session_name. #90825 (Antonio Andelic). - Ajout d’un paramètre
add_minmax_index_for_temporal_columnsqui, lorsqu’il est activé, crée automatiquement des indexes minmax pour toutes les colonnesDate,Date32,Time,Time64,DateTimeetDateTime64. #93355 (Michael Jarrett). - Prise en charge des alias de table étendus pour les JOINs (requêtes comme
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b). Résout #95131. #95331 (Yarik Briukhovetskyi). - Ajout de la prise en charge de
ALTER TABLE RENAME COLUMNpour les tables Iceberg. Auparavant, seulsADD COLUMN,DROP COLUMNetMODIFY COLUMNétaient pris en charge. #97455 (murphy-4o).
Fonctionnalité expérimentale
- L’index de texte est désormais GA. #96794 (Robert Schulze).
- Le type de données
QBit, destiné au stockage vectoriel quantifié compacté en bits (utilisé pour la recherche approximative des plus proches voisins), est désormais généralement disponible et ne nécessite plus l’activation d’un paramètre expérimental. #95358 (Raufs Dunamalijevs). - La recherche vectorielle dans ClickHouse peut désormais utiliser les répliques du cluster pour répartir la charge et les recherches sur les parties de l’index vectoriel. Cela permet à ClickHouse de prendre en charge de grands index vectoriels qui dépassent la capacité mémoire d’une seule VM. #95876 (Shankar Iyer).
- Ajout d’un server-side AST fuzzer contrôlé par les paramètres
ast_fuzzer_runsetast_fuzzer_any_query. Lorsqu’il est activé, le serveur exécute des mutations aléatoires de chaque requête après son exécution normale, en rejetant les résultats. #97568 (Alexey Milovidov). - Ajout de la fonction
iifau dialecte KQL expérimental. #94790 (happyso). - L’inférence de schéma respecte désormais
allow_experimental_nullable_tuple_type. Lorsqu’elle est activée, elle permet aux types Tuple inférés d’êtreNullable(Tuple(...)), afin que les objets imbriqués manquants puissent devenirNULLau lieu d’un tuple composé d’élémentsNULL. #95525 (Nihal Z. Miaji). - Le paramètre
use_statistics_cacheest désormais activé par défaut, de sorte que les statistiques de colonne sont mises en cache en mémoire pour accélérer l’optimisation des requêtes sans devoir les recharger depuis chaque part. #95950 (Han Fei).
Amélioration des performances
- Autoriser l’utilisation de toute expression déterministe dans la clé primaire pour l’élagage des données (par ex.
ORDER BY cityHash64(user_id)/ORDER BY length(user_id)). Pour les expressions déterministes, ClickHouse peut appliquer l’expression aux constantes de la requête et utiliser le résultat dans l’index de la clé primaire pour des prédicats tels que=,INethas. Si l’expression est également injective (par ex.ORDER BY hex(p)ouORDER BY reverse(tuple(reverse(p), hex(p)))), l’index peut aussi être utilisé efficacement pour les formes négatives :!=,NOT INetNOT has. Clôt #10685. Clôt #82161. #92952 (Nihal Z. Miaji). - Améliorer le format de stockage des statistiques. Toutes les statistiques sont désormais stockées dans un seul fichier. #93414 (Anton Popov).
- Autoriser la lecture parallélisée pour les moteurs/fonctions de table distants dans le cache du système de fichiers. #71781 (Kseniia Sumarokova).
- Autoriser l’utilisation du cache de pages en espace utilisateur avec les fichiers locaux et les fonctions de table de stockage objet. #77874 (Michael Kolupaev).
- Éviter les
memcpyinutiles dans le cache de pages en espace utilisateur. #77884 (Michael Kolupaev). - La valeur par défaut de
concurrent_threads_schedulerest désormaismax_min_fairau lieu defair_round_robin. Cela améliore l’équité sous forte charge en donnant la priorité aux requêtes disposant de moins d’emplacements alloués, afin que les requêtes courtes ne soient pas pénalisées par les requêtes longues. #95300 (Sergei Trifonov). - Si une requête
FINALutilisait une condition sur la clé primaire pour le filtrage, suivie de skip indexes pour d’autres conditions, l’étape de traitementPrimaryKeyExpandne vérifiera désormais l’intersection que pour les plages de clé primaire initialement présélectionnées. #94903 (Shankar Iyer). - Lors de l’utilisation de répliques parallèles avec des fonctions de table comme
s3(...), les requêtes comportant une seule sous-requête englobant la fonction de table sont désormais automatiquement parallélisées entre les répliques, alors qu’auparavant seules les références directes à des fonctions de table l’étaient. Clôt #92264. #96332 (phulv94). - Activer la séparation des données et des fichiers système mis en cache en segments distincts. #87834 (MikhailBurdukov).
- Accélérer certaines opérations de hash join en implémentant une répartition dynamique pour
ColumnVector::replicate. #79573 (Raúl Marín). - Amélioration des performances du parallel hash join dans les cas impliquant des prédicats complexes. Auparavant, les lignes non jointes étaient traitées dans un seul thread, ce qui était sous-optimal ; cette optimisation parallélise leur traitement sur plusieurs threads. Peut être activé ou désactivé via le paramètre
parallel_non_joined_rows_processing. Activé par défaut. #92068 (Yarik Briukhovetskyi). - Optimiser légèrement l’analyse du type JSON. #93614 (Pavel Kruglov).
- Réduire l’empreinte mémoire de l’AST. Cette optimisation est pertinente, car les champs ne sont pas utilisés lorsque la mise en évidence ne l’est pas non plus et qu’il n’y a pas d’analyse de VALUES. #93974 (Ilya Yatsishin).
- Optimise la consommation mémoire des objets AST
Tuplenommés. Place les noms de colonnes sous forme de chaînes dans l’objet tuple au lieu de les stocker dans des nœuds littéraux AST génériques. #94704 (Ilya Yatsishin). - La dévirtualisation est améliorée grâce à des options supplémentaires de l’éditeur de liens. #94737 (Nikita Taranov).
- Améliore les performances du clonage de réplicas pour les tables ReplicatedMergeTree comportant de nombreuses parts en regroupant les requêtes ZooKeeper par lots. #94847 (c-end).
- Lorsque l’étape de lecture comportait déjà des filtres PREWHERE, il n’était pas possible d’ajouter un nouveau filtre. Cette modification reporte l’optimisation PREWHERE après l’optimisation des runtime filters de JOIN afin que les runtime filters puissent eux aussi être poussés vers PREWHERE. #95838 (Alexander Gololobov).
- Accélère la compression du codec
T64en utilisant la répartition dynamique sur x86. #95881 (Raúl Marín). - Accélère
uniqsur les types numériques en regroupant les insertions par lots lorsque c’est possible (not null, pas de -If, pas de GROUP BY, ni IPv6 ni String). #95904 (Raúl Marín). - Optimisations de bas niveau pour Keeper : il a été constaté que
ZooKeeper::observeOperationsreprésentait >20 % de la consommation CPU du thread de réception de ZooKeeper. Cette modification y remédie en : 1. utilisantCityHash64au lieu deSipHashpourAggregatedZooKeeperLog::stats, ce qui est >10x plus rapide. 2. utilisantstd::array<std::atomic<UInt32>, N>au lieu destd::unordered_mapetstd::mutexpourCoordination::ErrorCounter. #95962 (Miсhael Stetsyuk). - Supprime l’alignement sur 64 octets pour ProfileEvents::Counter afin d’économiser de la mémoire. #96097 (Azat Khuzhin).
- Optimisation mémoire : réduit d’un facteur 50 la taille de la structure
CachedOnDiskReadBufferFromFile. #96098 (Azat Khuzhin). - Ne copie pas les anciennes données lors du redimensionnement d’une table de hachage si elle est vide. #96180 (Raúl Marín).
- Prend en charge les runtime filters de JOIN pour les JOIN
RIGHT OUTER. #96183 (Hechem Selmi). - L’optimisation
enable_join_runtime_filtersest désormais activée par défaut. #89314 (Alexey Milovidov). - Auparavant, l’optimisation de lecture directe du text index n’était appliquée que lorsque toutes les parts disposaient d’un text index matérialisé. Cette PR ajoute une prise en charge partielle : si certaines parts disposent d’un text index matérialisé, elles l’utiliseront, tandis que celles qui n’en ont pas reviendront à l’exécution de la filter expression d’origine. #96411 (Anton Popov).
- Ajout d’index secondaires
minmaxsur les colonnes temporelles et d’indexbloom_filtersur les colonnesquery_id/initial_query_iddans les tables de logs système pour accélérer le filtrage. #96712 (Alexey Milovidov). - L’optimisation de lazy materialization s’applique désormais à toutes les branches d’une requête
UNION ALL, et non plus seulement à la première. Les requêtes qui combinent plusieurs lectures triées et limitées à partir de différentes tablesMergeTreeviaUNION ALLbénéficient maintenant d’une lecture différée des colonnes sur chaque branche, ce qui réduit les E/S. #96832 (Federico Ginosa). - Optimise le calcul de l’index de saut minmax lors d’
INSERTen supprimant une copie de données inutile et en activant un calcul vectorisé min/max pour les colonnes numériques. #97392 (Raúl Marín). - Le moteur Storage
DeltaLakerécupère désormais le résultat decount()depuis les métadonnées delta lake et affiche des statistiques de table correctes dans system.tables (total des octets/lignes). #96190 (Kseniia Sumarokova). - Les colonnes inutilisées sont désormais également supprimées à l’étape de lecture dans le cas d’une lecture depuis un MergeTree. Cela est particulièrement utile lorsqu’un filtre est poussé dans
PREWHERE. #89982 (János Benjamin Antal). - Améliore le traitement de la requête
SHOW TABLESen ne récupérant que le nom des tables, et améliore getLightweightTablesIterator afin qu’il renvoie une structure ne contenant que les noms de tables. Résout #93835. #94467 (Smita Kulkarni). - Améliore
assumeNotNull,coalesceetifNullafin d’activer l’élagage de la clé primaire et de l’index de saut pour les prédicats de plage lorsque les colonnes de clé sont encapsulées dans ces fonctions. Clôt #94689. #94754 (Nihal Z. Miaji). - Ajoute les extensions with_data et with_stat à la requête getChildren de Keeper. Cela permet de récupérer non seulement la liste des enfants, mais aussi leur
statet/ou leursdataen une seule opération. #94826 (Nikolay Degterinsky). - L’analyse d’index n’est effectuée qu’une seule fois (dans la plupart des cas), que l’exécution se fasse finalement avec un plan local ou un plan avec des répliques parallèles. #94854 (Nikita Taranov).
- Permet d’activer l’analyse d’index distribuée en fonction du nombre de parts (
distributed_index_analysis_min_parts_to_activate) et de la taille des index (distributed_index_analysis_min_indexes_size_to_activate). #95216 (Azat Khuzhin). - Active l’optimisation PREWHERE pour les tables Iceberg. #95476 (Konstantin Vedernikov).
- Réduit l’empreinte mémoire de certaines classes AST. #95514 (Raúl Marín).
- Limite le nombre de flux du pipeline générés lorsque
split_intersecting_parts_ranges_into_layersest activé. Cela permet d’éviter une consommation mémoire excessive. #96478 (Nikita Taranov). - Implémente l’optimisation par ensembles équivalents pour plusieurs jointures. Les requêtes comportant plusieurs opérations
INNER JOINconsécutives bénéficient désormais d’une meilleure optimisation du pushdown des filtres. Lorsque des tables sont jointes sur des colonnes équivalentes (par exemple,t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), les filtres appliqués à n’importe quelle table de la chaîne sont automatiquement poussés vers toutes les tables. Clôt #96550. #96596 (Vladimir Cherkasov). - Optimisation de l’analyse des métadonnées delta lake. Utilise les changements de la PR delta-kernel https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
- Dans une base de données Replicated, le cluster mis en cache n’est plus mis à jour pour chaque requête factice. #96897 (Tuan Pham Anh).
- Utilisation de l’index de clé primaire lors du filtrage avec
startsWithUTF8si le préfixe ne contient que des caractères ASCII. #97055 (vkcku).
Amélioration
- Ajout du tracing OpenTelemetry pour les requêtes Keeper. #91332 (Miсhael Stetsyuk).
- Nouvelles options de configuration :
logger.startup_console_level&logger.shutdown_console_levelpermettant de redéfinir respectivement le niveau de log de la console pendant le démarrage et l’arrêt de ClickHouse. #95919 (Garrett Thomas). - Prise en compte des surcharges en ligne de commande lors du rechargement de la configuration. Clôture #80294. #80295 (Alexey Milovidov).
- Prise en charge des surcharges key-value pour les paramètres des named collections dans la table function
mongodb. #89616 (vanchaklar). - L’optimisation de lecture dans l’ordre pour les tables Iceberg fonctionne désormais avec des fonctions de tri complexes comme
icebergBucketeticebergTruncate, et non plus seulement avec de simples références de colonne. #90256 (Konstantin Vedernikov). - Ajout d’une nouvelle colonne nommée parts_postpone_reasons dans system.mutations afin d’améliorer le diagnostic ; elle affiche les raisons du report des parts. #92206 (Shaohua Wang).
- Suivi des variations du nombre de lignes à lire (dues aux insertions/suppressions ou à l’utilisation du query condition cache) dans
DataflowStatisticsCache. #93636 (Nikita Taranov). - Prise en charge de la requête SYSTEM RESET DDL WORKER [ON CLUSTER]. Elle demande la réinitialisation de l’état de DDLWorker dans son thread principal. Cela est utile pour réactualiser l’état actif de la replica lorsque les identifiants d’hôte sont mis à jour. #93780 (Tuan Pham Anh).
- Prise en charge de
mutation_idsdanssystem.part_logpour les types d’événementMUTATE_PARTetMUTATE_PART_START. #93811 (Shaohua Wang). - Les opérations en arrière-plan (Mutate, Merge) peuvent désormais être configurées indépendamment via le profil ‘background’. Auparavant, elles partageaient les paramètres des requêtes classiques via le profil ‘default’. #93905 (Arsen Muk).
- Ajout de davantage d’informations dans
system.crash_log. #94112 #95857 (Miсhael Stetsyuk). - Ajout de la nouvelle métrique
QueryNonInternalpour suivre le nombre de requêtes non internes en cours d’exécution. Cette métrique est exposée sous la formeClickHouseMetrics_QueryNonInternalet aide les opérateurs à surveiller la concurrence des requêtes par rapport à la limitemax_concurrent_queries, qui ne s’applique qu’aux requêtes non internes. #94284 (Ashwath Singh). - Prise en charge de la collecte de statistiques sur les octets en entrée pour les colonnes issues de compact parts dans
RuntimeDataflowStatisticsCacheUpdater. #94626 (Nikita Taranov). - Ajout d’une vérification pour détecter une mauvaise configuration de Keeper entraînant des échecs d’assemblage du cluster. Clôture #60932. #94682 (Konstantin Bogdanov).
- Amélioration de la désérialisation des préfixes JSON lors du chargement des parts. #94848 (Pavel Kruglov).
- Refonte de l’écriture pour utiliser le pipeline INSERT complet, ce qui déclenche les vues matérialisées sur la table cible. #94890 (Kai Zhu).
- Utiliser les optimisations du plan de recherche de similarité vectorielle uniquement si l’index existe pour la colonne de recherche. #94998 (Eduard Karacharov).
- Vérifier la limite totale de mémoire avant l’authentification de l’utilisateur et lever
(total) memory limit exceededsi la limite totale dépasse la valeur autorisée. #95003 (Nikolai Kochetov). - Ajout de l’option de configuration
throw_on_unmatched_row_policiesqui, lorsqu’elle est activée, lève une exception si un utilisateur interroge une table avec des politiques de ligne mais qu’aucune ne s’applique à lui, ce qui évite le comportement ambigu consistant à renvoyer toutes les lignes en raison d’une mauvaise configuration du contrôle d’accès. #95014 (Vitaly Baranov). - Mise à jour dynamique des jetons d’accès S3 dans les requêtes longues avec Unity Catalog. Cela clôt #93981. #95069 (Konstantin Vedernikov).
- Désactiver la décroissance des pages sales de jemalloc si ClickHouse est soumis à une pression mémoire soutenue pendant
memory_worker_decay_adjustment_period_msmillisecondes. Réactiver la décroissance des pages sales de jemalloc si ClickHouse fonctionne dans des conditions normales pendant la même durée. #95145 (Antonio Andelic). - Prise en charge d’un Zookeeper auxiliaire pour S3Queue à l’aide du paramètre
keeper_pathde s3Queue. #95203 (Diego Nieto). - Respect de
max_parts_to_merge_at_oncedans les fusions de parts supprimées par TTL. #95315 (Kseniia Sumarokova). - Ajouter
connection_addressetconnection_portà query_log pour refléter la connexion physique (addressetportsont remplacés en cas de connexion via un proxy et auth_use_forwarded_address=1). #95471 (Yakov Olkhovskiy). - Correction d’un comptage incorrect de la mémoire pour le cache des conditions de requête. Le principal problème était que la clé de cache, composée de plusieurs chaînes (comme part_name, l’ID de la table et la condition SQL complète), n’était pas prise en compte. #95478 (Nikita Mikhaylov).
- Le serveur démarré avec la configuration embarquée permettra de gérer les utilisateurs et les grants, en les enregistrant dans le répertoire
access, comme avec la configuration standard. Cela améliore les tests. Toutes les améliorations liées à access_control ont également été activées dans la config embarquée et dans clickhouse-local. #95481 (Alexey Milovidov). - Amélioration des messages d’erreur d’authentification S3 pour inclure une indication invitant à vérifier les identifiants lorsque l’accès est refusé. #95648 (Gerald Latkovic).
- Activer le cache de statistiques et définir sa période de mise à jour sur 300 s. #95841 (Han Fei).
- Ajouter le nom du composant à
system.aggregated_zookeeper_log. #95882 (Antonio Andelic). - Évite les lectures depuis l’object storage lors des requêtes sur les tables
DeltaLakeviasystem.tables. #95899 (Antonio Andelic). - Active
enable_max_bytes_limit_for_min_age_to_force_mergepar défaut si le paramètrecompatibilityest défini sur26.2ou plus. #95917 (Christoph Wurm). - Delta Lake est désormais disponible sur macOS. Résout le ticket #95979. #95985 (Alexey Milovidov).
- Dans les versions précédentes, lors de la combinaison d’expressions ALTER conflictuelles avec UPDATE et RENAME COLUMN, une erreur logique était levée au lieu d’une exception appropriée. Résout #70678. #96022 (Alexey Milovidov).
- Améliore la sortie de l’aide pour toutes les applications ClickHouse et ajoute l’option
--no-sudo, avec quelques correctifs. Cela fait suite à #58244 de Ilya Yatsishin. #96025 (Alexey Milovidov). - Ajoute l’alias
distanceCosinepourcosineDistance, car toutes les autres fonctions de distance disposent déjà d’un alias de cette forme. #96065 (Raufs Dunamalijevs). - Ajoute la prise en charge de l’extension Keeper
with_dataafin d’améliorer la récupération des tables dans Database Replicated. #96090 (Nikolay Degterinsky). - Met à jour chdig vers v26.2.1 (nouvelles fonctionnalités et prise en charge de MacOS). #96113 (Azat Khuzhin).
- Améliore le pushdown des filtres pour
numbersetprimes. ClickHouse peut désormais déduire des bornes de valeurs prudentes à partir des conditionsWHERElorsque des bornes exactes ne peuvent pas être déterminées, et restreindre en conséquence la génération de la séquence (par exemple, pourWHERE number % 5 < 2 AND number > 100 AND number < 300, ClickHouse ne générera que des nombres entre 100 et 300, puis appliquera le prédicat), évitant ainsi les scans non bornés. Résout #84853. Résout #93913. #96115 (Nihal Z. Miaji). - Le Formatter entourait auparavant SELECT de parenthèses lorsqu’une clause
COMMENTétait présente afin de lever l’ambiguïté lors du parsing. À la place, il placeCOMMENTavantAS SELECT, ce qui supprime l’ambiguïté sans recourir aux parenthèses. #96293 (Alexey Milovidov). - Le paramètre de config
allow_impersonate_userse trouve désormais dans la sectionaccess_control_improvementsau lieu d’être un server setting autonome. #96451 (Vitaly Baranov). - Rend le paramètre de configuration
core_dump.size_limitrechargeable à chaud, afin d’éviter d’avoir à redémarrer les servers pour que les modifications de configuration prennent effet. #96524 (Miсhael Stetsyuk). - Améliore l’interopérabilité des Profilers CPU et temps réel avec les timeouts de socket. #96601 (Sergei Trifonov).
- Empêche la réapparition de données supprimées si ADD COLUMN est exécuté peu après la mutation DROP COLUMN. #96713 (Alexey Milovidov).
- Modifie le type de
function_iddanssystem.instrumentation, de LowCardinality(Int32) à Int32. #96726 (Copilot). - L’attente synchrone des mutations respecte désormais l’annulation des requêtes et les limites de temps. #96756 (Alexey Milovidov).
- Ajoute la commande système
SYSTEM RELOAD DELTA KERNEL TRACING <level>pour permettre de modifier la journalisation de delta-kernel, ce qui peut être utile pour le débogage. #96763 (Kseniia Sumarokova). - Le filtrage par famille d’adresses IP, c’est-à-dire les paramètres
dns_allow_resolve_names_to_ipv4/ipv6, s’applique même si le cache DNS est désactivé. #96810 (c-end). - Améliore l’introspection de jemalloc. #96840 (Azat Khuzhin).
- Corrige l’erreur
QUERY_CACHE_USED_WITH_SYSTEM_TABLEdans l’interface web/playlors de requêtes sur des tables système. #96869 (Alexey Milovidov). - Améliore l’interface web : modifie le favicon pour indiquer l’état d’exécution d’une requête ; affiche les erreurs des requêtes auxiliaires (chargement des bases de données et des tables) au lieu de les ignorer silencieusement. Clôt #85055. #96883 (Alexey Milovidov).
- Rend le panneau de gauche de l’interface
/playcliquable pour afficher ou masquer la liste des bases de données. #96884 (Alexey Milovidov). DROP DATABASEsupprime désormais les tables dans l’ordre inverse des dépendances, ce qui améliore la résistance aux crashs lorsque la base de données contient des tables avec des dépendances de chargement (par exemple, des tablesDistributedutilisantjoinGet). #97057 (Alexey Milovidov).- Met à jour yaml-cpp pour éviter d’ignorer du YAML non valide. #97333 (Azat Khuzhin).
- Affiche un indicateur de chargement dans la barre latérale de
play.htmlpendant la récupération des tables. #97531 (Alexey Milovidov). - Ajoute un bouton de copie dans le presse-papiers pour les résultats bruts des requêtes dans l’interface web intégrée (play.html). #97532 (Alexey Milovidov).
- Corrige l’obfuscateur de requêtes (
clickhouse-format --obfuscate) afin de produire du SQL pouvant être analysé dans davantage de cas. #97584 (Alexey Milovidov).
Correction de bug (dysfonctionnement visible par l’utilisateur dans une version stable officielle)
- Après des ALTER ne portant que sur les métadonnées, comme l’extension des éléments d’un Enum, l’optimisation de l’agrégation avec projection peut finir par produire une exception. #84143 (Alexey Milovidov).
- Les vues matérialisées utilisent désormais comme contexte d’exécution la base de données dans laquelle elles ont été créées, ce qui signifie que : - il est possible d’omettre la qualification explicite de la base de données pour les noms référencés dans la requête SELECT de la vue - si aucune qualification explicite de base de données n’est fournie, la base de données où la vue matérialisée a été créée est utilisée par défaut. #88193 (Dmitry Kovalev).
- Corrige la substitution des paramètres de requête dans les méthodes d’authentication de CREATE USER lors de l’utilisation de ON CLUSTER. Les paramètres de requête dans les méthodes d’authentication (par ex.
password) n’étaient pas remplacés, ce qui provoquait des erreurs UNKNOWN_QUERY_PARAMETER sur les nœuds distants. #92777 (xiaohuanlin). - Corrige des incohérences dans l’analyse du text index pour les fonctions
has,mapContainsKeyetmapContainsValue. Auparavant, les requêtes utilisant ces fonctions pouvaient renvoyer des résultats différents selon que l’expression était évaluée avec ou sans text index. #93578 (Anton Popov). - Corrige un crash lors de l’attachement d’une table à une base de données
MaterializedPostgreSQLsidropReplicationSlotlève une exception pendant le déroulage de la pile. #96871 (Alexey Milovidov). - Les sauvegardes pouvaient faire planter le serveur si un grand nombre de sauvegardes concurrentes entraient en conflit sur les mêmes fichiers. #93659 (Alexey Milovidov).
- Corrige les requêtes avec parallel replicas et JOIN sur une table non-MT. Ferme #92056. #93902 (Igor Nikonov).
- Corrige un problème où des colonnes Iceberg contenant un point dans leur nom renvoyaient NULL comme valeur. #94335 (Mikhail Koviazin).
- Corrige la gestion des chaînes UTF8 dans
stringJaccardIndexUTF8et améliore les performances. #94613 (Joanna Hulboj). - Corrige de possibles dépassements de capacité dans
WITH FILL STALENESS(entraînant un comportement indéfini et/ou des boucles infinies). Corrige également une possible boucle infinie due à de grands sauts. Ajoute la prise en charge de l’ancien analyzer (principalement pour les tests de stress). #94663 (Azat Khuzhin). - Corrige un possible blocage de distributed queries lorsque des hostnames se résolvent en plusieurs adresses et qu’une replica distante se fige. #94726 (c-end).
- Corrige un résultat incorrect lors de la jointure de plusieurs expressions de table, lorsque l’expression de table la plus à gauche est une table function
-Cluster. Résout #89996. #94748 (Konstantin Bogdanov). - Corrige un pruning incorrect de la primary key et du skip index pour les predicates impliquant
toWeek,toYearWeek,toStartOfWeek,toLastDayOfWeekettoDayOfWeek, et corrige des exceptions dans certaines de ces fonctions pour des requêtes valides avecLowCardinality(String). #94816 (Nihal Z. Miaji). - Supprime le contournement inutile de la vérification des privilèges dans les requêtes
ATTACHpour une vue avec SQL Security. Cela évite une potentielle escalade de privilèges lorsqu’un utilisateur attache une vue avec un définisseur sans valider les accès requis. #94865 (pufit). - Corrige un crash au démarrage de
ReplicatedMergeTreecausé par la suppression concurrente des répertoiresdelete_tmp_*. #94892 (myeongjun). - Corrige la perte des informations de déduplication lors d’un
INSERTdans des tables Iceberg avec des vues matérialisées, ce qui provoquait une exception. #94938 (Daniil Ivanik). - Corrige un bug où
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>supprimait l’intégralité du cache sur le cluster. #94978 (Rory Crispin). - Préserve une granularité d’index constante (use_const_adaptive_granularity) après les fusions verticales (v2 avec un correctif pour Nested, et plus généralement). #95013 (Azat Khuzhin).
- Corrige une condition de concurrence dans le cache du système de fichiers dans la version 26.1 après [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764). #95042 (Kseniia Sumarokova).
- Corrige l’annulation de la fonction de table postgresql() via KILL QUERY et l’annulation de requête (Ctrl+C) dans clickhouse-client. #95136 (Roman Vasin).
- Corrige l’inférence de type pour les colonnes qualifiées provenant des tables sources lorsque plusieurs jointures sont utilisées avec la clause
USING. Auparavant, les jointures suivantes mettaient incorrectement à jour les types des colonnes sources sous-jacentes vers un supertype commun, même lorsque la colonne n’était pas impliquée dans cette jointure (par exemple, dansSELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a), la colonnet2.an’est utilisée que par la première jointure, son type devrait donc être le supertype det1.aett2.a, à l’exclusion det3.a). Cela pouvait entraîner des erreurs logiques ou des crashs lorsque des fonctions attendaient des types de colonnes différents de ceux réellement présents dans le plan d’exécution. #95157 (Vladimir Cherkasov). - N’effectue la transformation des colonnes qu’une seule fois lors de la récupération du contenu de la liste .avro du manifest et des fichiers. #95164 (Daniil Ivanik).
- Corrige un calcul incorrect de la taille des colonnes JSON, qui pouvait entraîner une utilisation excessive de la mémoire ou des statistiques de colonnes erronées. #95207 (Azat Khuzhin).
- Corrige une comptabilisation mémoire inexacte lors de l’application de gros patch parts après des lightweight updates. Auparavant, l’application de gros patchs pouvait provoquer une utilisation excessive de la mémoire et conduire à l’arrêt du processus serveur par l’OOM killer. #95231 (Anton Popov).
- Corrige un comportement indéfini qui pouvait provoquer des résultats incorrects ou une exception lorsqu’une requête distribuée avec
max_parallel_replicasbasculait vers une réplique locale pendant l’analyse des index. #95263 (Azat Khuzhin). - Corrige l’agrégation des colonnes creuses pour
sumet timeseries lorsquegroup_by_overflow_modeest défini surany. #95301 (Mikhail Koviazin). - Corrige un problème de fiabilité dans la politique de disque
plain_rewritable, où une erreur réseau survenant en cours de suppression d’un fichier de métadonnées pouvait laisser le stockage dans un état incohérent. #95302 (Mikhail Artemenko). - Remplace Date par Date32 pour Iceberg. #95322 (Konstantin Vedernikov).
- L’argument password de la table function
redissera désormais masqué dans les logs et les tables système (par ex. :query_log). #95325 (János Benjamin Antal). - Corrige un bogue où des tables pouvaient être supprimées ou modifiées alors qu’une requête distribuée était encore en cours d’exécution sur celles-ci, ce qui pouvait provoquer des exceptions ou des résultats incorrects. #95356 (Azat Khuzhin).
- Corrige une erreur logique dans certains cas lorsque des valeurs négatives de
LIMIT/OFFSETsont utilisées dans des requêtes distribuées. #95357 (Nihal Z. Miaji). - Corrige un bogue où clickhouse-client demandait le mot de passe deux fois lors d’une connexion via ssh. #95372 (Isak Ellmer).
- Corrige une condition de concurrence dans le stockage S3(Azure)Queue. #95385 (Kseniia Sumarokova).
- Corrige l’erreur de filtre prewhere provoquée par des expressions lambda dans prewhere. #95395 (Xiaozhe Yu).
- Corrige
optimize_syntax_fuse_functionsafin de ne pas réécriresum/count/avgensumCount()lorsque l’argument d’agrégation estNullable. Ferme #95390. #95441 (Nihal Z. Miaji). - Évite un plantage possible des requêtes distribuées en cas d’annulation. #95466 (Aleksandr Musorin).
- Corrige la déduplication lors du streaming depuis le moteur S3(Azure)Queue. #95467 (Kseniia Sumarokova).
- Corrige la mise à jour des politiques de lignes attribuées à l’utilisateur initial dans les requêtes distribuées. #95469 (Vitaly Baranov).
- Corrige la vérification des disques chiffrés sur plain_rewritable (corrige l’erreur possible
It is not possible to register multiple plain-rewritable disks with the same object storage prefix). #95470 (Azat Khuzhin). - La table function
mergeTreeProjectionn’effectuait pas de vérification d’accès, ce qui permettait à des utilisateurs sans permission SELECT sur une table (mais disposant de permissions pour les table functions) de lire des données dans ses projections. Ce correctif ajoute la même vérification d’accès que celle déjà présente dansmergeTreeIndexetmergeTreeAnalyzeIndexes. #95480 (Alexey Milovidov). - Corrige une erreur logique possible lors de la lecture de la sous-colonne
sizeà partir des sous-colonnes dynamiques des types Dynamic/JSON. #95573 (Pavel Kruglov). - Correction d’une régression dans la réplication zero-copy (expérimentale) introduite par #94262, où des parts partagées pouvaient être supprimées avant que d’autres répliques aient fini de les récupérer. #95597 (filimonov).
- Correction d’un crash lors de l’application de
tupleElementà des Arrays de JSON. Clôt #95581. #95647 (Pavel Kruglov). - Correction d’une exception d’erreur logique lors de l’utilisation d’un sélecteur (
*) à l’intérieur d’une fonction lambda dans une clause VALUES d’un JOIN avec USING. Clôt #93675. #95661 (Vladimir Cherkasov). - Correction de l’erreur logique
There was an error: Cannot obtain error messagelors de l’attente d’une DDL distribuée et de la suppression concurrente de la base de données Replicated. Corrige #95539. #95664 (Alexander Tokmakov). - Correction de la fonction
IN, qui renvoyait des résultats incorrects avec des valeursNULLlorsquetransform_null_inest activé. Clôt #65776. #95674 (Nihal Z. Miaji). - Gestion correcte des types LowCardinality Nullable dans
CASTlorsque le paramètrecast_keep_nullableest activé. Clôt #95670. #95747 (Alexey Milovidov). - Correction du squashing des données delta lake partitionnées. #95773 (Kseniia Sumarokova).
- Correction d’une race condition sur une colonne de jointure Nullable dans les Runtime Filters. #95775 (Hechem Selmi).
- Correction d’une possible erreur logique dans une requête avec sélecteur (
*,table.*) etanalyzer_compatibility_join_using_top_level_identifierlorsque la colonneUSINGa des types différents dans les tables et dans la liste SELECT. Clôt #90477. #95808 (Vladimir Cherkasov). - Correction de bugs de sûreté mémoire dans les opérations du thread pool parallèle (backups, aggregation, distributed queries) qui pouvaient provoquer des exceptions lorsqu’une erreur survenait lors de l’ordonnancement des tâches. #95818 (Raúl Marín).
- Correction d’un crash sur
DROP WORKLOADlorsqu’il s’exécute en parallèle avec des queries utilisant le workload en cours de suppression. #95856 (Alexey Milovidov). - Correction de lenteurs lors de l’interrogation des tables système avec un utilisateur disposant de grants limités sur de nombreuses bases de données. Clôt #89371. #95874 (pufit).
- Correction de l’exécution de
tupleElementsur du JSON avec des chemins imbriqués, ce qui pouvait auparavant conduire à un résultat de query erroné. #95907 (Pavel Kruglov). - Correction d’une erreur
NOT_SUPPORTEDqui pouvait se produire lors de l’utilisation de l’algorithme de joindirectavec une table MergeTree vide. #95935 (Vladimir Cherkasov). - Correction d’un problème où le client ne suggérait ni ne complétait automatiquement les noms d’alias pour les paramètres. Clôt #92190. #95945 (phulv94).
- Correction de event_date dans system.asynchronous_metric_log. #95947 (Raúl Marín).
- Correction des skipping paths dans le type de données JSON. Auparavant, avec
JSON(SKIP path), toutes les clés JSON ayant le préfixepathétaient ignorées, y compris des clés comme"pathpath"; cela pouvait donc entraîner une perte de données pour ces paths lors d’un insert. Désormais, le problème est corrigé et seule la clé"path"est ignorée. #95948 (Pavel Kruglov). - Une part avec des projections inconnues ne doit pas être marquée comme perdue définitivement. #95952 (Mikhail Artemenko).
- Correction d’un problème où une chaîne vide devenait
NULLdans une tableJoinavec une cléNullable(String). Clôt #71414. #96002 (Alexey Milovidov). - Désormais, le moteur PostgreSQL peut lire correctement
BOOLEAN[]. Clôt #72754. #96006 (Alexey Milovidov). - Correction du format
ProtobufListdans le cas d’une lecture depuis un fichier vide. Clôt #70059. #96007 (Alexey Milovidov). - Correction du format
ProtobufList, qui produisait un enregistrement fantôme pour les tables vides. Clôt #72596. #96010 (Alexey Milovidov). - Correction d’une incompatibilité de type dans la fonction
ifentreUInt64etInt32, dans un cas inhabituel impliquant des distributed queries, PREWHERE et l’inférence de type. Clôt #70017. #96012 (Alexey Milovidov). - Correction des requêtes compilées par
JITimpliquant des typesBool. #96013 (Alexey Milovidov). - Correction d’une erreur logique lors de la lecture d’une colonne UUID à partir d’une colonne SQLite TEXT. Clôt #71263. #96016 (Alexey Milovidov).
- Correction de la conversion de types du moteur SQLite pour
DateTime,Date,UUIDet d’autres types. Clôt #73481. #96017 (Alexey Milovidov). - Les valeurs
FixedStringétaient incorrectement échappées dans les requêtes vers des bases de données externes, SQLite et PostgreSQL. Clôt #73519. Coécrit avec @jh0x. #96019 (Alexey Milovidov). - Corrige un échec d’assertion dans WindowTransform avec un décalage PRECEDING important. Clôt #75852. #96026 (Alexey Milovidov).
- Corrige un bug pouvant entraîner une corruption de données lorsque des async inserts concurrentes utilisent les mêmes noms de paramètre, mais avec des valeurs différentes. #96035 (Seva Potapov).
- Corrige la période des profileurs globaux (contrôlée par
global_profiler_real_time_period_nsetglobal_profiler_cpu_time_period_ns). Au lieu de la valeur configurée, une valeur tronquée était utilisée, ce qui amenait le profiler à se réveiller plus souvent que prévu. #96048 (Antonio Andelic). - Auparavant, si le fichier de données de référence dans le fichier manifeste Iceberg pour la suppression par position était présent dans une entrée mais valait null, les bornes correctes n’étaient pas obtenues pour les fichiers de données correspondants. Cette PR corrige ce bug. #96061 (Daniil Ivanik).
- Corrige la révocation des rôles par défaut. #96103 (Vitaly Baranov).
- Corrige un use-after-free dans l’analyse d’index dans le cas rare où
use_primary_keyest désactivé et qu’un très grand nombre de disjonctions de conditions utilisent l’index. #96112 (Alexey Milovidov). - Corrige une régression du codec
Gorillalorsqu’une taille explicitement spécifiée ne correspond pas à la taille du type de données et que la taille du tampon est trop petite. Dans les versions précédentes, cela provoquait une exception lors de la décompression. Clôt #78253. #96118 (Alexey Milovidov). - Évite un interblocage dans les dictionnaires chargés lorsqu’un dictionnaire référence une table Merge qui le référence récursivement. Clôt #78360. #96120 (Alexey Milovidov).
- Corrige l’utilisation d’une valeur non initialisée dans
formatDateTimeavec des formatteurs non fixes, comme les styles MySQL et JODA. #96133 (Alexey Milovidov). - La combinaison des settings
use_const_adaptive_granularityetindex_granularity_bytes(qui signifie “granularité non adaptative”) entraînait un mauvais calcul du nombre de lignes à lire ainsi qu’une exception. #96143 (Alexey Milovidov). - L’exécution d’une mutation ALTER UPDATE invalide sur des tables de type fichier sur stockage objet, telles que S3 et Azure, pouvait entraîner un déréférencement de nullptr. Clôt #92994. #96162 (Alexey Milovidov).
- Corrige
AccessRights::contains, qui renvoyait des résultats incorrects avec des révocations partielles. #96170 (pufit). - Corrige une collision de hachage dans le cache des conditions de requête pour les constantes de CTE repliées, ce qui pouvait conduire à un résultat de requête erroné. Clôt #96060. #96172 (Alexey Milovidov).
- Corrige un possible interblocage dans ProcessList. Cela peut se produire en raison d’une inversion de verrous si l’overcommit tracker mémoire se déclenche pendant l’ajout d’une tâche au vérificateur d’annulation. #96182 (Antonio Andelic).
- Correction d’un bogue où des requêtes impliquant des jointures externes (LEFT, RIGHT ou FULL) combinées à plusieurs INNER JOIN pouvaient renvoyer des résultats incorrects en raison d’un réordonnancement illégal des jointures. Lorsque la condition ON d’une jointure externe faisait référence à des colonnes de plusieurs tables précédemment jointes, l’optimiseur ne tenait pas compte de toutes les dépendances entre tables et pouvait réordonner les jointures de manière incorrecte, ce qui produisait des lignes manquantes. Résout #95972. #96193 (Vladimir Cherkasov).
- Lorsqu’une table n’a pas de statistiques définies, ClickHouse ne doit pas essayer de les charger. Cela évite un surcoût (plus de 100 ms) lié à la vérification de l’existence des fichiers de statistiques. (issue #96068). #96233 (Han Fei).
- Corrige
optimize_syntax_fuse_functionsafin de ne pas réécriresum/count/avgensumCount()lorsque l’argument d’agrégation estLowCardinality(Nullable). Résout #95390. #96239 (Nihal Z. Miaji). - Corrige un partition pruning incorrect pour la fonction
not INetnot hasdans certains cas. #96241 (Nihal Z. Miaji). - Corrige
stack-use-after-scopedans l’index de similarité vectorielle. #96259 (Alexey Milovidov). - Corrige le fait que le lanceur de tests ne reconnaissait pas les commentaires d’indication d’erreur lorsqu’une requête était précédée d’un commentaire SQL. #96336 (Yakov Olkhovskiy).
- Corrige une erreur logique dans KeyCondition lorsqu’une table a une clé primaire Nullable et que la requête utilise la fonction
coalesce, dont le premier argument est une constante. #96340 (Alexey Milovidov). - L’interaction entre
GROUPING SETS,group_by_use_nullset le type de donnéesTupleavecLowCardinalityà l’intérieur pouvait produire une structure de block inattendue dans le query pipeline, ce qui entraînait une erreur logique. Ce problème est apparu après l’introduction desTupleNullable. #96358 (Alexey Milovidov). - Il était possible de créer une table avec une expression vide
()comme index, ce qui entraînait un accès mémoire invalide. #96363 (Alexey Milovidov). - Correction d’un crash dans l’ancien analyseur en présence de JOIN et d’alias dupliqués. #96405 (Ilya Golshtein).
- Corrige l’erreur
Nested columns sizes are inconsistent with local_discriminatorsdue à une optimisation incorrecte du filtrage en place pour les colonnes Variant. #96410 (Alexey Milovidov). - Corrige le fait que
CREATE TABLE ... CLONE AS ...ignorait le qualificateur complet de la table source. #96415 (Hasyimi Bahrudin). - Correction de l’annulation de la table function
mysqlvia KILL QUERY et de l’annulation de requête (Ctrl+C) dans clickhouse-client. #96437 (Roman Vasin). - Correction d’un livelock dans le thread de vérification des annulations pour les requêtes avec des valeurs élevées de
max_execution_time. #96450 (Sergei Trifonov). - Correction d’une erreur logique dans certains cas lorsque
LIMIT/OFFSETfractionnaire est utilisé dans des requêtes distribuées. #96475 (Nihal Z. Miaji). - Correction d’un déréférencement de pointeur nul dans certaines expressions avec des fonctions lambda. #96479 (Alexey Milovidov).
- Correction de résultats incorrects lorsque des colonnes
LowCardinalitysont converties enNullable. #96483 (Nihal Z. Miaji). - Correction d’un crash lors de la création d’une table Iceberg avec une clause
ORDER BYréférençant une colonne inexistante ou utilisant un argument positionnel. Ferme #93280. #96484 (Konstantin Vedernikov). - Correction d’une exception de runtime filter pour des colonnes Tuple avec des sous-champs Nullable. #96509 (Alexey Milovidov).
- Correction d’une exception
LOGICAL_ERRORdans le lecteur natif Parquet V3 lorsque la colonne de filtrePREWHEREcontient des valeurs UInt8 non booléennes. #96594 (Alexey Milovidov). - Correction de la régénération implicite des index dans les tables répliquées lors de modifications des métadonnées. #96600 (Raúl Marín).
- Correction d’une course de données sur DROP WORKLOAD. #96614 (Sergei Trifonov).
- Correction d’un bug dans les écritures vers une table Iceberg où des insertions partitionnées pouvaient produire une répartition incorrecte des données entre les fichiers de partition. #96620 (Konstantin Vedernikov).
- Correction d’un
heap-use-after-freedansCREATE TABLEavec des contraintes. #96669 (Nikita Taranov). - Validation de la witness version dans bech32 afin d’éviter un débordement de tampon. #96671 (Raúl Marín).
- Correction de
system.tables, qui renvoyait des erreurs lorsqu’un REST catalog de data lake était créé avec un paramètreauth_headernon valide. #96680 (Han Fei). - Correction de
min(timestamp), qui renvoyait l’époque (1970-01-01) via_minmax_count_projectionaprès une fusion TTL lorsque toutes les lignes d’un block étaient filtrées. #96703 (Raquel Barbadillo). - Amélioration de la validation du paramètre
iceberg_metadata_file_pathpour empêcher la traversée de chemin et garantir que le fichier de métadonnées spécifié se trouve dans le répertoire de la table. #96754 (Daniil Ivanik). - Correction d’un crash dans
ifNullavec un argumentVariantutilisé dansGROUP BY. #96790 (Alexey Milovidov). - Correction des collisions de clés de cache entre les tables avec le paramètre
table_disk=1. #96818 (Raufs Dunamalijevs). - Correction du blocage du thread de purge de MemoryWorker à cause d’une condition de concurrence. #96819 (Antonio Andelic).
- Les données contenant des informations d’authentification ne sont plus journalisées dans les catalogues Iceberg. #96831 (Konstantin Vedernikov).
- Correction du code de sortie de clickhouse-client après une erreur du serveur. #96841 (Vitaly Baranov).
- Les requêtes avec des
CROSS JOINet des répliques parallèles activées pouvaient renvoyer un résultat incorrect. Corrige #74337. #96848 (Igor Nikonov). - Correction de l’échec des requêtes
ALTER TABLE DROP COLUMNaprès qu’une lightweight update avait déjà été effectuée sur la même colonne. #96861 (Anton Popov). - Correction d’un dépassement de pile (crash) lors de la création de sauvegardes basées sur des archives (
.zip,.tzst) sur un disque de stockage objetplain_rewritable. #96872 (Alexey Milovidov). - Correction d’un crash du serveur lorsque la sauvegarde échoue en raison d’un disque plein ou d’autres erreurs d’E/S sur le système de fichiers de destination. #96873 (Alexey Milovidov).
- Correction de
EXCEPT ALLetINTERSECT ALL, qui ignoraient les multiplicités de lignes et se comportaient comme leurs équivalentsDISTINCT. #96876 (Alexey Milovidov). - Correction d’une exception
std::terminatedansindexOfAssumeSortedlorsqu’elle est appelée avec des types incompatibles (par exemple, un tableauIPv4avec une valeur de recherche entière). #96877 (Alexey Milovidov). - Correction de l’exception
Bad cast from type DB::ColumnNullable to DB::ColumnStringlors de l’utilisation de fonctions de fenêtre avecgroup_by_use_nulls = 1et CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov). - Correction de résultats incorrects lorsque des expressions compilées par JIT convertissent
DateTimeenDateTime64(par exemple, dansCASE/if/multiIfavec des types DateTime mixtes). La valeur était réinterprétée au lieu d’être correctement mise à l’échelle, ce qui produisait des horodatages erronés une fois la compilation de l’expression activée. #96879 (Alexey Milovidov). - Correction d’une exception d’erreur logique dans
CoalescingMergeTreelorsqu’une expression de skip index produit une colonne constante (par exemple,bloom_filtersurifNotFinite(1, c0)pour une colonne entière). #96880 (Alexey Milovidov). - Correction d’un numéro de port erroné dans le message d’erreur lors d’une connexion accidentelle en HTTP au port du protocole natif avec TLS activé. #96881 (Alexey Milovidov).
- Correction du fait que
SETTINGSpar sous-requête n’était pas appliqué aux fonctions de table commefiledans les CTE et les sous-requêtes. #96882 (Alexey Milovidov). - Corrige une fuite de mémoire des objets BIO lors de la lecture de certificats X509. #96885 (Alexey Milovidov).
- Corrige l’exception
LOGICAL_ERRORdans l’analyseur de requêtes lorsqu’une expression lambda est passée là où une valeur concrète est attendue (par exemple comme argument accumulateur dearrayFold). #96892 (Alexey Milovidov). - Corrige l’exception
ColumnNullable is not compatible with originallors du transtypage de types imbriqués complexes (Array de Tuple Nullable contenant une Map avec des valeurs Enum Nullable). #96924 (Alexey Milovidov). - Corrige une situation de concurrence lors du chargement parallèle d’un dictionnaire
HASHEDpartitionné, qui pouvait occasionnellement empêcher le chargement de certaines lignes. #96953 (Alexey Milovidov). - Corrige une situation de concurrence entre
REPLACE PARTITIONet les mutations en arrière-plan, qui pouvait rendre simultanément visibles les anciennes et les nouvelles données après le remplacement. #96955 (Alexey Milovidov). - Corrige la fonction
arrayJoin, qui produisait des lignes en double lorsqu’elle était utilisée avec INNER JOIN et la clause WHERE, en raison de l’optimisation partielle de descente de prédicat qui poussait à tort sous un JOIN les filtres contenantarrayJoin. #96989 (Alexey Milovidov). - Corrige un plantage (SEGFAULT) dans
clearCaches, causé par le fait queBlockIO::operator=ne déplaçait pasquery_metadata_cache, ce qui entraînait la destruction prématurée de snapshots de stockage mis en cache et une utilisation après libération du stockageMergeTreeData. #96995 (Alexey Milovidov). - Corrige un échec d’assertion dans
IfTransformStringsToEnumPasslorsque la fonctionifoutransformrenvoieNullable(String)(par exemple avecGROUP BY ... WITH CUBEetgroup_by_use_nulls = true). #97002 (Alexey Milovidov). - Corrige l’écriture de données incorrectes lors de
INSERT ... SELECTavecUNION ALLetJOIN, où des colonnes de chaînes constantes pouvaient recevoir des valeurs erronées après la fusion des blocs. #97019 (Hasyimi Bahrudin). - Corrige l’exception
assert_cast(ou une corruption silencieuse des données dans les builds de release) lors de la création des statistiques de colonnes après qu’unALTER TABLE MODIFY COLUMNa modifié le type de la colonne. #97027 (Alexey Milovidov). - Corrige des lectures de mémoire non initialisée dans Azure Blob Storage, le protocole SSH et les interfaces Arrow Flight. #97053 (Alexey Milovidov).
- Corrige des cas où les index affectaient le résultat des requêtes avec row policy/PREWHERE et FINAL. #97076 (Yarik Briukhovetskyi).
- Corrige la situation de concurrence résiduelle entre
REPLACE PARTITIONet les mutations en arrière-plan dans les tablesMergeTree, qui pouvait faire réapparaître d’anciennes données. #97105 (Alexey Milovidov). - Corrige les index implicites avec des colonnes alias et effectue une validation complète avant leur création. #97115 (Raúl Marín).
- Corrige une erreur logique dans
FunctionVariantAdaptoravec des fonctions nécessitant des arguments constants, commearrayROCAUC. #97116 (Bharat Nallan). - Corrige des mutations bloquées lorsque
PartCheckThreadremet en file d’attente unGET_PARTpour une part déjà mutée, en laissant des entrées fantômes dansparts_to_do. #97162 (Alexey Milovidov). - Corrige l’estimation du nombre de lignes dans le plan d’exécution pour des sous-requêtes avec
ORDER BY ... LIMIT, ce qui pouvait amener l’optimiseur à choisir un ordre de jointure sous-optimal. #97193 (Alexander Gololobov). - Corrige l’exception
LOGICAL_ERRORdansFunctionVariantAdaptorlorsqu’une fonction opérant sur des colonnes Variant renvoie le typeNothing, ce qui peut se produire avec des tableaux vides dans des requêtesUNION ALL. #97213 (Alexey Milovidov). - Corrige une data race lors des opérations de copie multipart vers S3 (par ex. lors d’un
BACKUP/RESTOREvers S3), qui pouvait provoquer des exceptions en cas d’accès concurrent. #97227 (Azat Khuzhin). - Corrige l’exception
LOGICAL_ERRORlorsquearrayJoindans la clauseWHEREréférence des colonnes des deux côtés d’unJOIN. #97239 (Alexey Milovidov). - Corrige l’exception
LOGICAL_ERRORlors de la lecture de la sous-colonne.sized’unNullable(String)sparse dans un Tuple avec PREWHERE. #97264 (Alexey Milovidov). - Corrige l’exception “Le nombre de lignes dans le chunk lazy ne correspond pas au nombre d’offsets” dans
LazyMaterializingTransformlors de la lecture de tables avec une granularité d’index non adaptative (index_granularity_bytes = 0) en utilisantORDER BY ... LIMIT. #97270 (Alexey Milovidov). - Corrige le fait que
SYSTEM RESTART REPLICAfasse disparaître une table de la base de données lorsque sa recréation échoue avec une exception sans lien avec ZooKeeper (par ex. memory limit), ce qui provoquait des incohérences d’empreinte de métadonnées dansDatabaseReplicated. #97276 (Alexey Milovidov). - Le champ
readonlydanssystem.merge_tree_settingsreflète désormais correctement que certains paramètres MergeTree (par ex.index_granularity) sont inconditionnellement en lecture seule. #97277 (Robert Schulze). - Corrige un crash lors de l’optimisation de
count()sur des tablesMergeTreelorsque le snapshot de stockage a été créé sans données. #97281 (Pablo Marcos). - Corrige un crash possible lors de la résolution des noms de fonctions à partir des informations de débogage pour les stack traces. #97294 (Azat Khuzhin).
- Corrige une erreur logique avec analyzer_compatibility_join_using_top_level_identifier et les colonnes ALIAS. Ferme #96228. #97297 (Vladimir Cherkasov).
- Corrige l’exception
LOGICAL_ERRORdansapplyOrderlors de l’utilisation de colonnes indexées en texte avec la clauseQUALIFY. #97313 (Alexey Milovidov). - La table système
system.functionsaffiche désormaiscategories = 'Internal'pour les fonctions internes, au lieu decategories = ''. #97315 (Robert Schulze). - Une requête comportant une chaîne de RIGHT JOIN avec les répliques parallèles activées peut produire un résultat incorrect. Corrige #74341. #97316 (Igor Nikonov).
- Corrige des erreurs
TABLE_UUID_MISMATCHintempestives pouvant survenir avec les vues matérialisées actualisables et dans d’autres scénarios où des tables sont renommées. #97323 (Azat Khuzhin). - Corrige un segfault dans la sauvegarde
StorageKeeperMap, dû à une utilisation après libération d’un pointeur de stockage devenu orphelin dans un lot de sauvegarde lazy. #97336 (Alexey Milovidov). - Corrige la fonction
existsavec une sous-requête scalaire dans unALTER UPDATE/DELETElorsquemutations_execute_subqueries_on_initiatorest activé. La sous-requête scalaire était évaluée incorrectement, ce qui pouvait entraîner une erreur ou une commande de mutation corrompue, rendant la table impossible à charger au redémarrage suivant du serveur. #97347 (Kirill Kopnev). - Corrige l’exception logique
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8)))lors de la comparaison de NULL avec une colonne Variant contenant des types LowCardinality. #97379 (Alexey Milovidov). - Corrige une possible condition de concurrence lorsque
EXCHANGE TABLESest exécuté en parallèle avec le query cache shardé activé. #97411 (Konstantin Vedernikov). - Corrige l’exception
LOGICAL_ERRORlors de la conversion d’Array versQBit, lorsquenullable_sourced’un wrapperTupleexterne remplace la colonne de tableau convertie par un type de colonne incompatible. Clôt #97389. #97413 (Alexey Milovidov). - Corrige une incohérence de formatting aller-retour de l’AST pour les littéraux de tuple avec alias entre parenthèses ; par exemple,
(('a', 'b') AS x)était incorrectement reformaté entuple(('a', 'b') AS x). #97418 (Alexey Milovidov). - Corrige une exception lors d’insertions asynchrones avec déduplication lorsqu’un échec de parsing produisait un bloc vide de zéro ligne. #97460 (Sema Checherinda).
- Corrige l’exception “Number of rows in lazy chunk does not match number of offsets” dans
LazyMaterializingTransformlors de la lecture de tables avec granularité d’index non adaptative (index_granularity_bytes = 0) en utilisantORDER BY ... LIMIT. #97482 (Alexey Milovidov). - Corrige les paramètres d’insert pour Iceberg. Ajoute un alias pour le paramètre
allow_experimental_insert_into_iceberg. #97483 (Konstantin Vedernikov). - Corrige
ACCESS_DENIEDpour les utilisateurs dépourvus de la permissionCREATE TEMPORARY TABLElorsque l’optimisationoptimize_inverse_dictionary_lookupréécrit les prédicatsdictGet(...). ClickHouse ignore désormais cette réécriture et exécute l’expression d’origine. Clôt #97269. #97484 (Nihal Z. Miaji). - Correction d’un échec d’assertion (exception dans les builds de débogage/sanitizer) dans
SetetMergeTreeIndexSetlors du traitement de colonnes comportant des sous-colonnessparseinternes (par ex. des colonnesTupleissues de parts MergeTree avec des profils de sérialisationsparsedifférents). #97493 (Alexey Milovidov). - Correction d’un possible use-after-free dans StorageKafka2. #97520 (Bharat Nallan).
- Correction de
INTO OUTFILEavecTRUNCATEet le paramètreinto_outfile_create_parent_directorieslorsque le chemin de sortie contient des répertoires. #97549 (Alexey Milovidov). - Correction de l’erreur
BAD_ARGUMENTSlors de requêtes sur des tables avec des expressions lambda dans des colonnes ALIAS via la table functionmerge(), avec l’analyseur activé. #97551 (Alexey Milovidov). - Correction de l’exception
system.zookeeper_infolorsque le zxid de Keeper vaut 0. #97553 (Alexey Milovidov). - Correction d’une possible erreur logique dans le dictionnaire
ip_trielorsque le type de la clé n’est pas String. #97555 (Bharat Nallan). - Correction de l’authentification OAuth du catalogue REST, qui ne fonctionnait pas pour le
RestCatalogde base (elle ne fonctionnait que pour des catalogues dérivés commeOneLakeCatalog). Cela a cassé le catalogue REST par défaut après l’introduction du catalogue BigLake. #97561 (Konstantin Vedernikov). - Les fonctions de géométrie (
perimeterSpherical,areaSpherical, etc.) acceptent désormais des sous-types géométriques individuels (Polygon,Ring,Point, etc.) en plus du type VariantGeometry. #97571 (Alexey Milovidov). - Correction de l’exception
LOGICAL_ERRORlors de l’utilisation deisNull/isNotNullsur des sous-colonnes de typesNullable(Tuple(... Nullable(T) ...)). Clôt #97224. #97582 (Alexey Milovidov). - Correction d’un déréférencement de pointeur nul lors de l’application de patch parts pendant les lightweight updates. #97583 (Alexey Milovidov).
BaseSettings::readBinarytransmet àfield_infos[]l’index renvoyé paraccessor.findsans vérifier la valeur sentinelle « non trouvé » (c.-à-d.-1), ce qui peut provoquer un accès hors limites à unstd::vector. Le problème a été détecté grâce au hardening de libcxx. Cela s’est probablement produit lors de la désérialisation du query plan lorsqu’un serveur plus récent envoie un paramètre inconnu à un serveur plus ancien. La méthode de lecture basée sur les chaînes gérait déjà correctement ce cas ; il manquait simplement la même vérification dansreadBinary. #97585 (Miсhael Stetsyuk).- Correction de résultats incorrects pour des queries
UNION ALLdans lesquelles une branche avait un predicate constant faux : la branche lisait à tort des données au lieu de ne rien renvoyer. #97620 (Bharat Nallan). - Correction de l’échec de
IN (col)avec une référence à une seule colonne, qui produisait l’erreurUNSUPPORTED_METHOD. #97646 (Alexey Milovidov). - Correction d’une exception d’erreur logique lors de
GROUP BY ... WITH ROLLUP/CUBElorsque les clés incluentLowCardinality(Nullable(...))à l’intérieur deNullable(Tuple(...)). #97647 (Alexey Milovidov). - Correction d’une incohérence de formatage de l’AST pour
NOT (1, 1, 1)pouvant provoquerLOGICAL_ERRORdans les versions de débogage. #97653 (Alexey Milovidov). - Correction d’une exception de
keeper-converterlorsqu’il rencontre des fichiers journaux de transactions ZooKeeper vides. #97673 (Alexey Milovidov).
Amélioration de la compilation/des tests/du packaging
- ClickHouse peut être compilé avec clang-23 (master). #95578 (Alexey Milovidov).
- Corrige le forçage de
is_localà false lorsquebind_hostest configuré, et le remplace par un test d’intégration. Suite de #74741. #93109 #96018 (Zhigao Hong). - Tests de stress : corrige les tests de stress et de mise à niveau dans la CI. Ignore les tags
no-{build}. Ajoute une randomisation de compatibilité. #94693 (Nikita Fomichev). - Publie le binaire parser_memory_profiler issu du build. Cet outil permet d’analyser la consommation mémoire de l’AST. #95826 (Ilya Yatsishin).
- Ajoute l’option
--symbolizeà l’outilparser_memory_profiler, qui génère des fichiers.heap.symavec les symboles résolus dans les résultats. #96477 (Ilya Yatsishin). - Épingle les images Docker tierces utilisées dans les tests d’intégration à des versions spécifiques. #96500 (Alexey Milovidov).
- Restaure la possibilité de lier
OpenSSLdynamiquement. Ce n’est pas recommandé et ce n’est utilisé par aucun build de production, mais l’option existe toujours pour les passionnés. #96506 (Govind R Nair). - Réduit la plage
magic_enumde [-100, 1000] à la plage par défaut [-128, 127] en utilisant une spécialisation par type pourCoordination::OpNum, ce qui améliore le temps de compilation. #96632 (Alexey Milovidov). - Supprime des templates C++ inutiles des classes Function afin de réduire les temps de compilation. #96646 (Alexey Milovidov).
- Déplace la génération de
StorageSystemLicensesà l’étape de configuration afin d’améliorer le parallélisme de compilation. #96697 (Alexey Milovidov). - Parallélise l’analyse des licences. #96727 (Raúl Marín).
- Ajoute un test fonctionnel stateless pour la prise en charge du protocole SSH. #96996 (Alexey Milovidov).
- Ajoute Kafka 3.9.0 à l’infrastructure des tests fonctionnels stateless, ce qui permet de tester directement les table engines Kafka et Kafka2 en utilisant ClickHouse Keeper comme ZooKeeper. Six nouveaux tests stateless couvrent les bases de la production/consommation, les virtual columns, INSERT, plusieurs formats, la gestion des messages corrompus et le stockage des offsets basé sur Keeper. #96997 (Alexey Milovidov).
- Ajoute un workflow CI pour compiler une toolchain clang optimisée avec PGO+BOLT. #96991 (Alexey Milovidov).
- Utilise dans la CI le build LLVM/Clang optimisé avec PGO, ce qui devrait accélérer la compilation de 20 à 30 %. #97031 (Alexey Milovidov).
- Remplace les fonctions mathématiques de glibc par des implémentations de llvm-libc. #90151 (Konstantin Bogdanov).
- Met à jour Boost de 1.83 à 1.90, corrigeant un échec d’assertion
devectordans les compilations de débogage. #97037 (Alexey Milovidov). - Met à jour
postgresvers REL_18_1. #95189 (Konstantin Bogdanov). - Utilise
libexpat2.7.3. #95218 (Konstantin Bogdanov). - Utilise
OpenSSL3.5.5. #95345 (Konstantin Bogdanov). - Utilise
simdjsonv4.2.4. #97129 (Konstantin Bogdanov). - Utilise
libarchive3.8.5. #97131 (Konstantin Bogdanov). - Utilise
fast_floatv8.2.3. #97133 (Konstantin Bogdanov). - Utilise
abseil-cpp20260107.1 ets2geometryv0.13.1. #97134 (Konstantin Bogdanov). - Fait passer
libxml2à la version 2.15.1. #95574 (Robert Schulze). - Met à niveau 7 images Docker de tests d’intégration Tier-3, en remplaçant des images de base en fin de vie ou supprimées par des versions actuellement prises en charge. #97314 (Rahul).
- Ajoute des requêtes de benchmark TPC-DS. #97349 (Raufs Dunamalijevs).
- Remplace les options cmake individuelles de jeu d’instructions x86 (
ENABLE_SSSE3,ENABLE_AVX2,NO_SSE3_OR_HIGHER,ARCH_NATIVE, etc.) par une unique option numériqueX86_ARCH_LEVEL(1/2/3/4), alignée sur les niveaux standard de microarchitecture x86-64 déjà utilisés par le système de dispatch à l’exécution. #97354 (Raúl Marín). - Évite d’instancier des variantes de template
division_by_nullable=truepour les opérations autres que la division dansFunctionBinaryArithmetic, ce qui réduit le temps de compilation et la taille du binaire. #97496 (Raúl Marín). - Réduit le volume d’inclusions de
Exception.hen le supprimant d’en-têtes largement utilisés commetypeid_cast.h,assert_cast.h,Context_fwd.h,IDataType.het divers en-têtesColumn. #97497 (Raúl Marín). - Utilise toujours les en-têtes
compiler-rtfournis avec le projet (interfaces Sanitizer et XRay) au lieu de ceux du compilateur hôte, et compile par défaut les bibliothèquescompiler-rtà partir des sources. #97499 (Raúl Marín). - Éviter d’inclure les en-têtes boost/multiprecision dans
wide_integer_impl.hsur les plateformes disposant d’unlong doublesuffisant, ce qui améliore le temps de compilation. #96633 (Alexey Milovidov). - Mettre en place le job de couverture de code LLVM et l’activer dans un premier temps pour la branche master. #90952 (Alexey Bakharew).
- Activer le durcissement rapide de libcxx pour les builds de release. Cela est principalement nécessaire pour les vérifications de dépassement de limites. D’après les résultats des tests de performance, aucun impact notable sur les performances n’est attendu. #94757 (Miсhael Stetsyuk).
Version 26.1 de ClickHouse, 2026-01-29. Présentation, Vidéo
Changement incompatible avec les versions précédentes
- Corrige un formatage incohérent causé par une substitution incorrecte d’alias dans le formateur. Cela clôt #82833. Cela clôt #82832. Cela clôt #68296. Cette modification peut être rétro-incompatible : lorsque l’analyseur est désactivé, certaines requêtes CREATE VIEW avec IN référençant un alias ne peuvent pas être traitées. Pour éviter cette incompatibilité, activez l’analyseur (il est activé par défaut depuis la version 24.3). #82838 (Alexey Milovidov).
- Les codecs
DEFLATE_QPLetZSTD_QATont été supprimés. Il est conseillé aux utilisateurs de convertir les données existantes compressées avecDEFLATE_QPLouZSTD_QATvers un autre codec avant la mise à niveau. Notez que, pour utiliser ces codecs, les paramètresenable_deflate_qpl_codecetenable_zstd_qat_codecdevaient être activés. #92150 (Robert Schulze). - Améliore le débogage des UDF en activant la capture de stderr dans
system.query_log.exception. Auparavant, stderr des UDF n’était consigné que dans des fichiers et n’était pas exposé dans les journaux de requêtes, ce qui rendait le débogage impossible. Désormais, stderr déclenche des exceptions par défaut et est entièrement accumulé (jusqu’à 1 Mo) avant qu’une exception ne soit levée, de sorte que les traces d’appels Python complètes et les messages d’erreur apparaissent danssystem.query_log.exceptionpour faciliter le dépannage. #92209 (Xu Jia). - Une liste de colonnes vide dans la clause
JOIN USING ()est désormais considérée comme une erreur de syntaxe. Auparavant, cela était censé produireINVALID_JOIN_ON_EXPRESSIONpendant l’exécution de la requête. Dans certains cas, comme lors d’une jointure avec le moteurJoin, cela menait àLOGICAL_ERROR, clôt #82502. #92371 (Vladimir Cherkasov). - Utilise par défaut une correspondance partielle pour SKIP REGEXP dans le type JSON. Clôt #79250. #92847 (Pavel Kruglov).
- Annule “Allow INSERT into simple ALIAS columns” (annule ClickHouse/ClickHouse#84154). Cela ne fonctionne pas avec les formats personnalisés et n’est protégé par aucun paramètre. #92849 (Azat Khuzhin).
- Ajoute un paramètre pour lever une erreur si un catalogue de data lake n’a pas accès au stockage objet. #93606 (Konstantin Vedernikov).
- Le moteur de base de données
Lazya été supprimé et n’est plus disponible. Clôt #91231. #93627 (Alexey Milovidov). - Supprime le mode
transposed_with_wide_viewdemetric_log: il est inutilisable en raison d’un bug. Il n’est plus possible de définirsystem.metric_logavec ce mode. Cela annule partiellement #78412. #93867 (Alexey Milovidov). - L’ordonnancement CPU des workloads est désormais préemptif par défaut. Voir le paramètre serveur
cpu_slot_preemption. #94060 (Sergei Trifonov). - Échapper les noms de fichiers d’index pour éviter des parts corrompues. Avec ce changement, ClickHouse ne pourra plus charger les index dont le nom contient des caractères non ASCII et qui ont été créés par des versions précédentes. Pour gérer ce cas, vous pouvez utiliser le paramètre MergeTree
escape_index_filenames. #94079 (Raúl Marín). - Les paramètres de format
exact_rows_before_limit,rows_before_aggregation,cross_to_inner_join_rewrite,regexp_dict_allow_hyperscan,regexp_dict_flag_case_insensitive,regexp_dict_flag_dotalletdictionary_use_async_executoront été convertis en paramètres ordinaires (non liés au format). Il s’agit d’un changement purement interne, sans effet visible pour l’utilisateur, sauf dans le cas (peu probable) où vous auriez spécifié l’un de ces paramètres dans des définitions de moteurs de table Iceberg ou DeltaLake ou Kafka ou S3 ou S3Queue ou Azure ou Hive ou RabbitMQ ou Set ou FileLog ou NATS. Dans ce cas, ces paramètres étaient auparavant ignorés ; désormais, de telles définitions génèrent une erreur. #94106 (Robert Schulze). - Les fonctions
joinGet/joinGetOrNullimposent désormais les privilègesSELECTsur la table Join sous-jacente. Après ce changement, l’exécution dejoinGet('db.table', 'column', key)exige que l’utilisateur dispose du privilègeSELECTà la fois sur les colonnes de clé définies dans la table Join et sur la colonne d’attribut récupérée. Les requêtes ne disposant pas de ces privilèges échoueront avecACCESS_DENIED. Pour migrer, accordez les privilèges nécessaires à l’aide deGRANT SELECT ON db.join_table TO userpour un accès à toute la table, ou deGRANT SELECT(key_col, attr_col) ON db.join_table TO userpour un accès au niveau des colonnes. Ce changement affecte tous les utilisateurs et applications qui s’appuient surjoinGet/joinGetOrNulllorsque des privilègesSELECTexplicites n’étaient pas configurés auparavant. #94307 (Vladimir Cherkasov). - Vérifier
SHOW COLUMNSpour les requêtesCREATE TABLE ... AS .... Auparavant,SHOW TABLESétait vérifié, ce qui correspond à un privilège incorrect pour ce type de vérification d’autorisation. #94556 (pufit). - Rendre le format de sortie
Hashindépendant de la taille des blocks. #94503 (Alexey Milovidov). Notez que cela modifie les valeurs de hachage en sortie par rapport aux versions précédentes.
Nouvelle fonctionnalité
- API HTTP et interface Web intégrée pour ClickHouse Keeper. #78181 (pufit et speeedmaster).
- La déduplication d’async insert fonctionne désormais avec les vues matérialisées dépendantes. Lorsqu’une collision sur
block_idse produit, le bloc d’origine est filtré pour supprimer les lignes associées à ceblock_id, puis les lignes restantes sont transformées à l’aide de toutes les requêtesselectpertinentes des vues matérialisées, ce qui reconstruit le bloc d’origine sans les lignes en conflit. #89140 (Sema Checherinda). Il est désormais possible d’utiliser la déduplication avec les async inserts lorsque des vues matérialisées sont impliquées. #93957 (Sema Checherinda). - Introduction d’une nouvelle syntaxe et d’une nouvelle infrastructure afin de simplifier et d’étendre la fonctionnalité d’index de projection. Cela fait suite à https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
- Ajout de la prise en charge des index de texte pour les colonnes
Array. #89895 (Jimmy Aguilar Mena). - Active
use_variant_as_common_typepar défaut, ce qui permet d’utiliser des types incompatibles dans unArray, dans des requêtesUNIONet dans les branches deif/multiIf/case. #90677 (Alexey Milovidov). - Nouvelle table système
zookeeper_info. Implémente #88014. #90809 (Smita Kulkarni). - Prise en charge du type
Variantdans toutes les fonctions. #90900 (Bharat Nallan). - Ajoute une métrique
ClickHouse_Infoau endpoint Prometheus/metrics, contenant principalement des informations de version, afin de pouvoir créer des graphiques suivant l’évolution détaillée des versions au fil du temps. #91125 (Christoph Wurm). - Introduction d’une nouvelle commande Keeper à quatre lettres,
rcfg, qui permet de modifier la configuration du cluster. Cette commande offre plus de possibilités de modification de la configuration que la requête standardreconfigure. La commande prend une chaînejsoncomme argument. L’ensemble des octets envoyés à l’interface TCP doit avoir la forme suivante :rcfg{json_string_length_big_endian}{json_string}. Voici un exemple de commande :{"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin). - Ajoute la fonction
reverseBySeparator, qui inverse l’ordre des sous-chaînes d’une chaîne séparées par un séparateur donné. Clôt #91463. #91780 (Xuewei Wang). - Ajoute le nouveau paramètre
max_insert_block_size_bytes, qui permet de contrôler plus finement la formation des blocs insérés. #92833 (Kirill Kopnev). - Il est possible d’exécuter des requêtes DDL avec la clause
ON CLUSTERpour une base de données Replicated si le paramètreignore_on_cluster_for_replicated_databaseest activé. Dans ce cas, le nom du cluster est ignoré. #92872 (Kirill). - Implémentation de la fonction
mergeTreeAnalyzeIndexes. #92954 (Azat Khuzhin). - Ajout du nouveau paramètre
use_primary_key. Définissez-le surfalsepour désactiver le pruning des granules basé sur la clé primaire. #93319 (Nihal Z. Miaji). - Ajout de la fonction de table
icebergLocalCluster. #93323 (Anton Ivashkin). - Ajout de la fonction
cosineDistanceTransposed, qui approxime la distance cosinus entre deux points. #93621 (Raufs Dunamalijevs). - Ajout de la colonne
filesà la table system.parts, qui affiche le nombre de fichiers dans chaque data part. #94337 (Match). - Ajout d’un scheduler max-min fair pour le contrôle de la concurrence. Il offre une meilleure équité en cas de forte sursouscription, lorsque de nombreuses requêtes se disputent un nombre limité de CPU slots. Les requêtes de courte durée ne sont pas pénalisées par les requêtes de longue durée qui ont accumulé davantage de slots au fil du temps. Activé via la valeur
max_min_fairdu paramètre serveurconcurrent_threads_scheduler. #94732 (Sergei Trifonov). - Ajout de la possibilité, pour le client ClickHouse, de remplacer le TLS SNI lors de la connexion au serveur. #89761 (Matt Klein).
- Prise en charge des tables temporaires dans les appels de fonction
joinGet. #92973 (Eduard Karacharov). - Prise en charge des vecteurs de suppression dans le moteur de table
DeltaLake. #93852 (Kseniia Sumarokova). - Prise en charge des vecteurs de suppression pour
deltaLakeCluster. #94365 (Kseniia Sumarokova). - Prise en charge de Google Cloud Storage pour les data lakes. #93866 (Konstantin Vedernikov).
Fonctionnalité expérimentale
- Passage de
QBitdu statut Experimental à Beta. #93816 (Raufs Dunamalijevs). - Ajout de la prise en charge de
Nullable(Tuple). Définissezallow_experimental_nullable_tuple_type = 1pour l’activer. #89643 (Nihal Z. Miaji). - Prise en charge du REST catalog Paimon, dans la continuité de https://github.com/ClickHouse/ClickHouse/pull/84423. #92011 (JIaQi Tang).
Amélioration des performances
- Le paramètre
use_skip_indexes_on_data_readest désormais activé par défaut. Ce paramètre permet un filtrage en flux, en même temps que la lecture, ce qui améliore les performances des requêtes et le temps de démarrage. #93407 (Shankar Iyer). - Améliore les performances de
DISTINCTsur les colonnesLowCardinality. Clôt #5917. #91639 (Nihal Z. Miaji). - Optimise la fonction d’agrégation
distinctJSONPathsafin qu’elle lise uniquement les chemins JSON à partir des data parts, et non la JSON column entière. #92196 (Pavel Kruglov). - Davantage de filtres sont pushed down dans les JOIN. #85556 (Nikita Taranov).
- Prend en charge davantage de cas de push down à partir de la condition ON du join lorsque le filtre n’utilise des entrées que d’un seul côté. Prend en charge les joins
ANY,SEMI,ANTI. #92584 (Dmitry Novik). - Permet d’utiliser des sets équivalents pour push down les filtres dans
SEMI JOIN. Clôt #85239. #92837 (Dmitry Novik). - Évite de lire le côté gauche d’un hash join lorsque le côté droit est vide. Auparavant, le côté gauche était lu jusqu’au premier block non vide, ce qui pouvait entraîner beaucoup de travail en cas de filtrage ou d’agrégation importants. #94062 (Alexander Gololobov).
- Utilisation de la méthode “fastrange” (Daniel Lemire) pour partitionner les données au sein du query pipeline. Cela peut améliorer le tri parallèle et les JOIN. #93080 (Alexey Milovidov).
- Améliore les performances des fonctions de fenêtre lorsque PARTITION BY correspond à la sorting key ou en est un préfixe. #87299 (Nikita Taranov).
- Le filtre externe est pushed down dans les vues, ce qui permet d’appliquer PREWHERE sur les nœuds locaux et distants. Résout #88189. #88316 (Igor Nikonov).
- Met en œuvre des compilations JIT pour davantage de fonctions. Clôt #73509. #88770 (Alexey Milovidov avec Taiyang Li).
- Si un skip index utilisé dans une requête
FINALporte sur une colonne faisant partie de la primary key, l’étape supplémentaire consistant à vérifier l’intersection de la primary key dans les autres parts n’est pas nécessaire et n’est désormais plus effectuée. Résout #85897. #93899 (Shankar Iyer). - Optimise les performances et l’utilisation mémoire pour les
LIMITetOFFSETfractionnaires. #91167 (Ahmed Gouda). - Corrige l’utilisation d’une logique de lecture aléatoire plus rapide pour le mécanisme de prefetch du Parquet reader V3. Clôt #90890. #91435 (Arsen Muk).
- Amélioration des performances de
icebergCluster. Closes #91462. #91537 (Yang Jiang). - Ne pas filtrer sur les colonnes virtuelles avec des filtres constants. #91588 (c-end).
- Réduction de l’utilisation mémoire des INSERT/fusions avec les wide parts pour les tables très larges grâce à l’activation de tampons d’écriture adaptatifs. Ajout de la prise en charge des tampons d’écriture adaptatifs pour les disques chiffrés. #92250 (Azat Khuzhin).
- Amélioration des performances de la recherche en texte intégral avec le text index et le tokenizer
sparseGrams, en réduisant le nombre de tokens recherchés dans l’index. #93078 (Anton Popov). - La fonction
isValidASCIIa été optimisée pour les résultats positifs, c.-à-d. pour les valeurs d’entrée entièrement ASCII. #93347 (Robert Schulze). - L’optimisation de lecture dans l’ordre détecte désormais lorsque les colonnes ORDER BY sont constantes du fait des conditions WHERE, ce qui permet des lectures efficaces en ordre inverse. Cela profite aux requêtes multi-tenant comme
WHERE tenant='42' ORDER BY tenant, event_time DESC, qui peuvent désormais utiliser InReverseOrder au lieu de nécessiter un tri complet.”. #94103 (matanper). - Introduction d’une classe AST Enum spécialisée pour stocker les paramètres de valeur sous forme de paires (chaîne, entier) au lieu d’enfants ASTLiteral, afin d’optimiser la consommation mémoire. #94178 (Ilya Yatsishin).
- Analyse d’index distribuée sur plusieurs répliques. Bénéfique pour le stockage partagé et les très grands volumes de données dans le cluster. Cela s’applique à SharedMergeTree (ClickHouse Cloud) et pourrait s’appliquer à d’autres types de tables MergeTree sur stockage partagé. #86786 (Azat Khuzhin).
- Réduction du surcoût des runtime filters de jointure en les désactivant dans les cas suivants : - trop de bits sont définis dans le bloom filter - trop peu de lignes sont filtrées à l’exécution. #91578 (Alexander Gololobov).
- Utilisation d’un tampon en mémoire pour l’entrée des sous-requêtes corrélées afin d’éviter de l’évaluer plusieurs fois. Fait partie de #79890. #91205 (Dmitry Novik).
- Autoriser toutes les répliques à récupérer les plages orphelines dans la lecture en parallel replicas. Cela améliore l’équilibrage de charge et réduit la latence de fin de distribution. #91374 (zoomxi).
- L’agrégation/le tri/la jointure externes respectent désormais le paramètre de requête
temporary_files_codecdans tous les contextes. Correction de l’absence de profile events pour grace hash join. #92388 (Vladimir Cherkasov). - Renforcement de la détection de l’utilisation mémoire des requêtes pour le spilling to disk pendant l’agrégation/le tri. #92500 (Azat Khuzhin).
- Estimation du nombre total de lignes et des statistiques NDV (nombre de valeurs distinctes) des colonnes clés d’agrégation. #92812 (Alexander Gololobov).
- Optimisation de la compression des listes de postings avec simdcomp. #92871 (Peng Jian).
- Refonte du traitement du mode Ordered de S3Queue avec des buckets. Cela devrait également améliorer les performances en réduisant le nombre de requêtes vers Keeper. #92889 (Kseniia Sumarokova).
- Les fonctions
mapContainsKeyLikeetmapContainsValueLikepeuvent désormais exploiter un text index surmapKeys()oumapValues(), respectivement. #93049 (Michael Jarrett). - Réduction de l’utilisation mémoire sur les systèmes non Linux (activation de la purge immédiate des dirty pages de jemalloc). #93360 (Eduard Karacharov).
- Forcer la purge des Arena de jemalloc lorsque le ratio entre la taille des dirty pages et
max_server_memory_usagedépassememory_worker_purge_dirty_pages_threshold_ratio. #93500 (Eduard Karacharov). - Réduction de l’utilisation mémoire pour l’AST. #93601 (Nikolai Kochetov).
- Dans certains cas, nous avons constaté que ClickHouse ne respectait pas la memory limit lors de la lecture d’une table. Ce comportement a été corrigé. #93715 (Nikita Mikhaylov).
- Activer par défaut les extensions Keeper
CHECK_STATetTRY_REMOVE. #93886 (Mikhail Artemenko). - Analyser les bornes inférieure et supérieure des noms de fichiers correspondant aux suppressions par position à partir des entrées du manifest file Iceberg afin d’améliorer la sélection des data files correspondants. #93980 (Daniil Ivanik).
- Ajouter deux paramètres supplémentaires pour contrôler le nombre maximal de subcolumns dynamiques dans une JSON column. Le premier est le MergeTree setting
merge_max_dynamic_subcolumns_in_compact_part(similaire àmerge_max_dynamic_subcolumns_in_wide_part, déjà ajouté), qui limite le nombre de subcolumns dynamiques créées lors d’un merge vers une compact part. Le second est le paramètre au niveau de la querymax_dynamic_subcolumns_in_json_type_parsing, qui limite le nombre de subcolumns dynamiques créées lors du parsing des données JSON, ce qui permettra de définir la limite on insert. #94184 (Pavel Kruglov). - Légère optimisation du squashing des JSON columns dans certains cas. #94247 (Pavel Kruglov).
- Réduire la taille des queue du thread pool sur la base du retour d’expérience en production. Ajouter une vérification explicite de la consommation mémoire avant toute lecture de données depuis MergeTree. #94692 (Nikita Mikhaylov).
- S’assurer que le scheduler privilégie le thread MemoryWorker en cas de pénurie de CPU, car il protège le processus ClickHouse contre une menace existentielle. #94864 (Nikita Mikhaylov).
- Exécuter la purge des dirty pages de jemalloc dans un thread distinct du thread principal de MemoryWorker. Si la purge est lente, cela pourrait retarder les mises à jour de l’utilisation de la RSS, ce qui pourrait entraîner l’arrêt du processus par manque de mémoire. Introduction d’une nouvelle config,
memory_worker_purge_total_memory_threshold_ratio, pour démarrer la purge des dirty pages en fonction du ratio d’utilisation mémoire totale. #94902 (Antonio Andelic).
Amélioration
system.blob_storage_logest désormais disponible pour Azure Blob Storage. #93105 (Alexey Milovidov).- Implémente
blob_storage_logpour Local et HDFS. Corrige une erreur lorsqueS3Queueutilisait autre chose que le nom du disque pour la journalisation dansblob_storage_log. Ajoute la colonneerror_codeàblob_storage_log. Scinde le fichier de configuration des tests pour simplifier les tests en local. #93106 (Alexey Milovidov). clickhouse-clientetclickhouse-localmettront désormais en évidence les groupes de chiffres (milliers, millions, etc.) au sein des littéraux numériques pendant la saisie. Cela clôt #93100. #93108 (Alexey Milovidov).- Ajoute la prise en charge, dans
clickhouse-client, des arguments de ligne de commande avec une espace autour du signe égal. Clôt #93077. #93174 (Cole Smith). - Avec
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>, le client CLI peut désormais revenir à Ctrl-R pour la recherche classique comme auparavant, tandis que Ctrl-T effectue une recherche approximative. #87785 (Larry Snizek). - L’instruction de vidage des caches
SYSTEM DROP [...] CACHEdonnait la fausse impression qu’elle désactivait le cache. ClickHouse prend désormais en charge l’instructionSYSTEM CLEAR [...] CACHE, plus explicite. L’ancienne syntaxe reste disponible. #93727 (Pranav Tiwari). - Prend en charge plusieurs colonnes comme clé primaire dans
EmbeddedRocksDB. Clôt #32819. #33917 (usurai). - Il est désormais possible d’utiliser un
INnon constant pour des scalaires (requêtes commeval1 NOT IN if(cond, val2, val3)). #93495 (Yarik Briukhovetskyi). - Empêche la propagation des en-têtes
x-amz-server-side-encryptionvers les requêtes S3HeadObject,UploadPartetCompleteMultipartUpload, car elles ne sont pas prises en charge. #64577 (Francisco J. Jurado Moreno). - Ajoute le suivi du partitionnement Hive pour le mode ordered dans S3Queue. Résout #71161. #81040 (Anton Ivashkin).
- Optimise la réservation d’espace dans le cache du système de fichiers.
FileCache::collectCandidatesForEvictionsera exécuté sans verrou unique. #82764 (Kseniia Sumarokova). - Prend en charge une stratégie composite de rotation (taille + temps) pour le journal du serveur. #87620 (Jianmei Zhang).
- Le client CLI peut désormais spécifier
<warnings>false</warnings>au lieu de l’option de ligne de commande--no-warnings. #87783 (Larry Snizek). - Ajout de la prise en charge de la fonction d’agrégation
avgavec des valeurs Date, DateTime et Time comme arguments. Clôt #82267. #87845 (Yarik Briukhovetskyi). - L’optimisation
use_join_disjunctions_push_downest activée par défaut. #89313 (Alexey Milovidov). - Prise en charge d’un plus grand nombre de moteurs de table et de types de sources de données dans les sous-requêtes corrélées. Clôt #80775. #90175 (Dmitry Novik).
- Si le schéma d’une vue paramétrée est spécifié explicitement, il est affiché. Clôt #88875, #81385. #90220 (Grigorii Sokolik).
- Gère correctement les écarts dans les entrées de log de Keeper lorsque les logs se situent avant le dernier index validé. #90403 (Antonio Andelic).
- Amélioration du paramètre
min_free_disk_bytes_to_perform_insertafin qu’il fonctionne correctement avec les volumes JBOD. #90878 (Aleksandr Musorin). - Permet de spécifier le paramètre
storage_class_namedans les collections nommées pour le moteur de tableS3et la fonction de tables3. #91926 (János Benjamin Antal). - Prise en charge de l’accès à un ZooKeeper auxiliaire via
system.zookeeper. #92092 (RinChanNOW). - Ajout de nouvelles métriques pour Keeper : les profile events
KeeperChangelogWrittenBytes,KeeperChangelogFileSyncMicroseconds,KeeperSnapshotWrittenBytesetKeeperSnapshotFileSyncMicroseconds, ainsi que les histogram metricsKeeperBatchSizeElementsetKeeperBatchSizeBytes. #92149 (Miсhael Stetsyuk). - Ajout d’un nouveau paramètre,
trace_profile_events_list, qui limite le tracing avectrace_profile_eventà la liste spécifiée de noms d’événements. Cela permet une collecte de données plus précise sur les charges de travail importantes. #92298 (Alexey Milovidov). - Prise en charge de SYSTEM NOTIFY FAILPOINT pour les failpoints pouvant être mis en pause. - Prise en charge de SYSTEM WAIT FAILPOINT fp PAUSE/RESUME. #92368 (Shaohua Wang).
- Ajout de la colonne
creation(implicit/explicit) àsystem.data_skipping_indices. #92378 (Raúl Marín). - Permet de transmettre à la source du dictionnaire la description des colonnes des tables dynamiques YTsaurus. #92391 (MikhailBurdukov).
- Dans #63985, nous avons permis de spécifier, port par port, tous les paramètres nécessaires à la configuration de TLS (voir protocoles composables), de sorte qu’il n’est plus nécessaire de s’appuyer sur une configuration TLS globale. Cependant, l’implémentation exige encore implicitement la présence d’une section de configuration globale
openSSL.server, ce qui pose problème dans les configurations où des paramètres TLS différents sont requis selon le port. Par exemple, dans les déploiements keeper-in-server, des configurations TLS distinctes sont nécessaires pour la communication inter-keeper et pour les connexions du clickhouse client. #92457 (Miсhael Stetsyuk). - Introduction d’un nouveau paramètre
input_format_binary_max_type_complexity, qui limite le nombre total de nœuds de type pouvant être décodés au format binaire afin d’éviter les payloads malveillants. #92519 (Raufs Dunamalijevs). - Afficher les tâches en cours d’exécution dans
system.background_schedule_pool{,_log}. Ajout de la documentation. #92587 (Azat Khuzhin). - Exécuter la requête en cours dans la recherche Ctrl+R du client si aucune correspondance n’est trouvée dans l’historique. #92749 (Azat Khuzhin).
- Prise en charge de
EXPLAIN indices = 1comme alias deEXPLAIN indexes = 1. Ferme #92483. #92774 (Pranav Tiwari). - Le lecteur Parquet permet désormais de lire des colonnes Tuple ou Map au format JSON :
select x from file(f.parquet, auto, 'x JSON')fonctionne même si le type de la colonnexdansf.parquetest tuple ou map. #92864 (Michael Kolupaev). - Prise en charge des tuples vides dans le lecteur Parquet. #92868 (Michael Kolupaev).
- Basculement vers une copie en lecture-écriture pour Azure Blob Storage lorsque la copie native échoue avec BadRequest (par ex. liste de blocs invalide). Auparavant, cela ne se produisait qu’en cas d’erreur Unauthorized, observée lors de la copie d’un blob vers différents comptes de stockage. Mais nous observons aussi parfois l’erreur “The specified block list is invalid”. La condition a donc été mise à jour pour basculer vers la lecture-écriture pour tous les échecs de copie native. #92888 (Smita Kulkarni).
- Correction du throttling de l’endpoint de métadonnées EC2 lors de l’exécution d’un grand nombre de requêtes S3 concurrentes avec des credentials de profil d’instance EC2. Auparavant, chaque requête créait son propre
AWSInstanceProfileCredentialsProvider, ce qui entraînait des requêtes concurrentes vers le service de métadonnées EC2 et pouvait provoquer des timeouts ainsi que des erreursHTTP response code: 403. Désormais, le fournisseur de credentials est mis en cache et partagé entre toutes les requêtes. #92891 (Sav). - Refonte du paramètre
insert_select_deduplicateafin de préserver la rétrocompatibilité. #92951 (Sema Checherinda). - Journaliser les tâches d’arrière-plan plus lentes que la moyenne (
background_schedule_pool_log.duration_threshold_milliseconds=30) afin d’éviter une journalisation excessive. #92965 (Azat Khuzhin). - Dans les versions précédentes, certains noms de fonctions C++ s’affichaient de manière incorrecte (« mangled ») dans
system.trace_logetsystem.symbols, et la fonctiondemanglene les traitait pas correctement. Corrige #93074. #93075 (Alexey Milovidov). - Introduction du paramètre de sauvegarde
backup_data_from_refreshable_materialized_view_targetspour ne pas sauvegarder les cibles des vues matérialisées actualisables. Les RMV avec une stratégie d’actualisation APPEND sont toujours sauvegardées. #93076 (Julia Kartseva). #93658 (Julia Kartseva) - Utilisation d’informations minimales de débogage au lieu de l’absence totale d’informations de débogage pour les unités de traduction volumineuses, comme les fonctions. #93079 (Alexey Milovidov).
- Ajout de la prise en charge de la compatibilité MinIO au SDK C++ AWS S3 via l’implémentation d’une correspondance des codes d’erreur pour les erreurs spécifiques à MinIO. Cette modification permet à ClickHouse de gérer correctement les erreurs du serveur MinIO et de les réessayer lors de l’utilisation de déploiements MinIO au lieu d’AWS S3, ce qui améliore la fiabilité pour les utilisateurs qui exécutent du stockage objet sur des clusters MinIO autohébergés. #93082 (XiaoBinMu).
- Écriture de profils jemalloc symbolisés (ce qui supprime la nécessité d’un binaire lors de la génération du profil du tas). #93099 (Azat Khuzhin).
- Restauration de l’outil
clickhouse git-import: il ne fonctionnait plus avec des commits volumineux et invalides. Voir https://presentations.clickhouse.com/2020-matemarketing/. #93202 (Alexey Milovidov). - Ne plus afficher les mots de passe du stockage URL dans le query log. #93245 (Konstantin Vedernikov).
- Prise en charge du type
GeometrypourflipCoordinates. #93303 (Bharat Nallan). - Amélioration de l’UX de SYSTEM INSTRUMENT ADD/REMOVE : utilisation de littéraux
Stringpour les noms de fonctions, application du correctif à toutes les fonctions correspondantes et possibilité d’utiliser function_name dansREMOVE. #93345 (Pablo Marcos). - Ajout d’un nouveau paramètre
materialize_statistics_on_mergequi active ou désactive la matérialisation des statistiques lors de la fusion. La valeur par défaut est1. #93379 (Han Fei). - ClickHouse peut désormais analyser
SELECTsans parenthèses dans les requêtesDESCRIBE SELECT. Corrige #58382. #93429 (Yarik Briukhovetskyi). - Ajout d’une randomisation probabiliste des vérifications de validité du cache. #93439 (Kseniia Sumarokova).
- Ajout du paramètre
type_json_allow_duplicated_key_with_literal_and_nested_objectpour autoriser les chemins dupliqués dans JSON lorsque l’un correspond à un littéral et l’autre à un objet imbriqué, par ex.{"a" : 42, "a" : {"b" : 42}}. Certaines données ont pu être créées avant l’ajout de cette restriction sur les chemins dupliqués dans https://github.com/ClickHouse/ClickHouse/pull/79317, et toute manipulation ultérieure de ces données peut désormais provoquer des erreurs. Avec ce paramètre, ces anciennes données peuvent encore être utilisées sans erreur. #93604 (Pavel Kruglov). - N’affichez plus les valeurs des types simples sur des lignes distinctes dans Pretty JSON. #93836 (Pavel Kruglov).
- Lorsqu’il y a beaucoup d’instructions
alter table ... modify setting ..., il peut arriver que le verrou ne soit pas acquis pendant 5 secondes. Il vaut mieux renvoyertimeoutquelogical error. #93856 (Han Fei). - Éviter une sortie excessive en cas d’erreur de syntaxe. Avant ce changement, l’intégralité du script SQL était affichée, ce qui pouvait contenir un grand nombre de requêtes. #93876 (Alexey Milovidov).
- Effectuer un calcul correct de la taille en octets de la requête
checkavec statistiques dans Keeper. #93907 (Mikhail Artemenko). - Ajout du paramètre
use_hash_table_stats_for_join_reorderingpour contrôler si les statistiques de taille des tables de hachage à l’exécution sont utilisées pour réordonner les jointures. Ce paramètre est activé par défaut, ce qui préserve le comportement existant decollect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov). - Les utilisateurs peuvent désormais consulter partiellement les paramètres globaux imbriqués du server dans la table
system.server_settings(par ex.logger.level). Cela ne couvre que les paramètres à structure fixe (pas de listes, d’énumérations, de répétitions, etc.). #94001 (Hechem Selmi). QBitpeut désormais être comparé pour l’égalité. #94078 (Raufs Dunamalijevs).- Lorsque Keeper détecte un snapshot corrompu ou des changelogs incohérents, lever une exception au lieu d’interrompre manuellement ou de nettoyer automatiquement les fichiers. Cela devrait rendre le comportement de Keeper plus sûr, en reposant sur une intervention manuelle. #94168 (Antonio Andelic).
- Correction des résidus potentiels laissés en cas d’échec de
CREATE TABLE. #94174 (Azat Khuzhin). - Correction d’un accès à de la mémoire non initialisée (un bug dans OpenSSL) lorsqu’une clé TLS protégée par mot de passe est utilisée. #94182 (Konstantin Bogdanov).
- Mise à niveau de chdig vers v26.1.1. #94290 (Azat Khuzhin).
- Prise en charge d’un partitionnement plus générique pour le mode ordered de S3Queue. #94321 (Bharat Nallan).
- Ajout de l’alias
use_statisticspour le paramètreallow_statistics_optimize. C’est plus cohérent avec les paramètres existantsuse_primary_keyetuse_skip_indexes. #94366 (Robert Schulze). - Activation du paramètre
input_format_numbers_enum_on_conversion_errorpour la conversion de Numbers en Enums afin de vérifier si l’élément existe. #94384 (Elmi Ahmadov). - En mode ordered de S3(Azure)Queue, nettoyage des nœuds en échec selon les limites de suivi (auparavant, cela n’était fait qu’en mode unordered, à la fois pour les éléments en échec et ceux traités ; désormais, cela s’applique aussi au mode ordered, mais uniquement pour les nœuds en échec). #94412 (Kseniia Sumarokova).
- Activation de la gestion des accès pour l’utilisateur
defaultdans clickhouse-local. L’utilisateur par défaut declickhouse-localne disposait pas du privilège access_management, ce qui faisait échouer des opérations commeDROP ROW POLICY IF EXISTSavec l’erreurACCESS_DENIED, alors que cet utilisateur ne devrait avoir aucune restriction. #94501 (Alexey Milovidov). - Activation des collections nommées pour les dictionnaires et les tables YTsaurus. #94582 (MikhailBurdukov).
- Ajout de la prise en charge des collections nommées définies en SQL dans BACKUP/RESTORE pour S3 et Azure Blob Storage. Résout #94604. #94605 (Pablo Marcos).
- Prise en charge du bucketing basé sur la clé de partition pour S3Queue en mode ordered. #94698 (Bharat Nallan).
- Ajout d’une métrique asynchrone indiquant le temps écoulé de la fusion la plus longue en cours d’exécution. #94825 (Raúl Marín).
- Ajout d’une vérification de l’appartenance du fichier avant d’appliquer la suppression par position à l’aide de IcebergBitmapPositionDeleteTransform. #94897 (Yang Jiang).
- Désormais,
view_duration_msindique la durée pendant laquelle le groupe a été actif, et non la somme des durées des threads qu’il contient. #94966 (Sema Checherinda). - Suppression de la limite du nombre maximal de tokens de recherche dans les fonctions
hasAnyTokensethasAllTokens, auparavant fixée à 64. Exemple :SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);La requête entraînait une erreurBAD_ARGUMENTScar elle contenait 65 tokens de recherche. Avec cette PR, cette limite a été entièrement supprimée, et la même requête s’exécute désormais sans erreur. #95152 (Elmi Ahmadov). - Ajout d’un paramètre
input_format_numbers_enum_on_conversion_errorpour la conversion de Numbers en Enums afin de vérifier si l’élément existe. Résout : #56144. #56240 (Nikolay Degterinsky). - Partage des ressources du parseur de format entre la lecture du fichier de données et celle du fichier de suppression par position dans les tables Iceberg afin de réduire les allocations mémoire. #94701 (Yang Jiang).
Correction de bug (comportement incorrect perceptible par l’utilisateur dans une version stable officielle)
- Corrige un bug où les gestionnaires de requêtes prédéfinies interprétaient les espaces en fin de ligne comme des données lors des insertions. #83604 (Fabian Ponce).
- Corrige l’erreur INCOMPATIBLE_TYPE_OF_JOIN lorsque le moteur Join est utilisé et que l’optimisation de jointure outer vers inner est appliquée. Résout #80794. #84292 (Vladimir Cherkasov).
- Corrige l’exception “Invalid number of rows in Chunk” lors de l’utilisation d’un hash join avec
allow_experimental_join_right_table_sortingactivé. #86440 (yanglongwei). - Remplace systématiquement les noms de fichiers par un hash dans MergeTree si le système de fichiers est insensible à la casse. Auparavant, sur les systèmes dotés d’un système de fichiers insensible à la casse (comme MacOS), cela pouvait entraîner une corruption des données lorsque plusieurs noms de colonne/sous-colonne ne différaient que par la casse. #86559 (Pavel Kruglov).
- Ajoute une vérification complète des permissions à l’étape de création pour la requête sous-jacente d’une vue matérialisée. #89180 (pufit).
- Corrige un crash dans la fonction
icebergHashavec un argument constant. #90335 (Michael Kolupaev). - Corrige une erreur logique lorsqu’une mutation sans transaction modifie des parts dans une transaction active, finalement annulée. #90469 (Shaohua Wang).
- Met correctement à jour
system.warningsaprès la conversion d’une base de données ordinaire en base de données atomic. #90473 (sdk2). - Corrige une assertion lors de la lecture d’un fichier Parquet, lorsqu’une partie d’une expression prewhere est utilisée ailleurs dans la requête. #90635 (Max Kainov).
- Corrige un crash dans un cluster à nœud unique lors de la lecture depuis Iceberg en mode split-by-buckets. Cela clôt #90913. #91553 (Konstantin Vedernikov).
- Corrige une possible erreur logique dans le moteur Log lors de la lecture des sous-colonnes. Clôt #91710. #91711 (Pavel Kruglov).
- Corrige l’erreur logique : ‘Storage does not support transaction’ pendant ATTACH AS REPLICATED. #91772 (Shaohua Wang).
- Corrige le fonctionnement incorrect des runtime filters lorsque LEFT ANTI JOIN comporte une post-condition supplémentaire. #91824 (Alexander Gololobov).
- Corrige une erreur survenant en présence d’une comparaison null-safe impliquant le type Nothing. Clôt #91834. Clôt #84870. Clôt #91821. #91884 (Yarik Briukhovetskyi).
- Corrige des bugs de décodage DELTA_BYTE_ARRAY dans le lecteur Parquet natif, qui affectaient les données de chaînes très répétitives. #91929 (Daniel Muino).
- Met en cache le schéma uniquement pour le fichier dont il a été inféré dans les globs, au lieu de tous les fichiers lors de l’inférence de schéma. Clôt #91745. #92006 (Pavel Kruglov).
- Corrige l’erreur
Couldn't pack tar archive: Failed to write all bytescausée par un en-tête de taille d’entrée d’archive incorrect. Corrige #89075. #92122 (Julia Kartseva). - Libère le flux de requête dans insert select afin d’éviter la fermeture de la connexion HTTP. #92175 (Sema Checherinda).
- Corrige une erreur logique pour les requêtes avec plusieurs JOIN avec la clause
USINGetjoin_use_nulls. #92251 (Vladimir Cherkasov). - Corrige une erreur logique lors de la réorganisation des jointures avec join_use_nulls, clôt https://github.com/clickhouse/clickhouse/issues/90795. #92289 (Vladimir Cherkasov).
- Corrige le formatage AST incohérent de
arrayElementavec un littéral négatif. Clôt #92288 Clôt #92212 Clôt #91832 Clôt #91789 Clôt #91735 Clôt #88495 Clôt #92386. #92293 (Pavel Kruglov). - Corrige un crash possible avec le paramètre
join_on_disk_max_files_to_merge. #92335 (Bharat Nallan). - Problème connexe #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
- Corrige l’absence de vérification d’accès dans
SYSTEM SYNC FILE CACHE. Clôt #92101. #92372 (Kseniia Sumarokova). - Corrige l’application de
count_distinct_optimizationaux fonctions de fenêtre et à plusieurs arguments. #92376 (Raúl Marín). - Corrige l’erreur “Cannot write to finalized buffer” lors de l’utilisation de certaines fonctions d’agrégation avec des fonctions de fenêtre. Clôt #91415. #92395 (Jimmy Aguilar Mena).
- Corrige une erreur logique avec
CREATE TABLE ... AS urlCluster()et le moteur de base de donnéesReplicated. Clôt #92216. #92418 (Kseniia Sumarokova). - Hérite, lors d’une mutation dans MergeTree, des paramètres d’information de sérialisation de la part source. Cela corrige un résultat potentiellement incorrect d’une requête sur une part mutée après des modifications de la sérialisation des types de données. #92419 (Pavel Kruglov).
- Correction d’un conflit possible entre une colonne et une sous-colonne portant le même nom, qui entraînait l’utilisation d’une mauvaise sérialisation et des échecs de requête. Clôt #90219. Clôt #85161. #92453 (Pavel Kruglov).
- Correction de
LOGICAL_ERRORs causées par une modification indésirable du plan de requête lors de la conversion d’une jointure externe en jointure interne. Assouplit également les conditions d’optimisation pour pouvoir l’appliquer lorsque des fonctions injectives sont appliquées aux clés d’agrégation dans les jointures. #92503 (János Benjamin Antal). - Correction d’une possible erreur
SIZES_OF_COLUMNS_DOESNT_MATCHlors du tri d’une colonne Tuple vide. Clôt #92422. #92520 (Pavel Kruglov). - Vérification des chemins typés incompatibles dans le type JSON. Clôt #91577. #92539 (Pavel Kruglov).
- Correction d’un interblocage avec SHOW CREATE DATABASE pour une base de données Backup. #92541 (Azat Khuzhin).
- Utilisation du code d’erreur approprié lors de la validation d’un index hypothétique. #92559 (Raúl Marín).
- Correction de la résolution des sous-colonnes dynamiques dans les alias de colonne dans l’analyseur. Auparavant, une sous-colonne dynamique dans un alias de colonne était enveloppée dans
getSubcolumnet, dans certains cas, pouvait ne pas être résolue du tout. Clôt #91434. #92583 (Pavel Kruglov). - Empêche un crash dans tokens() avec un deuxième argument NULL. #92586 (Raúl Marín).
- Correction d’un crash potentiel causé par une mutation en place des colonnes PREWHERE const sous-jacentes. Cela pouvait se produire lors de la réduction de la taille d’une colonne (
IColumn::shrinkToFit) ou du filtrage (IColumn::filter), qui pouvaient être déclenchés concurremment par plusieurs threads. #92588 (Arsen Muk). - La création et la matérialisation de text indexes sur des tables contenant de grandes parts (plus de 4 294 967 295 lignes) sont temporairement désactivées. Cette limitation évite des résultats de requête incorrects, car l’implémentation actuelle de l’index ne prend pas encore en charge des parts aussi volumineuses. #92644 (Anton Popov).
- Correction d’une erreur logique
Too large size (A) passed to allocatorlors de l’exécution de JOINs. Clôt #92043. #92667 (Yarik Briukhovetskyi). - Correction d’un bogue qui faisait que les index
ngrambf_v1avec une longueur de ngram (1er paramètre) > 8 pouvaient lever une exception. #92672 (Robert Schulze). - Correction d’une exception non interceptée lors du rechargement en arrière-plan des collections nommées lorsque le stockage ZooKeeper est utilisé. Clôt https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
- Revoit la logique incorrecte des vérifications des grants d’accès pour les grants avec caractères génériques. La tentative précédente https://github.com/ClickHouse/ClickHouse/pull/90928 corrigeait une vulnérabilité critique, mais s’est révélée trop restrictive, ce qui faisait échouer certaines instructions
GRANTavec caractères génériques à cause de révocations sans rapport. #92725 (pufit). - Corrige un bug dans la logique de skipping des données lorsque
not match(...)est utilisé dansWHERE, ce qui provoquait des résultats incorrects. Clôt #92492. #92726 (Nihal Z. Miaji). - N’essaie pas de supprimer les répertoires temporaires au démarrage si une table MergeTree est créée sur un disque en lecture seule. #92748 (Alexey Milovidov).
- Corrige
Cannot add action to empty ExpressionActionsChainpour ALTER TABLE REWRITE PARTS (v2). #92754 (Azat Khuzhin). - Évite un crash dû à la lecture depuis une
Connectiondéconnectée. #92807 (Raufs Dunamalijevs). - Corrige l’erreur logique
Failed to set file processing within 100 retriesdans le stockageS3Queueen modeOrdered. Elle est désormais remplacée par un avertissement. Cette erreur pouvait survenir avant la version 25.10 si la session Keeper expirait ; toutefois, dans les versions 25.10+, elle restera un avertissement, car il reste théoriquement possible qu’elle se produise en cas de forte concurrence de traitement en modeOrdered. #92814 (Kseniia Sumarokova). - Auparavant, certaines requêtes utilisant le sharding PK avec une condition fausse échouaient. Ce n’est désormais plus le cas. Nécessaire pour https://github.com/ClickHouse/ClickHouse/pull/89313. #92815 (Yarik Briukhovetskyi).
- Corrige le calcul des tailles non compressées des text indexes dans la table
system.parts. #92832 (Anton Popov). - Corrige l’utilisation du primary index dans les lightweight updates comportant une clause
INavec des subqueries dans le prédicat de la clauseWHERE. #92838 (Anton Popov). - Corrige la création d’un type hint pour le chemin ‘skip’ en JSON. Clôt #92731. #92842 (Pavel Kruglov).
- Dans le S3 table engine, il faut éviter de mettre en cache la partition key en présence de fonctions non déterministes. #92844 (Miсhael Stetsyuk).
- Corrige une possible erreur
FILE_DOESNT_EXISTaprès la mutation d’une colonne sparse avecratio_of_defaults_for_sparse_serialization=0.0. Clôt #92633. #92860 (Pavel Kruglov). - Corrige la schema inference Parquet dans l’ancien parquet reader (non utilisé par défaut) lorsqu’une JSON column vient après une colonne Tuple. Corrige également l’échec de l’ancien parquet reader (non utilisé par défaut) sur les tuples vides. #92867 (Michael Kolupaev).
- Correction d’une erreur logique avec plusieurs jointures sur une condition constante et
join_use_nulls, ferme #92640. #92892 (Vladimir Cherkasov). - Correction d’une erreur possible
NOT_FOUND_COLUMN_IN_BLOCKlors d’un insert dans une table avec une sous-colonne dans l’expression de partition. Ferme #93210. Ferme #83406. #92905 (Pavel Kruglov). - Correction de l’erreur
NO_SUCH_COLUMN_IN_TABLEdans le moteur Merge sur des tables avec alias. Ferme #88665. #92910 (Pavel Kruglov). - Correction du cas NULL != NULL pour
full_sorting_joinsur une colonne LowCardinality(Nullable(T)). #92924 (Vladimir Cherkasov). - Correction de plusieurs crashs lors des merges de text indexes dans les tables
MergeTree. #92925 (Anton Popov). - Restauration des wrappers LowCardinality sur les résultats d’expressions SET si nécessaire pendant l’aggregation TTL afin d’éviter des exceptions lors de l’optimisation de la table. #92971 (Seva Potapov).
- Correction d’une erreur logique lors de l’index analysis lorsqu’un tableau vide est utilisé dans la fonction
has. Ferme #92906. #92995 (Nihal Z. Miaji). - Correction d’un blocage possible lors de l’arrêt du background schedule pool (pouvant entraîner des blocages du server à l’arrêt). #93008 (Azat Khuzhin).
- Correction d’une erreur possible FILE_DOESNT_EXIST après une mutation de colonne sparse lorsque le paramètre
ratio_of_defaults_for_sparse_serializationa été modifié à1.0via alter. #93016 (Pavel Kruglov). - Correction d’un bug dans la logique de skipping des données lorsque
not materialize(...)ounot CAST(...)est utilisé dans WHERE, ce qui provoquait des résultats incorrects. Ferme #88536. #93017 (Nihal Z. Miaji). - Correction d’une utilisation possible de parts obsolètes en raison d’une situation de compétition TOCTOU sur des parts partagées. #93022 (Azat Khuzhin).
- Correction d’un crash lors de la désérialisation d’un aggregate state
groupConcatmal formé avec des offsets hors limites. #93028 (Raufs Dunamalijevs). - Correction d’un état de connexion corrompu après l’annulation préliminaire de distributed queries. #93029 (Azat Khuzhin).
- Correction des résultats de jointure lorsque la join key du côté droit est une colonne sparse. Cela ferme #92920. Je ne peux reproduire le bug qu’avec
set compatibility='23.3'. Je ne sais pas s’il faut le rétroporter. #93038 (Amos Bird). - Corrige un possible
Cannot finalize buffer after cancellationdansestimateCompressionRatio(). Correctif : #87380. #93068 (Azat Khuzhin). - Corrige les merges d’index textuels construits à partir d’expressions complexes (comme
concat(col1, col2)). #93073 (Anton Popov). - Corrige l’application d’une projection lorsque le filtre contient des sous-colonnes. Ferme #92882. #93141 (Pavel Kruglov).
- Corrige une erreur logique survenant dans certains cas lorsque des filtres runtime de jointure sont ajoutés au plan de requête. Cela était dû au renvoi incorrect de colonnes constantes dupliquées depuis l’un des côtés de la jointure. #93144 (Alexander Gololobov).
- La fonction spéciale
__applyFilter, utilisée par les filtres runtime de jointure, renvoyaitILLEGAL_TYPE_OF_ARGUMENTdans certains cas pourtant valides. #93187 (Alexander Gololobov). - Empêche que différentes colonnes interpolées ne soient fusionnées en une seule colonne dans un bloc lorsque ces colonnes interpolées sont en réalité des alias de la même colonne. #93197 (Yakov Olkhovskiy).
- N’ajoute pas de filtre runtime lors d’une jointure avec une table de droite déjà remplie. #93211 (Alexander Gololobov).
- Corrige le nettoyage des watches persistantes de Keeper après une session expirée. Ferme #92480. #93213 (Konstantin Vedernikov).
- Corrige ORDER BY sur un Tuple dans Iceberg. Ferme #92977. #93225 (Konstantin Vedernikov).
- Corrige un bug du paramètre S3Queue
s3queue_migrate_old_metadata_to_buckets. Ferme #93392, #93196, #81739. #93232 (Kseniia Sumarokova). - Supprime les colonnes inutilisées lorsque la projection est reconstruite pendant le merge. Cela réduit l’utilisation de la mémoire et crée moins de parts temporaires. #93233 (Nikolai Kochetov).
- Corrige la suppression de colonnes inutilisées dans des sous-requêtes en présence d’une sous-requête corrélée scalaire. Avant ce correctif, une colonne pouvait être supprimée si elle n’était utilisée que dans la sous-requête corrélée, ce qui faisait échouer la requête avec l’erreur
NOT_FOUND_COLUMN_IN_BLOCK. #93273 (Dmitry Novik). - Corrige une possible sous-colonne manquante dans une MV lors d’un ALTER de la table source. Ferme #93231. #93276 (Pavel Kruglov).
- Correction de la planification des requêtes du moteur de table
Mergeavec l’analyseur, qui pouvait lever ILLEGAL_COLUMN pourhostName()lors de la fusion de tables locales et distantes/Distributed. Clôt #92059. #93286 (Jinlin). - Correction d’un cas où NOT IN avec des arguments Array non constants renvoyait une valeur incorrecte + prise en charge des fonctions Array non constantes. Clôt #14980. #93314 (Yarik Briukhovetskyi).
- Correction de l’erreur
Not found columnpour l’optimisationuse_top_k_dynamic_filtering. Corrige #93186. #93316 (Nikolai Kochetov). - Correction de la reconstruction des index de texte créés à partir de sous-colonnes. #93326 (Anton Popov).
- Correction de la gestion d’un tableau vide comme deuxième argument dans les fonctions
hasAllTokensethasAnyTokens. #93328 (Anton Popov). - Correction d’une erreur logique lorsque des runtime filters sont utilisés dans une requête avec des totaux pour la table du côté droit. #93330 (Alexander Gololobov).
- Le serveur ne plante plus si la fonction
tokensest appelée avec des paramètres de tokenizer non constants (les 2e, 3e et 4e paramètres), par ex.SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze). - Correction d’une vulnérabilité de dépassement d’entier dans la désérialisation de l’état de
groupConcat, qui pouvait entraîner des problèmes de sécurité mémoire avec des aggregate states forgés. #93426 (Raufs Dunamalijevs). - Correction de l’analyse d’index de texte sur les colonnes de tableau lorsque l’index ne contient aucun token (tous les tableaux sont vides ou tous les tokens sont ignorés par le tokenizer). #93457 (Anton Popov).
- Évite la connexion OAuth dans ClickHouse Client lorsque le nom d’utilisateur/mot de passe figure dans la chaîne de connexion. #93459 (Krishna Mannem).
- Correction de la prise en charge des credentials fournis par Azure ADLS Gen2 dans DataLakeCatalog - analyse des clés
adls.sas-token.*provenant des REST catalogs Iceberg et correction de l’analyse des URL ABFSS. #93477 (Karun Anantharaman). - Correction de la prise en charge de GLOBAL IN avec l’analyseur (auparavant, l’ensemble était recréé sur le nœud distant). #93507 (Azat Khuzhin).
- Correction de l’extraction d’une sous-colonne lors de la désérialisation directement dans des colonnes Sparse. #93512 (Pavel Kruglov).
- Correction de la lecture directe depuis l’index de texte avec des requêtes de recherche dupliquées. #93516 (Anton Popov).
- Correction de l’erreur NOT_FOUND_COLUMN_IN_BLOCK lorsque le runtime filter est activé et que des tables jointes renvoient plusieurs fois la même colonne (par ex. SELECT a, a, a FROM t). #93526 (Alexander Gololobov).
- Correction d’un bug où clickhouse-client demandait le mot de passe deux fois lors d’une connexion via ssh. #93547 (Isak Ellmer).
- S’assurer que ZooKeeper est bien finalisé lors de l’arrêt (corrige un possible blocage à l’arrêt dans des cas très improbables). #93602 (Azat Khuzhin).
- Correction de LOGICAL_ERROR lors de la restauration de ReplicatedMergeTree en cas de concurrence pendant la déduplication. #93612 (Pablo Marcos).
- Correction de l’utilisation d’une colonne Sparse pour la mise à jour TTL lors d’une désérialisation directe dans des colonnes Sparse dans certains formats d’entrée. Cela corrige l’erreur logique possible
Unexpected type of result TTL column. #93619 (Pavel Kruglov). - Correction de fonctions d’index H3 qui plantaient parfois ou restaient bloquées lorsqu’elles étaient appelées avec des entrées invalides. #93657 (Michael Kolupaev).
- L’utilisation de l’index
ngram_bfsur des données non UTF-8 entraînait une lecture de mémoire non initialisée, avec des valeurs pouvant se retrouver dans la structure d’index résultante. Ferme #92576. #93663 (Alexey Milovidov). - Validation de la taille attendue du tampon décompressé. #93690 (Raúl Marín).
- Empêche les utilisateurs d’obtenir la liste des colonnes d’une table sans vérification du privilège
SHOW COLUMNSen utilisant le moteur de tablemerge. #93695 (János Benjamin Antal). - Correction de la matérialisation des skip indexes créés à partir de sous-colonnes. #93708 (Anton Popov).
- Nous stockons des pointeurs partagés vers les stockages dans
QueryPipeline::resources::storage_holderspour nous assurer que les objetsIStoragene sont pas détruits tant quePipelineExecutorest actif. #93746 (Miсhael Stetsyuk). - Correction de l’opération Attach des DB Replicated lorsque l’hôte interserver changeait après un redémarrage. #93779 (Tuan Pham Anh).
- Correction de l’assertion
!read_until_positiondansReadBufferFromS3, qui se produisait lorsque le cache était activé. #93809 (Kseniia Sumarokova). - Correction d’une erreur logique dans un cas rare où un tuple vide est utilisé avec la colonne
Map. Ferme #93784. #93814 (Nihal Z. Miaji). - Correction de la corruption de
_part_offsetlorsque les projections sont reconstruites pendant les merges, et optimisation du traitement des projections en évitant des lectures inutiles de la colonne_part_offsetainsi qu’en ignorant les colonnes non nécessaires dans les calculs de projection. Cela prolonge les optimisations introduites dans #93233. #93827 (Amos Bird). - Suppression de la gestion de ‘Bad version’. #93843 (Anton Ivashkin).
- Correction de
optimize_inverse_dictionary_lookup, qui ne fonctionnait pas avec une requête distribuée lorsque la clé était de type intégral signé. Closes #93259. #93848 (Nihal Z. Miaji). - Correction de
lag/lead, qui ne fonctionnaient pas avec une requête distribuéeremote(). Closes #90014. #93858 (Nihal Z. Miaji). - Correction d’un bug dans le mécanisme de dispatch de system instrument. #93937 (Pablo Marcos).
- Dans https://github.com/ClickHouse/ClickHouse/pull/89173, nous avons ajouté un field supplémentaire à la structure que
TraceSenderenvoie via un pipe interne. Cependant, la taille du buffer n’a pas été mise à jour (ici) ; nous écrivions donc plus de données dans le buffer quebuffer_size, ce qui entraînait plusieurs flushes. Et commeTraceSender::sendest appelé depuis différents threads, les flushes de différents threads peuvent s’entrelacer, ce qui rompt l’invariant sur lequel s’appuie l’extrémité réceptrice (TraceCollector). #93966 (Miсhael Stetsyuk). - Correction de la conversion de type vers le supertype lors de l’opération JOIN du storage
Joinavec la clauseUSING. Fixes #91672. Fixes #78572. #94000 (Dmitry Novik). - Correction de l’ajout incorrect de FilterStep lorsqu’un filtre d’exécution de join est appliqué à une Merge table. #94021 (Alexander Gololobov).
- Une requête
SELECTcontenant un prédicat sur plusieurs colonnes avec des skip indexes bloom filter, en présence à la fois de conditionsORetNOT, pouvait renvoyer des résultats incohérents. C’est désormais corrigé. #94026 (Shankar Iyer). - Correction de CLEAR column avec des index dépendants. #94057 (Raúl Marín).
- Correction d’une utilisation de valeur non initialisée dans
ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov). - Correction d’une validation incorrecte des paths typés dans JSON. Cette validation a été introduite dans https://github.com/ClickHouse/ClickHouse/pull/92842 et peut entraîner une erreur au démarrage de tables existantes. #94070 (Pavel Kruglov).
- Correction d’un crash pendant l’analyse du filtre en présence d’un OUTER JOIN. Fixes #90979. #94080 (Dmitry Novik).
- Correction de la précision de
uniqThetalors de l’utilisation, en parallèle, de clés d’agrégation UInt8 (max_threads> 1 - par défaut). #94095 (Azat Khuzhin). - Correction d’un crash provoqué par une exception levée lors d’un appel à
socket.setBlocking(true)à l’intérieur deSCOPE_EXIT. #94100 (Miсhael Stetsyuk). - Correction d’une perte de données lorsque
DROP PARTITIONsupprime des parts créées par des entrées de log plus récentes dans ReplicatedMergeTree. #94123 (Tuan Pham Anh). - Correction du lecteur Parquet v3, qui gérait incorrectement les tableaux traversant des limites de page. Cela se produit par exemple avec des fichiers écrits par Arrow sans activer les statistiques de page ni l’index de page. N’affecte que les colonnes de type Array. Le symptôme le plus probable est qu’un tableau est tronqué environ toutes les ~1 Mo de données. En attendant ce correctif, utilisez ce paramètre comme solution de contournement :
input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev). - Correction d’un trop grand nombre de watches dans ReplicatedMergeTree lors de l’attente d’une entrée de log. #94133 (Azat Khuzhin).
- Les fonctions
arrayShuffle,arrayPartialShuffleetarrayRandomSamplematérialisent désormais les colonnes constantes, afin que différentes lignes produisent des résultats différents. #94134 (Joanna Hulboj). - Correction d’une data race lors de l’évaluation des fonctions de table dans les vues matérialisées. #94171 (Alexey Milovidov).
- Correction d’un déréférencement de pointeur nul dans les moteurs de base de données
PostgreSQL(lorsque la requête est incorrecte). Clôture #92887. #94180 (Alexey Milovidov). - Correction d’une fuite mémoire dans les vues matérialisées actualisables utilisant des requêtes
SELECTavec plusieurs sous-requêtes. #94200 (Antonio Andelic). - Correction d’une data race entre
DataPartStorageOnDiskBase::removeetsystem.parts. Clôture #49076. #94262 (Alexey Milovidov). - Suppression du mauvais spécificateur
noexceptdans l’affectation par copie de HashTable, qui pouvait entraîner un crash (std::terminate) en cas d’exception mémoire. #94275 (Nikita Taranov). - Auparavant, créer une projection avec des colonnes dupliquées dans GROUP BY (par exemple,
GROUP BY c0, c0) puis insérer des données provoquait unestd::length_errorsioptimize_row_orderest activé. Clôture #94065. #94277 (Alexey Milovidov). - Correction d’un bug obscur dans le client ZooKeeper à la connexion, provoquant des blocages et des crashs. #94320 (Azat Khuzhin).
- Correction d’une optimisation réécrivant les fonctions en accès aux sous-colonnes, qui n’était pas appliquée aux sous-colonnes. #94323 (Pavel Kruglov).
- Correction d’un résultat potentiellement incorrect dans des RIGHT JOIN imbriqués lorsque
enable_lazy_columns_replicationest activé. Le bug faisait que toutes les lignes des colonnes répliquées renvoyaient à tort la même valeur au lieu de leurs valeurs distinctes. Clôture #93891. #94339 (Vladimir Cherkasov). - Correction du pushdown de filtre pour
SEMI JOINà l’aide d’ensembles d’équivalence. Le filtre n’est pas poussé vers le bas si les types d’argument ont changé. Corrige #93264. #94340 (Dmitry Novik). - Correction de l’utilisation de DeltaLake CDF avec le moteur de base de données DataLake (intégration des catalogs Delta Lake). Clôt #94122. #94342 (Kseniia Sumarokova).
- Correction de la valeur incorrecte de la métrique
FilesystemCacheSizeLimitlorsqu’une cache policySLRUétait utilisée. #94363 (Kseniia Sumarokova). - La création d’un moteur de base de données Backup avec moins de deux arguments renvoie désormais un message d’erreur plus explicite (
Wrong number of argumentsau lieu destd::out_of_range: InlinedVector::at(size_type) const failed bounds check.). #94374 (Robert Schulze). - Ignore les révocations impossibles de privilèges globaux au niveau de la base de données pour les privilèges avec l’option GRANT. #94386 (pufit).
- Correction de la lecture des offsets épars depuis des parties compactes. Clôt #94385. #94399 (Pavel Kruglov).
- N’empêche plus l’ALTER des colonnes utilisant des index implicites, même si le mode
throwdealter_column_secondary_index_modeest utilisé. #94425 (Raúl Marín). - Correction d’un crash dans
TCPHandlerlorsque plusieurs appels àreceivePacketsExpectQuerylisentProtocol::Client::IgnoredPartUUIDs. #94434 (Miсhael Stetsyuk). - Correction du masquage des données sensibles dans
system.functions. #94436 (Vitaly Baranov). - Correction d’un déréférencement de pointeur nul avec
send_profile_eventsdésactivé. Cette fonctionnalité a été introduite récemment pour le driver Python de ClickHouse. Clôt #92488. #94466 (Alexey Milovidov). - Correction d’une incompatibilité
.mrkde l’index de texte pendant les fusions. #94494 (Peng Jian). - Lorsque
read_in_order_use_virtual_rowest activé, le code accédait aux colonnes d’index en se basant sur la taille complète de la clé primaire sans vérifier si l’index avait été tronqué, ce qui entraînait une utilisation après libération / mémoire non initialisée. Clôt #85596. #94500 (Alexey Milovidov). - Correction d’une erreur due à une incompatibilité de type lors de l’envoi de tables externes pour des sous-requêtes avec GLOBAL IN si les types sont Nullable. Clôt #94097. #94511 (Alexey Milovidov).
- Dans les versions précédentes, les requêtes comportant plusieurs conditions d’index sur la même expression pouvaient, à tort, lever l’exception
Not found column. Clôt #60660. #94515 (Alexey Milovidov). - Corrige la gestion incorrecte d’une colonne de jointure Nullable dans les filtres d’exécution. #94555 (Alexander Gololobov).
- La création d’un workload dans un autre workload déjà en cours d’utilisation ne provoque plus de crash. #94599 (Sergei Trifonov).
- Corrige un crash lors de l’optimisation de ANY LEFT JOIN lorsque
isNotNullest évalué sur une colonne absente. #94600 (Molly). - Corrige l’évaluation des expressions par défaut lorsqu’elles référencent d’autres colonnes ayant des valeurs par défaut calculées. #94615 (Alexey Milovidov).
- Corrige les problèmes d’autorisation dans les opérations BACKUP/RESTORE. #94617 (Pablo Marcos).
- Corrige un crash dû à une conversion de type incorrecte lorsque le type de données est
Nullable(DateTime64). #94627 (Miсhael Stetsyuk). - Corrige un bug où certaines requêtes distribuées avec
ORDER BYpouvaient renvoyer des colonnesALIASavec des valeurs inversées (c.-à-d. la colonneaaffichant les données de la colonneb, et inversement). #94644 (filimonov). - Corrige l’enregistrement des résultats de keeper-bench dans un fichier. #94654 (Antonio Andelic).
- Corrige des estimations incorrectes avec des statistiques de type MinMax lorsque la colonne contient des valeurs négatives à virgule flottante. #94665 (zoomxi).
- Corrige la lecture des fichiers Parquet lorsque la clé d’une map est une struct. #94670 (Konstantin Vedernikov).
- Corrige un résultat de RIGHT JOIN potentiellement incorrect lors de l’utilisation de conditions ON complexes. Clôt #92913. #94680 (Vladimir Cherkasov).
- Préserve la granularité d’index constante (use_const_adaptive_granularity) après les fusions verticales. #94725 (Azat Khuzhin).
- Corrige un bug de mutation avec des sous-requêtes scalaires et des dépendances de table. Si une table avait des dépendances (index ou projections) sur une colonne, les sous-requêtes scalaires pouvaient être évaluées et mises en cache sans données, entraînant des modifications incorrectes. #94731 (Raúl Marín).
- Corrige le fallback de cpu_pressure d’AsynchronousMetrics en cas d’erreur. #94827 (Raúl Marín).
- La fonction
getURLHostRFCn’effectuait pas de vérification des limites avant le déréférencement des pointeurs. Lorsqu’une chaîne vide était passée àdomainRFC, elle lisait de la mémoire non initialisée, déclenchant des erreurs MSan. #94851 (Alexey Milovidov). - Corrige le caractère readonly des disques chiffrés. #94852 (Azat Khuzhin).
- Corrige une erreur logique dans
LIMIT/OFFSETfractionnaire lors de l’utilisation de l’ancien analyseur avec les tables Distributed. Clôt #94712. #94999 (Ahmed Gouda). - Corrige un plantage dans certaines conditions lorsque les filtres runtime de jointure sont activés par défaut. #95000 (Alexander Gololobov).
- Améliore le masquage des mots de passe dans les URL utilisées dans le moteur de table
URL()et la fonction de tableurl(). #95006 (Vitaly Baranov). - La fonction
toStartOfIntervalfonctionne désormais de la même manière quetoStartOfX, oùXvautDay, Week, Month, Quarter, Yearlorsqueenable_extended_results_for_datetime_functionsest activé. #95011 (Kirill Kopnev). - Corrige les comparaisons de chaînes constantes qui ne respectaient pas les paramètres
cast_string_to_date_time_mode,bool_true_representation,bool_false_representationetinput_format_null_as_default. Résout #91681. #95040 (Nihal Z. Miaji). - Corrige une data race dans le cache du système de fichiers. #95064 (Alexey Milovidov).
- Corrige une rare condition de concurrence dans le lecteur Parquet. #95068 (Alexey Milovidov).
- Corrige un plantage dans l’optimisation top K lorsque
LIMITvaut zéro. Résout #93893. #95072 (Alexey Milovidov). - La conversion de DateTime/entiers vers Time64 extrait la composante horaire via
toTime, qui n’est pas monotone. Le templateToDateTimeMonotonicityindiquait à tort que cette conversion était monotone, ce qui provoquait l’exception “Invalid binary search result in MergeTreeSetIndex” dans les builds de débogage. #95125 (Alexey Milovidov). - Ne recrée la liste des entrées du fichier manifeste que si nécessaire (auparavant, cela était fait à chaque itération). #95162 (Daniil Ivanik).
Amélioration de la compilation/des tests/du packaging
- Ajout d’un ensemble d’outils pour le profilage des allocations mémoire dans l’analyseur SQL de ClickHouse à l’aide des capacités de profilage du tas de jemalloc. #94072 (Ilya Yatsishin).
- Ajout d’un outil qui simplifie le débogage des allocations mémoire dans l’analyseur. Il utilise la métrique jemalloc
stats.allocatedavant et après l’analyse de la requête en représentation AST pour montrer ce qui a été alloué. Il prend également en charge un mode de profilage mémoire qui génère un dump du profil avant et après afin de produire des rapports indiquant où les allocations se sont produites. #93523 (Ilya Yatsishin). - Suppression des inclusions transitives de libc++. #92523 (Raúl Marín).
- Exécution en parallèle de certains tests séquentiels : https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df. #93030 (Nikita Fomichev).
- Nettoyage de certaines options de compilation. #93679 (Raúl Marín).
- Passage de c-ares de v1.34.5 à v1.34.6. Cela corrige la
CVE-2025-62408de c-ares, qui n’est pas pertinente pour ClickHouse. #94129 (Govind R Nair). - Utilisation de
curl8.18.0. #94742 (Konstantin Bogdanov).