Passer au contenu principal

Modifications incompatibles avec les versions précédentes

Modifications apportées à JSON et aux formats de données

Stockage et partitionnement

  • Ajout de la prise en charge des écritures au format de partitionnement Hive et refonte de l’implémentation des lectures (les colonnes de partition Hive ne sont plus virtuelles). #76802 (Arthur Passos).
  • Activation par défaut du paramètre MergeTree write_marks_for_substreams_in_compact_parts. Cela améliore considérablement les performances de lecture des sous-colonnes à partir des nouvelles parts Compact. Les serveurs dont la version est inférieure à 25.5 ne pourront pas lire ces nouvelles parts Compact. #84171 (Pavel Kruglov).
  • Interdiction de RENAME COLUMN ou DROP COLUMN sur des colonnes explicitement listées pour la sommation dans SummingMergeTree. Résout #81836. #82821 (Alexey Milovidov).

Améliorations des fonctions

  • Ajout d’un nouvel argument unexpected_quoting_character_strategy à la fonction extractKeyValuePairs, qui contrôle le comportement lorsqu’un quoting_character est rencontré de manière inattendue. Pour plus de détails, consultez la documentation de extractKeyValuePairs. #80657 (Arthur Passos).
  • Auparavant, la fonction countMatches arrêtait le comptage à la première correspondance vide, même si le pattern l’autorise. Pour corriger ce problème, countMatches poursuit désormais son exécution en avançant d’un seul caractère lorsqu’une correspondance vide se produit. Les utilisateurs qui souhaitent conserver l’ancien comportement peuvent activer le paramètre count_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).

Améliorations des types de données

  • Amélioration de la précision de la conversion de Decimal en Float32. Implémentation de la conversion de Decimal en BFloat16. Résout #82660. #82823 (Alexey Milovidov).

Performances et gestion des ressources

  • Auparavant, les requêtes BACKUP, les merges et les mutations n’utilisaient pas les limiteurs à l’échelle du serveur pour le trafic local (max_local_read_bandwidth_for_server et max_local_write_bandwidth_for_server) et distant (max_remote_read_network_bandwidth_for_server et max_remote_write_network_bandwidth_for_server) ; elles étaient uniquement limitées par des paramètres serveur dédiés (max_backup_bandwidth_for_server, max_mutations_bandwidth_for_server et max_merges_bandwidth_for_server). Désormais, elles utilisent simultanément les deux types de limiteurs. #81753 (Sergei Trifonov).
  • Ajout d’un nouveau paramètre cluster_function_process_archive_on_multiple_nodes qui améliore les performances du traitement des archives dans les fonctions de cluster lorsqu’il est défini sur true (par défaut). Il doit être défini sur false pour des raisons de compatibilité et afin d’éviter des erreurs lors de la mise à niveau vers la version 25.7+ si vous utilisez des fonctions de cluster avec des archives sur des versions antérieures. #82355 (Kseniia Sumarokova).
  • La valeur par défaut précédente de concurrent_threads_scheduler était round_robin, qui s’est révélé inéquitable en présence d’un grand nombre de requêtes mono-thread (par ex. des INSERT). Cette modification fait de fair_round_robin, une alternative plus sûre, l’ordonnanceur par défaut. #84747 (Sergei Trifonov).
  • La matérialisation paresseuse est activée uniquement avec l’analyseur afin d’éviter d’avoir à la maintenir sans l’analyseur, ce qui peut poser certains problèmes (par exemple lors de l’utilisation de indexHint() dans des conditions). #83791 (Igor Nikonov).

Schéma et syntaxe SQL

  • Interdire la création d’une table sans colonnes pouvant recevoir des insertions. #81835 (Pervakov Grigorii).
  • Exiger des backticks autour des identifiants contenant des points dans les expressions par défaut afin d’éviter qu’ils soient analysés comme des identifiants composés. #83162 (Pervakov Grigorii).
  • Prendre en charge la syntaxe Heredoc de style PostgreSQL : $tag$ string contents... $tag$, également appelée littéraux de chaîne délimités par des dollars. Dans les versions précédentes, les tags étaient soumis à moins de restrictions : ils pouvaient contenir des caractères arbitraires, y compris des signes de ponctuation et des espaces. Cela introduit une ambiguïté d’analyse avec les identifiants qui peuvent eux aussi commencer par le caractère dollar. Or, PostgreSQL n’autorise que des caractères de mot dans les tags. Pour résoudre ce problème, nous limitons désormais les tags heredoc à ces seuls caractères. Résout #84731. #84846 (Alexey Milovidov).

Sécurité et permissions

  • SYSTEM RESTART REPLICAS redémarre uniquement les répliques dans les bases de données où vous disposez du droit d’exécuter SHOW TABLES. Auparavant, la requête provoquait l’activation des tables de la base de données Lazy, même sans accès à cette base, alors que ces tables étaient supprimées simultanément. #83321 (Alexey Milovidov).
  • Les fonctions azureBlobStorage, deltaLakeAzure et icebergAzure ont été mises à jour afin de vérifier correctement les autorisations AZURE. Toutes les fonctions avec variante cluster (fonctions -Cluster) vérifient désormais les autorisations par rapport à leurs équivalents correspondants sans cluster. Pour éviter les erreurs d’autorisation, assurez-vous que les utilisateurs qui appellent les fonctions -Cluster disposent des privilèges appropriés (par exemple, GRANT S3 ON *.* TO user). De plus, les fonctions icebergLocal et deltaLakeLocal appliquent désormais les vérifications d’autorisation FILE. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov

Nouvelles fonctionnalités

Types de données

  • Ajout de nouveaux types de données : Time ([H]HH:MM:SS) et Time64 ([H]HH:MM:SS[.fractional]), ainsi que de quelques fonctions de conversion de base et de fonctions permettant d’interagir avec d’autres types de données. Ajout de paramètres assurant la compatibilité avec l’ancienne fonction ToTime. #81217 (Yarik Briukhovetskyi).

Fonctions

Tables système

Iceberg et DeltaLake

  • Prise en charge des types complexes dans la schema evolution d’Iceberg. #73714 (scanhex12).
  • Prise en charge des écritures Iceberg pour les requêtes insert. #82692 (scanhex12).
  • Prise en charge des suppressions positionnelles pour le moteur de table Iceberg. #83094 (Daniil Ivanik).
  • Lecture des fichiers de données Iceberg à partir des identifiants de champ. Clôture #83065. #83653 (scanhex12).
  • Écritures Iceberg pour CREATE. Clôture #83927. #83983 (scanhex12).
  • Écritures pour les catalogs Glue. #84136 (scanhex12).
  • Écritures pour les catalogs REST Iceberg. #84684 (scanhex12).
  • Fusion de tous les position delete files Iceberg dans les fichiers de données. Cela réduira le nombre et la taille des fichiers Parquet dans le stockage Iceberg. Syntaxe : OPTIMIZE TABLE table_name. #85250 (scanhex12).
  • Prise en charge de DROP TABLE pour Iceberg (suppression des catalogs REST/Glue + suppression des métadonnées de la table). #85395 (scanhex12).
  • Prise en charge des mutations ALTER DELETE pour Iceberg au format merge-on-read. #85549 (scanhex12).
  • Prise en charge des écritures dans DeltaLake. Clôture #79603. #85564 (Kseniia Sumarokova).
  • Écriture de davantage de statistiques Iceberg (tailles des colonnes, bornes inférieures et supérieures) dans les métadonnées (entrées de manifeste) pour l’élagage min-max. #85746 (scanhex12).
  • Prise en charge de l’ajout, de la suppression et de la modification de colonnes dans Iceberg pour les types simples. #85769 (scanhex12).

MergeTree et stockage

  • Toutes les tables prennent désormais en charge la colonne virtuelle _table, et plus seulement les tables de type Merge. #63665 (Xiaozhe Yu).
  • Ajout de SZ3 comme codec de compression avec perte, mais à erreur bornée, pour les colonnes de type Float32 et Float64. #67161 (scanhex12).
  • Ajout de la prise en charge des mises à jour légères pour les tables de la famille MergeTree. Les mises à jour légères peuvent désormais être utilisées avec une nouvelle syntaxe : UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. Ajout également de l’implémentation des suppressions légères via les mises à jour légères, activable en définissant lightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov).
  • Prise en charge de la colonne virtuelle _part_granule_offset dans les tables de la famille MergeTree. Cette colonne indique l’index, à partir de zéro, du granule/repère auquel chaque ligne appartient au sein de sa data part. Cela corrige #79572. #82341 (Amos Bird).

Prise en charge des protocoles et des clients

Fonctionnalités SQL et des requêtes

  • Prise en charge de DESCRIBE SELECT en plus de DESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi).
  • Prise en charge de la syntaxe USE DATABASE {name}. #81307 (Yarik Briukhovetskyi).
  • La lecture depuis les projections est implémentée pour les répliques parallèles. Un nouveau paramètre parallel_replicas_support_projection a été ajouté pour déterminer si la prise en charge des projections est activée. Pour simplifier l’implémentation, cette prise en charge n’est activée que lorsque parallel_replicas_local_plan est actif. #82807 (zoomxi).

Formats

  • Ajout du paramètre format_schema_source, qui définit la source de format_schema. #80874 (Tuan Pham Anh).
  • Ajout du nouveau format de sortie Hash. Il calcule une valeur de hachage unique pour toutes les colonnes et lignes du résultat. Cela est utile pour calculer une « empreinte » du résultat, par exemple dans les cas d’usage où le transfert de données constitue un goulot d’étranglement. Exemple : SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash renvoie e5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze).

Configuration du serveur et gestion des workloads

  • Le paramètre serveur cpu_slot_preemption active la planification préemptive du CPU pour les workloads et garantit une répartition max-min équitable du temps CPU entre les workloads. De nouveaux paramètres de workload de limitation du CPU ont été ajoutés : max_cpus, max_cpu_share et max_burst_cpu_seconds. #80879 (Sergei Trifonov).
  • Le paramètre de workload max_waiting_queries est désormais pris en charge. Il peut être utilisé pour limiter la taille de la file d’attente des requêtes. Si la limite est atteinte, toutes les requêtes suivantes sont interrompues avec l’erreur SERVER_OVERLOADED. #81250 (Oleg Doronin).
  • La connexion TCP est fermée après un nombre configuré de requêtes ou un seuil de durée. Résout #68000. #81472 (Kenny Sun).

Cloud storage

  • Ajout de extra_credentials à AzureBlobStorage pour l’authentification avec client_id et tenant_id. #84235 (Pablo Marcos).

Keeper

Fonctionnalités expérimentales

Moteurs de table et fonctions de table

Améliorations des index de texte

  • Ajout des fonctions searchAny et searchAll, des outils généraux permettant d’interroger les index de texte. #80641 (Elmi Ahmadov).
  • L’index de texte prend désormais en charge le tokenizer string. #81752 (Elmi Ahmadov).
  • La valeur par défaut de la granularité d’index des index text a été portée à 64. Cela améliore les performances attendues de la requête de test moyenne dans les benchmarks internes. #82162 (Jimmy Aguilar Mena).
  • Le bitmap de 256 bits stocke les labels sortants d’un état dans l’ordre, mais les états sortants sont enregistrés sur disque dans l’ordre où ils apparaissent dans la table de hachage. Par conséquent, un label pouvait pointer vers un état suivant erroné lors de la lecture sur disque. #82783 (Elmi Ahmadov).
  • Actuellement, l’arbre FST est enregistré sur disque sans compression. Cela peut entraîner des performances plus faibles ou une consommation de bande passante d’E/S plus élevée, aussi bien en écriture qu’en lecture sur disque. #83093 (Elmi Ahmadov).

Mises à jour de la maturité des fonctionnalités

Améliorations des performances

Exécution des requêtes et agrégation

  • Optimisation triviale pour le combinateur de fonction d’agrégation -If. #78454 (李扬).
  • Ajout d’une nouvelle logique (contrôlée par le paramètre enable_producing_buckets_out_of_order_in_aggregation, activé par défaut) permettant d’envoyer certains buckets dans le désordre pendant une agrégation économe en mémoire. Lorsque certains buckets d’agrégation mettent nettement plus de temps à fusionner que d’autres, cela améliore les performances en permettant à l’initiateur de fusionner entre-temps des buckets ayant des ID plus élevés. L’inconvénient est une utilisation mémoire potentiellement plus élevée (qui ne devrait pas être significative). #80179 (Nikita Taranov).
  • Rend le pipeline après l’étape TOTALS multithreadé. #80331 (UnamedRus).
  • Lorsque la requête d’agrégation ne contient qu’une seule fonction COUNT() sur une colonne NOT NULL, la logique d’agrégation est entièrement intégrée lors de la recherche dans la table de hachage. Cela évite d’allouer et de maintenir un quelconque état d’agrégation, ce qui réduit considérablement l’utilisation mémoire et la surcharge CPU. Cela répond partiellement à #81982. #82104 (Amos Bird).
  • Calcul de la clé sérialisée en mode colonnaire lors d’un groupement sur plusieurs colonnes de type chaîne ou numérique. #83884 (李扬).
  • Implémente addManyDefaults pour les combinateurs -If. #83870 (Raúl Marín).

Optimisations de JOIN

  • Ajout du nouveau paramètre min_joined_block_size_rows (analogue à min_joined_block_size_bytes ; valeur par défaut : 65409) pour contrôler la taille minimale des blocs (en rows) des blocs d’entrée et de sortie de JOIN (si l’algorithme de join le prend en charge). Les petits blocs seront squashed. #81886 (Nikita Taranov).
  • Les performances de HashJoin ont été optimisées en supprimant la boucle supplémentaire sur les tables de hachage dans le cas courant d’une seule key column ; les vérifications de null_map et join_mask sont également supprimées lorsqu’elles valent toujours true/false. #82308 (Nikita Taranov).
  • Les optimisations de null_map et JoinMask issues de #82308 ont été appliquées au cas d’un JOIN comportant plusieurs disjonctions. La data structure KnownRowsHolder a également été optimisée. #83041 (Nikita Taranov).
  • Un simple std::vector<std::atomic_bool> est utilisé pour les flags de join afin d’éviter de calculer un hash à chaque accès à ces flags. #83043 (Nikita Taranov).
  • Traitement de max_joined_block_rows hors de la boucle principale du hash JOIN. Performances légèrement améliorées pour ALL JOIN. #83216 (Nikolai Kochetov).
  • La mémoire des colonnes de résultat n’est plus préallouée à l’avance lorsque HashJoin utilise le mode de sortie lazy. Cela est sous-optimal, en particulier lorsque le nombre de correspondances est faible. De plus, le nombre exact de correspondances est connu une fois la jointure terminée, ce qui permet une préallocation plus précise. #83304 (Nikita Taranov).
  • Tous les JOIN LEFT/INNER seront automatiquement convertis en RightAny si le côté droit est fonctionnellement déterminé par les key columns de jointure (toutes les rows ont des valeurs de join key uniques). #84010 (Nikita Taranov).
  • Amélioration des performances lors de l’application des patch parts en mode Join. #85040 (Anton Popov).

Améliorations des requêtes distribuées

  • Ajout d’une option permettant de déporter la (dé)compression et la (dé)sérialisation des blocs vers les threads du pipeline, au lieu d’un seul thread associé à une connexion réseau. Contrôlée par le paramètre enable_parallel_blocks_marshalling. Cela devrait accélérer les requêtes distribuées qui transfèrent des volumes importants de données entre l’initiateur et les nœuds distants. #78694 (Nikita Taranov).
  • Le INSERT SELECT distribué parallèle est activé par défaut dans le mode où INSERT SELECT s’exécute indépendamment sur chaque shard ; voir le paramètre parallel_distributed_insert_select. #80425 (Igor Nikonov).
  • Compression des logs et des profile events dans le protocole natif. Sur les clusters de plus de 100 répliques, les profile events non compressés représentent de 1 à 10 Mo/s, et la barre de progression manque de réactivité sur les connexions Internet lentes. Cela corrige #82533. #82535 (Alexey Milovidov).
  • Le INSERT SELECT distribué parallèle est activé par défaut dans le mode où INSERT SELECT s’exécute indépendamment sur chaque shard ; voir le paramètre parallel_distributed_insert_select. #83040 (Igor Nikonov).
  • Correction du calcul de la taille minimale des tâches pour les répliques parallèles. #84752 (Nikita Taranov).

Améliorations des index

  • Les requêtes de recherche vectorielle utilisant un index de similarité vectorielle s’exécutent avec une latence plus faible grâce à la réduction des lectures sur le stockage et de l’utilisation du CPU. #79103 (Shankar Iyer).
  • Prend en compte merge_tree_min_{rows,bytes}_for_seek dans filterPartsByQueryConditionCache afin de l’aligner sur les autres méthodes de filtrage par index. #80312 (李扬).
  • Traite d’abord les index min-max à granularité plus élevée. Clôt #75381. #83798 (Maruth Goyal).
  • L’index bloom filter est désormais utilisé pour des conditions telles que has([c1, c2, ...], column), où column n’est pas de type Array. Cela améliore les performances de ces requêtes et les rend aussi efficaces que l’opérateur IN. #83945 (Doron David).
  • Traite les index par ordre croissant de taille de fichier. L’ordre global donne la priorité aux index min-max et vectoriels (en raison respectivement de leur simplicité et de leur sélectivité), puis aux petits index. Au sein des index min-max/vectoriels, les plus petits sont également privilégiés. #84094 (Maruth Goyal).
  • Auparavant, les données de l’index de texte intégral étaient réparties en plusieurs segments (la taille par défaut de chaque segment était de 256 MiB). Cela pouvait réduire la consommation de mémoire lors de la construction de l’index de texte intégral, mais augmentait l’espace requis sur le disque ainsi que le temps de réponse des requêtes. #84590 (Elmi Ahmadov).

Optimisations des sous-requêtes

  • Optimise le plan généré pour les sous-requêtes corrélées en supprimant les opérations JOIN redondantes à l’aide de classes d’équivalence. S’il existe des expressions équivalentes pour toutes les colonnes corrélées, CROSS JOIN n’est pas généré si le paramètre query_plan_correlated_subqueries_use_substitution est activé. #82435 (Dmitry Novik).
  • Lit uniquement les colonnes nécessaires dans une sous-requête corrélée lorsqu’elle apparaît comme argument de la fonction EXISTS. #82443 (Dmitry Novik).

Améliorations d’Azure Blob Storage

  • Le moteur de table azureBlobStorage met désormais en cache et réutilise, lorsque c’est possible, les jetons d’authentication d’identité managée afin d’éviter toute limitation de débit. #79860 (Nick Blakely).
  • Remplacement du client HTTP curl par le client HTTP poco pour Azure Blob Storage. Plusieurs paramètres ont été ajoutés pour ces clients, alignés sur ceux de S3. Des délais d’expiration de connexion très courts ont été introduits pour Azure comme pour S3. La visibilité sur les profile events et les métriques Azure a été améliorée. Le nouveau client est activé par défaut et offre de bien meilleures latences pour les requêtes à froid sur Azure Blob Storage. L’ancien client Curl peut être rétabli en définissant azure_sdk_use_native_client=false. #83294 (alesapin).

Améliorations du moteur de stockage

  • Corrige le filtrage par clé pour les stockages Redis et KeeperMap. #81833 (Pervakov Grigorii).
  • ATTACH PARTITION n’entraîne plus la suppression de tous les caches. #82377 (Alexey Milovidov).
  • Évite de conserver le verrou pendant la création des données de snapshot du stockage afin de réduire la contention sur le verrou en cas de forte charge concurrente. #83510 (Duc Canh Le).
  • La suppression des parts temporaires peut prendre du temps (en particulier avec S3), et nous la faisons actuellement en conservant un verrou global dans MergeTreeBackgroundExecutor. Lorsque nous devons redémarrer toutes les tables en raison d’une perte de connexion et attendre la fin des tâches en arrière-plan, les tables peuvent même rester bloquées en mode readonly pendant une heure. Mais il semble que nous n’ayons pas besoin de ce verrou pour appeler cancel. #84311 (Alexander Tokmakov).

Améliorations du format

  • Nouvelle implémentation du lecteur Parquet. Elle est globalement plus rapide et prend en charge le pushdown des filtres au niveau des pages ainsi que PREWHERE. Elle est actuellement Experimental. Utilisez le paramètre input_format_parquet_use_native_reader_v3 pour l’activer. #82789 (Michael Kolupaev).
  • Les performances du format d’entrée ProtobufSingle ont été améliorées grâce à la réutilisation du sérialiseur lorsqu’aucune erreur d’analyse ne se produit. #83613 (Eduard Karacharov).

Optimisations des types de données et de la sérialisation

  • Améliore significativement les performances de lecture des sous-colonnes JSON issues de données partagées dans MergeTree en implémentant de nouvelles sérialisations pour les données partagées JSON dans MergeTree. #83777 (Pavel Kruglov).
  • Optimise la désérialisation des chaînes de caractères en simplifiant le code. Résout #38564. #84561 (Alexey Milovidov).

Améliorations du pipeline et de l’exécution

  • Réduire au minimum les copies en mémoire des en-têtes de port lors de la construction du pipeline. PR initiale par heymind : #70105. #83381 (Raúl Marín).
  • Améliorer les performances de construction du pipeline. #83631 (Raúl Marín).
  • Optimiser MergeTreeReadersChain::getSampleBlock. #83875 (Raúl Marín).
  • Optimiser la matérialisation des constantes dans les cas où elle est effectuée uniquement pour renvoyer une seule ligne. #85071 (Alexey Milovidov).

Optimisations de la mémoire et des ressources

  • Ajuster certaines configurations de jemalloc pour améliorer les performances. #81807 (Antonio Andelic).
  • Ajouter un alignement dans le compteur de ProfileEvents pour réduire le faux partage. #82697 (Jiebin Sun).
  • Réduire les appels inutiles à memcpy dans CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).

Planification et analyse des requêtes

Améliorations de la journalisation

Optimisations des fonctions

  • Optimisation de largestTriangleThreeBuckets par suppression des données temporaires. #84479 (Alexey Milovidov).
  • Implémentation de nombreuses fonctions de manipulation de chaînes optimisée et simplifiée. Correction de la documentation erronée de plusieurs fonctions. Remarque : la sortie de byteSize pour les colonnes String et les types complexes contenant des colonnes String est passée de 9 octets par chaîne vide à 8 octets par chaîne vide, ce qui correspond au comportement attendu. #85063 (Alexey Milovidov).

Améliorations de Keeper

Améliorations du data lake

  • Amélioration du traitement parallèle des fichiers avec le backend delta-kernel-rs. #85642 (Azat Khuzhin).

Améliorations

Contrôle d’accès et sécurité

  • Introduction de deux nouveaux types d’accès : READ et WRITE pour les sources, et dépréciation de tous les anciens types d’accès liés aux sources. Auparavant : GRANT S3 ON *.* TO user ; désormais : GRANT READ, WRITE ON S3 TO user. Cela permet également de dissocier les autorisations READ et WRITE pour les sources, par exemple : GRANT READ ON * TO user, GRANT WRITE ON S3 TO user. Cette fonctionnalité est contrôlée par le paramètre access_control_improvements.enable_read_write_grants et est désactivée par défaut. #73659 (pufit).
  • Prise en charge des paramètres dans les requêtes CREATE USER pour les noms d’utilisateur. #81387 (Diskein).
  • Exclusion des données sensibles des core dumps. Ajout de deux allocateurs : AwsNodumpMemoryManager, compatible avec la bibliothèque AWS, et JemallocNodumpSTLAllocator, compatible avec la STL. Tous deux sont des wrappers de l’allocateur Jemalloc. Ils utilisent les extent hooks de Jemalloc et madvise pour marquer les pages mémoire comme « don’t dump ». Utilisés pour les informations d’authentification S3, les informations d’authentification utilisateur et certaines données de requête. #82441 (Miсhael Stetsyuk).
  • Les views créées par des utilisateurs éphémères stockeront désormais une copie de l’utilisateur réel et ne seront plus invalidées après la suppression de l’utilisateur éphémère. #84763 (pufit).
  • Correspondance des forward_headers de l’authentification externe de manière insensible à la casse. #84737 (ingodwerust).
  • Ajout d’une colonne parameter à system.grants pour déterminer le type de source pour GRANT READ/WRITE et le moteur de table pour GRANT TABLE ENGINE. #85643 (MikhailBurdukov).

Sauvegarde et restauration

Intégrité et validation des données

  • Vérifiez que la partie possède un fichier checksum.txt cohérent juste avant de la valider. #76625 (Sema Checherinda).
  • Empêcher le démarrage d’une mutation ALTER RENAME COLUMN si elle doit renommer une colonne actuellement affectée par une mutation de données incomplète. #81823 (Mikhail Artemenko).
  • Désormais, le snapshot des mutations sera construit à partir du snapshot des parties visibles. Les compteurs de mutations utilisés dans le snapshot seront également recalculés à partir des mutations incluses. #82945 (Mikhail Artemenko).
  • Ajout de la possibilité d’analyser le préfixe et le suffixe d’une partie, ainsi que de vérifier la couverture des colonnes non constantes. #83377 (Mikhail Artemenko).

Moteur de table Iceberg

  • Prise en charge des suppressions positionnelles pour le moteur de table Iceberg. #80237 (YanghongZhong).
  • ClickHouse prend désormais en charge les fichiers metadata.json compressés pour Iceberg. Corrige #70874. #81451 (alesapin).
  • Correction de la lecture d’Iceberg par identifiants de champ pour les types complexes. #84821 (scanhex12).
  • Prise en charge de l’écriture par Iceberg pour permettre la lecture depuis pyiceberg. #84466 (scanhex12).
  • Ajout de la version de snapshot aux moteurs de table de data lake. #84659 (Pete Hampton).
  • Prise en charge de l’écriture d’un fichier version-hint avec Iceberg. Cela clôt #85097. #85130 (scanhex12).
  • Prise en charge du fichier .metadata.json compressé via le paramètre iceberg_metadata_compression_method. Il prend en charge toutes les méthodes de compression de ClickHouse. Cela clôt #84895. #85196 (scanhex12).
  • Optimisation de l’utilisation mémoire pour les fichiers de suppression positionnelle Iceberg. Au lieu de charger en mémoire toutes les données des fichiers de suppression, seul le groupe de lignes courant des fichiers de suppression Parquet est conservé en RAM. Cela réduit considérablement la consommation mémoire lors de l’utilisation de grands fichiers de suppression positionnelle. #85329 (scanhex12).
  • Autorise l’itération asynchrone des objets d’une table Iceberg sans stocker explicitement les objets de chaque fichier de données. #85369 (Daniil Ivanik).
  • Prise en charge des suppressions par égalité pour Iceberg. #85843 (Han Fei).

Moteur de table DeltaLake

  • Amélioration du moteur de table DeltaLake : delta-kernel-rs dispose d’une API ExpressionVisitor, implémentée dans cette PR et appliquée à la transformation des expressions des colonnes de partition (elle remplacera un ancien mécanisme désormais obsolète dans delta-kernel-rs, auparavant utilisé dans notre code). À l’avenir, cet ExpressionVisitor permettra également d’implémenter le pruning basé sur les statistiques ainsi que certaines fonctionnalités propriétaires de delta-lake. En outre, cette modification vise à prendre en charge le pruning des partitions dans le moteur de table DeltaLakeCluster (le résultat d’une expression analysée — ActionsDAG — sera sérialisé et envoyé depuis l’initiateur avec le chemin des données, car ce type d’information, nécessaire au pruning, n’est disponible qu’en tant que méta-informations lors de la liste des fichiers de données, opération effectuée uniquement par l’initiateur, mais qui doit être appliquée aux données sur chaque serveur de lecture). #81136 (Kseniia Sumarokova).
  • Correction du pruning des partitions avec les fonctions de cluster de data lake. #82131 (Kseniia Sumarokova).
  • Correction de la lecture des données partitionnées dans la fonction de table DeltaLakeCluster. Dans cette PR, la protocol version des fonctions de cluster est augmentée, ce qui permet d’envoyer des informations supplémentaires de l’initiateur vers les répliques. Ces informations supplémentaires contiennent l’expression de transformation delta-kernel, nécessaire pour analyser les colonnes de partition (et, à l’avenir, d’autres éléments comme les generated columns, etc.). #82132 (Kseniia Sumarokova).
  • Désormais, la base de données Datalake renvoie une exception plus explicite. Corrige #81211. #82304 (alesapin).
  • Implémentation du filtrage interne de delta-kernel-rs (statistiques et pruning des partitions) dans le stockage DeltaLake. #84006 (Kseniia Sumarokova).
  • Ajout d’un paramètre delta_lake_enable_expression_visitor_logging pour désactiver les logs du visiteur d’expressions, car ils peuvent être trop verbeux, même avec un niveau de log de test, lors du débogage. #84315 (Kseniia Sumarokova).
  • Ajout du paramètre delta_lake_snapshot_version pour permettre la lecture d’une version de snapshot spécifique dans le moteur de table DeltaLake. #85295 (Kseniia Sumarokova).

Intégration au data lake

  • Accélère le listage des tables dans les catalogues de données grâce à des requêtes asynchrones. #81084 (alesapin).
  • Prend en charge TimestampTZ dans le catalogue Glue. Cela résout #81654. #83132 (scanhex12).
  • Scinde FormatParserGroup en deux structs indépendantes : la première est responsable des ressources partagées de calcul et d’IO, la seconde des ressources de filtre partagées (filter ActionDag, KeyCondition). Cela permet une utilisation partagée plus souple de ces structures par différents threads. #83997 (Daniil Ivanik).
  • Ajoute partition_columns_in_data_file, qui manquait à la configuration Azure. #85373 (Arthur Passos).
  • Ajoute le flag show_data_lake_catalogs_in_system_tables pour gérer l’ajout des tables de data lake dans system.tables ; résout #85384. #85411 (Smita Kulkarni).

S3 et le stockage objet

  • Implémentation des méthodes moveFile et replaceFile dans s3_plain_rewritable afin de permettre son utilisation comme disk de database. #79424 (Tuan Pham Anh).
  • Les requêtes de lecture et d’écriture S3 sont soumises à une limitation de débit au niveau du socket HTTP (plutôt qu’au niveau des requêtes S3 complètes) afin d’éviter les problèmes liés au throttling de max_remote_read_network_bandwidth_for_server et max_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov).
  • Cette PR introduit un jitter dans le mécanisme de retry S3 lorsque la configuration s3_slow_all_threads_after_network_error est enabled. #81849 (zoomxi).
  • Implémentation de l’authentication AWS S3 avec un IAM role fourni explicitement. Implémentation d’OAuth pour GCS. Ces fonctionnalités, auparavant disponibles uniquement dans ClickHouse Cloud, sont désormais open-source. Synchronisation de certaines interfaces, comme la sérialisation des paramètres de connexion pour les object storages. #84011 (Alexey Milovidov).
  • Possibilité d’utiliser n’importe quelle storage policy (c.-à-d. un object storage tel que S3) pour l’aggregation/le tri externes. #84734 (Azat Khuzhin).
  • Regroupement de tous les objects supprimés pour exécuter une seule opération de suppression sur l’object storage. #85316 (Mikhail Artemenko).

Moteur de table S3Queue

  • Les macros comme {uuid} peuvent désormais être utilisées dans le paramètre keeper_path du moteur de table S3Queue. #82463 (Nikolay Degterinsky).
  • Ajout d’un nouveau paramètre du serveur s3queue_disable_streaming, qui désactive le streaming pour les tables utilisant le moteur de table S3Queue. Ce paramètre peut être modifié sans redémarrage du serveur. #82515 (Kseniia Sumarokova).
  • Ajout des colonnes commit_time et commit_id à system.s3queue_log. #83016 (Kseniia Sumarokova).
  • Ajout de logs pour le processus d’arrêt de S3Queue. #83163 (Kseniia Sumarokova).
  • Arrêt du streaming de S3(Azure/etc)Queue avant l’arrêt de toute table lors de l’arrêt du serveur. #83530 (Kseniia Sumarokova).
  • Prise en charge de la modification des paramètres d’insert des vues matérialisées au niveau de la table S3Queue. Ajout de nouveaux paramètres au niveau de S3Queue : min_insert_block_size_rows_for_materialized_views et min_insert_block_size_bytes_for_materialized_views. Par défaut, les paramètres au niveau du profil sont utilisés, et ceux définis au niveau de S3Queue les remplacent. #83971 (Kseniia Sumarokova).
  • Correction du mode ordered de S3Queue : arrêt anticipé si l’arrêt a été demandé. #84463 (Kseniia Sumarokova).

Intégration Kafka

Améliorations de ClickHouse Keeper

  • Amélioration de Keeper : déplacement des fichiers de changelog entre disques dans un thread d’arrière-plan. Auparavant, déplacer le changelog vers un autre disque bloquait globalement Keeper jusqu’à la fin du déplacement. Cela entraînait une dégradation des performances lorsque le déplacement était une opération longue (par exemple vers un disque S3). #82485 (Antonio Andelic).
  • Amélioration de Keeper : ajout d’une nouvelle configuration keeper_server.cleanup_old_and_ignore_new_acl. Si elle est activée, les ACL de tous les nœuds seront supprimées, tandis que les ACL des nouvelles requêtes seront ignorées. Si l’objectif est de supprimer complètement les ACL des nœuds, il est important de laisser cette configuration activée jusqu’à la création d’un nouveau snapshot. #82496 (Antonio Andelic).
  • Amélioration de Keeper : prise en charge d’autorisations spécifiques pour l’ACL world:anyone. #82755 (Antonio Andelic).
  • Ajout de la prise en charge de la définition d’ACL Keeper supplémentaires pour des chemins dans la configuration. Si vous souhaitez ajouter une ACL supplémentaire pour un chemin spécifique, définissez-la dans la configuration sous zookeeper.path_acls. #82898 (Antonio Andelic).
  • Ajoute un ProfileEvent lorsque Keeper rejette une écriture en raison de la limite mémoire souple. #82963 (Xander Garbett).
  • Active par défaut dans Keeper les feature flags create_if_not_exists, check_not_exists, remove_recursive, qui permettent de nouveaux types de requêtes. #83488 (Antonio Andelic).
  • Ajout de la prise en charge de l’application d’ACL supplémentaires sur des nœuds Keeper spécifiques à l’aide de la configuration apply_to_children. #84137 (Antonio Andelic).
  • Ajout de la commande get_acl à KeeperClient. #84641 (Antonio Andelic).
  • Ajout de 4LW dans Keeper, lgrq, pour activer ou désactiver la journalisation des requêtes reçues. #84719 (Antonio Andelic).
  • Réduit la contention sur le verrou de stockage dans Keeper. #84732 (Antonio Andelic).
  • L’outil encrypt_decrypt prend désormais en charge les connexions ZooKeeper chiffrées. #84764 (Roman Vasin).
  • Limite la taille du cache des entrées de log de Keeper par nombre d’entrées à l’aide de keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold et keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic).

Types JSON et Dynamic

  • Ajout du fichier columns_substreams.txt à la Wide part pour suivre tous les sous-flux stockés dans la part. Cela permet de suivre les flux dynamiques dans les types JSON et Dynamic, et donc d’éviter de lire un échantillon de ces colonnes pour obtenir la liste des flux dynamiques (par exemple pour calculer la taille des colonnes). Tous les flux dynamiques apparaissent désormais également dans system.parts_columns. #81091 (Pavel Kruglov).
  • ALTER UPDATE est désormais autorisé dans les colonnes JSON et Dynamic. #82419 (Pavel Kruglov).
  • Vous pouvez désormais utiliser les types Time et Time64 dans le type JSON. #83784 (Yarik Briukhovetskyi).
  • Ajout du paramètre json_type_escape_dots_in_keys pour échapper les points dans les clés JSON lors de l’analyse du type JSON. Ce paramètre est désactivé par défaut. #84207 (Pavel Kruglov).

Formats Parquet et ORC

  • Introduction de paramètres permettant de définir la taille du bloc de compression ORC, et mise à jour de sa valeur par défaut de 64KB à 256KB pour rester cohérent avec Spark ou Hive. #80602 (李扬).
  • Prise en charge de l’écriture des enum Parquet sous forme de tableau d’octets, comme l’exige la spécification. J’ajouterai plus d’informations plus tard. #81090 (Arthur Passos).
  • Prise en charge de l’écriture de GeoParquet comme format de sortie. #81784 (scanhex12).

Requêtes distribuées et répliques parallèles

  • Un nouveau paramètre, enable_add_distinct_to_in_subqueries, a été introduit. Lorsqu’il est activé, ClickHouse ajoute automatiquement DISTINCT aux sous-requêtes des clauses IN pour les requêtes distribuées. Cela peut réduire considérablement la taille des tables temporaires transférées entre les shards et améliorer l’efficacité du réseau. Remarque : c’est un compromis : si les transferts réseau diminuent, un travail supplémentaire de fusion (déduplication) est nécessaire sur chaque nœud. Activez ce paramètre lorsque le transfert réseau constitue un goulot d’étranglement et que le coût de fusion reste acceptable. #81908 (fhw12345).
  • Prise en charge des fonctions de table remote-() avec les répliques parallèles lorsqu’un cluster est fourni dans l’argument address_expression. Corrige également #73295. #82904 (Igor Nikonov).
  • Les jointures avec répliques parallèles utilisent désormais l’étape logique de jointure. En cas de problème avec des requêtes de jointure utilisant des répliques parallèles, essayez SET query_plan_use_new_logical_join_step=0 et signalez une issue. #83801 (Vladimir Cherkasov).

Paramètres et configuration

  • Le paramètre allow_experimental_join_condition est désormais obsolète. #80566 (Vladimir Cherkasov).
  • Les throttlers réseau globaux et par utilisateur ne sont jamais réinitialisés, ce qui garantit que les limites max_network_bandwidth_for_all_users et max_network_bandwidth_for_all_users ne sont jamais dépassées. #81729 (Sergei Trifonov).
  • Ajoute le paramètre optimize_rewrite_regexp_functions (activé par défaut), qui permet à l’optimiseur de réécrire certains appels à replaceRegexpAll, replaceRegexpOne et extract sous des formes plus simples et plus efficaces lorsque des motifs d’expression régulière spécifiques sont détectés. (issue #81981). #81992 (Amos Bird).
  • Ajuste la file d’attente des serveurs TCP (64 par défaut) en fonction de listen_backlog (4096 par défaut). #82045 (Azat Khuzhin).
  • Ajoute la possibilité de recharger max_local_read_bandwidth_for_server et max_local_write_bandwidth_for_server à la volée, sans redémarrer le serveur. #82083 (Kai Zhu).
  • Introduit le paramètre enable_vector_similarity_index, qui doit être activé pour utiliser l’index de similarité vectorielle. Le paramètre existant allow_experimental_vector_similarity_index est désormais obsolète. Il fonctionne toujours si nécessaire. #83459 (Robert Schulze).
  • Ajoute max_joined_block_size_bytes, en complément de max_joined_block_size_rows, pour limiter l’utilisation mémoire des JOIN avec des colonnes volumineuses. #83869 (Nikolai Kochetov).
  • Corrige la compatibilité de cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
  • Active par défaut la prise en charge des sous-requêtes corrélées. #85107 (Dmitry Novik).
  • Ajoute les paramètres database_replicated qui définissent les valeurs par défaut de DatabaseReplicatedSettings. Si le paramètre n’est pas présent dans la requête CREATE de la base de données Replicated, la valeur de ce paramètre est utilisée. #85127 (Tuan Pham Anh).
  • Autorise les arguments clé-valeur dans le moteur/fonction de table s3 ou s3Cluster, par exemple s3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova).
  • Exécute EXISTS non corrélé comme une sous-requête scalaire. Cela permet d’utiliser un cache de sous-requêtes scalaires et d’évaluer le résultat comme une constante, ce qui est utile pour les index. Pour des raisons de compatibilité, le nouveau paramètre execute_exists_as_scalar_subquery=1 a été ajouté. #85481 (Nikolai Kochetov).
  • Prend en charge la résolution d’un plus grand nombre de cas pour les identifiants composés. En particulier, cela améliore la compatibilité de ARRAY JOIN avec l’ancien analyseur. Introduit un nouveau paramètre analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested pour conserver l’ancien comportement. #85492 (Nikolai Kochetov).

Tables système et observabilité

  • Ajout de métriques de pression aux métriques asynchrones de ClickHouse. #80779 (Xander Garbett).
  • Ajout des métriques MarkCacheEvictedBytes, MarkCacheEvictedMarks, MarkCacheEvictedFiles pour suivre les évictions du mark cache. (issue #60989). #80799 (Shivji Kumar Jha).
  • La table system.formats contient désormais des informations détaillées sur les formats, comme le type de contenu HTTP, les capacités d’inférence de schéma, etc. #81505 (Alexey Milovidov).
  • Ajout de la prise en charge de la suppression de tous les avertissements de la table system.warnings à l’aide de TRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov).
  • Liste des licences des crates Rust dans system.licenses. #82440 (Raúl Marín).
  • Estimation des CNF/DNF complexes, par exemple (a < 1 and a > 0) or b = 3, à l’aide des statistiques. #82663 (Han Fei).
  • Dans certains cas, il est nécessaire d’avoir plusieurs dimensions pour les métriques. Par exemple, compter les merges ou les mutations en échec par code d’erreur plutôt que d’avoir un seul compteur. #83030 (Miсhael Stetsyuk).
  • Ajout de métriques de ressource du processus (telles que UserTimeMicroseconds, SystemTimeMicroseconds, RealTimeMicroseconds) aux profile events de part_log pour les entrées MergeParts. #83460 (Vladimir Cherkasov).
  • Les métriques au niveau du cgroup et les métriques système sont désormais toutes rapportées ensemble. Les métriques au niveau du cgroup portent les noms CGroup<Metric> et les métriques au niveau de l’OS (collectées depuis procfs) portent les noms OS<Metric>. #84317 (Nikita Taranov).
  • Ajout de métriques dimensionnelles pour surveiller la taille des queues bornées concurrentes, étiquetées par type de queue et ID d’instance, pour une meilleure observabilité. #84675 (Miсhael Stetsyuk).
  • La table system.columns fournit désormais column comme alias de la colonne name existante. #84695 (Yunchi Pang).
  • Ajout d’une colonne de format string à system.errors. Cette colonne est nécessaire pour regrouper un même type d’erreur dans les règles d’alerte. #84776 (Miсhael Stetsyuk).
  • Les limites d’Async Log sont désormais ajustables, avec ajout de l’introspection. #85105 (Raúl Marín).
  • Ignorer UNKNOWN_DATABASE lors de la récupération des tailles des colonnes de table pour system.columns. #85632 (Azat Khuzhin).

Moteurs de base de données

Améliorations système et internes

  • Corrige l’attachement de bases de données avec des disques distants en lecture seule en ajoutant manuellement les UUID de table à DatabaseCatalog. #82670 (Tuan Pham Anh).
  • Améliore la gestion des tâches DDL lorsque distributed_ddl_output_mode='*_only_active' en n’attendant pas les nouvelles répliques ou les répliques restaurées dont le retard de réplication dépasse max_replication_lag_to_enqueue. Cela permet d’éviter les erreurs DDL task is not finished on some hosts lorsqu’une nouvelle réplique devient active après l’initialisation ou la récupération, mais a accumulé un journal de réplication important. Implémente également la requête SYSTEM SYNC DATABASE REPLICA STRICT, qui attend que le journal de réplication repasse sous max_replication_lag_to_enqueue. #83302 (Alexander Tokmakov).
  • Modifie l’ordre d’arrêt de SystemLogs afin qu’il intervienne après les tables ordinaires (et avant les tables système, au lieu d’avant les tables ordinaires). #83134 (Kseniia Sumarokova).
  • Ajoute le paramètre serveur logs_to_keep pour les paramètres des bases de données Replicated, ce qui permet de configurer la valeur par défaut du paramètre logs_to_keep pour les bases de données Replicated. Des valeurs plus faibles réduisent le nombre de nœuds ZooKeeper (particulièrement utile lorsqu’il y a de nombreuses bases de données), tandis que des valeurs plus élevées permettent aux répliques absentes de rattraper leur retard après de plus longues périodes d’indisponibilité. #84183 (Alexey Khatskevich).
  • Modifie la valeur par défaut du paramètre de base de données Replicated max_retries_before_automatic_recovery à 10, ce qui permet une récupération plus rapide dans certains cas. #84369 (Alexander Tokmakov).
  • Optimise les opérations DDL des vues matérialisées actualisables sans append dans les bases de données Replicated en évitant la création et le renommage des anciennes tables temporaires. #84858 (Tuan Pham Anh).

Réplication et synchronisation

Améliorations système et internes

  • Améliore SYSTEM RESTART REPLICA pour réessayer de créer la table en cas de problèmes de connexion à ZooKeeper, afin d’éviter que des tables soient oubliées. #82616 (Nikolay Degterinsky).
  • Ajoute une validation d’UUID dans ReplicatedMergeTree::executeMetadataAlter afin d’éviter des définitions de table incorrectes lorsqu’un échange de tables se produit entre l’obtention du StorageID et l’appel à IDatabase::alterTable. #82666 (Nikolay Degterinsky).
  • Supprime la logique expérimentale send_metadata liée à la zero-copy replication expérimentale. Ce code n’a jamais été utilisé, n’était pas pris en charge et était probablement défectueux, sans aucun test pour en vérifier le fonctionnement. #82508 (alesapin).
  • Ajoute la prise en charge de l’expansion des macros dans remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).

Fonctions et expressions

  • La fonction addressToSymbol et la table system.symbols utiliseront des offsets de fichier au lieu d’adresses de mémoire virtuelle. #81896 (Alexey Milovidov).
  • Préserver autant que possible les noms des éléments lors de la dérivation des supertypes pour les tuples nommés. #81345 (lgbo).
  • Autorisation de combiner différentes collations pour une même colonne dans différentes fenêtres. #82877 (Yakov Olkhovskiy).
  • Ajout d’une fonction pour écrire des types au format WKB. #82935 (scanhex12).
  • Ajout de la possibilité d’analyser Time et Time64 aux formats MM:SS, M:SS, SS ou S. #83299 (Yarik Briukhovetskyi).
  • La fonction reinterpret() prend désormais en charge la conversion vers Array(T)T est un type de données de taille fixe (issue #82621). #83399 (Shankar Iyer).
  • Correction des fonctions structureToProtobufSchema et structureToCapnProtoSchema pour ajouter correctement un octet nul de fin au lieu d’utiliser un saut de ligne, ce qui évite les sauts de ligne manquants dans la sortie et d’éventuels débordements de tampon dans les fonctions qui dépendent de l’octet nul (comme logTrace, demangle, extractURLParameter, toStringCutToZero et encrypt/decrypt). Clôture de l’issue #85062. #85063 (Alexey Milovidov).
  • Correction du dictionary layout regexp_tree pour prendre en charge le traitement de chaînes contenant des octets nuls. #85063 (Alexey Milovidov).
  • Correction de la fonction formatRowNoNewline, qui tronquait à tort le dernier caractère de la sortie lorsqu’elle était appelée avec le format Values ou tout autre format sans saut de ligne en fin de ligne. #85063 (Alexey Milovidov).
  • Correction d’un problème de sûreté des exceptions dans la fonction stem, qui pouvait entraîner des fuites de mémoire dans de rares cas. #85063 (Alexey Milovidov).
  • Correction de la fonction initcap pour les arguments FixedString afin de reconnaître correctement le début des mots en début de chaîne lorsque la chaîne précédente d’un block se terminait par un caractère de mot. #85063 (Alexey Milovidov).
  • Correction d’une vulnérabilité de sécurité dans le format Apache ORC qui pouvait entraîner l’exposition de mémoire non initialisée. #85063 (Alexey Milovidov).
  • Le comportement de replaceRegexpAll et de son alias REGEXP_REPLACE a été modifié pour autoriser les correspondances vides à la fin des chaînes, même lorsque la correspondance précédente traitait la chaîne entière (par exemple ^a*|a*$ ou ^|.*), afin de s’aligner sur la sémantique de JavaScript, Perl, Python, PHP et Ruby, tout en différant de PostgreSQL. #85063 (Alexey Milovidov).
  • Optimiser et simplifier l’implémentation de nombreuses fonctions de manipulation de chaînes. Correction de la documentation erronée de plusieurs fonctions. Remarque : la valeur renvoyée par byteSize pour les colonnes String et les types complexes contenant des colonnes String est passée de 9 octets par chaîne vide à 8 octets par chaîne vide, ce qui correspond au comportement attendu. #85063 (Alexey Milovidov).
  • Autoriser un pas nul dans les fonctions timeSeries*ToGrid(). Cela fait partie du #3 de https://github.com/ClickHouse/ClickHouse/pull/75036. #85390 (Vitaly Baranov).
  • Prise en charge des tableaux imbriqués pour la fonction nested. #85719 (Nikolai Kochetov).

Améliorations de MergeTree

  • Désactive de manière plus granulaire les skipping indexes qui dépendent de colonnes mises à jour à la volée ou par des patch parts. Désormais, les skipping indexes ne sont désactivés que dans les parts affectées par des on-the-fly mutations ou des patch parts ; auparavant, ils l’étaient pour toutes les parts. #84241 (Anton Popov).
  • Ajoute le MergeTree setting search_orphaned_parts_drives afin de limiter le périmètre de recherche des parts, par exemple aux disques avec des metadata locales. #84710 (Ilya Golshtein).
  • Ajoute la prise en charge manquante de read_in_order_use_virtual_row pour WHERE. Cela permet d’éviter de lire davantage de parts pour les queries avec des filters qui n’ont pas été entièrement poussés vers PREWHERE. #84835 (Nikolai Kochetov).
  • Corrige l’utilisation de la serialization « compact » des discriminators Variant dans MergeTree. Auparavant, elle n’était pas utilisée dans certains cas où elle aurait pu l’être. #84141 (Pavel Kruglov).
  • Ajoute une limite (table setting max_uncompressed_bytes_in_patches) pour le nombre total d’octets uncompressed dans les patch parts. Cela évite des ralentissements importants des queries SELECT après des lightweight updates et empêche une utilisation abusive possible des lightweight updates. #85641 (Anton Popov).

Gestion du cache et de la mémoire

  • Correction d’une erreur logique dans le filesystem cache : “Having zero bytes but range is not finished”. #81868 (Kseniia Sumarokova).
  • Ajout du hachage par rendez-vous pour améliorer la localité du cache. #82511 (Anton Ivashkin).
  • Refonte de la fonctionnalité de redimensionnement dynamique du filesystem cache. Ajout de logs supplémentaires pour l’introspection. #82556 (Kseniia Sumarokova).
  • Réduction du surcoût du suivi de la mémoire des query pour les user-defined functions exécutables. #83929 (Eduard Karacharov).
  • Toutes les allocations effectuées par des bibliothèques externes sont désormais visibles par le memory tracker de ClickHouse et correctement prises en compte. Cela peut entraîner une hausse de l’utilisation mémoire signalée pour certaines query ou des échecs avec MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov).
  • Allocation de la quantité minimale de mémoire nécessaire pour encrypted_buffer dans les collections nommées chiffrées. #84432 (Pablo Marcos).

Index de similarité vectorielle

  • Empêche désormais les utilisateurs d’utiliser nan et inf avec NumericIndexedVector. Corrige #82239 et quelques cas supplémentaires. #82681 (Raufs Dunamalijevs).
  • L’index de similarité vectorielle prend désormais en charge la quantification binaire. La quantification binaire réduit considérablement la consommation de mémoire et accélère la création d’un index vectoriel (grâce à un calcul plus rapide des distances). De plus, le paramètre existant vector_search_postfilter_multiplier est désormais obsolète et a été remplacé par un paramètre plus général : vector_search_index_fetch_multiplier. #85024 (Shankar Iyer).
  • La recherche vectorielle approximative avec des index de similarité vectorielle est désormais GA. #85888 (Robert Schulze).

Gestion des erreurs et messages

  • L’en-tête Connection est envoyé à la fin des en-têtes, lorsque l’on sait si la connexion doit être maintenue. #81951 (Sema Checherinda).
  • Dans les versions précédentes, la multiplication de l’état d’une fonction d’agrégation par IPv4 produisait une erreur logique au lieu d’un code d’erreur approprié. Corrige #82817. #82818 (Alexey Milovidov).
  • Meilleure gestion des erreurs dans AsynchronousMetrics. Si le répertoire /sys/block existe mais n’est pas accessible, le serveur démarrera sans surveiller les périphériques de bloc. Corrige #79229. #83115 (Alexey Milovidov).
  • Il y avait une vérification incorrecte des dépendances pour l’INSERT avec des vues matérialisées contenant des SELECT mal formés, et l’utilisateur pouvait recevoir une std::exception obscure au lieu d’une erreur explicite accompagnée d’une explication claire. C’est désormais corrigé. Corrige : #82889. #83190 (Nikita Mikhaylov).
  • Ne plus afficher de très longues descriptions des actions d’expression dans les messages d’exception. Corrige #83164. #83350 (Alexey Milovidov).
  • Lorsque le stockage est en cours d’arrêt, getStatus lève une exception ErrorCodes::ABORTED. Auparavant, cela faisait échouer la requête SELECT. Désormais, nous interceptons les exceptions ErrorCodes::ABORTED et les ignorons intentionnellement. #83435 (Miсhael Stetsyuk).
  • Les messages d’exception pour certaines situations liées au chargement et à l’ajout de projections sont désormais plus faciles à lire. #83728 (Robert Schulze).
  • Vérifier si la connexion est annulée avant de vérifier l’EOF afin d’éviter de lire depuis une connexion fermée. Corrige #83893. #84227 (Raufs Dunamalijevs).
  • Amélioration de la gestion de l’arrêt du serveur pour les connexions client grâce à une simplification des vérifications internes. #84312 (Raufs Dunamalijevs).
  • Les erreurs de bas niveau lors de l’exécution des UDF échouent désormais avec le code d’erreur UDF_EXECUTION_FAILED, alors qu’auparavant différents codes d’erreur pouvaient être renvoyés. #84547 (Xu Jia).

Améliorations de la mise en forme SQL

  • Correction de la mise en forme incohérente de CREATE DICTIONARY. Résout #82105. #82829 (Alexey Milovidov).
  • Correction de la mise en forme incohérente de TTL lorsqu’il contient une fonction materialize. Résout #82828. #82831 (Alexey Milovidov).
  • Correction de la mise en forme incohérente de EXPLAIN AST dans une sous-requête lorsqu’elle contient des options de sortie telles que INTO OUTFILE. Résout #82826. #82840 (Alexey Milovidov).
  • Correction de la mise en forme incohérente des expressions entre parenthèses avec des alias dans un contexte où aucun alias n’est autorisé. Résout #82836. Résout #82837. #82867 (Alexey Milovidov).
  • Correction de la mise en forme de CREATE USER avec des paramètres de requête (c.-à-d. CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin).
  • Correction de l’analyse syntaxique d’une virgule finale dans les colonnes de la requête CREATE DICTIONARY après une colonne avec paramètres, par exemple Decimal(8). Résout #85586. #85653 (Nikolay Degterinsky).

Intégrations externes

  • Uniformisation des noms de paramètres dans ODBC et JDBC lors de l’utilisation de collections nommées. #83410 (Andrey Zvonov).
  • MongoDB : analyse implicite des chaînes en types numériques. Auparavant, si une valeur de type chaîne était reçue depuis une source MongoDB pour une colonne numérique dans une table ClickHouse, une exception était levée. Désormais, le moteur tente d’analyser automatiquement la valeur numérique à partir de la chaîne. Corrige #81167. #84069 (Kirill Nikiforov).
  • Autorisation de simdjson sur les architectures non prises en charge (auparavant, cela entraînait des erreurs CANNOT_ALLOCATE_MEMORY). #84966 (Azat Khuzhin).

Améliorations diverses

  • Ajout du moteur de table Ytsaurus et de la fonction de table. #77606 (MikhailBurdukov).
  • Amélioration de HashJoin::needUsedFlagsForPerRightTableRow : renvoie false pour un cross join. #82379 (lgbo).
  • Autorise l’écriture/la lecture de colonnes Map comme tableaux de tuples. #82408 (MikhailBurdukov).
  • Cette PR a été revertée. #82884 (Mithun p).
  • Logs asynchrones : limite le nombre maximal d’entrées conservées dans la file d’attente. #83214 (Raúl Marín).
  • Active Date/Date32 en tant qu’entiers dans les formats d’entrée JSON. #83597 (MikhailBurdukov).
  • Meilleure prise en charge des index Bloom filter (regular, ngram et token) afin qu’ils soient utilisés lorsque le premier argument est un tableau constant (l’ensemble) et le second la colonne indexée (le sous-ensemble), pour une exécution des requêtes plus efficace. #84700 (Doron David).
  • Autorise la conversion de type des valeurs de set lors du pushdown des filtres IN / GLOBAL IN sur les clés primaires du stockage KeyValue (par ex. EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • Élimine les scans complets lorsque l’analyse d’index aboutit à des plages vides pour la lecture avec des répliques parallèles. #84971 (Eduard Karacharov).
  • Corrige une série de problèmes pouvant survenir lors de l’exécution de tests d’intégration en local. #82135 (Oleg Doronin).
  • Active trace_log.symbolize par défaut pour les anciens déploiements. #85456 (Azat Khuzhin).

Corrections de bugs (dysfonctionnements visibles par l’utilisateur dans une version stable officielle)

Optimisations des performances

Correctifs liés à l’exécution des requêtes

  • Pour les requêtes combinant ORDER BY ... LIMIT BY ... LIMIT N, lorsque ORDER BY est exécuté sous forme de PartialSorting, le compteur rows_before_limit_at_least reflète désormais le nombre de lignes consommées par la clause LIMIT, et non plus le nombre de lignes consommées par la transformation de tri. #78999 (Eduard Karacharov).
  • Correction d’une logical error avec l’opérateur <=> et le moteur Join : la query renvoie désormais le code d’error approprié. #80165 (Vladimir Cherkasov).
  • Correction d’un crash dans la fonction loop lorsqu’elle est utilisée avec la famille de fonctions remote. Garantit que la clause LIMIT est respectée dans loop(remote(...)). #80299 (Julia Kartseva).
  • Correction du comportement incorrect des fonctions to_utc_timestamp et from_utc_timestamp lors du traitement des dates antérieures à l’epoch Unix (1970-01-01) et postérieures à la date maximale (2106-02-07 06:28:15). Désormais, ces fonctions ramènent correctement les valeurs, respectivement au début de l’epoch et à la date maximale. #80498 (Surya Kant Ranjan).
  • Correction de l’exécution de IN avec transform_null_in=1 lorsqu’il y a une valeur NULL dans l’argument de gauche et un résultat de subquery non Nullable. #81584 (Pavel Kruglov).
  • Correction du problème où les colonnes requises ne sont pas lues lors du traitement d’une subquery corrélée scalaire. Corrige #81716. #81805 (Dmitry Novik).
  • Correction de l’analyse du filtre lorsqu’une seule colonne d’alias constante est utilisée dans la query. Corrige #79448. #82037 (Dmitry Novik).
  • Correction de l’error Not found column pour les requêtes avec arrayJoin dans la condition WHERE et IndexSet. #82113 (Nikolai Kochetov).
  • Correction de l’exception TOO_DEEP_SUBQUERIES lorsque la définition d’une CTE référence une autre expression de table portant le même nom. #83413 (Dmitry Novik).
  • Correction d’un résultat incorrect pour les queries avec la clause WHERE ... IN (<subquery>) lorsque le query condition cache est activé (paramètre use_query_condition_cache). #83445 (LB7666).
  • INSERT SELECT avec UNION ALL pouvait entraîner un déréférencement de pointeur null dans un cas limite. Cela clôt #83618. #83643 (Alexey Milovidov).
  • Correction de LOGICAL_ERROR lors de l’analyse de l’expression de ROW POLICY pour les colonnes corrélées. #82618 (Dmitry Novik).
  • Correction de résultats erronés lorsque le query condition cache est utilisé conjointement avec des CTE récursives (issue #81506). #84026 (zhongyuankai).
  • Correction de l’analyse récursive infinie des définitions WINDOW invalides. Corrige #83131. #84242 (Dmitry Novik).
  • Correction du problème Not-ready Set pour IN (subquery) dans le paramètre additional_table_filters expression. #85210 (Nikolai Kochetov).
  • Correction d’une erreur logique liée à des sous-requêtes dupliquées lorsque optimize_syntax_fuse_functions est activé, clôture de #75511. #83300 (Vladimir Cherkasov).

Correctifs pour Iceberg et DataLake

  • Correction de la résolution des métadonnées lors des requêtes sur des tables Iceberg via le REST catalog. … #80562 (Saurabh Kumar Ojha).
  • Correction de data races dans Iceberg. #82088 (Azat Khuzhin).
  • Correction de « Context has expired » pour Iceberg. #82146 (Azat Khuzhin).
  • ClickHouse peut désormais lire des tables Iceberg depuis le Glue catalog après une évolution de schéma. Corrige #81272. #82301 (alesapin).
  • Correction de data races dans Iceberg. #82841 (Azat Khuzhin).
  • Désactive le pruning de fichiers basé sur les bornes pour les éléments d’Array Iceberg et les valeurs de Map Iceberg, y compris tous leurs sous-champs imbriqués. #83520 (Daniil Ivanik).
  • Correction des écritures Iceberg pour les types complexes. #85330 (scanhex12).
  • L’écriture des bornes inférieures et supérieures n’est pas prise en charge pour les types complexes. #85332 (scanhex12).
  • Correction de la nullabilité des fields dans Iceberg. #85977 (scanhex12).
  • Ne crée plus de fichier de suppression Iceberg vide. #86061 (scanhex12).
  • Met à jour le timestamp des métadonnées lors des écritures Iceberg. #85711 (scanhex12).
  • Spark ne peut pas lire les position delete files. #85762 (scanhex12).
  • Ne récupère plus le schéma à partir des manifest files, mais stocke séparément les schémas pertinents pour chaque snapshot. Déduit le schéma pertinent de chaque fichier de données à partir du snapshot correspondant. Le comportement précédent ne respectait pas la spécification Iceberg pour les entrées de manifest files avec le statut existing. #84588 (Daniil Ivanik).
  • Désormais, Iceberg n’essaie plus de mettre en cache la snapshot version pertinente entre les requêtes SELECT et tente toujours de résoudre le snapshot correctement. La précédente tentative de mise en cache du snapshot Iceberg entraînait des problèmes lors de l’utilisation d’une Iceberg table avec le time travel. #85038 (Daniil Ivanik).
  • Correction de la résolution des métadonnées lors des requêtes sur des tables Iceberg via le REST catalog. … #85531 (Saurabh Kumar Ojha).
  • Correction du masquage des secrets dans les table functions icebergS3Cluster et icebergAzureCluster. #85658 (MikhailBurdukov).

Correctifs DeltaLake

Correctifs TTL et MergeTree

  • Recalcule l’index min-max lorsque le TTL réduit le nombre de lignes, afin de garantir la fiabilité des algorithmes qui s’appuient dessus, tels que minmax_count_projection. Cela résout #77091. #77166 (Amos Bird).
  • Corrige le recalcul incorrect du TTL dans TTL GROUP BY lors de la mise à jour du TTL. #81222 (Evgeniy Ulasik).
  • Corrige l’erreur « Context has expired » lors des merges lorsqu’un dict est utilisé dans une expression TTL. #81690 (Azat Khuzhin).
  • Corrige LOGICAL_ERROR et le plantage qui s’ensuit lors de l’utilisation de la même colonne dans le TTL pour GROUP BY et SET. #82054 (Pablo Marcos).
  • MergeTree ne fait désormais plus rien en lien avec le TTL si tous les TTL sont supprimés de la table. #84441 (alesapin).
  • Corrige le fait que ALTER MODIFY ORDER BY ne validait pas les colonnes TTL dans les clés de tri. Les colonnes TTL sont désormais correctement rejetées lorsqu’elles sont utilisées dans des clauses ORDER BY au cours d’opérations ALTER, ce qui évite une corruption potentielle de la table. #84536 (xiaohuanlin).

Correctifs des projections

  • Correction d’une erreur logique lors de la matérialisation d’une projection lorsque le type de colonne a été changé en Nullable. #80741 (Pavel Kruglov).
  • Correction de l’utilisation incorrecte des métadonnées du parent dans la fonction de table mergeTreeProjection lorsque enable_shared_storage_snapshot_in_query = 1. Cela concerne #82634. #82638 (Amos Bird).
  • Correction d’un crash rare de ClickHouse lorsqu’une table comporte une projection, que lightweight_mutation_projection_mode = 'rebuild' et que l’utilisateur exécute une suppression légère qui supprime TOUTES les lignes de n’importe quel block de la table. #84158 (alesapin).
  • Correction de la sauvegarde des parts avec des projections corrompues. #85362 (Antonio Andelic).
  • Interdiction d’utiliser la colonne _part_offset dans les projections dans les versions tant qu’elle n’est pas stabilisée. #85372 (Sema Checherinda).

Correctifs pour les répliques parallèles

  • Pour certaines requêtes exécutées avec des répliques parallèles, les optimisations de lecture dans l’ordre pouvaient être appliquées sur un initiateur, mais pas sur les nœuds distants. Cela entraînait l’utilisation de modes de lecture différents par le coordinateur des répliques parallèles (sur l’initiateur) et par les nœuds distants, ce qui constitue une erreur logique. #80652 (Igor Nikonov).
  • Désactivation des répliques parallèles lorsqu’une sous-requête contient FINAL #81401. #83455 (zoomxi).
  • Correction de LOGICAL_ERROR pour les requêtes avec des répliques parallèles et plusieurs INNER JOIN suivis d’un RIGHT JOIN. N’utilisez pas de répliques parallèles pour ce type de requêtes. #84299 (Vladimir Cherkasov).
  • Les requêtes avec des répliques parallèles qui utilisent l’optimisation de lecture inversée dans l’ordre peuvent produire des résultats incorrects. #85406 (Igor Nikonov).

Authentification et sécurité

  • Correction du masquage des valeurs des named collections dans les logs/query_log. Clôt #82405. #82510 (Kseniia Sumarokova).
  • Définition d’un sel pour les données d’authentification lors de l’analyse de l’AST avec le type SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
  • Masquage des informations d’authentification du schema registry Avro afin qu’elles ne soient visibles ni par l’utilisateur ni dans les logs. #83713 (János Benjamin Antal).
  • Correction d’un comportement incorrect lors de l’exécution de REVOKE S3 ON system.*, qui révoquait les autorisations S3 pour *.*. Cela corrige #83417. #83420 (pufit).
  • Correction d’un crash du serveur lorsqu’un utilisateur créé avec no_password tente de se connecter après que le paramètre serveur allow_no_password a été défini sur 0. #84426 (Shankar Iyer).
  • Amélioration du message d’erreur lors d’une tentative de création d’un utilisateur identifié par JWT. #85072 (Konstantin Bogdanov).
  • Masquage des identifiants pour deltaLakeAzure, deltaLakeCluster, icebergS3Cluster et icebergAzureCluster. #85889 (Julian Maicher).
  • Correction d’un bug introduit dans #79963. Lors d’un insert dans une vue matérialisée avec un definer, la vérification des autorisations doit utiliser les grants du definer. Corrige #79951. #83502 (pufit).

Correctifs de sauvegarde et de restauration

  • Corrige la sauvegarde d’une table Memory vide, qui entraînait l’échec de la restauration de la sauvegarde avec l’erreur BACKUP_ENTRY_NOT_FOUND. #82791 (Julia Kartseva).
  • Corrige un message d’erreur trompeur lors de la restauration d’une sauvegarde sur un disque en lecture seule. #83051 (Julia Kartseva).
  • Corrige le lancement de sauvegardes internes superflues après des problèmes de connexion. #84755 (Vitaly Baranov).

Fonctions de fenêtre et d’agrégation

  • Correction d’un plantage possible dans Aggregator en cas d’exception lors de la fusion. #81450 (Nikita Taranov).
  • Correction d’un plantage possible dans Aggregator en cas d’exception lors de la fusion. #82022 (Nikita Taranov).
  • Correction d’une erreur de copier-coller dans arraySimilarity, qui interdit désormais l’utilisation de poids UInt32 et Int32. Mise à jour des tests et de la documentation. #82103 (Mikhail f. Shiryaev).
  • Correction d’un dépassement de capacité dans les fonctions numericIndexedVectorPointwiseAdd, numericIndexedVectorPointwiseSubtract, numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, qui se produisait lors de leur application à de grands nombres. #82165 (Raufs Dunamalijevs).

Correctifs pour Parquet et le format de fichier

  • Correction du bloom filter Parquet qui appliquait à tort une condition comme WHERE function(key) IN (...) comme s’il s’agissait de WHERE key IN (...). #81255 (Michael Kolupaev).
  • Correction du writer Parquet qui générait des statistiques incorrectes (min/max) pour les types Decimal. #83754 (Michael Kolupaev).
  • Correction de la désérialisation de groupArraySample/groupArrayLast en cas d’éléments vides (la désérialisation pouvait ignorer une partie des données binaires si l’entrée était vide, ce qui peut entraîner une corruption lors de la lecture des données et UNKNOWN_PACKET_FROM_SERVER dans le protocole TCP). Cela n’affecte pas les types numériques ni les types de date et heure. #82763 (Pedro Ferreira).
  • Correction de l’écriture des chemins JSON avec des valeurs NULL au format RowBinary. #83923 (Pavel Kruglov).

Correctifs liés aux JOIN

  • Correction de la modification du filter pour les queries avec une expression JOIN sur une table utilisant le moteur Merge. Corrige #82092. #82950 (Dmitry Novik).
  • Correction du crash lorsqu’un stockage key-value est joint avec une clé convertie en un autre type. #82497 (Pervakov Grigorii).
  • Correction d’une erreur logique lors de la résolution du matcher dans une query comportant plusieurs JOIN, ferme #81969. #82421 (Vladimir Cherkasov).
  • Correction de la fusion du filter dans la condition JOIN lorsque les opérandes d’égalité sont de types différents ou font référence à des constantes. Corrige #83432. #84145 (Dmitry Novik).
  • Correction de l’erreur logique Expected single dictionary argument for function lors de l’exécution d’un JOIN sur une condition d’inégalité lorsque l’une des colonnes est LowCardinality et l’autre une constante. Ferme #81779. #84019 (Alexey Milovidov).

Correctifs de la base de données Replicated

  • Correction de markReplicasActive dans DDLWorker et DatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh).
  • Correction de DatabaseReplicated::getClusterImpl. Si le premier élément (ou les premiers éléments) de hosts a id == DROPPED_MARK et qu’il n’existe aucun autre élément pour le même shard, le premier élément de shards sera un vecteur vide, ce qui provoque std::out_of_range. #82093 (Miсhael Stetsyuk).
  • Suivi du nombre de jobs asynchrones de chargement de tables. Si des jobs sont en cours d’exécution, ne met pas à jour tail_ptr dans TransactionLog::removeOldEntries. #82824 (Tuan Pham Anh).
  • Correction du problème suivant : si une table MergeTree est créée avec add_minmax_index_for_numeric_columns=1 ou add_minmax_index_for_string_columns=1, l’index est ensuite matérialisé lors d’une opération ALTER, ce qui empêche la base de données Replicated de s’initialiser correctement sur une nouvelle réplique. #83751 (Nikolay Degterinsky).
  • Correction de la création de RMV sur une nouvelle réplique de la base de données Replicated si DEFINER est supprimé. #85327 (Nikolay Degterinsky).
  • Correction de la récupération des bases de données répliquées lorsque le déplacement du fichier de métadonnées prend beaucoup de temps. #85177 (Tuan Pham Anh).
  • Récupération forcée de la base de données Replicated après restauration des métadonnées de la base de données dans Keeper. #85960 (Tuan Pham Anh).
  • Correction d’un bug dans la récupération de la base de données Replicated : si un nom de table contient le symbole %, la table pouvait être recréée avec un nom différent pendant la récupération. #85987 (Alexander Tokmakov).
  • Désormais, le worker DDL supprime les hôtes obsolètes de l’ensemble de répliques. Cela réduit la quantité de métadonnées stockées dans ZooKeeper. #88154 (alesapin).

Correctifs pour les lightweight updates

  • Correction des lightweight updates pour les tables utilisant les moteurs ReplacingMergeTree et CollapsingMergeTree. #84851 (Anton Popov).
  • Correction d’une erreur logique dans les lightweight updates qui mettent à jour toutes les colonnes de la table. #84380 (Anton Popov).
  • Correction des lightweight updates pour les tables utilisant le moteur ReplicatedMergeTree et créées sur des serveurs exécutant une version antérieure à 25.7. #84933 (Anton Popov).
  • Correction des lightweight updates pour les tables utilisant un moteur MergeTree non répliqué après l’exécution d’une requête ALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov).
  • Correction du nettoyage des patch parts dans ReplicatedMergeTree. Auparavant, le résultat d’une lightweight update pouvait temporairement ne pas être visible sur la réplique tant que la part fusionnée ou mutée qui matérialise les patch parts n’avait pas été téléchargée depuis une autre réplique. #85121 (Anton Popov).

Corrections liées à S3 et au stockage d’objets

  • Correction de la validation des arguments de la fonction de table S3 lors du masquage des secrets, évitant un possible LOGICAL_ERROR, clôture de #80620. #82056 (Vladimir Cherkasov).
  • Correction d’un possible interblocage pour les requêtes distantes lorsque le serveur subit une pression mémoire. #82160 (Kirill).
  • Ajout d’une expiration au jeton AWS ECS afin qu’il puisse être rechargé. #82422 (Konstantin Bogdanov).
  • Correction de la désactivation de l’alignement sur les limites pour le buffer mis en cache dans les moteurs de table externes. Cela a été cassé dans https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
  • Correction de no_sign_request pour le client S3. Il peut être utilisé pour éviter explicitement de signer les requêtes S3. Il peut également être défini pour des endpoints spécifiques à l’aide de paramètres basés sur les endpoints. #83379 (Antonio Andelic).
  • Ignore les nœuds indisponibles pendant un INSERT SELECT depuis s3Cluster() vers un MergeTree replicated. #83676 (Igor Nikonov).
  • Correction de la condition de retour anticipé pour le ralentissement du débit des requêtes S3 : pour activer ce comportement lorsque tous les threads sont en pause à cause d’une erreur renouvelable, il suffit que s3_slow_all_threads_after_network_error ou backup_slow_all_threads_after_retryable_s3_error soit à true, au lieu d’exiger les deux. #85505 (Julia Kartseva).
  • Correction d’une erreur logique lors de la lecture via des fonctions de stockage d’objets à travers une table Distributed ou une fonction de table distante. Corrige : #84658, corrige #85173, corrige #52022. #85359 (alesapin).
  • Correction de l’erreur logique S3Queue « Table is already registered ». Clôture de #84433. Cassé après https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
  • Correction de valeurs de paramètres trop grandes, qui cassaient les tables S3Queue et le redémarrage des répliques. #86074 (Nikolay Degterinsky).

Corrections pour les types Dynamic et Variant

  • Correction du rollback d’une colonne Dynamic en cas d’échec de l’analyse. #82169 (Pavel Kruglov).
  • Correction d’un possible plantage du type Variant dans UNION. #83295 (Pavel Kruglov).
  • Correction de la lecture d’une colonne Variant avec matérialisation différée. #84400 (Pavel Kruglov).
  • Ne pas valider les types expérimentaux ou suspects lors de l’exécution des expressions default/materialize pendant la lecture d’une table existante. #81618 (Pavel Kruglov).

Correctifs de Keeper

  • Correctif de Keeper : mise à jour correcte du nombre total de watches lors de la suppression de nœuds éphémères à la fermeture d’une session. #83583 (Antonio Andelic).
  • Correction des écritures dans le désordre dans le changelog de Keeper. Auparavant, des écritures pouvaient être en cours dans le changelog, mais un rollback pouvait entraîner une modification concurrente du fichier de destination. Cela pouvait provoquer des logs incohérents, voire une perte de données. #84434 (Antonio Andelic).
  • Correction de fuites dans Keeper avec le stockage rocksdb (les itérateurs n’étaient pas détruits). #84523 (Azat Khuzhin).
  • Correction d’un problème où le paramètre Keeper rotate_log_storage_interval = 0 faisait planter ClickHouse. (issue #83975). #84637 (George Larionov).
  • Correction du nombre total de watches renvoyé par Keeper. #84890 (Antonio Andelic).
  • Verrouillage du ‘mutex’ lors de la récupération de zookeeper depuis ‘view’ dans RefreshTask. #84699 (Tuan Pham Anh).

Correctifs d’indexation

  • Correction d’un skipping excessif de granules lors du filtrage sur des index token/ngram avec une regexp contenant une alternance et une première alternative non littérale. #79373 (Eduard Karacharov).
  • L’implémentation du paramètre use_skip_indexes_if_final_exact_mode (introduit dans la version 25.6) pouvait ne pas sélectionner une plage candidate pertinente selon les paramètres du moteur MergeTree / la distribution des données. Ce problème est désormais résolu. #82667 (Shankar Iyer).
  • L’optimisation du paramètre use_skip_indexes_if_final_exact_mode (introduit dans la version 25.6) pouvait ne pas sélectionner une plage candidate pertinente selon les paramètres du moteur MergeTree / la distribution des données. Ce problème est désormais résolu. #82879 (Shankar Iyer).
  • Auparavant, les index set ne prenaient pas en compte les colonnes Nullable lors de la vérification du passage des granules par le filtre (ticket #75485). #84305 (Elmi Ahmadov).
  • La comparaison avec la valeur nan n’utilisait pas les plages correctes lors de l’évaluation de l’index MinMax. #84386 (Elmi Ahmadov).
  • Les tokenizers ngram et no_op ne provoquent plus de plantage de l’index textuel (expérimental) en présence de tokens d’entrée vides. #84849 (Robert Schulze).

Correctifs des vues matérialisées

Correctifs pour Azure et le stockage dans le cloud

  • Dans AzureBlobStorage, pour la copie native, les méthodes d’authentification sont comparées ; si une exception se produit pendant cette opération, le code a été mis à jour pour revenir à une lecture suivie d’une copie (c’est-à-dire une copie non native). #82693 (Smita Kulkarni).
  • Corrige une double libération dans AzureIteratorAsync. #85064 (Nikita Taranov).

Correctifs de plantage et de stabilité

  • Corrige un plantage possible dans la journalisation lors de la fermeture d’une session, car user_id peut parfois être vide. #82513 (Bharat Nallan).
  • Corrige un plantage du client dû à une connexion laissée à l’état déconnecté après un INSERT invalide. #83253 (Azat Khuzhin).
  • Corrige un plantage lors du calcul de la taille d’un bloc contenant des colonnes vides. #83271 (Raúl Marín).
  • Corrige un plantage pouvant survenir pour une query avec le paramètre max_threads=1 lorsqu’elle est exécutée sous charge avec l’ordonnancement CPU activé. #83387 (Fan Ziqi).
  • Fait de zoutofmemory une erreur matérielle, faute de quoi une erreur logique sera levée. Voir https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei).
  • Corrige un abort possible (dû à l’attente de terminaison des threads depuis la tâche) et, espérons-le, des blocages (dans les tests unitaires) lors de l’arrêt de BackgroundSchedulePool. #83769 (Azat Khuzhin).
  • Corrige un interblocage causé par le thread de vérification d’annulation en arrière-plan. #84203 (Antonio Andelic).
  • Corrige un interblocage à l’arrêt dû à un verrouillage récursif du contexte pendant le nettoyage du library bridge. #83824 (Azat Khuzhin).
  • Corrige un plantage du client dû à une connexion laissée à l’état déconnecté après un INSERT invalide. #83842 (Azat Khuzhin).
  • Corrige un possible comportement indéfini (UB) pouvant entraîner des plantages en cas de MEMORY_LIMIT_EXCEEDED pendant la désérialisation de String. #85440 (Azat Khuzhin).
  • Corrige un plantage rare dans les insertions asynchrones qui modifient les paramètres log_comment ou insert_deduplication_token. #85540 (Anton Popov).

Correctifs pour Glue et les catalogues

  • Correction d’un bug dans l’intégration à Glue catalog. Désormais, ClickHouse peut lire des tables avec des types de données imbriqués dont certaines sous-colonnes contiennent des valeurs décimales, par exemple : map<string, decimal(9, 2)>. Corrige #81301. #82114 (alesapin).
  • ClickHouse lit désormais les tables de Glue Catalog lorsque le type de table est indiqué en minuscules. #84316 (alesapin).
  • Unity catalog ignore désormais les schémas comportant des types de données inhabituels dans le cas des tables non-Delta. Corrige #85699. #85950 (alesapin).

Correctifs de fonctions

  • Les fonctions trim{Left,Right,Both} prennent désormais en charge les chaînes d’entrée de type “FixedString(N)”. Par exemple, SELECT trimBoth(toFixedString('abc', 3), 'ac') fonctionne désormais. #82691 (Robert Schulze).
  • La fonction trim, lorsqu’elle est appelée avec des entrées toutes constantes, produit désormais une chaîne de sortie constante. (Bug #78796). #82900 (Robert Schulze).
  • Corrige une sortie incorrecte de la fonction formatDateTime lorsque le formateur %f est utilisé avec des formateurs de taille variable (par ex. %M). #83020 (Robert Schulze).
  • Corrige un bug lié aux arguments NULL dans la fonction CASE. #82436 (Yarik Briukhovetskyi).
  • N’utilise pas de parties non pertinentes d’un dictionnaire partagé dans la fonction lowCardinalityKeys. #83118 (Alexey Milovidov).
  • Corrige colorSRGBToOKLCH/colorOKLCHToSRGB pour les mélanges d’arguments constants et non constants. #83906 (Azat Khuzhin).
  • Corrige la construction incorrecte de tuples vides dans la fonction array(). Cela corrige #84202. #84297 (Amos Bird).
  • Corrige un bug qui entraînait un encodage et un décodage Bech32 incorrects. Le bug n’avait pas été détecté initialement, car une implémentation en ligne de l’algorithme utilisée pour les tests présentait le même problème. #84257 (George Larionov).

Correctifs des requêtes distribuées

  • Le INSERT SELECT distribué parallèle avec LIMIT était autorisé, ce qui était incorrect et entraînait une duplication des données dans la table cible. #84477 (Igor Nikonov).
  • Ne pas tenter de remplacer les fonctions de table par leur alternative cluster en présence d’un JOIN ou d’une sous-requête. #84335 (Konstantin Bogdanov).
  • Ajout d’une vérification lorsqu’une sous-requête corrélée est utilisée dans un contexte distribué afin d’éviter un plantage. Corrige #82205. #85030 (Dmitry Novik).
  • L’utilisation de distributed_depth comme indicateur de fonction *Cluster était incorrecte et pouvait entraîner une duplication des données ; client_info.collaborate_with_initiator est désormais utilisé à la place. #85734 (Konstantin Bogdanov).
  • Prise en charge des constantes globales de l’instruction WITH pour le INSERT SELECT distribué parallèle avec une table de destination Distributed. Auparavant, la query pouvait générer une erreur Unknown expression identifier. #85811 (Nikolai Kochetov).
  • Correction d’une erreur logique lors d’une tentative de CREATE ... AS (SELECT * FROM s3Cluster(...)) avec DatabaseReplicated. #85904 (Konstantin Bogdanov).
  • Ajout de vérifications sur sharding_key lors d’un ALTER de la table Distributed. Auparavant, un ALTER incorrect pouvait casser la définition de la table et empêcher le redémarrage du server. #86015 (Nikolay Degterinsky).

Corrections des métriques et du monitoring

  • Correction de la validation des paramètres des métriques asynchrones asynchronous_metrics_update_period_s et asynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan).
  • Correction des métriques IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles (elles étaient auparavant incluses dans une métrique sans le préfixe Cache). #83730 (Azat Khuzhin).
  • Correction de LOGICAL_ERROR dans QueryMetricLog : le mutex ne peut pas être NULL. #82979 (Pablo Marcos).
  • Correction des métriques KafkaAssignedPartitions et KafkaConsumersWithAssignment, qui étaient incorrectes. #85494 (Ilya Golshtein).
  • Correction de la sous-estimation de la statistique des octets traités lorsque PREWHERE (explicite ou automatique) est utilisé. #85495 (Michael Kolupaev).
  • Correction de la dérive du suivi de la mémoire dans le background schedule pool et l’executor. #84946 (Azat Khuzhin).

Correctifs liés aux types de données et aux conversions

  • Correction des cas où l’analyse de Time pouvait entraîner des problèmes avec msan. Corrige : #82477. #82514 (Yarik Briukhovetskyi).
  • Correction du tri des valeurs NaN dans le type LowCardinality(Float32|Float64|BFloat16). #83786 (Pervakov Grigorii).
  • Correction d’un dépassement de capacité pour les grandes valeurs (>2106-02-07) lors de la conversion de Date en DateTime64. #83982 (Yarik Briukhovetskyi).
  • Correction d’un problème lors de la lecture implicite de valeurs Time négatives dans la table, et clarification de la documentation. #83091 (Yarik Briukhovetskyi).
  • Le codec DoubleDelta ne peut désormais être appliqué qu’à des colonnes de type numérique. En particulier, les colonnes FixedString ne peuvent plus être compressées avec DoubleDelta. (corrige #80220). #84383 (Jimmy Aguilar Mena).
  • Correction d’une perte de précision dans JSONExtract lors de la conversion de nombres JSON en types Decimal. Désormais, les valeurs numériques JSON conservent leur représentation décimale exacte, ce qui évite les erreurs d’arrondi liées aux nombres à virgule flottante. #85665 (ssive7b).

Gestion de la mémoire et des ressources

  • Correction d’une mauvaise gestion de la mémoire liée à max_untracked_memory. #83607 (Azat Khuzhin).
  • Ne plus partager async_read_counters entre les requêtes. #83423 (Azat Khuzhin).
  • Correction d’éventuelles erreurs de File Cache non initialisé lorsqu’il est utilisé comme stockage temporaire de données. #83539 (Bharat Nallan).
  • Toujours appliquer filesystem_prefetches_limit (pas uniquement dans MergeTreePrefetchedReadPool). #83999 (Azat Khuzhin).

Correctifs de configuration et de paramètres

  • Lors du passage de paramètres via l’URI, seule la dernière valeur est prise en compte. #82137 (Sema Checherinda).
  • Correction des accès concurrents dans le client (en n’utilisant pas de contexte global) et des surcharges de session_timezone (auparavant, si session_timezone était défini, par exemple, dans users.xml/les options du client sur une valeur non vide, et dans le contexte de la requête sur une valeur vide, alors la valeur de users.xml était utilisée, ce qui était incorrect ; désormais, le contexte de la requête aura toujours priorité sur le contexte global). #82444 (Azat Khuzhin).
  • Interdire de définir threadpool_writer_pool_size à zéro afin de garantir que les opérations du serveur ne restent pas bloquées. #82532 (Bharat Nallan).
  • Correction d’un léger dépassement de capacité d’entier dans la configuration du paramètre role_cache_expiration_time_seconds (issue #83374). #83461 (wushap).
  • Interdire la valeur zéro pour max_insert_block_size, car cela pouvait provoquer une erreur logique. #83688 (Bharat Nallan).
  • Correction d’une boucle infinie dans estimateCompressionRatio() avec block_size_bytes=0. #83704 (Azat Khuzhin).
  • Des paramètres comme date_time_input_format étaient tout simplement ignorés lors de l’utilisation de HTTP avec multipart. #85570 (Sema Checherinda).

Correctifs MongoDB

  • Auparavant, les définitions du moteur de table MongoDB pouvaient inclure un composant de chemin dans l’argument host:port, qui était ignoré sans avertissement. L’intégration MongoDB refuse de charger de telles tables. Avec ce correctif, nous autorisons le chargement de telles tables et ignorons le composant de chemin si le moteur MongoDB comporte cinq arguments, en utilisant le nom de la base de données fourni dans les arguments. Remarque : ce correctif ne s’applique pas aux tables nouvellement créées ni aux requêtes utilisant la fonction de table mongo, ni aux sources de dictionnaire et aux collections nommées. #81942 (Vladimir Cherkasov).

Correctifs divers

  • Dans les versions précédentes, le serveur renvoyait un contenu excessif pour les requêtes vers /js. Cela corrige #61890. #81895 (Alexey Milovidov).
  • Correction de InterpreterInsertQuery::extendQueryLogElemImpl pour ajouter des accents graves aux noms de base de données et de table lorsque nécessaire (par exemple, lorsque les noms contiennent des caractères spéciaux comme -). #81528 (Ilia Shvyrialkin).
  • Correction d’une possible condition de concurrence entre le thread de suggestion et le thread principal du client. #82233 (Azat Khuzhin).
  • Correction de la sûreté vis-à-vis des exceptions dans la réécriture de union/intersect/except_default_mode. Cela corrige #82664. #82820 (Alexey Milovidov).
  • Lors de l’utilisation d’une implémentation de Database sans mise en cache, les métadonnées de la table correspondante sont supprimées une fois les colonnes renvoyées et la référence est invalidée. #82939 (buyval01).
  • L’appel Onprogress dans JSONEachRowWithProgress est synchronisé avec la finalisation. #83879 (Sema Checherinda).
  • Correction d’un bogue rare où la requête MATERIALIZE COLUMN pouvait entraîner des fichiers inattendus dans checksums.txt et, à terme, des data parts détachées. #84007 (alesapin).
  • Gestion correcte des exceptions lors du rafraîchissement périodique des parts. #84083 (Azat Khuzhin).
  • Correction de la génération des noms de colonnes pour les littéraux booléens afin d’utiliser “true”/“false” au lieu de “1”/“0”, ce qui évite les conflits de noms de colonnes entre littéraux booléens et entiers dans les requêtes. #84945 (xiaohuanlin).
  • Correction de problèmes potentiels de tri imprécis dans la table Merge. #85025 (Xiaozhe Yu).
  • Implémentation des API manquantes pour DiskEncrypted. #85028 (Azat Khuzhin).
  • Introduction d’un paramètre de rétrocompatibilité pour permettre au nouvel analyseur de référencer un alias externe dans la clause WITH en cas de conflit de noms. Cela corrige #82700. #83797 (Dmitry Novik).
  • Autorisation de référencer n’importe quelle table dans l’argument view(...) de la fonction de table remote lorsque l’analyseur est activé. Cela corrige #78717. Cela corrige #79377. #83844 (Dmitry Novik).
  • Correction de l’écriture avec append (dans MergeTree utilisé pour les transactions expérimentales) avec les types de métadonnées plain_rewritable/plain, auparavant simplement ignorés. #83695 (Tuan Pham Anh).
  • Correction de l’utilisation du logger dans IAccessStorage. #84365 (Konstantin Bogdanov).
  • Correction du pruning des fichiers via une colonne virtuelle dans les data lakes. #84520 (Kseniia Sumarokova).
  • Correction d’un problème où l’interrogation d’une source distante lente pouvait provoquer un dépassement des limites d’un vecteur. #84820 (George Larionov).
  • Stocke correctement tous les paramètres dans les métadonnées de table pour le moteur object queue. #84860 (Antonio Andelic).
  • Correction de l’erreur CORRUPTED_DATA lorsque des colonnes lazy sont utilisées avec un tri externe. #84738 (János Benjamin Antal).
  • Suppression des appels inutiles à getStatus() pendant les requêtes SYSTEM DROP REPLICA. Corrige le cas où une table est supprimée en arrière-plan et où l’exception Shutdown for storage is called est levée. #85220 (Nikolay Degterinsky).
  • Ajout des vérifications manquantes sur la longueur des noms de table dans les requêtes CREATE OR REPLACE et RENAME. #85326 (Michael Kolupaev).
  • Correction d’un crash et d’une corruption de données lors de ALTER UPDATE pour JSON. #85383 (Pavel Kruglov).
  • Correction d’un segfault dans le moteur MergeTree coalescent pour les grandes chaînes. Cela clôt #84582. #85709 (scanhex12).
  • Correction de send_logs_source_regexp (après la refactorisation du logging asynchrone dans #85105). #85797 (Azat Khuzhin).
  • Correction d’une possible incohérence pour les Dictionaries avec update_field en cas d’erreurs MEMORY_LIMIT_EXCEEDED. #85807 (Azat Khuzhin).
  • Correction des requêtes HTTP effectuées par la table function url() afin d’inclure correctement les numéros de port dans l’en-tête Host lors de l’accès à des ports non standard. Cela résout les échecs d’authentication lors de l’utilisation d’URL présignées avec des services S3-compatible comme MinIO exécutés sur des ports personnalisés, ce qui est courant dans les environnements de Development. (Corrige #85898). #85921 (Tom Quist).
Dernière modification le 29 juin 2026