Skip to main content

Changements incompatibles avec les versions précédentes

Modifications des requêtes et de la syntaxe

  • L’opérateur IN utilise désormais une sémantique de correspondance exacte des valeurs pour le type Bool : seules les valeurs 0 et 1 de l’ensemble correspondent à des valeurs Bool. Auparavant, les valeurs numériques supérieures à 255 dans l’ensemble IN étaient incorrectement forcées à true, de sorte que SELECT CAST(1, 'Bool') IN (256) renvoyait 1. Cette expression renvoie désormais correctement 0. #93115 (Ashrith Bandla).
  • Correction de la priorité de l’opérateur NOT pour l’aligner sur le standard SQL : NOT a désormais une priorité inférieure à IS NULL, BETWEEN, LIKE et aux opérateurs arithmétiques. Par exemple, NOT (x) IS NULL est désormais interprété comme NOT (x IS NULL) au lieu de (NOT x) IS NULL. Cela peut modifier le résultat des requêtes qui s’appuyaient sur l’ancien comportement (non standard). #97680 (Alexey Milovidov).
  • SELECT n’est plus autorisé comme identifiant non cité dans un élément de liste d’expressions WITH. #101059 (Aruj Bansal).
  • L’opérateur IN rejette désormais les conversions Decimal avec perte à l’intérieur des types composites (Tuple, Array, Map), ce qui rend son comportement cohérent avec celui des comparaisons scalaires de niveau supérieur. Auparavant, les vérifications de précision n’étaient appliquées qu’aux valeurs scalaires de niveau supérieur : par exemple, CAST('33.3', 'Decimal64(1)') IN (33.33) renvoyait correctement 0, mais CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) renvoyait incorrectement 1. Les deux cas renvoient désormais correctement 0. #101812 (Nihal Z. Miaji).

Modifications des types de données

  • Les versions de sérialisation des types de données sont désormais propagées aux types de données imbriqués. Par exemple, la version de sérialisation de String with_size_stream n’était auparavant appliquée qu’aux colonnes String de premier niveau et aux éléments de Tuple ; elle s’applique désormais à tout type String à l’intérieur de n’importe quel type imbriqué, comme Array, Map, Variant ou JSON. Ce comportement est contrôlé par le paramètre MergeTree propagate_types_serialization_versions_to_nested_types, désormais activé par défaut. Après cette modification, les nouvelles data parts créées ne peuvent plus être lues par les anciennes versions, mais les anciennes parts peuvent être lues par la nouvelle version. Les mises à niveau sont sûres, mais pas les retours à une version antérieure. #94859 (Pavel Kruglov).
  • Correction du boutisme de la sérialisation binaire de QBit afin d’utiliser le format little-endian. #101378 (Raufs Dunamalijevs).

Modifications du stockage et des index

  • Correction des métadonnées des projections normales afin que les projections avec des clés de tri multicolonnes soient correctement reconnues. #91352 (Amos Bird).
  • Correction des fichiers d’index de saut qui ne respectaient pas le paramètre replace_long_file_name_to_hash, ce qui provoquait des erreurs « Nom de fichier trop long » ainsi que des erreurs de lecture d’index pour les index aux noms longs. Les noms de fichiers des index de saut sont désormais hachés lorsqu’ils dépassent max_file_name_length, comme pour les fichiers de colonne. Ce changement est rétrocompatible (les nouveaux serveurs lisent les anciennes parts), mais une rétrogradation (ou d’anciens serveurs lors d’une mise à niveau progressive) peut entraîner l’ignorance des index aux noms longs. #97128 (Raúl Marín).

Fonctionnalités supprimées

  • Suppression du type de skip index hypothesis. Il s’agissait d’une fonctionnalité expérimentale peu utilisée et d’un intérêt pratique limité. La création de tables avec INDEX ... TYPE hypothesis génère désormais une erreur. #96874 (Alexey Milovidov).
  • Suppression de la fonction expérimentale detectProgrammingLanguage. #99567 (Alexey Milovidov).

Modifications des paramètres et de la configuration

  • La valeur par défaut de mysql_datatypes_support_level a été modifiée, passant de vide à decimal,datetime64,date2Date32, ce qui active par défaut le mapping correct de MySQL DATE vers Date32, de DECIMAL/NUMERIC vers Decimal et de DATETIME/TIMESTAMP avec précision vers DateTime64. Auparavant, les colonnes MySQL DATE étaient mappées vers Date, qui ne peut pas représenter les dates antérieures au 1970-01-01, ce qui entraînait une corruption des données. #97716 (Alexey Milovidov).

Modifications des insertions et de la déduplication

  • L’async insert est désormais activé par défaut — ClickHouse regroupe par lots toutes les petites insertions. Ce comportement est régi par le paramètre compatibility : définir compatibility sur une version inférieure à 26.2 rétablit l’ancienne valeur par défaut, false. Les insertions asynchrones peuvent être activées ou désactivées à plusieurs niveaux : dans les profils utilisateur de la config, pour la session, pour la requête ou pour la table MergeTree. #97590 (Sema Checherinda).

Modifications des tables système

Autres changements incompatibles

  • mergeTreeAnalyzeIndexes{,UUID} accepte désormais un tableau de noms de parties au lieu d’une expression régulière, car les expressions régulières sont lentes (fonctionnalité expérimentale). #98474 (Azat Khuzhin).
  • La bibliothèque H3 a été mise à jour vers la v4, ce qui améliore la précision des calculs de longueur, de surface et d’autres mesures. Ce changement est incompatible avec les versions précédentes, car les nouveaux résultats diffèrent des anciens. #100348 (Alexey Milovidov).
  • La manière dont la table Merge gère les colonnes virtuelles a été modifiée. Si la table sous-jacente contient _table ou _database, ces colonnes sont lues depuis le stockage ; sinon, elles sont renseignées après l’étape de lecture, via l’étape d’expression. #101742 (Mikhail Artemenko).

Nouvelles fonctionnalités

Fonctions

  • Ajout de la fonction naturalSortKey(s) pour les clés de tri naturel. #90322 (Nazarii Piontko).
  • Ajout de la fonction arrayAutocorrelation(arr [, max_lag]), qui calcule l’autocorrélation normalisée d’un tableau de nombres pour chaque décalage. Prend en charge les types de tableaux d’entiers, de nombres à virgule flottante et décimaux. #94776 (Wenyu Chen).
  • La fonction has() est désormais prise en charge pour le type JSON afin de vérifier l’existence d’un chemin, comme avec Map. #96927 (DQ).
  • Ajout de la fonction de table mergeTreeTextIndex(database, table, index), qui lit les données directement depuis un text index. Elle peut être utilisée pour l’introspection ou pour effectuer des aggregations sur les données du text index. #97003 (Anton Popov).
  • Ajout de la fonction SQL obfuscateQuery. #98305 (Xuewei Wang).
  • Ajout des fonctions caseFoldUTF8 et removeDiacriticsUTF8 pour le repliement de casse Unicode et la suppression des signes diacritiques. #98973 (George Larionov).
  • La fonction printf prend désormais en charge les chaînes de format non constantes, ce qui permet d’utiliser un format différent pour chaque ligne en fonction des valeurs des colonnes. #98991 (Yash).
  • Ajout de la fonction highlight(), qui entoure les occurrences des termes de recherche dans une chaîne de texte avec des balises HTML (par défaut <em>/</em>). Prend en charge la correspondance ASCII insensible à la casse, la fusion automatique des correspondances qui se chevauchent, ainsi que des balises d’ouverture et de fermeture personnalisées. #99131 (Peng).
  • Ajout de la fonction de chaîne normalizeUTF8NFKCCasefold pour la normalisation Unicode NFKC_Casefold, qui combine la normalisation NFKC avec le repliement de casse. #99276 (George Larionov).
  • Ajout du tokenizer unicode_word pour les full-text indexes et de la fonction tokens. Il segmente le texte selon les règles de délimitation des mots Unicode : les mots ASCII sont formés avec des caractères de liaison (tiret bas, deux-points, point, apostrophe), tandis que les caractères Unicode non ASCII deviennent des tokens d’un seul caractère. Les stop words configurables utilisent par défaut la ponctuation CJK courante. #99357 (Amos Bird).
  • Ajout de la fonction arrayTranspose, qui prend un tableau bidimensionnel (matrice) et le transpose. #101214 (Vitaly Baranov).
  • Ajout de la fonction hasPhrase (alias matchPhrase) pour la recherche de phrases (séquences continues de tokens). La recherche s’effectue en brute-force et n’est pas encore prise en charge par le text index. #101997 (Elmi Ahmadov).
  • Ajout de dotProduct comme fonction de distance prise en charge pour les vector similarity indexes. La direction du tri est désormais validée pour toutes les fonctions de distance afin d’éviter des résultats incorrects sans avertissement. #102254 (Renzo).
  • La fonction stem peut désormais appliquer la racinisation à tous les mots/tokens dans les colonnes String, FixedString, Array([Fixed]String), Nullable, LowCardinality et Const. #99137 (Jimmy Aguilar Mena).
  • La fonction stem n’est plus expérimentale (auparavant, il fallait activer allow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena).
  • Ajout de la fonction JSONAllValues, qui renvoie toutes les valeurs d’une colonne JSON sous forme de Array(String), les valeurs étant sérialisées en représentation textuelle et ordonnées selon leur nom de chemin. Ajout également de la prise en charge des index textuels pour l’expression JSONAllValues sur les colonnes JSON : lorsqu’un index textuel est créé sur JSONAllValues(json_column), il est automatiquement utilisé pour filtrer les requêtes sur les sous-colonnes JSON (par exemple json_column.key1 = 'value'). #100730 (Anton Popov).
  • Ajout d’unités compatibles avec PostgreSQL à l’opérateur EXTRACT : EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE et MILLENNIUM. Correction également de EXTRACT(WEEK FROM date), qui renvoyait auparavant une erreur. #100274 (Alexey Milovidov).
  • Ajout de la prise en charge, via un sucre syntaxique du parseur, de la syntaxe SQL standard de la fonction OVERLAY. La fonction overlay existe déjà ; cela ajoute la prise en charge de la forme basée sur des mots-clés utilisant PLACING, FROM et FOR comme séparateurs. #101681 (Desel72).
  • Les valeurs Date et Date32 peuvent désormais être additionnées aux valeurs Time et Time64 à l’aide de l’opérateur +, produisant un résultat DateTime ou DateTime64. Par exemple, SELECT toDate('2024-01-15') + toTime('14:30:25') renvoie 2024-01-15 14:30:25. Le résultat est calculé dans le fuseau horaire de la session, et les résultats hors plage sont gérés conformément au paramètre date_time_overflow_behavior. #102421 (Nihal Z. Miaji).

Fonctionnalités SQL et de requête

  • Lorsqu’un paramètre est de type Nullable et n’est pas spécifié, sa valeur est désormais considérée comme NULL. #93869 (Vikash Kumar).
  • ClickHouse peut désormais éliminer des data parts entières dans les requêtes SELECT en s’appuyant sur les statistiques min/max. #94140 (zoomxi).
  • Ajout de la prise en charge des Materialized CTEs, qui n’évaluent les CTE qu’une seule fois pendant l’exécution de la requête et stockent leurs résultats dans des tables temporaires. #94849 (Dmitry Novik).
  • Certaines fonctions peuvent désormais être utilisées sans parenthèses en SQL. #95949 (Aly Kafoury).
  • Ajout de la syntaxe de subcolumn combinée json.@path pour le type JSON. Elle renvoie la valeur littérale sous forme de Dynamic si le chemin contient un scalaire, le sub-object sous forme de Dynamic si le chemin contient un objet imbriqué, ou NULL si le chemin est absent. #98788 (Pavel Kruglov).
  • Ajout du keyword SOME pour les expressions de subquery. Son comportement est identique à celui de ANY. #99842 (Artem Kytkin).
  • Ajout de la prise en charge de SET TIME ZONE 'tz' comme alias de SET session_timezone. #99883 (phulv94).
  • Ajout de la prise en charge de la clause SQL standard VALUES comme expression de table dans FROM, par exemple SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72).
  • Ajout de la prise en charge des littéraux d’intervalle composés conformes au standard SQL avec des qualificateurs de plage TO, par exemple INTERVAL '1:30' HOUR TO MINUTE, décomposés en interne en sommes d’intervalles. #100453 (Desel72).
  • Ajout de la commande SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x' pour les modes ordered et unordered. #100709 (Bharat Nallan).

Moteurs de table et stockage

  • Ajout de la prise en charge de la lecture incrémentielle pour le moteur de table Paimon, avec suivi de la progression des snapshots via Keeper, y compris des lectures delta ciblées de snapshots via paimon_target_snapshot_id. #93655 (XiaoBinMu).
  • Ajout de la prise en charge de ZooKeeper auxiliaire dans DatabaseReplicated. #95590 (RinChanNOW).
  • Ajout de la prise en charge de la lecture des types de timestamp à la nanoseconde d’Iceberg v3 (timestamp_ns et timestamptz_ns), mappés vers DateTime64(9) et DateTime64(9, 'UTC'). Cela permet à ClickHouse de lire des données Iceberg utilisant ces types dans le schéma ; cela ne constitue ni une prise en charge complète d’Iceberg v3, ni la possibilité d’écrire en Iceberg v3 avec ces types. #97132 (Dmitry Kovalev).
  • Ajout de ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') pour les tables Iceberg. #97904 (murphy-4o).
  • Ajout d’un nouveau cache SLRU pour les métadonnées Parquet afin d’améliorer les performances de lecture en évitant de retélécharger des fichiers uniquement pour lire les métadonnées. #98140 (Grant Holly).
  • Ajout de la prise en charge des index de saut de MergeTree pour les colonnes JSON à l’aide de JSONAllPaths avec les types d’index bloom_filter, tokenbf_v1, ngrambf_v1 et text (inversé), permettant d’ignorer des granules en fonction de l’ensemble des chemins JSON présents dans chaque granule. #98886 (Pavel Kruglov).
  • Ajout de l’index de projection commit_order, qui réorganise les données dans l’ordre d’insertion. #99004 (Mikhail Artemenko).
  • Ajout de la sérialisation par buckets pour les colonnes Map dans MergeTree (map_serialization_version = 'with_buckets'). Les clés sont réparties dans des buckets basés sur le hachage afin que la lecture d’une seule clé (m['key']) ne lise qu’un seul bucket au lieu de la colonne entière, ce qui offre une accélération de 2 à 49x pour les recherches sur une seule clé selon la taille de la map. Le nombre de buckets et la stratégie de répartition peuvent être contrôlés par les nouveaux paramètres MergeTree map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient et map_buckets_min_avg_size. Le paramètre map_serialization_version_for_zero_level_parts conserve la sérialisation de base pour les insertions afin d’éviter une surcharge d’écriture, tandis que les parts fusionnées utilisent des buckets. Les index de saut sur mapKeys/mapValues sont pris en charge avec la sérialisation par buckets, et optimize_functions_to_subcolumns réécrit m['key'] en lecture d’une subcolumn par clé lorsque des buckets sont disponibles. #99200 (Pavel Kruglov).

Insertion et déduplication

  • Mise en place d’un nouveau comportement pour max_insert_block_size_rows, max_insert_block_size_bytes, min_insert_block_size_rows et min_insert_block_size_bytes dans le processus de squashing, régi par le paramètre de compatibilité use_strict_insert_block_limits. #94207 (Kirill Kopnev).

Paramètres et configuration

  • Ajout du paramètre MergeTree table_readonly pour marquer les tables en lecture seule et empêcher les insertions et les modifications. #97652 (Alexey Milovidov).
  • Ajout du paramètre use_partition_pruning (alias use_partition_key). Définissez-le sur false pour désactiver l’élagage des partitions en fonction de la clé de partition. #97888 (Nihal Z. Miaji).
  • Chaque entrée type=http dans <protocols> peut désormais spécifier une clé <handlers> personnalisée pointant vers une section de configuration <http_handlers_*> distincte, ce qui permet d’appliquer des règles de routage HTTP différentes selon le port. #98414 (Amos Bird).
  • Ajout de deux paramètres MergeTree — replicated_fetches_min_part_level et replicated_fetches_min_part_level_timeout_seconds — qui permettent aux répliques d’éviter de récupérer auprès de leurs homologues des parts récemment insérées (non fusionnées), réduisant ainsi la surcharge liée à la réplication lors d’une ingestion intensive. #98625 (tanner-bruce).
  • Ajout du paramètre serveur restore_access_entities_with_current_grants. Lorsqu’il est activé, les privilèges des utilisateurs/rôles restaurés sont limités à ce que l’utilisateur effectuant la restauration est autorisé à accorder (même sémantique que GRANT CURRENT GRANTS), au lieu d’échouer avec ACCESS_DENIED. #98795 (pufit).
  • Ajout des paramètres max_skip_unavailable_shards_num et max_skip_unavailable_shards_ratio pour limiter le nombre de shards pouvant être ignorés silencieusement lorsque skip_unavailable_shards est activé. Si le nombre ou la proportion de shards indisponibles dépasse le seuil configuré, une exception est levée au lieu de renvoyer silencieusement des résultats incomplets. #99369 (Alexey Milovidov).
  • Implémentation de quotas par hash de requête normalisée pour protéger les services ClickHouse publics contre les abus. NORMALIZED_QUERY_HASH est pris en charge comme type de clé de quota — avec un quota distinct pour chaque requête normalisée unique, de sorte que CREATE QUOTA q KEYED BY normalized_query_hash suit chaque requête distincte indépendamment. QUERIES_PER_NORMALIZED_HASH est pris en charge comme type de ressource de quota — limitant le nombre maximal d’exécutions d’une même requête normalisée dans un intervalle, de sorte que MAX queries_per_normalized_hash = 100 empêche un même modèle de requête de s’exécuter plus de 100 fois. #99586 (Alexey Milovidov).
  • Le paramètre MergeTree auto_statistics_types a désormais pour valeur par défaut minmax, uniq, de sorte que des statistiques minmax et uniq sont créées automatiquement pour toutes les colonnes appropriées dans les nouvelles tables. materialize_statistics_on_insert a désormais pour valeur par défaut false, de sorte que les statistiques sont construites lors des fusions plutôt qu’au moment de l’insertion, réduisant ainsi la surcharge des insertions. Définissez materialize_statistics_on_insert = 1 pour rétablir l’ancien comportement. #101275 (Han Fei).
  • Ajout du paramètre d’actualisation prefer_dependency_replica pour les chaînes de dépendances de vues matérialisées afin de réduire les données manquantes dues au décalage de réplication entre répliques. #101591 (Seva Potapov).

Authentification

  • Ajout de l’option de configuration LDAP par serveur <follow_referrals> (par défaut false) pour contrôler si le client LDAP suit les renvois. Désactiver le suivi des renvois évite les timeouts et les blocages lors des recherches à partir d’une base DN racine de domaine Active Directory, et réduit le bruit dans les journaux. #96765 (paf91).

Tables système

  • Ajout de system.histogram_metric_log, une nouvelle table système qui prend périodiquement des instantanés de toutes les métriques sous forme d’histogrammes (par ex. les latences S3/Azure, les durées des étapes de traitement des requêtes de Keeper). La colonne value de system.histogram_metrics est désormais de type Float64 pour offrir davantage de flexibilité et une meilleure compatibilité avec le modèle de données Prometheus. #103046 (Miсhael Stetsyuk).

Fonctionnalités expérimentales

  • Ajout du codec de compression ALP pour nombres à virgule flottante (sans fallback ALP_rd pour les doubles non compressibles). #91362 (Nazarii Piontko).
  • Ajout des Lazy Type Hints expérimentaux pour les colonnes JSON. Lorsqu’ils sont activés via allow_experimental_json_lazy_type_hints, ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName), lorsqu’il ajoute ou modifie uniquement des indications de type, s’exécute instantanément comme une simple opération sur les métadonnées, sans réécriture des données historiques. Les indications de type sont appliquées au moment de la requête pour les anciennes parts et matérialisées lors des INSERT et des fusions en arrière-plan. #97412 (tanner-bruce).
  • Ajout de la prise en charge des dialectes SQL externes via la bibliothèque polyglot. #99496 (Alexey Milovidov).
  • Ajout du paramètre query_plan_optimize_join_order_randomize, qui rend aléatoires les statistiques utilisées pour la réorganisation des jointures, ce qui est utile pour les tests. #100643 (Vladimir Cherkasov).
  • Ajout de la prise en charge des AI functions dans ClickHouse, permettant aux utilisateurs d’appeler des points de terminaison OpenAI et Anthropic en SQL. aiGenerate est la première fonction de ce type incluse. #100831 (George Larionov).
  • Ajout des AI functions aiClassify, aiExtract et aiTranslate pour exploiter des API de LLM dans ClickHouse. #100832 (George Larionov).
  • Ajout de la prise en charge des data lakes sur Azure avec Delta Kernel. #102202 (Smita Kulkarni).

Améliorations des performances

Performances des JOIN

  • Quelques améliorations ont été apportées à HashJoin et ConcurrentHashJoin. #96663 (Yarik Briukhovetskyi).
  • Ajout de la prise en charge de l’inversion des côtés des JOIN ANTI, SEMI et FULL en fonction des statistiques de l’optimiseur. #97498 (Hechem Selmi).
  • Réduction de la contention du cache dans les JOIN RIGHT et FULL en vérifiant si JoinUsedFlags est défini avant écriture. #99274 (Hechem Selmi).
  • Accélération des hash joins sur des clés Int32 et Int64 couvrant une petite plage, grâce à l’utilisation d’une table de hachage à index direct. #99275 (Hechem Selmi).

Optimisation des requêtes

  • Optimisation du saut de granules pour pointInPolygon sur de grands polygones, et correction d’une erreur dans l’analyse d’index de pointInPolygon qui se produisait lors de l’élagage par clé primaire. #91633 (Nihal Z. Miaji).
  • optimize_read_in_order est désormais pris en compte lors de la lecture des projections. #95885 (Andrey Zvonov).
  • Légère optimisation de la lecture depuis le dictionnaire du text index, ce qui améliore les performances globales de l’analyse du text index. #97519 (Anton Popov).
  • Amélioration des performances de l’analyse du text index pour les requêtes comportant des conditions combinées impliquant à la fois des colonnes indexées et non indexées. Auparavant, l’optimisation de sortie anticipée lors de l’analyse d’index était désactivée à tort dans ce type de cas. #98096 (Anton Popov).
  • Amélioration des performances des requêtes avec des expressions constantes qui génèrent des arrays ou des maps très volumineux. #98287 (Alexey Milovidov).
  • Correction de l’analyse des conditions sur la clé pour les clés primaires DateTime64 comparées à des constantes entières, ce qui empêchait auparavant tout élagage de granules. #98410 (Amos Bird).
  • Le paramètre optimize_syntax_fuse_functions est désormais activé par défaut. #98424 (Alexey Milovidov).
  • L’élagage des partitions est désormais autorisé lorsque le prédicat contient n’importe quel opérateur de comparaison (=, <, >, !=) et que la clé de partition est enveloppée dans une chaîne de fonctions déterministes (par exemple, avec PARTITION BY x, des prédicats comme cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026 ou toYYYYMM(x) != 2026 utiliseront tous la clé de partition pour l’élagage). #98432 (Nihal Z. Miaji).
  • L’optimisation de lecture dans l’ordre et l’élagage par clé primaire sont désormais autorisés lorsque le type cible de CAST est Nullable et que la conversion est monotone ; par exemple, avec PRIMARY KEY x, ClickHouse peut utiliser l’optimisation de lecture dans l’ordre pour ORDER BY x::Nullable(UInt64) et l’élagage par clé primaire pour des prédicats tels que WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • L’élagage d’index et le pushdown des filtres sont désormais autorisés lorsqu’une colonne entière est comparée à un littéral flottant ; par exemple, des prédicats comme WHERE x < 10.5 peuvent désormais utiliser la clé primaire pour l’élagage, et des filtres tels que prime < 1e9 ou number < 1e5 sont désormais poussés vers les table functions primes() et numbers() au lieu d’entraîner une exécution non bornée. #98516 (Nihal Z. Miaji).
  • Les requêtes qui filtrent sur des colonnes de clé primaire MergeTree avec des alternances Regex sur des chaînes littérales, telles que ^(abc-1|abc-2), peuvent désormais utiliser l’élagage par clé primaire lorsque les alternatives partagent un préfixe commun. #98988 (Yash).
  • Optimisation de INTERSECT ALL et EXCEPT ALL. #99097 (Raufs Dunamalijevs).
  • Ajout de la prise en charge de l’optimisation read_in_order_use_virtual_row pour les lectures en ordre inverse. #99198 (Vladimir Cherkasov).
  • Requêtes discontinues plus rapides pour les colonnes LowCardinality avec un seul dictionnaire. #99285 (Ivan Babrou).
  • Correction de la dégradation des performances de mise à l’échelle pour les requêtes courtes avec agrégation sur des machines dotées d’un grand nombre de cœurs. Lorsqu’une requête lit peu de marks, le pipeline ne s’étend plus jusqu’à max_threads après l’agrégation, ce qui évite le surcoût lié à des streams presque vides. #99493 (Alexey Milovidov).
  • Amélioration des performances des requêtes avec répliques parallèles grâce à une sélection correcte de la taille des tâches de lecture. #99801 (Nikita Taranov).
  • Suppression des éléments ORDER BY redondants en fin de clause une fois que toutes les clés GROUP BY sont couvertes par le préfixe ORDER BY. #100157 (Alexey Milovidov).
  • Optimisation des requêtes en appliquant la clause LIMIT au niveau de UNION ALL. #100364 (Alexey Milovidov).
  • Ajout de la prise en charge de la compilation JIT pour les comparaisons de colonnes String et FixedString dans ORDER BY, améliorant de 6 à 17 % les performances de tri pendant la phase de fusion pour les clés de tri riches en chaînes. #100577 (Raúl Marín).
  • Lorsque read_in_order_use_virtual_row est activé avec le nouveau paramètre read_in_order_use_virtual_row_per_block, les informations de limite des lignes virtuelles sont désormais émises après chaque block lu depuis MergeTree, ce qui permet à la fusion de redonner la priorité aux sources en cours de stream pour les parts dont les données sont entièrement filtrées par WHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov).
  • Meilleure parallélisation des requêtes avec des views simples (sur une table MergeTree sous-jacente) exécutées avec des répliques parallèles. #100815 (Igor Nikonov).
  • Ajout de la prise en charge des répliques parallèles sur des views simples (y compris les views UNION ALL éligibles sur des tables MergeTree) lorsque parallel_replicas_allow_view_over_mergetree=1. Cela parallélise la requête externe de la view plutôt que la requête interne, augmentant ainsi la parallélisation des requêtes entre les nœuds. #100958 (Igor Nikonov).
  • Optimisation de la lecture dans l’ordre de la clé primaire pour full_sorting_merge lorsque des filtres avec IN sont présents dans le plan de requête. #101261 (Nikita Taranov).
  • Amélioration des performances de INSERT VALUES pour les colonnes Map, Array et Tuple lorsque les valeurs sont transmises sous forme de chaînes échappées (par exemple '{\'key\':1}'), évitant un recours inutile à l’analyseur d’expressions SQL. #102119 (Joanna Hulboj).

Performance des fonctions et de l’agrégation

  • Amélioration des performances de la fonction levenshteinDistance. #94543 (Joanna Hulboj).
  • Optimisation des conversions par lots de types décimaux en évitant les appels de fonction pour chaque élément. #95923 (Konstantin Bogdanov).
  • Amélioration des performances des requêtes LIKE. #98149 (Elmi Ahmadov).
  • Optimisation de la fonction d’agrégation avgWeighted grâce à l’utilisation d’accumulateurs locaux au lieu d’un transfert par stockage pour chaque ligne via un état d’agrégation, avec un gain de performances pouvant atteindre 27 % pour les entrées Nullable. #98793 (Antonio Andelic).
  • Accélération des fonctions var*Stable et stddev*Stable pour les colonnes Float64 grâce à la dévirtualisation de la boucle interne. Cela permet des optimisations du compilateur (FMA/registres) qui modifient les résultats en virgule flottante au niveau de l’ULP. #99460 (Riyane El Qoqui).
  • Utilisation de l’encodage base58 optimisé de Firedancer pour les entrées de 32/64 octets (automatique pour base58Encode), avec en plus la possibilité d’utiliser le décodage base58 optimisé si le résultat décodé fait 32/64 octets (explicitement avec base58Decode('...', 32)). #99461 (Joanna Hulboj).
  • Optimisation de la fonction cutURLParameter en supprimant les décalages mémoire inutiles. #100218 (Nikita Semenov).
  • Conversion plus rapide des flottants en chaînes pour les grandes valeurs entières grâce à l’extension du chemin rapide itoa avec un arrondi compatible avec dragonbox. #100649 (Raúl Marín).
  • Remplacement de dragonbox par zmij pour une conversion des flottants en chaînes 1,5 à 3 fois plus rapide. #100650 (Raúl Marín).
  • Conversion plus rapide de Int128/UInt128 en chaînes grâce au remplacement de la division logicielle par la réduction de Barrett et au déroulage de la boucle de conversion. #100671 (Raúl Marín).
  • Évite la création de threads redondants lors du merge parallèle de UniqExactSet. #100686 (Jiebin Sun).
  • Ajout d’un merge parallèle par lots pour UniqExactSet. #100687 (Jiebin Sun).

Performances du stockage et des E/S

  • Réduction de la contention sur les verrous lors des opérations en lecture seule sur les tables ReplicatedMergeTree avec mutations terminées. #95771 (Eduard Karacharov).
  • Iceberg peut désormais préremplir de manière asynchrone les métadonnées dans le cache, via le paramètre iceberg_metadata_async_prefetch_period_ms défini lors de la création de la table. Les requêtes SELECT sur les tables Iceberg peuvent désormais spécifier le paramètre iceberg_metadata_staleness_ms, ce qui permet à ClickHouse de s’appuyer sur la version des métadonnées en cache si elle est plus récente que le seuil d’obsolescence indiqué ; sinon, le catalogue Iceberg distant est interrogé pour récupérer les métadonnées les plus récentes. Cela peut supprimer les appels au catalogue Iceberg pendant le traitement des requêtes, avec un gain de performances notable à la clé. #96191 (Arsen Muk).
  • Le mode ordered de S3Queue utilise désormais ListObjectsV2 StartAfter de S3 pour éviter de relister tout l’historique du préfixe, ce qui réduit les appels à ListObjects. #96370 (Venkata Vineel).
  • Activation des lectures parallèles avec le moteur de table YTsaurus. #97343 (MikhailBurdukov).
  • Amélioration des performances des lacs de données. Dans les versions précédentes, la lecture depuis le stockage d’objet n’adaptait pas la taille du pipeline au nombre de threads de traitement. #99548 (Alexey Milovidov).
  • Autorisation du prefetch lors de la lecture d’un fichier distant via le userspace page cache. #99919 (Alexey Milovidov).
  • Correction d’une régression significative des performances d’INSERT lorsque deduplicate_insert=enable (valeur par défaut depuis 26.2), en reportant le calcul du hash des données de l’étape de squashing vers le sink et en utilisant le hachage par lot des colonnes via updateHashWithValueRange, ce qui réduit la surcharge d’environ 2,5 s à environ 0,5 s pour 5 M de lignes avec 22 colonnes. #101494 (Sema Checherinda).

Optimisation de la mémoire

  • Pour les insertions synchrones, le bloc d’origine (nécessaire à la déduplication) peut désormais être omis afin d’économiser de la mémoire. #96661 (Sema Checherinda).
  • Amélioration des performances et réduction de l’utilisation mémoire pour les fonctions de fenêtre parallèles dans certains scénarios, ainsi que pour les charges de travail arrayFold avec de grands tableaux. Cela peut également réduire la pression liée aux défauts de page et améliorer la stabilité lorsque les requêtes concernées sont soumises à des limites mémoire strictes. #98892 (filimonov).

Améliorations

Requêtes et SQL

  • Les projections agrégées sont désormais correctement prises en charge dans les vues. #88798 (Amos Bird).
  • optimize_aggregators_of_group_by_keys optimise désormais correctement les fonctions d’agrégation dans les requêtes GROUPING SETS. #93935 (Xiaozhe Yu).
  • Ajout de la prise en charge de l’optimisation convertissant les jointures OUTER en INNER avec join_use_nulls. #95968 (Vladimir Cherkasov).
  • cast_keep_nullable a été étendu pour fonctionner avec les types Dynamic/JSON. Lorsqu’il est activé, le transtypage de NULL à partir de types pouvant être Nullable renvoie NULL ; sinon, NULL génère une erreur CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).
  • Ajout de la clause ROLE à CREATE USER. #97074 (Vitaly Baranov).
  • Ajout d’informations sur les filtres différés sous forme d’élément distinct dans la sortie de la requête EXPLAIN (lors de l’utilisation de politiques de lignes/PREWHERE avec FINAL). #97374 (Yarik Briukhovetskyi).
  • Ajout de la prise en charge des expressions de jointure de tables entre parenthèses dans la clause FROM, par exemple SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
  • Application des index de saut de données lors de l’analyse d’index distribuée. #97767 (Azat Khuzhin).
  • La clé de tri d’une table peut désormais être une expression comme toDate(time), et la décision de ne pas différer de telles expressions est désormais prise lorsqu’elles font partie de filtres. #98237 (Yarik Briukhovetskyi).
  • L’optimiseur d’ordre des jointures déduit désormais des prédicats transitifs d’équi-jointure à partir des conditions de jointure existantes. Par exemple, avec A.x = B.x AND B.x = C.x, l’équivalence A.x = C.x est reconnue, ce qui permet à l’optimiseur d’envisager des jointures directes entre des tables connectées transitivement. Cela peut améliorer la qualité du plan pour les schémas en étoile et en flocon. Cette fonctionnalité est contrôlée par le nouveau paramètre enable_join_transitive_predicates (désactivé par défaut). #98479 (Alexander Gololobov).
  • Lorsque apply_row_policy_after_final ou apply_prewhere_after_final est activé, les conditions composées AND dans les politiques de lignes et PREWHERE sont désormais décomposées pour extraire les atomes de clé de tri en vue de l’analyse de l’index de clé primaire. Auparavant, si un filtre différé contenait un mélange de prédicats sur la clé de tri et hors clé de tri (par exemple x > 1 AND y != 'foo'), l’expression entière était exclue de l’analyse d’index. #98513 (Yarik Briukhovetskyi).
  • Seules les répliques “actives” (joignables) participent désormais à l’analyse d’index distribuée. #98521 (Azat Khuzhin).
  • Le nombre de nœuds utilisés dans l’heuristique automatique des répliques parallèles a été plafonné au nombre réel de nœuds du cluster (et non plus au seul paramètre max_parallel_replicas). #98668 (Nikita Taranov).
  • Mise en œuvre des requêtes spéculatives et de la lecture asynchrone pour l’analyse d’index distribuée. #98724 (Azat Khuzhin).
  • Ajout de la prise en charge de la clause SAMPLE dans l’analyse distribuée des index. #98931 (Azat Khuzhin).
  • Ajout de la prise en charge de la monotonie pour la multiplication, ce qui permet l’élagage de la clé primaire pour les expressions key * constant. #98983 (Amos Bird).
  • Les messages d’erreur de l’analyzer ne listent plus toutes les colonnes d’une table (ce qui pouvait produire des exceptions de plus de 150 KB). Les listes de colonnes sont désormais limitées à 10 entrées. #99002 (Yash).
  • Les statistiques de colonnes issues de sous-requêtes avec jointures sont désormais correctement renvoyées afin que la requête parente puisse les utiliser pour réordonner les jointures. #99096 (Alexander Gololobov).
  • ALTER TABLE MODIFY COLUMN x TTL ... est désormais autorisé sans qu’il soit nécessaire de préciser le type de la colonne. #99208 (Nikolay Degterinsky).
  • Sortie EXPLAIN PLAN pretty=1 améliorée : affichage des colonnes de sortie de la requête de plus haut niveau, des libellés/symboles de relation de jointure avec estimation du nombre de lignes résultantes et de la localité, et inclusion des colonnes de sortie pour chaque étape de jointure/source. #99462 (Kirill Kopnev).
  • Correction d’un échec de la table function merge() avec une erreur UNKNOWN_IDENTIFIER lors de requêtes sur des colonnes absentes de certaines tables distribuées/distantes sous-jacentes. #99833 (Alexey Milovidov).
  • ConditionSelectivityEstimator n’est plus utilisé dans l’optimiseur lorsque la condition n’est pas sous forme CNF (par exemple where a = 0, qui est une condition unique pour laquelle les statistiques ne peuvent pas aider). #100110 (Han Fei).
  • distributed_index_analysis_min_indexes_bytes_to_activate est désormais appliqué après l’élagage des partitions. #100477 (Azat Khuzhin).
  • EXPLAIN PIPELINE prend désormais en charge le paramètre distributed=1 pour inclure les fragments de pipeline distants. #100513 (Nikita Taranov).
  • use_partition_pruning = 0 désactive désormais également l’élagage de l’index MinMax et l’optimisation de comptage sur les colonnes de clé de partition, en plus de désactiver l’élagage basé sur les clés de partition. #100904 (Nihal Z. Miaji).
  • EXPLAIN [PLAN] pretty=1 affiche désormais les expressions dans un format lisible. #100927 (Kirill Kopnev).
  • accurateCastOrNull et accurateCastOrDefault prennent désormais en charge les types cibles Tuple, y compris les Tuples imbriqués avec des éléments Nullable. Auparavant, ces fonctions rejetaient les cibles Tuple parce que Tuple ne pouvait pas se trouver à l’intérieur de Nullable. #100942 (Nihal Z. Miaji).
  • Vous pouvez désormais utiliser une virgule finale dans la clause WITH avant une requête SELECT. #101093 (Aruj Bansal).
  • Mise en œuvre de la matérialisation différée des colonnes pour ReplacingMergeTree avec FINAL lorsque le prédicat est suffisamment sélectif. #101647 (Nikolai Kochetov).
  • Amélioration des estimations de sélectivité par défaut pour les conditions sans statistiques, afin de les aligner sur les heuristiques standard du secteur : 0,1 pour la sélectivité de la condition LIKE, 0,33 pour la sélectivité d’une condition inconnue. #101653 (Alexander Gololobov).
  • Intégration directe de la sous-requête VIEW dans l’arbre de requête afin de permettre davantage d’optimisations sur la VIEW. #100830 (Dmitry Novik).

Fonctions

  • Vous pouvez désormais utiliser une entrée JSON/Object native avec les fonctions JSONExtract. #96711 (Fisnik Kastrati).
  • Ajout de la fonction SQL tokensForLikePattern, qui découpe les motifs LIKE en tokens tout en respectant la sémantique des caractères génériques : % et _ sont traités comme des caractères génériques, les caractères génériques échappés (\%, \_) comme des littéraux, et les tokens adjacents à des caractères génériques non échappés sont ignorés. #97872 (Amos Bird).
  • Implémentation de la fonction toDaysInMonth(), qui renvoie le nombre de jours dans le mois de la date spécifiée. #99227 (Vitaly Baranov).
  • Le tokenizer unicodeWord a été renommé en asciiCJK. #100956 (George Larionov).
  • Ajout d’un sucre syntaxique au niveau du parseur pour la syntaxe de fonction OVERLAY du standard SQL. La fonction overlay existe déjà ; cela ajoute la prise en charge de la forme basée sur des mots-clés, avec PLACING, FROM et FOR comme séparateurs. #101681 (Desel72).
  • La fonction ngrams rejette désormais les longueurs de ngram non valides. Par exemple, SELECT ngrams('abc', 0) renvoie désormais une erreur. #101922 (Robert Schulze).
  • Ajout de la prise en charge du tokenizer array dans l’optimisation LIKE. #102880 (Elmi Ahmadov).

Moteurs de table et stockage

  • Ajout d’un thread de nettoyage dédié pour MergeTree afin d’éviter les retards de nettoyage en cas de forte charge de merges. #91574 (Amos Bird).
  • Les tables avec des règles DELETE TTL peuvent désormais utiliser l’algorithme de fusion verticale. #97332 (murphy-4o).
  • Les index marks des index secondaires sont désormais préchargés lorsque le paramètre prewarm_mark_cache est activé (chargés dans l’index mark cache pendant les fetches de data parts et au démarrage de la table). #97772 (Anton Popov).
  • Des index textuels peuvent désormais être créés sur des colonnes Nullable([Fixed]String) et Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
  • Annulation anticipée des merges en arrière-plan dans DROP DATABASE pour ordinary shared merge tree. #98161 (Shaohua Wang).
  • Ajout du paramètre finalize_projection_parts_synchronously pour permettre la finalisation synchrone des projection parts pendant INSERT, réduisant le pic d’utilisation mémoire pour les tables comportant de nombreuses projections, tout en conservant par défaut le comportement asynchrone existant. #98228 (Amos Bird).
  • Ajout du paramètre MergeTree share_nested_offsets (valeur par défaut : true). Lorsqu’il est défini sur false, les colonnes Array avec des noms à points (par exemple n.a, n.b) sont traitées comme des colonnes indépendantes au lieu de partager des fichiers d’offset et de vérifier l’égalité des tailles de tableau dans le cadre de l’ancienne sémantique Nested. #98416 (Amos Bird).
  • Optimisation de TRUNCATE DATABASE TABLES LIKE par pré-annulation des merges en parallèle. #98597 (Shaohua Wang).
  • Réduction de la contention sur les verrous dans MergeTreeBackgroundExecutor en libérant les ressources des tâches sans acquérir le verrou. #98604 (Dmitry Novik).
  • TRUNCATE DATABASE prend désormais en charge l’annulation de requête. #98828 (Shaohua Wang).
  • Redémarrage du cache de statistiques après modification d’un paramètre MergeTree. #98520 (Han Fei).
  • Ajout du paramètre MergeTree compress_per_column_in_compact_parts pour contrôler l’organisation des blocs compressés au sein des compact parts. Quand true (par défaut, ce qui préserve le comportement actuel), chaque colonne démarre un nouveau bloc compressé, ce qui permet une décompression sélective. Quand false, toutes les colonnes d’une granule sont regroupées dans un même bloc compressé, ce qui améliore le taux de compression et les performances de lecture pour les workloads qui lisent systématiquement toutes les colonnes. #101114 (Amos Bird).
  • L’index textuel est désormais GA et reste activé quelle que soit la valeur du paramètre compatibility, ce qui évite une désactivation inattendue lors des restaurations de sauvegarde ou en mode de compatibilité. #101518 (Nikita Fomichev).
  • Ajout de la prise en charge de l’index textuel construit sur mapValues(map) avec l’opérateur IN. #99286 (Anton Popov).
  • Amélioration de l’analyse de plusieurs index textuels utilisés simultanément dans une même requête. Le paramètre use_skip_indexes_on_data_read n’est plus requis pour l’optimisation de lecture directe des index textuels. #102255 (Anton Popov).
  • Ajout de la prise en charge de l’analyse des index de texte pour la fonction hasPhrase en mode HINT. #102438 (Elmi Ahmadov).
  • Les statistiques MinMax des colonnes stockent désormais les valeurs minimale et maximale sous forme de Field (typé) au lieu de Float64. Le format sérialisé inclut le nom du type de la colonne en plus des valeurs. La version du fichier de statistiques passe à V2 ; les fichiers écrits par des versions antérieures doivent être rematérialisés (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).

Lacs de données

  • Ajout d’une nouvelle requête pour vérifier l’état de DataLakeCatalog. #94690 (Smita Kulkarni).
  • Amélioration des écritures Iceberg pour Unity Catalog. #98162 (Konstantin Vedernikov).
  • Reconstruction des entités dans IcebergManifestFile afin de rendre la maintenance du code moins sujette aux erreurs (corrige également certains problèmes de mise en cache des fichiers manifeste). #98231 (Daniil Ivanik).
  • Amélioration d’Iceberg ALTER TABLE ... EXECUTE expire_snapshots(...) avec une prise en charge plus complète des arguments. #99130 (murphy-4o).
  • Modification de l’interface des insertions Iceberg avec le catalogue. Les paramètres storage_catalog_type, storage_aws_access_key_id et autres paramètres similaires sont désormais obsolètes. #100334 (Konstantin Vedernikov).
  • Correction de la gestion incohérente des chemins dans Iceberg causée par l’utilisation mixte des chemins de stockage et des chemins de métadonnées ; obligation pour les tables Iceberg d’écrire un emplacement de table qui soit soit une URL, soit un chemin absolu ; ajout d’un mécanisme de repli pour le calcul de la taille des fichiers dans Azure ; prise en charge de version-hint.txt de manière compatible avec Spark ; introduction d’abstractions au niveau des types pour éviter de confondre les types de chemins ; et correction de l’utilisation des suppressions positionnelles. #100420 (Daniil Ivanik).
  • Évite d’analyser l’ensemble du catalogue distant de lac de données pour les suggestions de table « Maybe you meant … » lorsque show_data_lake_catalogs_in_system_tables est désactivé. #100452 (Alsu Giliazova).
  • Les informations sur les objets utilisées pour analyser les fichiers de données Iceberg contiennent désormais le nombre de lignes du fichier et sa taille en octets, extraits du fichier manifeste. #100645 (Daniil Ivanik).
  • Ajout d’un mécanisme d’élagage Delta Lake avec des colonnes virtuelles. #101634 (Konstantin Vedernikov).

S3 et stockage d’objets

  • Ajout d’un espace réservé {_schema_hash} pour le moteur de table S3, qui insère un hachage des définitions des colonnes de la table dans le chemin S3. #98265 (Miсhael Stetsyuk).
  • Ajout d’une nouvelle option pour forcer le style virtuel/par chemin pour les endpoints S3. #102378 (Konstantin Vedernikov).

Paramètres et configuration

  • Les utilisateurs peuvent désormais spécifier plusieurs méthodes d’authentification dans la configuration users_xml. #91998 (Flip-Liquid).
  • Vous pouvez désormais définir les paramètres internal_replication pour un cluster créé par la base de données Replicated. #97228 (Pervakov Grigorii).
  • Ajout du paramètre allow_nullable_tuple_in_extracted_subcolumns, qui contrôle si les sous-colonnes Tuple(...) extraites de Tuple, Variant, Dynamic et JSON sont renvoyées sous la forme Nullable(Tuple(...)) (NULL pour les lignes où la valeur est manquante) ou sous la forme Tuple(...) (valeurs de tuple par défaut pour les lignes où la valeur est manquante). Désactivé par défaut ; ne peut être modifié qu’en redémarrant le serveur. #97299 (Nihal Z. Miaji).
  • type_json_allow_duplicated_key_with_literal_and_nested_object est désormais activé par défaut, ce qui évite les erreurs liées aux clés dupliquées lors de l’analyse de JSON comme {"a" : 42, "a" : {"b" : 42}} que ClickHouse peut produire à partir des données d’origine {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
  • Les statistiques de colonnes sont désormais disponibles en GA. Le paramètre allow_experimental_statistics (par défaut false) devient obsolète au profit de allow_statistics (par défaut true) ; allow_statistics_optimize passe de bêta à GA ; ClickHouse crée des statistiques minmax et uniq pour les nouvelles colonnes (paramètre MergeTree auto_statistics_types) ; et, pour éviter de ralentir les INSERT, materialize_statistics_on_insert est désormais désactivé par défaut. #97487 (Han Fei).
  • La relation entre enable_parallel_replicas et automatic_parallel_replicas_mode a été clarifiée : une requête ne peut utiliser des répliques parallèles que si enable_parallel_replicas > 0. Avec automatic_parallel_replicas_mode=1, la décision est prise lors de la planification en fonction des statistiques collectées ; avec automatic_parallel_replicas_mode=0, les répliques parallèles sont utilisées pour toutes les requêtes prises en charge, indépendamment des statistiques. Les opérations insert-select sur Distributed avec des répliques parallèles se comportent toujours comme si automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
  • La fonctionnalité d’usurpation d’identité (EXECUTE AS target_user) a été activée par défaut. #97870 (Vitaly Baranov).
  • Ajout du paramètre access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (activé par défaut), qui interdit l’utilisation de profils de paramètres définis dans la configuration (à l’exception du profil default) pour les utilisateurs définis en SQL. #98662 (Alexander Tokmakov).
  • Ajout d’un paramètre pour contrôler le comportement en cas d’incompatibilité de type pour Variant et Dynamic (throw ou retour de NULL). #99085 (Bharat Nallan).
  • La valeur par défaut de stderr_reaction a été remplacée, passant de throw à log_last, pour les UDFs exécutables. Les UDFs qui écrivent des avertissements sur stderr n’échouent plus lorsque le code de sortie est 0, et les exceptions liées au code de sortie incluent désormais le contenu de stderr. #99232 (Xu Jia).
  • Ajout du paramètre input_format_column_name_matching_mode, qui permet différents modes de sensibilité à la casse pour les formats d’entrée. #99346 (manerone).
  • Les statistiques automatiques ne sont plus activées pour les tables système, car elles en tirent rarement parti. #102862 (Han Fei).

Tables système et monitoring

  • Les index de saut de données utilisés lors de l’exécution des requêtes sont désormais suivis dans system.query_log, dans une nouvelle colonne skip_indices. #99793 (Grant Holly).
  • La colonne projections_duration_ms a été ajoutée à system.part_log ; elle enregistre, pour chaque projection, la durée de fusion/reconstruction en millisecondes. #98292 (Amos Bird).
  • L’alias de colonne INDEX_LENGTH a été ajouté à information_schema.tables. #101705 (Robert Schulze).
  • information_schema.tables ignore désormais les parties de table inactives, ce qui rend les valeurs de taille affichées plus réalistes. #101706 (Robert Schulze).

ClickHouse Keeper

  • find_super_nodes ne se bloque plus lors du parcours des enfants du premier super-nœud, ce qui permet d’en trouver plusieurs. #97819 (pufit).
  • Marque une session ZooKeeper comme expirée dès le début de la finalisation, au lieu d’attendre la fin du thread d’envoi. Cela permet aux autres threads d’établir une nouvelle session sans délai. #99102 (Raúl Marín).
  • Ignore les requêtes Keeper obsolètes pour les sessions déjà déconnectées, évitant ainsi des allers-retours Raft inutiles. Le nombre de sessions terminées suivies est plafonné par le paramètre de coordination max_finished_sessions_cache_size. #99246 (Antonio Andelic).
  • Empêche la commande Keeper mntr de se bloquer à cause de contentions sur les verrous. #99472 (Antonio Andelic).
  • Réduction de la contention sur les verrous dans le dispatcher Keeper grâce à l’appel des callbacks et à la distribution des requêtes de lecture en dehors de la portée du mutex, avec ajout de gardes de verrou profilés pour l’observabilité. #99751 (Antonio Andelic).

Gestion de la mémoire

  • Ajout du paramètre de configuration use_separate_cache_arena pour contrôler la séparation de l’arène de cache. #100664 (Seva Potapov).

Formats de données

  • Ajout du paramètre output_format_trim_fixed_string pour supprimer les octets nuls de fin des valeurs FixedString dans les formats de sortie texte. #97558 (NeedmeFordev).
  • Il est désormais possible de lire des fichiers GeoParquet contenant différents types Geo dans une même colonne. #97851 (Mark Needham).
  • La désérialisation des états binaires AggregateFunction exige désormais la consommation complète de l’entrée. Si des octets de fin superflus sont présents, ClickHouse lève une exception au lieu d’accepter des données d’état mal formées. #98786 (Nihal Z. Miaji).
  • Les utilisateurs peuvent désormais écrire les types de données intervalle de ClickHouse au format Arrow. #99519 (Peter Nguyen).
  • Ajout de la prise en charge native de l’importation et de l’exportation des types de données UUID dans les formats Arrow et Parquet, avec inférence logique automatique pour les UUID de premier niveau et prise en charge d’indications de schéma explicites pour les UUID imbriqués. #99521 (Ivan).
  • Tolérance à l’absence de padding à la fin du dernier bloc des fichiers Parquet. #99857 (Seva Potapov).
  • L’exportation des UUID vers Parquet via l’encodeur Arrow inclut désormais l’annotation de type UUID correcte, ce qui évite de devoir convertir manuellement les données FixedString(16) lors de la relecture des fichiers. #100150 (Ivan).
  • Ajout de la prise en charge native de l’importation des types de données Apache Arrow StringView et BinaryView dans des colonnes ClickHouse String, ce qui améliore la compatibilité de l’ingestion basée sur Arrow. #100762 (Ivan).
  • Ajout de la prise en charge de Nullable(Tuple) dans les formats Arrow, ArrowStream, ORC et l’ancien format Parquet. #101272 (Nihal Z. Miaji).

Collections nommées et dictionnaires

  • Ajout de sslmode aux clés autorisées pour les sources de dictionnaire PostgreSQL, ce qui permet de configurer le mode SSL pour les connexions de dictionnaire PostgreSQL (par exemple avec AWS RDS, qui impose SSL par défaut). #98014 (mcalfin).
  • Évite la suppression des collections nommées dont dépendent des sources de dictionnaire. #98127 (Pablo Marcos).
  • Ajout de la prise en charge des types Map et JSON/Object comme attributs de dictionnaire. Les dictionnaires peuvent désormais stocker et récupérer des types complexes, notamment Map(String, String), Map(String, Array(String)), JSON et Nullable(JSON), dans les layouts FLAT et HASHED. #98627 (yanglongwei).
  • SYSTEM RELOAD DICTIONARIES recharge désormais les dictionnaires dans un ordre topologique, afin que les dictionnaires dont la source est un autre dictionnaire utilisent des données à jour après le rechargement. #98356 (Alexey Milovidov).
  • Les dictionnaires de type cache ne prennent plus de verrou exclusif dans hasKeys, ce qui réduit la contention sur les verrous grâce à l’utilisation d’un verrou partagé pour les lectures du cache. #100796 (liuguangliang).

Autres améliorations

  • Les messages ACCESS_DENIED ne révèlent plus les noms de colonnes, sauf si l’utilisateur peut afficher toutes les colonnes requises ; les noms de base de données et de table restent visibles dans le message. #91067 (filimonov).
  • Rechargement de la configuration du cluster si les adresses IP du nom d’hôte du serveur local changent, plutôt que lors d’un changement d’adresse IP de n’importe quel hôte. #93726 (Zhigao Hong).
  • Vidage des buffers de logging asynchrone en cas de crash. #97836 (Azat Khuzhin).
  • Réduction du verrouillage dans le contrôle d’accès. #97894 (Nikita Taranov).
  • Mise à jour de ClickStack vers la version 2.20.0. #98252 (Aaron Knudtson).
  • Désactivation de la génération SQL par IA (commande ??) dans le client intégré (protocoles SSH et WebSocket) afin d’empêcher l’accès aux variables d’environnement du serveur. #100290 (Alexey Milovidov).
  • Envoi d’un NACK pour les messages défectueux lors de l’utilisation du moteur de stockage RabbitMQ. #102157 (Seva Potapov).

Corrections de bugs

Correctifs JOIN

  • Correction d’une colonne manquante lorsqu’un alias d’identifiant non standard était utilisé dans un JOIN avec l’ancien analyseur. #95679 (Zhigao Hong).
  • Correction d’un résultat incorrect lorsque l’algorithme grace_hash était utilisé avec des joins non-équi et que le bloc de gauche ne pouvait pas être traité entièrement en raison de contraintes de taille sur le résultat du JOIN. #97866 (János Benjamin Antal).
  • Correction d’une erreur logique avec analyzer_compatibility_join_using_top_level_identifier et ARRAY JOIN. #98179 (Vladimir Cherkasov).
  • Correction d’une exception LOGICAL_ERROR lorsqu’un RIGHT JOIN encapsulé dans un CROSS JOIN était permuté par l’optimisation query_plan_join_swap_table dans le chemin de code hérité de l’étape de join. #98279 (Alexey Milovidov).
  • Correction d’une exception “Pipeline stuck” dans les joins full_sorting_merge, provoquée par un interblocage dans PingPongProcessor lorsque l’optimisation FilterBySetOnTheFly créait une dépendance circulaire avec MergeJoinTransform. #98454 (Alexey Milovidov).
  • Correction d’une erreur logique lorsque CROSS JOIN était utilisé avec INNER JOIN USING. #98459 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR lorsque arrayJoin était utilisé dans une expression de filtre avec OUTER JOIN et join_use_nulls activé. #98464 (Alexey Milovidov).
  • Correction d’une exception BAD_GET et de résultats de requête incorrects lorsqu’une expression non booléenne (par ex. sin(col)) était utilisée à la fois dans WHERE et SELECT avec un JOIN, en raison d’une optimisation de descente de filtre qui corrompait des nœuds DAG partagés. #98681 (Alexey Milovidov).
  • Correction d’une LOGICAL_ERROR “Replica decided to read in Default mode, not in WithOrder” lors de l’utilisation de read_in_order_through_join avec des répliques parallèles. #98685 (Alexey Milovidov).
  • LEFT ANTI JOIN avec plusieurs colonnes de clé de jointure renvoyait des résultats incorrects lorsque enable_join_runtime_filters=1 (par défaut). #98871 (Alexander Gololobov).
  • Correction d’un bug dans l’optimisation query_plan_convert_any_join_to_semi_or_anti_join qui renvoyait un résultat incorrect pour les lignes sans correspondance. #99112 (Yarik Briukhovetskyi).
  • Correction d’une exception dans les fonctions opérant sur ColumnReplicated avec des lignes non référencées produites par un JOIN. #99564 (Hechem Selmi).
  • Correction d’un cas rare où un join avec réordonnancement pouvait produire un résultat incorrect. #100790 (Yarik Briukhovetskyi).
  • Correction de résultats incorrects lorsqu’un JOIN avec l’optimisation shard-by-PK utilisait le cache des conditions de requête et que certaines parts étaient filtrées par des conditions mises en cache. #100926 (Groene AI).
  • Correction d’une exception NOT_FOUND_COLUMN_IN_BLOCK lors de l’utilisation de ARRAY JOIN avec JOIN USING et analyzer_compatibility_join_using_top_level_identifier activé. #101507 (Vladimir Cherkasov).
  • Correction d’un ordre des lignes incorrect dans les requêtes utilisant ORDER BY avec l’algorithme de jointure grace_hash, ce qui pouvait produire un résultat incorrect sans avertissement. #102036 (János Benjamin Antal).
  • Correction d’une LOGICAL_ERROR (taille inattendue du type d’index) qui pouvait se produire dans les requêtes RIGHT JOIN et FULL JOIN lorsque max_bytes_in_join était configuré. #102042 (Jimmy Aguilar Mena).

Correctifs pour les requêtes et l’analyseur

  • Correction de la façon dont la cible d’une table Alias est enregistrée comme dépendance DDL lorsqu’elle n’est pas entièrement qualifiée : elle est désormais enregistrée avec la base de données de la table Alias au lieu de la base de données de session. #95175 (Enric Calabuig).
  • Correction d’une erreur Block structure mismatch in stream causée par des colonnes superflues renvoyées par la matérialisation paresseuse. #96682 (Nikolai Kochetov).
  • Correction d’une exception dans la comparaison de tuples impliquant des éléments de type Nothing (par ex. lors d’une comparaison avec des éléments de tuple NULL) lorsqu’elle est utilisée avec GROUPING SETS et ORDER BY. #97509 (Alexey Milovidov).
  • Correction d’une exception “Context has expired” pour les sous-requêtes corrélées contenant des fonctions de table comme url(). #97544 (Alexey Milovidov).
  • Correction d’exceptions et d’un comportement incorrect dans optimize_syntax_fuse_functions avec les projections agrégées, les types Date et la préservation des noms de colonnes. #97545 (Alexey Milovidov).
  • Suppression d’une réécriture de requête incorrecte de replaceRegexpOne vers extract qui produisait des résultats erronés lorsque la regexp ne correspondait pas ; correction également d’une exception lorsque replaceRegexpOne était utilisé avec GROUP BY ... WITH CUBE et group_by_use_nulls=1. #97546 (Alexey Milovidov).
  • Correction d’exceptions LOGICAL_ERROR causées par LowCardinality à l’intérieur de types composés (Variant, Dynamic, Tuple) dans concatWithSeparator, format, les sous-requêtes IN, GLOBAL IN et les jointures avec des filtres d’exécution. #97831 (Raúl Marín).
  • Correction d’une exception LOGICAL_ERROR “Chunk info was not set for chunk in MergingAggregatedTransform” lors de l’utilisation de ARRAY JOIN avec la fonction de table merge() sur plusieurs tables Distributed combinées avec GROUP BY. #97838 (Raúl Marín).
  • Correction d’un bug qui empêchait l’utilisation des CTE avec des insert-select distribués. #97889 (Yarik Briukhovetskyi).
  • Correction d’une incompatibilité entre colonnes. #97921 (Kai Zhu).
  • Correction d’un segfault dans l’optimisation du plan de requête lors de la conversion d’une jointure externe en jointure interne avec arrayJoin dans une expression de filtre. #98147 (Alexey Milovidov).
  • Correction d’un LOGICAL_ERROR “Trying to execute PLACEHOLDER action” lorsque des colonnes corrélées de requêtes externes étaient référencées à l’intérieur de fonctions lambda telles que arrayMap. #98285 (Alexey Milovidov).
  • Correction d’une exception d’erreur logique dans caseWithExpression lorsque l’expression CASE impliquait materialize(NULL) ou d’autres arguments Nullable(Nothing). #98290 (Alexey Milovidov).
  • Correction d’une exception de transtypage invalide lors du filtrage de la colonne virtuelle _table dans la fonction de table merge. #98291 (Alexey Milovidov).
  • Correction d’une exception lorsque ORDER BY ... WITH FILL était utilisé avec LIMIT BY. #98361 (Alexey Milovidov).
  • Correction d’une exception “Column … query tree node does not have valid source node” lors d’une jointure entre une table Merge (encapsulant une table Distributed) et une autre table. #98376 (Alexey Milovidov).
  • Correction d’une exception “Column identifier is already registered” lorsque count_distinct_optimization était utilisé avec une clause QUALIFY. #98433 (Alexey Milovidov).
  • Correction d’une exception “cannot be inside Nullable type” lors de l’utilisation de IN/NOT IN avec des arguments de colonne LowCardinality (par ex. a NOT IN (b)a est de type LowCardinality(String)). #98443 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR “Projection cannot increase the number of rows in a block” lors de la fusion de parts avec un TTL qui supprime toutes les lignes et une projection agrégée avec une clé GROUP BY constante. #98458 (Alexey Milovidov).
  • Correction d’une exception dans les requêtes DISTINCT lorsque l’utilisation de projections agrégées et de materialize provoquait des différences de type LowCardinality entre la requête et la projection. #98462 (Alexey Milovidov).
  • Correction d’une exception d’erreur logique “Replica decided to read in WithOrder mode, not in ReverseOrder” lors de l’utilisation de répliques parallèles avec optimize_aggregation_in_order. #98467 (Alexey Milovidov).
  • Correction d’un résultat inattendu avec read_in_order_use_virtual_row et des fonctions monotones. #98514 (Vladimir Cherkasov).
  • Correction d’une exception LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' lors de l’utilisation de PREWHERE avec une sous-requête IN sur des tables MergeTree. #98522 (Alexey Milovidov).
  • Correction d’une exception “Sorting column wasn’t found in the ActionsDAG’s outputs” lorsque query_plan_convert_join_to_in était activé avec query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
  • Correction d’une LOGICAL_ERROR lorsqu’un Identifier était vide après substitution des paramètres. #98530 (Pervakov Grigorii).
  • Correction de l’analyse d’index distribuée avec des expressions (et pas seulement des colonnes) dans la clé primaire, ce qui entraînait l’absence de filtrage des granules redondants sur les répliques distantes. #98561 (Azat Khuzhin).
  • Correction d’une erreur logique “TABLE_FUNCTION is not allowed in expression context” lorsqu’une table function avec un alias apparaissait plusieurs fois dans la même portée de requête (par ex. dans les clauses PREWHERE et QUALIFY). #98557 (Alexey Milovidov).
  • Correction d’une exception “Bad cast from type DB::TableFunctionNode to DB::QueryNode” lors de l’utilisation de la fonction de table input comme argument de remote. #98694 (Alexey Milovidov).
  • Correction d’une exception dans LogicalExpressionOptimizerPass lorsqu’une fonction booléenne dans une comparaison equals renvoyait un type Variant. #98712 (Alexey Milovidov).
  • Correction d’une exception UNKNOWN_IDENTIFIER lors de l’interrogation de la fonction de table merge() ou du moteur Merge sur des tables avec des colonnes JSON ayant des paramètres différents et des colonnes ALIAS référençant des sous-chemins JSON, avec le nouvel analyseur activé. #98753 (Pavel Kruglov).
  • Correction de l’optimisation optimize_skip_unused_shards avec l’analyseur lorsqu’un stockage Distributed était utilisé dans une View. #98754 (Nikolai Kochetov).
  • Correction d’une exception LOGICAL_ERROR (incompatibilité de structure de bloc dans removeUnusedColumns) qui pouvait se produire avec FINAL + PREWHERE + une expression WHERE constante + des agrégats indépendants des colonnes comme count(). #98778 (Alexey Milovidov).
  • Correction d’une exception “Inconsistent table names” lors de l’utilisation de la fonction de table view() contenant des JOIN imbriqués dans un autre JOIN (uniquement avec l’ancien analyseur). #98809 (Alexey Milovidov).
  • Correction d’une exception lors de la composition de loop avec des fonctions de table de cluster. #98860 (Konstantin Bogdanov).
  • Correction d’une LOGICAL_ERROR “RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin).
  • Correction d’une exception “Scalar doesn’t exist” lors de l’interrogation d’un shard distant avec optimize_const_name_size activé et enable_scalar_subquery_optimization = 0. #98979 (andriibeee).
  • Correction de NOT_FOUND_COLUMN_IN_BLOCK pour certaines requêtes avec GROUP BY et des expressions incluant une recherche inverse dans un dictionnaire, des comparaisons de conversion Date/DateTime et des comparaisons de tuples. #98980 (Nihal Z. Miaji).
  • Correction d’un bug où EXISTS ignorait les clauses LIMIT et OFFSET dans les sous-requêtes, provoquant des résultats incorrects lorsque la sous-requête ne renvoyait aucune ligne en raison d’un décalage ou d’une limite nulle. #99005 (andriibeee).
  • Correction d’une exception “Block structure mismatch” lorsque l’optimisation de push-down des filtres rencontrait une expression AND qui se court-circuitait en constante avec GROUPING SETS. #99010 (Alexey Milovidov).
  • Correction d’une LOGICAL_ERROR lors de l’interrogation d’une table ayant à la fois une ROW POLICY et une colonne ALIAS utilisant dictGet, causée par un accès prématuré à l’expression de table pendant la résolution de la colonne ALIAS dans le nouvel analyseur. #99065 (Peng).
  • Correction d’un segfault dans une CTE récursive avec remote() + view(). #99081 (Konstantin Bogdanov).
  • Suppression d’une analyse d’index supplémentaire inutile lorsque l’optimisation de lecture dans l’ordre est appliquée. #99084 (Vladimir Cherkasov).
  • Correction des vérifications d’accès dans InverseDictionaryLookupPass en n’effectuant le contrôle d’accès qu’une seule fois avant l’exécution de la passe d’optimisation. #99210 (Mikhail Artemenko).
  • Correction de optimize_skip_unused_shards avec le nouvel analyseur lorsqu’une table Distributed était utilisée dans une sous-requête IN. #99436 (Nikolai Kochetov).
  • Correction d’un heap-use-after-free dans INTERSECT/EXCEPT lorsque la requête produisait des noms de colonnes en double. #99471 (Alexey Milovidov).
  • Correction d’une erreur logique dans ALTER TABLE ... DROP PART lorsqu’un paramètre de requête typé était utilisé pour le nom de la part. #99489 (Alexey Milovidov).
  • Correction d’une exception std::length_error lors de requêtes sur des tables système vides avec le format Pretty via l’interface HTTP. #99541 (Alexey Milovidov).
  • Correction d’une dégradation des performances dans l’analyseur grâce à l’élimination des colonnes inutilisées de ARRAY JOIN. #99587 (Dmitry Novik).
  • Correction d’une exception (Bad get: has Tuple, actual type String) dans ConditionSelectivityEstimator lorsqu’une requête utilisait IN avec un seul paramètre de requête scalaire (par ex. WHERE col IN ({p:String})) sur une table ayant des statistiques de colonnes et avec use_statistics activé. #99614 (Ilya Yatsishin).
  • Correction d’une exception “Block structure mismatch” dans des requêtes avec une clause HAVING où l’expression de filtre contenait à la fois un agrégat encapsulé dans une fonction produisant NULL et materialize(0). #99915 (Alexey Milovidov).
  • Correction d’une erreur logique liée à une sous-requête corrélée dans un argument untuple. #99917 (Vladimir Cherkasov).
  • Correction d’une exception “Inconsistent AST formatting” pour ALTER TABLE ... MODIFY QUERY avec des sous-requêtes imbriquées contenant SETTINGS lorsque l’instruction ALTER elle-même comportait aussi SETTINGS. #99938 (Nikita Mikhaylov).
  • Correction d’une exception LOGICAL_ERROR “Not-ready Set” dans la fonction IN pendant l’optimisation du plan de requête avec convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR “Unexpected node type for table expression … Actual IDENTIFIER” lorsqu’une sous-requête scalaire était utilisée dans un argument de fonction de table non résolu. #100014 (Alexey Milovidov).
  • Correction du nombre quadratique de requêtes exécutées lorsque distributed_index_analysis était utilisé avec des prédicats contenant des sous-requêtes IN. #100287 (Anton Popov).
  • Correction d’une exception “Block structure mismatch” lors de l’utilisation de GROUP BY ... WITH TOTALS HAVING combiné à UNION DISTINCT et à des expressions Nullable. #100293 (Alexey Milovidov).
  • Correction d’une exception “Inconsistent AST formatting” dans les versions de débogage lors de l’utilisation de GROUP BY CUBE(...) WITH ROLLUP ou de combinaisons similaires. #100376 (Alexey Milovidov).
  • Correction d’une exception lors de la création d’une vue avec des alias de colonnes et SELECT * ou des requêtes EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
  • Correction d’une exception TOO_MANY_ROWS pour les requêtes SELECT count() avec max_rows_to_read / force_primary_key lorsque les données étaient réparties sur plusieurs parts avec des frontières de granules non alignées. #100408 (Alexey Milovidov).
  • Correction de cas NOT_FOUND_COLUMN_IN_BLOCK où la partie SELECT de la projection contenait des colonnes qui n’existaient pas dans la partie SELECT d’origine de la requête. #100623 (Yarik Briukhovetskyi).
  • Ajout de la prise en charge du passage d’une clé de sharding aux fonctions de table cluster() et clusterAllReplicas() lors de l’utilisation d’une fonction de table comme source (par ex. cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy).
  • Correction de types d’argument AggregateFunction incorrects dans le count trivial optimisé, ce qui provoquait une exception NUMBER_OF_ARGUMENTS_DOESNT_MATCH lors de requêtes sur des expressions comme count(v0 + v1) sur des tables distribuées. #100794 (YjyJeff).
  • Correction d’une erreur logique “Invalid action query tree node” lors de l’utilisation de INTERSECT ALL / UNION ALL avec des expressions constantes simplifiées. #100977 (Alexey Milovidov).
  • Correction d’une erreur UNKNOWN_IDENTIFIER incorrecte lorsque le même alias était utilisé pour plusieurs expressions dans SELECT ; l’erreur correcte MULTIPLE_EXPRESSIONS_FOR_ALIAS est désormais renvoyée. #101040 (Alexey Milovidov).
  • Correction d’une exception dans DirectJoinMergeTreeEntity lorsque les blocks du pipeline contenaient des colonnes ColumnConst fusionnées avec des colonnes ordinaires. #101046 (Alexey Milovidov).
  • Correction d’un espace superflu dans le formatage des alias de colonnes de CTE (WITH t (a, b)WITH t(a, b)). #101049 (Alexey Milovidov).
  • Correction d’un échec des fonctions de table remote/cluster avec des fonctions de table imbriquées comme merge lorsque l’analyseur était activé. #101055 (Alexey Milovidov).
  • Correction de l’application d’OFFSET en double dans les requêtes distribuées lorsque prefer_localhost_replica=1, ce qui produisait moins de lignes que prévu. #101071 (Nihal Z. Miaji).
  • Correction d’une erreur “Illegal type Decimal64 of start parameter” dans les fonctions d’agrégation de séries temporelles lors de l’utilisation de serialize_query_plan=1 avec des répliques parallèles. #101083 (Groene AI).
  • Correction de résultats de requête incorrects lorsqu’une grande constante entière (par ex. 256, 2147483648) était utilisée comme prédicat booléen dans une clause WHERE avec AND sur des tables MergeTree. #101287 (Groene AI).
  • Correction d’un plantage avec “Logical error: Reading from materialized CTE before materialization” lorsqu’une sous-requête scalaire référençait une chaîne de CTE matérialisées dépendantes. #101305 (Groene AI).
  • Correction d’une exception lors de la conversion d’une chaîne avec des données résiduelles vers le type vide Tuple(). #102011 (Alexey Milovidov).
  • Correction d’une erreur logique lors de l’analyse d’une chaîne de tuple vide incorrecte. #102289 (Nihal Z. Miaji).
  • Correction de résultats d’agrégation incorrects (lignes dupliquées) lors de l’utilisation de optimize_aggregation_in_order=1 avec des colonnes GROUP BY ordonnées différemment de la clé de tri de la table. #102299 (Groene AI).
  • Correction d’une exception dans getStructureOfRemoteTable lorsque le shard local renvoyait des colonnes vides en raison de DDL concurrentes. #102604 (Alexey Milovidov).
  • Optimisation des chaînes de OR dans les row policy en IN dans le nouvel analyseur. #102915 (Azat Khuzhin).
  • Correction de résultats incorrects renvoyés par WHERE x AND toNullable(N) sur des tables MergeTree lorsque N est un entier plus grand que UInt8 (par ex. 256, 65535, 2147483648 ou tout entier négatif). #103077 (Groene AI).

Correctifs MergeTree et stockage

  • Correction d’une erreur logique lors de l’attachement d’une part dans MergeTree lorsqu’il y avait plusieurs renommages en chaîne entre le détachement et l’attachement. #96351 (Alexey Milovidov).
  • Correction d’un calcul non déterministe de uncompressed_hash pour les parts Compact MergeTree lorsque plusieurs codecs de compression sont utilisés, ce qui pouvait entraîner un comportement incorrect de déduplication. #97522 (Alexey Milovidov).
  • Correction d’exceptions MEMORY_LIMIT_EXCEEDED signalées à tort comme CORRUPTED_DATA lors des merges de SummingMergeTree et CoalescingMergeTree. #97537 (János Benjamin Antal).
  • hasPartitionId renvoie désormais false si une autre partition avec un ID de partition plus élevé existe dans l’ensemble des parts de données. #97748 (Mikhail Artemenko).
  • Correction d’une mutation après une lightweight update avec des index secondaires. #98044 (Raúl Marín).
  • Correction de résultats incorrects de requêtes FINAL lors du mélange d’index de saut sur clé primaire et hors clé primaire. #98097 (Raúl Marín).
  • Si les colonnes de la clé de partition ne sont pas couvertes par la clé de tri, l’élagage des partitions pouvait ignorer à tort des partitions contenant des lignes qui devaient “l’emporter” lors de la déduplication FINAL. #98242 (Yarik Briukhovetskyi).
  • Correction d’un interblocage potentiel lorsque deux opérations MOVE PARTITION concurrentes travaillent sur la même paire de tables dans des directions opposées. #98264 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR “Invalid binary search result in MergeTreeSetIndex” déclenchée par une conversion toDate sur des colonnes clés avec des données franchissant la limite de 65535. #98276 (Alexey Milovidov).
  • Correction d’un échec sporadique de déduplication, où des réinsertions étaient dédupliquées à tort en raison d’un ordre de nettoyage incohérent entre les répertoires ZooKeeper blocks/ et deduplication_hashes/. #98293 (Alexey Milovidov).
  • Correction de mutations MATERIALIZE INDEX et MATERIALIZE PROJECTION bloquées lorsque l’index ou la projection est supprimé avant la fin de la mutation. #98369 (Alexey Milovidov).
  • Correction de résultats incorrects d’élagage des partitions après fusion de parts avec des colonnes de clé de partition Nullable, en raison de bornes d’index min-max erronées. #98405 (Amos Bird).
  • Correction d’une exception LOGICAL_ERROR dans renameAndCommitEmptyParts qui pouvait se produire lorsque TRUNCATE TABLE s’exécutait simultanément avec OPTIMIZE TABLE en utilisant des transactions MergeTree. #98508 (Alexey Milovidov).
  • Correction d’un dépassement Decimal lors de l’élagage des partitions avec DateTime64. #98628 (Yarik Briukhovetskyi).
  • Correction de la résurrection de parts de données obsolètes causée par un nettoyage incorrect de parts de couverture vides. #98698 (Shaohua Wang).
  • Correction de la détection de l’utilité de l’index de saut de type Set avec un prédicat OR sur false (c.-à-d. or(x, 0)). #98776 (Azat Khuzhin).
  • Correction du problème où les skip indexes (et les conditions de clé primaire) n’étaient pas appliqués aux colonnes ALIAS lorsque la fusion des expressions du plan de requête est désactivée (query_plan_merge_expressions = 0 ou query_plan_enable_optimizations = 0). #98960 (Peng).
  • Correction d’un pruning incorrect ou insuffisant lorsque startsWith, LIKE ou NOT LIKE étaient utilisés avec une colonne FixedString. De plus, la fonction de conversion de type de FixedString vers String peut désormais élaguer les granules lorsqu’elle est appliquée à une colonne clé. #99001 (Nihal Z. Miaji).
  • Correction d’une exception lors de la lecture de patch parts (lightweight updates) sans la colonne _part_offset dans le plan de requête. #99023 (Alexey Milovidov).
  • Une requête comme SELECT * FROM table WHERE pk_id = '', où pk_id est une clé primaire String, utilise désormais correctement l’index de clé primaire pour filtrer les granules. #99027 (Shankar Iyer).
  • Correction d’une exception lors de la création d’une table avec une colonne EPHEMERAL portant le même nom qu’une colonne virtuelle (par ex. _part_offset). #99031 (Alexey Milovidov).
  • Correction de LOGICAL_ERROR due à un ordre de colonnes incohérent dans les patch parts. #99164 (Pablo Marcos).
  • Correction du problème où ALTER TABLE UPDATE/DELETE échouait avec une erreur Missing columns lorsqu’une table possède une colonne MATERIALIZED dont l’expression dépend d’une colonne EPHEMERAL. #99281 (Yash).
  • Correction de la compatibilité lors de la mise à niveau de tables répliquées avec des index minmax implicites de la version 25.10 vers des versions plus récentes. #99392 (Raúl Marín).
  • Correction d’un rare marquage erroné d’une data part comme corrompue, suivi de son détachement après une requête DETACH/ATTACH TABLE. #99529 (Anton Popov).
  • Correction d’un échec d’assertion rows_sources lors d’une vertical merge quand SYSTEM STOP/START MERGES est activé/désactivé rapidement pendant la fusion d’une table avec des colonnes Dynamic. #99532 (Alexey Milovidov).
  • Correction d’un partition pruning incorrect pour toWeek() qui faisait que les requêtes avec WHERE toWeek(date, mode) = N renvoyaient des résultats vides pour les semaines 49 à 52 sur des tables partitionnées par toYYYYMM(date). #99542 (Takumi Hara).
  • Correction d’une LOGICAL_ERROR lors de l’utilisation de ALTER TABLE ADD COLUMN pour créer une colonne EPHEMERAL portant le même nom qu’une colonne virtuelle (par ex. _part_offset). #99549 (Alexey Milovidov).
  • Correction du fait que CLEAR COLUMN ne reconstruisait pas les projections et ne réévaluait pas les colonnes matérialisées qui dépendent de la colonne effacée, ce qui pouvait provoquer des exceptions ou une corruption des données lors des fusions suivantes. #99565 (Desel72).
  • Une partie avec des projections inconnues n’est plus marquée comme définitivement perdue. #99623 (Sema Checherinda).
  • Correction d’une référence pendante dans injectRequiredColumns qui provoquait un crash lors d’une fusion. #99679 (Tuan Pham Anh).
  • Correction d’une erreur logique lors de la fusion de parties de projection après CLEAR COLUMN sur une table avec des projections et des parties compactes. #100068 (Pavel Kruglov).
  • Correction d’une LOGICAL_ERROR “Stream … not found” lors de l’insertion dans une table avec des colonnes imbriquées Array(JSON) dans des parties wide avec optimize_on_insert=0. #100475 (Pavel Kruglov).
  • Les arguments du engine pour StorageAlias sont désormais évalués avant le stockage de la définition, afin que des expressions comme currentDatabase() soient résolues en littéraux avant d’être enregistrées dans la base de données. #100902 (Nikolay Degterinsky).
  • Correction d’un problème où divide et intDiv renvoyaient ILLEGAL_DIVISION lorsqu’ils étaient utilisés dans des expressions de filtre lors de l’analyse des index, dans certains cas. #100928 (Nihal Z. Miaji).
  • Correction d’un problème où une optimisation minmax_count_projection et l’optimisation triviale COUNT(*) restaient désactivées de façon permanente après un lightweight delete, même après la fusion de toutes les parties comportant un masque de lightweight delete. #101212 (Anton Popov).
  • Correction d’une data race sur storage_id dans IStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky).
  • Correction d’un problème où materialize_skip_indexes_on_merge=false ne supprimait pas les index textuels (full-text) lors d’une fusion. Auparavant, seuls les skip indexes non textuels (minmax, set, bloom_filter) étaient supprimés. #101932 (Groene AI).
  • Les entrées du cache de l’index de similarité vectorielle sont désormais supprimées après la suppression d’une partie (par exemple lors d’une fusion), ce qui corrige un problème empêchant leur éviction en raison de clés de cache non concordantes. #99575 (Seva Potapov).
  • Correction d’une fausse exception LOGICAL_ERROR lors du redimensionnement dynamique du cache du système de fichiers, due à une condition de concurrence dans la promotion d’une sous-file SLRU. #99850 (Alexey Milovidov).
  • Correction d’une possible erreur logique lors de la lecture de sous-colonnes de type Map. #101641 (Pavel Kruglov).
  • Correction de la priorité de la correspondance exacte des sous-colonnes par rapport à la correspondance par préfixe dans getSubcolumnData, afin d’éviter un possible crash. #101645 (Pavel Kruglov).
  • Correction de l’utilisation d’extrêmes incorrects dans un index min-max créé sur une colonne JSON, ce qui entraînait des résultats de query erronés. #101918 (Pavel Kruglov).
  • Correction d’un bug de concurrence SLRU dans le cache du système de fichiers (26.1+) qui pouvait entraîner une erreur logique de réservation d’espace. #101991 (Kseniia Sumarokova).
  • Correction d’une erreur logique Having zero bytes dans le cache, qui se produisait lorsqu’un objet distant était écrasé entre list et read, ce qui entraînait auparavant des métadonnées d’objet obsolètes. #101219 (Kseniia Sumarokova).
  • Correction d’un échec d’assertion file_offset_of_buffer_end <= getFileSize() lors de la lecture de tables Log ou StripeLog sur un stockage objet S3 en présence d’écritures concurrentes. #100763 (Alexey Milovidov).
  • Correction du plafonnement de la taille du cache lors du rechargement de la configuration. #100659 (Aleksei Filatov).
  • Correction d’un arrêt LOGICAL_ERROR lors du redimensionnement dynamique du cache du système de fichiers SLRU, causé par des statistiques d’éviction partagées entre les sous-files d’attente et par un chemin de récupération incorrect pour les candidats en échec. #102396 (Antonio Andelic).
  • Correction de la désactivation permanente d’une optimisation minmax_count_projection et de l’optimisation triviale de COUNT(*) après un lightweight delete. #102900 (Anton Popov).

Corrections relatives aux types de données et à la sérialisation

  • Correction d’un résultat incorrect ou d’une exception lors de la lecture des sous-colonnes de colonnes ALIAS. #95408 (Pavel Kruglov).
  • Correction du fait que la fonction d’agrégation sumCount ne pouvait pas lire d’anciens états sérialisés après l’introduction de Nullable(Tuple). #97502 (Nihal Z. Miaji).
  • Correction d’une erreur logique liée à un flux manquant lors d’un INSERT SELECT avec JSON et des buckets dans les données partagées. #97523 (Pavel Kruglov).
  • Correction de plantages possibles lors de la lecture de granules vides dans les données partagées avancées en JSON. #97778 (Pavel Kruglov).
  • Correction d’une mauvaise compilation JIT de la fonction sign pour les types entiers plus larges que Int8 — les valeurs en dehors de la plage -128..127 pouvaient produire un signe incorrect. #98012 (Alexey Milovidov).
  • Correction du fait que le format ProtobufList ne fonctionnait pas avec le Kafka engine, car l’état de lecture n’était pas réinitialisé entre les messages. #98151 (Alexey Milovidov).
  • Correction d’une corruption silencieuse des données lors de l’insertion d’une colonne Date Parquet/Arrow dans une colonne Enum — la conversion de type incompatible est désormais correctement rejetée au lieu de stocker des valeurs d’enum invalides. #98364 (Alexey Milovidov).
  • Correction d’une exception lors de la lecture d’un fichier Arrow avec une colonne Array dans une table avec une colonne Nested. #98365 (Alexey Milovidov).
  • Correction d’une exception lors de la lecture depuis Nullable(Tuple(...)) lorsqu’un nom d’élément de Tuple entrait en collision avec la sous-colonne null de Nullable. #98372 (Alexey Milovidov).
  • Correction d’une conversion incorrecte de Parquet Bool vers FixedString dans le lecteur natif V3, qui produisait des octets bruts au lieu d’une représentation sous forme de chaîne. #98378 (Alexey Milovidov).
  • Correction de tryGetColumnDescription afin de filtrer les sous-colonnes par type de colonne parente, conformément aux autres méthodes de recherche de colonnes. #98391 (Alexey Milovidov).
  • Correction du rollback de colonne dans le moteur Buffer lors du traitement d’une exception pendant l’ajout d’un nouveau block. L’ancienne logique pouvait entraîner un état corrompu des colonnes en mémoire. #98551 (Pavel Kruglov).
  • Correction d’une exception Bad cast from type ColumnConst to ColumnDynamic dans une comparaison null-safe (<=> / IS NOT DISTINCT FROM) avec des colonnes constantes Dynamic ou Variant et NULL. Correction également du fait que IS DISTINCT FROM avec Dynamic/Variant et NULL renvoyait toujours 0 à tort. #98553 (Alexey Milovidov).
  • Correction du fait que parseDateTimeBestEffort analysait incorrectement les mots commençant par des préfixes de mois ou de jours de la semaine. #98742 (Pavel Kruglov).
  • Correction d’une exception reverseUTF8 sur une entrée UTF-8 invalide (tronquée). #98770 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR dans les fonctions financières (financialNetPresentValue, financialInternalRateOfReturn, etc.) lors du passage d’arguments de type BFloat16. #98958 (Alexey Milovidov).
  • SummingMergeTree n’additionne plus les colonnes Bool (ni les autres colonnes de type domaine) ; les valeurs Bool sont désormais conservées telles quelles au lieu d’être additionnées arithmétiquement. #98976 (Yash).
  • Correction d’un comportement indéfini (déréférencement de pointeur nul) lors de la modification d’une colonne version/sign/is_deleted en EPHEMERAL ou ALIAS dans les moteurs MergeTree. Ces modifications sont désormais correctement rejetées. #98985 (Alexey Milovidov).
  • Correction de parseDateTimeBestEffort, qui analysait incorrectement des mots commençant par des préfixes de mois au format DD-month-YYYY. #99350 (Pavel Kruglov).
  • Correction de CHECK TABLE avec une sérialisation sparse à l’intérieur d’un Tuple avec Dynamic. #99351 (Pavel Kruglov).
  • Correction d’une erreur logique unordered_map::at: key not found dans le format de sortie Avro lors de la sérialisation de colonnes Enum8/Enum16 contenant des valeurs absentes de la définition de l’enum. #99332 (Desel72).
  • Correction d’un bug qui rendait confuse la comparaison entre les types Time[64] et DateTime[64] ; les valeurs Time[64] sont désormais converties en DateTime[64] en ajoutant 1970-01-01 comme partie date. #99267 (Yarik Briukhovetskyi).
  • Correction de la désérialisation de \N (NULL) pour le type Variant dans les formats texte Escaped/Raw. #99648 (Pavel Kruglov).
  • Correction d’un comportement indéfini dans le lecteur du format Avro lors de la lecture de valeurs numériques dépassant la capacité du type de colonne cible. Les requêtes échouent désormais en cas de dépassement au lieu de produire silencieusement des valeurs incorrectes. #99697 (asyablue22).
  • Correction d’un faux positif provoquant un arrêt dans NativeReader lors de la désérialisation d’un flux au format Native avec une discordance du nombre de lignes : LOGICAL_ERROR a été remplacé par INCORRECT_DATA. #99822 (Rahul Nair).
  • Correction d’un arrêt du processus lors de la désérialisation d’une colonne Tuple lorsque le type de sérialisation dans le flux binaire est DETACHED. #99823 (Rahul Nair).
  • Correction du paramètre aggregate_functions_null_for_empty pour qu’il fonctionne avec des fonctions d’agrégation renvoyant des types non-Nullable tels que Array ou Map (par exemple groupArray, sumMap). #99839 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR dans la fonction midpoint lorsqu’elle est appelée avec un mélange de types entiers signés et non signés. #99867 (Alexey Milovidov).
  • Correction d’une exception LOGICAL_ERROR dans des requêtes impliquant des colonnes Dynamic, des jointures croisées et des filtres d’exécution, causée par le fait que ColumnVariant::filter partageait des pointeurs vers des colonnes Variant au lieu de les cloner dans le chemin d’optimisation hasOnlyNulls. #100234 (Pavel Kruglov).
  • Correction d’un bug sur les tableaux de Variant qui pouvait réinterpréter le type de données lors de l’appel à arrayFirst/arrayLast. Par exemple, Array(Variant(Date, Bool)) était converti en Bool alors que le type Variant sous-jacent réel était Date. #100255 (timothygk).
  • Correction d’un problème empêchant les formats CSV et MsgPack d’analyser correctement Nullable(Tuple). #100038 (Nihal Z. Miaji).
  • Correction d’un problème où les fonctions accurateCastOrDefault et to*OrDefault ne conservaient pas le type de colonne Const pour les entrées constantes. #100132 (Alexey Milovidov).
  • Les paramètres de requête omis de type LowCardinality(Nullable(T)) prennent désormais correctement NULL comme valeur par défaut, comme pour Nullable(T). #100144 (Denys Melnyk).
  • Correction d’un dépassement d’entier signé (comportement indéfini) dans toStartOfInterval lors d’un appel avec de très grandes valeurs d’intervalle en millisecondes/microsecondes sur DateTime64 à haute précision. #100156 (Alexey Milovidov).
  • Correction des filtres d’exécution de jointure sur le type de données Variant. #100182 (Dmitry Novik).
  • Correction d’un cast de Time64 vers UInt64 qui pouvait limiter les valeurs à 24 heures. #100025 (Yarik Briukhovetskyi).
  • Correction d’une exception lors du calcul du supertype commun pour des tuples vides et non vides avec use_variant_as_common_type activé. #100699 (Antonio Andelic).
  • Correction d’un comportement indéfini dans positiveModulo lorsque le diviseur non signé ne tient pas dans le type de résultat signé. #100705 (Raúl Marín).
  • Correction d’un comportement indéfini (dépassement d’entier signé) dans toStartOfInterval lors de l’utilisation d’intervalles Week, Quarter ou Year avec un argument origin et des valeurs d’intervalle extrêmes. #100817 (Raúl Marín).
  • Correction des combinators de fonctions d’agrégation If, Distinct, DistinctIf et IfState avec un type de retour Tuple et un ou plusieurs arguments Nullable, qui ne pouvaient pas lire les anciens états sérialisés après l’introduction de Nullable(Tuple). #100826 (Nihal Z. Miaji).
  • cast_keep_nullable, lorsqu’il est activé, ne lève plus d’exception lors du cast d’une valeur NULL Dynamic vers un Variant. #100864 (Seva Potapov).
  • Correction d’une exception dans intDiv/intDivOrZero sur des tableaux de tuples Nullable. #100895 (Raúl Marín).
  • Correction d’un comportement indéfini (dépassement d’entier signé) dans parseDateTimeBestEffort lors de l’analyse de chaînes de date/heure comportant plus de 18 chiffres de fraction de seconde. #100948 (Vasily Chekalkin).
  • Correction d’un problème empêchant la fonction d’agrégation sumCountOrDefault, avec un ou plusieurs arguments Nullable, de lire d’anciens états sérialisés après l’introduction de Nullable(Tuple). #101021 (Nihal Z. Miaji).
  • Correction des colonnes ALIAS de type DateTime/DateTime64 qui n’appliquaient pas la conversion de fuseau horaire lorsque le fuseau horaire déclaré différait de celui de l’expression. #101043 (Alexey Milovidov).
  • Suppression de Nullable de la colonne de résultat dans arrayIntersect et les fonctions associées afin d’éviter un décalage entre sérialisation et désérialisation. #101569 (George Larionov).
  • Correction de positiveModulo(tuple, number), qui utilisait à tort la division au lieu du modulo. #101709 (ClickGap AI Bot).
  • Correction d’une sortie incorrecte dans formatDateTime avec le formatter %W sous certains paramètres de formatting non par défaut. #101847 (Robert Schulze).
  • Correction d’une exception d’incompatibilité de type dans transform lorsque la colonne par défaut est const sur certains blocks. #100616 (Pavel Kruglov).
  • Autorisation des row groups vides dans Parquet. #100653 (Vitaly Baranov).
  • min/max/argMin/argMax traitent désormais NaN de manière cohérente avec ORDER BY : NaN est toujours ignoré (il n’est renvoyé que si toutes les valeurs sont NaN). Auparavant, les résultats dépendaient de la position de NaN dans les données en raison de la sémantique de comparaison non ordonnée d’IEEE 754. #100448 (Raúl Marín).
  • Correction d’une inférence incorrecte du type de date en cas de dépassement après ajustement du fuseau horaire. #102674 (Pavel Kruglov).
  • Correction de CASE avec une expression Dynamic qui renvoyait ELSE pour toutes les lignes. #102684 (Pavel Kruglov).
  • Correction de la sérialisation du type Dynamic aplati avec des types de données encodés en binaire. #102692 (Pavel Kruglov).
  • Correction du fait que cast_string_to_date_time_mode était ignoré pour CAST vers Nullable(DateTime). #103035 (Pavel Kruglov).
  • La représentation de null dans la sérialisation des colonnes répliquées et sparse respecte désormais les paramètres (par ex. format_tsv_null_representation). #102888 (Hechem Selmi).

Corrections des index de texte et des index de saut

  • Correction de l’utilisation du text index avec d’autres skip indexes. Auparavant, des erreurs logiques telles que “Trying to get non-existing mark” pouvaient être levées lorsqu’un filtre de query utilisait simultanément un text index et d’autres skip indexes classiques. #98555 (Anton Popov).
  • Correction de la reconstruction des text indexes lors des merges avec TTL. #99107 (Anton Popov).
  • Correction d’une validation trop stricte du preprocessor du text index. #99359 (Anton Popov).
  • Suppression de la prise en charge des fonctions niées (notEquals, notLike, notIn) dans l’analyse d’index du text index. Ces fonctions ne pouvaient jamais ignorer de granules ; leur analyse par l’index n’ajoutait donc que du surcoût. #99393 (Anton Popov).
  • Correction d’une exception NOT_FOUND_COLUMN_IN_BLOCK lorsqu’un predicate de text index (par ex. hasAllTokens) était référencé à la fois dans les clauses SELECT et WHERE via un alias. #99504 (Anton Popov).
  • Correction de résultats incorrects lors de l’utilisation de hasAllTokens avec OR sur des columns dotées de text indexes distincts. #99505 (Anton Popov).
  • Correction de la lecture du text index dans une table comportant des lightweight deletes existants et des row policies. #99661 (Anton Popov).
  • Correction de l’analyse des predicates avec la fonction IN par le text index avec le preprocessor, ainsi que d’une collision entre tokens recherchés qui pouvait entraîner des résultats incorrects. #99755 (Anton Popov).
  • Correction d’une utilisation incorrecte du text index avec les fonctions startsWith et endsWith pour les tokenizers qui ne prennent pas en charge la correspondance par substring (array, splitByString). Auparavant, ces tokenizers pouvaient produire silencieusement des résultats erronés. #100151 (Anton Popov).
  • Correction d’un crash rare lorsqu’une exception “Memory Limit” était levée pendant la construction du text index. #100213 (Anton Popov).
  • Correction des erreurs “Not-ready Set is passed as the second argument” pendant l’analyse d’un text index construit sur mapValues pour des predicates contenant une clause IN. #100224 (Anton Popov).
  • Correction d’un crash lors de l’utilisation d’un index de recherche textuelle avec une clause IN contenant une sous-requête de tuple, par ex. WHERE (id, str) IN (SELECT (id, str) FROM ...), ou lorsque le nombre de columns dans la sous-requête ne correspondait pas au tuple situé à gauche de IN. #100959 (Anton Popov).
  • Le tokenizer splitByString rejette désormais les chaînes de séparation vides. #101928 (Robert Schulze).
  • Le tokenizer sparseGrams générait des tokens plus longs que la longueur maximale fournie (en raison d’un +2 codé en dur dans l’implémentation). #101934 (Elmi Ahmadov).
  • Correction d’une exception lors de l’exécution de requêtes sur des tables Merge ou Distributed avec un index de texte intégral et des conditions de filtrage combinées mêlant has*Tokens et LIKE, lorsque query_plan_direct_read_from_text_index est activé. #101939 (Jimmy Aguilar Mena).
  • Correction de hasToken/hasTokenOrNull avec des motifs de recherche composés uniquement de séparateurs (par ex. '()', '!!!') sur des colonnes avec un index de texte intégral : auparavant, l’index ignorait silencieusement toutes les granules au lieu de lever BAD_ARGUMENTS (pour hasToken) ou de renvoyer NULL (pour hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
  • Les paramètres de l’index de texte intégral (enable_full_text_index, allow_experimental_full_text_index, use_skip_indexes_on_data_read) ne sont plus désactivés lorsque le paramètre compatibility pointe vers une version antérieure à 26.1. #102422 (Nikita Fomichev).
  • Ajout de la prise en charge des colonnes ALIAS dans l’optimisation de lecture directe depuis l’index de texte. #103037 (Anton Popov).

Correctifs du lac de données

  • Correction d’une condition de concurrence logique lors d’un changement de version de snapshot dans le moteur de table DeltaLake, et suppression de rechargements de snapshot lourds et redondants. #96226 (Kseniia Sumarokova).
  • Correction d’une exception DUPLICATE_COLUMN et de valeurs NULL silencieuses lors de la lecture de tables Delta Lake utilisant le mode de mapping de colonnes “name” avec des champs de struct dont les noms contiennent des points. #98013 (Caio Ishizaka Costa).
  • Correction d’un bug lors de l’utilisation de Unity Catalog sur GCS. #98456 (Melvyn Peignon).
  • DataLakeCatalog respecte désormais la configuration http_forbid_headers du serveur lors de la validation du paramètre auth_header. #98827 (Michael Anastasakis).
  • La création, l’attachement et la mise à jour de tables de data lake locales en dehors des chemins utilisateur sont désormais interdits ; cette vérification est effectuée lors de la création et de la mise à jour de IDataLakeMetadata. #98936 (Daniil Ivanik).
  • Correction des lectures Iceberg BigLake : les identifiants ADC sont désormais transmis au client S3 de GCS (ce qui corrige les erreurs 403), les identifiants OAuth2 sont encodés dans l’URL avant l’envoi, et le parcours de l’espace de noms ne s’interrompt plus sur les réponses HTTP 400 de BigLake. #98998 (Nikita Fomichev).
  • Correction d’une erreur de dépassement de limites lors de l’interrogation exclusive des colonnes virtuelles d’une table Iceberg contenant des données Avro. #99080 (alesapin).
  • Correction d’un crash dans ALTER TABLE ... REMOVE SETTINGS pour le moteur de table Iceberg. #99108 (alesapin).
  • Correction d’un crash très rare lorsqu’une table Iceberg contient des fichiers de formats mixtes (ORC et Parquet). #99168 (alesapin).
  • Correction d’un crash (déréférencement de pointeur nul) lors de l’exécution de ALTER TABLE ... MODIFY COLUMN ... COMMENT sur des tables Iceberg. #99838 (Desel72).
  • ClickHouse gère désormais correctement les tables au format Spark (avec un chemin absolu complet pour chaque fichier ou un chemin relatif vers le chemin commun de la table). #99935 (alesapin).
  • Correction d’une exception lorsqu’un paramètre de chemin de fichier des métadonnées Iceberg contient un octet nul. #100283 (Alexey Milovidov).
  • Correction d’un bug de copier-coller où delta_lake_snapshot_end_version, défini sans delta_lake_snapshot_start_version, était ignoré silencieusement au lieu de produire une erreur BAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar).
  • Correction d’une erreur logique dans des tables Iceberg triées pendant les mutations. #100499 (alesapin).
  • Correction du Polaris Catalog avec Azure : depuis la version 25.12, le catalog ajoutait le bucket au début du chemin. #100583 (Konstantin Vedernikov).
  • Correction d’une exception Logical error: 'partitions_count > 0' lors de l’exécution d’ALTER TABLE UPDATE consécutifs sur une table Iceberg partitionnée. #101278 (Desel72).
  • Correction de l’insert-select depuis un cluster Delta Lake avec ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
  • Déclenche une erreur lorsque les paramètres delta_lake_snapshot_version ou de version CDF sont utilisés sans DeltaKernel activé, au lieu de renvoyer silencieusement des données incorrectes. #101489 (Desel72).
  • Correction d’une boucle de tentatives d’INSERT Iceberg qui échouait lorsque la table était créée avec iceberg_metadata_file_path et que la version cible des métadonnées existait déjà. #101548 (Groene AI).
  • Correction d’un plantage du serveur (LOGICAL_ERROR) lors d’un SELECT depuis une vue matérialisée reposant sur un moteur de table IcebergLocal. #101577 (Groene AI).
  • Correction d’un plantage dans IcebergLocal ALTER TABLE ... UPDATE lors de l’utilisation du format Avro, dû au fait que les types wrapper LowCardinality/Nullable n’étaient pas désencapsulés avant la sérialisation. #102337 (Desel72).
  • Ajout de la colonne hostname manquante à system.delta_lake_metadata_log et system.iceberg_metadata_log. #102162 (Michael Russell).
  • Correction dans CoalescingMergeTree pour le type Array. #102384 (Konstantin Vedernikov).

Correctifs S3/Azure/stockage objet

  • Correction d’une exception provenant de CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova).
  • Correction d’un crash : l’interrogation de fichiers avec un motif glob (par ex. file('dir/**', 'LineAsString')) levait une exception du système de fichiers non gérée si le répertoire contenait un lien symbolique orphelin. Les liens symboliques orphelins sont désormais ignorés sans bruit. #98143 (Mark Andreev).
  • Correction d’une utilisation mémoire excessive (~514 MiB) lors de la détection automatique du format pendant la lecture de données non Arrow (par ex. du JSON depuis url() ou file() sans format explicite), causée par le lecteur ArrowStream qui interprétait les premiers octets comme une longueur de métadonnées énorme. #98893 (Konstantin Bogdanov).
  • Correction d’une situation de concurrence pouvant provoquer une exception “ReadBuffer is canceled” dans les requêtes utilisant urlCluster ou des fonctions table cluster similaires. #98955 (Alexey Milovidov).
  • Correction d’un message trompeur “inflate failed: buffer error” lors de la lecture de fichiers compressés inexistants via la fonction table url() avec des motifs glob. #99034 (Alexey Milovidov).
  • Correction des appels HeadObject N+1 pour les motifs glob S3 avec expansion d’accolades. #99219 (Konstantin Bogdanov).
  • Correction de cas où des nombres avec des zéros initiaux dans un chemin de partitionnement Hive provoquaient des erreurs. #99458 (Yarik Briukhovetskyi).
  • Correction d’un seek incorrect dans AsynchronousReadBufferFromFileDescriptor avec O_DIRECT. #99678 (Pavel Kruglov).
  • Correction d’un bug où ClickHouse pouvait ignorer des fichiers si l’en-tête Content-Length était absent de la réponse à leur requête HEAD (par exemple, en raison d’un transcodage décompressif dans GCS). #99971 (Yarik Briukhovetskyi).
  • Le serveur n’échoue plus au démarrage lorsqu’un disque Azure blob storage est configuré mais que l’endpoint est temporairement inaccessible (par ex. échec DNS). #100701 (Raúl Marín).
  • Correction d’un segfault dans s3Cluster et les requêtes distribuées dû à une libération prématurée dans le pool de connexions. #100837 (Konstantin Bogdanov).
  • Correction d’une exception s’échappant du destructeur S3 Client::~Client, provoquant l’arrêt du serveur. #101798 (Gagan Dhakrey).
  • Correction de l’hôte et du port qui n’étaient pas correctement consignés lors de la reconnexion. #102280 (Grant Holly).
  • Correction d’une exception côté serveur dans ClusterDiscovery lorsqu’un cluster statique (défini dans la config) n’avait temporairement aucun nœud actif. #102661 (Kseniia Sumarokova).

Correctifs S3Queue

  • S3Queue : correction d’une assertion en échec après une perte de connexion à ZooKeeper, malgré un commit réussi. #100210 (Kseniia Sumarokova).
  • Correction de l’inversion du texte de description de la colonne alterable dans system.s3_queue_settings et system.azure_queue_settings — la signification de 0 et 1 a été permutée pour correspondre au comportement réel du code. #101703 (ClickGap AI Bot).

Correctifs de sécurité et de contrôle d’accès

  • La fonction de table loop appelait directement inner_storage->read(), en contournant la couche d’interprétation où sont appliquées les row policies, les grants au niveau des colonnes et les autres contrôles de sécurité. Cela permettait à un utilisateur restreint par des row policies de lire toutes les lignes via loop(table). #97682 (pufit).
  • Application des vérifications READ ON FILE pour le scalaire file() et DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
  • Prise en charge des credentials base64 sans padding dans HTTP Basic Auth. Certains clients HTTP omettent le padding final = dans l’en-tête Authorization: Basic, ce qui provoquait auparavant des échecs d’authentification. #98392 (Amos Bird).
  • Correction d’un contournement de RBAC qui permettait aux utilisateurs d’exécuter DESCRIBE sur n’importe quelle table via remote(), remoteSecure(), cluster() ou clusterAllReplicas() pointant vers localhost, sans nécessiter le privilège SHOW_COLUMNS. #98669 (pufit).
  • Correction d’un problème où system.grants omettait les paramètres de regular expression pour les grants URL et S3 dans la colonne access_object. #98987 (DQ).
  • Correction d’un contournement de RBAC qui permettait aux utilisateurs d’obtenir la structure d’une table via DESCRIBE TABLE ou CREATE TABLE AS sur des fonctions de table (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc(), etc.) sans les privilèges d’accès à la source requis. Pour les fonctions qui déduisent le schéma à partir de serveurs distants, cela permettait également de déclencher des connexions sortantes (SSRF) sans autorisation. #99122 (pufit).
  • Limitation des settings constraints dans le worker DDL pour les distributed DDL queries. #99317 (Pablo Marcos).
  • Correction de problèmes mineurs liés à l’authentification TOTP : l’option CLI --one-time-password avec un mot de passe vide, ainsi que la validation des valeurs de configuration <digits> et <period>. #99322 (Vladimir Cherkasov).
  • Les credentials dans les connection strings JDBC, ODBC et NATS sont désormais masqués dans les query logs et la sortie de SHOW CREATE. Pour les connection strings de type URI, seule la partie mot de passe est masquée. Le setting nats_token est désormais lui aussi masqué. #99344 (János Benjamin Antal).
  • Interdiction de lire les credentials Google depuis un fichier local, ce qui n’était pas sûr, car cela permettait de lire d’autres credentials si le file path était connu. #99584 (Konstantin Vedernikov).
  • Correction du contournement de RemoteHostFilter par la source de dictionnaire MySQL pour les paramètres DDL inline. #99720 (Shaohua Wang).
  • Correction de system.completions afin de filtrer correctement les databases, tables et columns selon les access rights dans toutes les combinaisons de grants : revoke par table, par DB et par colonne. #100432 (Shaohua Wang).
  • Nettoyage de query_id dans le handler HTTP afin d’empêcher l’injection CRLF dans les headers de réponse via l’en-tête X-ClickHouse-Query-Id. #100500 (Pablo Marcos).
  • Certains catalogues pouvaient afficher des secrets dans la section SETTINGS de SELECT * FROM system.databases. Ce n’est désormais plus possible. #100800 (Konstantin Vedernikov).
  • Les politiques au niveau des lignes n’étaient pas propagées des sous-planificateurs vers le planificateur parent pour la journalisation, elles étaient donc absentes de query_log pour les vues, les sous-requêtes et les insert-selects. Elles sont désormais conservées dans QueryAccessInfo pour la journalisation. #101044 (Narasimha Pakeer).

Correctifs de sauvegarde et de restauration

  • Correction du problème empêchant l’application de max_execution_time aux opérations de sauvegarde/restauration. #99205 (Kseniia Sumarokova).
  • Correction d’une exception ReadBuffer is canceled. Can't read from it. dans les opérations de sauvegarde/restauration utilisant des archives zip. #100400 (Alexey Milovidov).
  • Validation des chemins des entrées de fichier dans les métadonnées de sauvegarde afin de rejeter les traversées de répertoires, les chemins absolus et les noms vides lors de RESTORE. #100483 (Pablo Marcos).
  • Correction de la mise en forme et du clonage de l’AST pour BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).

Correctifs ClickHouse Keeper

  • Correction d’une data race dans le client ZooKeeper entre le thread d’envoi et le thread de réception. #97887 (Pablo Marcos).
  • Correction d’une perte de données dans Keeper après redémarrage lors de l’utilisation d’Azure Blob Storage avec des métadonnées s3_plain pour le stockage des logs. #97987 (Antonio Andelic).
  • Définition du composant Watch pour les réponses de watch dans aggregated_zookeeper_log, au lieu de le laisser vide. #98202 (Antonio Andelic).
  • Correction d’un problème où ClickHouse Keeper déconnectait les clients ZooKeeper Java après une requête addWatch. Le client Java attend un corps ErrorResponse de 4 octets, mais Keeper envoyait un corps vide, ce qui provoquait une EOFException et la déconnexion de la session. #98499 (Antonio Andelic).
  • Correction d’un problème où les métriques Keeper zk_followers et zk_synced_followers ne diminuaient pas lorsqu’un follower tombait en panne. Ajout des nouvelles métriques zk_learners et zk_synced_non_voting_followers à la commande mntr. #98504 (Antonio Andelic).
  • Correction d’un problème où le port Raft sécurisé de Keeper ignorait cipherList et dhParamsFile de la configuration openSSL. #98509 (Antonio Andelic).
  • Correction de messages de log Keeper trompeurs, comme “Receiving request for session X took 9963 ms”, alors que le temps indiqué correspondait en réalité à l’attente inactive dans poll() entre deux heartbeats. #98510 (Antonio Andelic).
  • Correction d’un problème où des connexions TCP de Keeper empêchaient l’arrêt gracieux du serveur en ne répondant pas au signal d’arrêt. #98525 (Alexey Milovidov).
  • Correction d’une assertion de débogage dans DDLWorker, causée par un first_failed_task_name obsolète après la suppression d’une entrée ZooKeeper pendant la récupération lors de la réinitialisation. #99099 (Antonio Andelic).
  • Correction d’un cas de plantage de Keeper. #99133 (JIaQi Tang).
  • Correction d’un bug dans Keeper où une requête de lecture pouvait rester bloquée (provoquant un timeout de session) si une autre session sans rapport sur le même serveur était fermée au mauvais moment. #99484 (Michael Kolupaev).
  • Correction d’un SEGFAULT dans NuRaft dû à une race condition. #100444 (Pablo Marcos).
  • Correction d’un problème où CREATE TABLE de KeeperMap échouait avec “Cannot create metadata for table” lorsque des nœuds ZooKeeper résiduels issus d’un drop partiel antérieur à la version 25.1 ne contenaient pas le nœud drop_lock_version. #101623 (Antonio Andelic).
  • Correction d’une perte du registry UDF lorsqu’une session ZooKeeper expirait pendant un refresh périodique — toutes les user-defined functions pouvaient devenir indisponibles jusqu’à la réussite d’un full refresh. #101891 (Nikita Fomichev).
  • Correction d’un plantage lors du refresh des UDF, causé par ZooKeeperRetriesControl, qui réessayait sur une session ZooKeeper obsolète (expirée) sans la renouveler. #102059 (Nikita Fomichev).

Correctifs de crash et de stabilité

  • Correction d’un crash dans les fonctions du dialecte Kusto bin(), bin_at(), extract() et indexof() lorsque des arguments vides sont fournis. #95736 (NeedmeFordev).
  • Correction d’un crash/assertion du serveur dans mapContainsKey/mapContainsKeyLike avec un skip index tokenbf_v1. #97826 (Shankar Iyer).
  • Correction d’un crash du serveur (std::terminate) provoqué par une exception non interceptée dans le destructeur du pool de connexions HTTP lorsque la limite stricte du groupe de connexions est atteinte en cas de forte concurrence. #97850 (Antonio Andelic).
  • Correction d’un accès hors limites dans ColumnConst::getExtremes qui pouvait provoquer un crash lorsque extremes = 1 est activé. #98263 (Alexey Milovidov).
  • Validation des données corrompues lors de la désérialisation de DDSketch afin d’éviter des segfaults, des exceptions, des boucles infinies et des OOM lors de la lecture d’états de fonctions d’agrégation quantilesDD corrompus. #98284 (Alexey Milovidov).
  • Correction d’une exception rare dans l’exécuteur du pipeline, qui pouvait se manifester par Received signal 6 (dans les builds de débogage), lorsque l’expansion du pipeline entrait en concurrence avec l’annulation de la requête. #98428 (Alexey Milovidov).
  • Correction d’un déréférencement de pointeur nul dans dictGetOrDefault lorsque l’argument de clé est Nullable. #98460 (Alexey Milovidov).
  • Correction d’un interblocage du pipeline lors de l’utilisation de sort_overflow_mode = 'break' avec des fonctions de fenêtre. #98543 (Alexey Milovidov).
  • Correction d’un crash provoqué par le déréférencement d’un pointeur nul dans des tables système créées entre la capture d’un snapshot des tables dans IDatabaseTablesIterator::table() et leur modification par un autre thread lors d’une itération ultérieure. #98792 (Grant Holly).
  • Correction d’une dérive du suivi mémoire provoquée par l’absence d’annulation des allocations échouées, le comportement indéfini de nallocx(0) et une erreur de décalage d’une unité dans le suivi du pic global. Extension du suivi pour couvrir les buffers en anneau io_uring. #98915 (Antonio Andelic).
  • Correction d’un crash du serveur (std::terminate) lors de l’exécution de ALTER TABLE ... DROP PART sur une patch part après un changement de schéma (par ex. ADD COLUMN). #99036 (Peng).
  • Correction d’un crash du serveur qui pouvait se produire si une exception de dépassement de la limite mémoire était levée pendant une lecture sur disque mise en cache. #99042 (Shankar Iyer).
  • Correction d’un crash déclenché par une exception de limite mémoire levée pendant l’application d’une patch part. #99086 (Anton Popov).
  • Correction d’un crash lors de l’utilisation d’une Buffer table avec SAMPLE lorsque la destination ne le prend pas en charge. #99141 (Kseniia Sumarokova).
  • Correction d’un heap-use-after-free lorsqu’une table est supprimée de façon concurrente alors qu’une requête de lecture est en cours d’exécution. #99483 (Alexey Milovidov).
  • Correction d’un heap-buffer-overflow dans CompressionCodecT64 et d’un arrêt du processus dans CompressionCodecMultiple lors de la décompression de données compressées malformées. Les codecs lèvent désormais une exception au lieu de provoquer un crash. #99680 (Rahul Nair).
  • Correction d’une boucle infinie lors de la lecture de fichiers au format Npy avec des dimensions de forme négatives. #99812 (Desel72).
  • Correction d’un global-buffer-overflow dans la fonction CRC32 sur des arguments FixedString lorsqu’elle est évaluée sur zéro ligne pendant le calcul de l’en-tête du plan de requête. #99835 (Alexey Milovidov).
  • Correction d’un échec d’assertion dans sipHash128Keyed (et des fonctions de hachage à clé similaires) lorsque l’argument de données est un Map avec des clés de tableau ou d’autres types de tableaux imbriqués. #99921 (Alexey Milovidov).
  • Correction d’un échec d’assertion lors de la multiplication des états d’agrégation NumericIndexedVector par une constante entière paire, causé par un auto-XOR sur des bitmaps Roaring aliasés dans pointwiseAddInplace. #99976 (Desel72).
  • Correction d’un déréférencement de nullptr dans le lecteur Parquet lorsque le chemin filter-in-decoder rencontre des pages filtrées. #99677 (Alexey Milovidov).
  • Correction d’un crash du serveur local lorsque CREATE DICTIONARY contient une définition avec une valeur de liste contenant une fonction inexistante. #100036 (Yakov Olkhovskiy).
  • Correction d’un SIGSEGV lors de la lecture de patch parts après ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky).
  • Correction de l’utilisation d’une valeur non initialisée dans StringSearcher.h. #100225 (Konstantin Bogdanov).
  • Correction d’un crash du serveur (échec d’assertion) lors de l’utilisation de fonctions d’agrégation paramétriques avec le combinator Array et des arguments NULL, comme quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot).
  • Correction d’un heap-buffer-overflow dans sorted_buffer_gt::insert() de usearch, pouvant provoquer un crash ou corrompre silencieusement la mémoire pendant une recherche de similarité vectorielle. #100537 (Dustin Healy).
  • Correction d’un crash du serveur (erreur logique “Unexpected return type from __topKFilter”) lorsque use_top_k_dynamic_filtering est activé et que la colonne ORDER BY est de type Dynamic ou Variant. #100742 (Groene AI).
  • Correction d’un crash du serveur lors de l’utilisation de la fonction has() avec PREWHERE/WHERE sur une clé Tuple contenant des éléments LowCardinality. #100760 (Groene AI).
  • Correction d’un segfault dû à un déréférencement de pointeur nul lors du chargement des dictionnaires pendant l’arrêt du serveur. #100839 (Miсhael Stetsyuk).
  • Correction d’un buffer overflow dans ULIDStringToDateTime lorsque l’entrée contient des octets non ASCII. #100843 (Konstantin Bogdanov).
  • Correction d’un crash (LOGICAL_ERROR) lors d’une requête sur une table Merge (ou la fonction de table merge()) qui regroupe plusieurs tables, dont une table Distributed, avec distributed_group_by_no_merge=1 activé. #100859 (Groene AI).
  • Correction d’un crash lors de la construction d’un dictionnaire Polygon à partir d’une table MergeTree utilisant une sérialisation clairsemée des colonnes. #100964 (Anton Popov).
  • Correction d’un crash (Logical error: isConst/isSparse/isReplicated assertTypeEquality) dans les algorithmes de fusion lorsque la réplication lazy des colonnes (enable_lazy_columns_replication) produit des colonnes ColumnReplicated qui arrivent dans des pipelines de tri par fusion avec des entrées tardives. #101036 (Groene AI).
  • Correction d’un crash du serveur (SIGABRT) lors de l’utilisation de fonctions d’agrégation avec le combinator Null, réservé à un usage interne (par ex. sumNull, avgNull), et aggregate_functions_null_for_empty = 1. #101147 (Groene AI).
  • Correction d’un use-after-free dans le chemin d’écriture du cache du système de fichiers, qui pouvait entraîner des lectures depuis une mémoire déjà libérée lors de la journalisation des segments de fichier terminés. #101161 (Groene AI).
  • Correction d’un crash du serveur avec “Trying to attach external table to a ready set without explicit elements” lorsque l’analyse distribuée des index rencontre un prédicat GLOBAL IN dont le Set a été construit sans éléments explicites. #101178 (Groene AI).
  • Correction des fonctions d’agrégation MAX/MIN sur des colonnes Decimal qui renvoyaient des résultats incorrects lorsque la compilation JIT est activée. #101203 (Raúl Marín).
  • Correction d’un crash du serveur (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) lors d’une requête sur une table MergeTree avec ORDER BY CAST(lc_column, 'Type'), où lc_column est de type LowCardinality. #101220 (Groene AI).
  • Correction d’un comportement indéfini dans mergeTreeAnalyzeIndexes() en cas d’argument d’optimisation invalide. #101253 (Azat Khuzhin).
  • Correction d’un crash du serveur (Logical error: “Variant … is empty”) lorsqu’une requête lit simultanément une colonne Tuple contenant un type Map Dynamic et sa sous-colonne. #101448 (Groene AI).
  • Correction d’un crash LOGICAL_ERROR “Current component is empty” lors d’une requête sur system.part_moves_between_shards avec enforce_keeper_component_tracking activé. #101462 (Groene AI).
  • Correction d’une erreur de segmentation dans DataTypeDynamic::create() lorsque le fuzzer génère un AST de type Dynamic mal formé. #101464 (Groene AI).
  • Correction d’un crash LOGICAL_ERROR (“ColumnUnique can’t contain null values”) lors de la comparaison d’une colonne LowCardinality avec une constante NULL de type Variant, alors que use_variant_default_implementation_for_comparisons est désactivé. #101690 (Groene AI).
  • Ajout d’une protection contre les flux vides à Bzip2ReadBuffer afin qu’il renvoie EOF au lieu de lever UNEXPECTED_END_OF_FILE lorsque le flux interne est vide. #101691 (ClickGap AI Bot).
  • Correction d’un crash de type use-after-free dans l’ordonnanceur de lease CPU lorsque le temporisateur d’attente survit au worker thread dont il référence ProfileEvents::Counters. #101761 (Antonio Andelic).
  • Correction d’un use-after-scope dans la désérialisation en parallèle des chemins dynamiques de type Object, qui pouvait provoquer des crashs lors de la lecture de tables comportant de nombreux chemins dynamiques. #101823 (Antonio Andelic).
  • Correction d’un SIGSEGV dans MergeTreeDataPartWriterWide::cancel lorsqu’un constructeur de flux lève une exception pendant addStreams, laissant une entrée nulle dans column_streams. #101936 (Antonio Andelic).
  • Correction d’un segfault dans les mutations sur des colonnes matérialisées sans expression. #102342 (zoomxi).
  • Correction d’un segfault (ou de LOGICAL_ERROR dans les builds de débogage) lors de la lecture de fichiers Parquet avec le push-down du bloom filter activé et des conditions d’égalité/inégalité dans la clause WHERE, causé par un accès mémoire hors limites dans le prefetcher Parquet. #102385 (Groene AI).
  • Correction d’une lecture hors limites dans les fonctions de recherche de chaînes (countSubstrings, position, etc.) lors de la recherche d’un needle composé uniquement de null bytes. #102401 (Raúl Marín).
  • Correction d’une lecture hors limites dans printf avec un % final. #102472 (Raúl Marín).
  • Correction d’un crash LOGICAL_ERROR “Unexpected number of rows in column subchunk” dans le lecteur natif Parquet V3 lors de la lecture de colonnes Nullable avec un filtre WHERE. #102628 (Groene AI).
  • Correction d’un crash du serveur (SIGSEGV) lors de la lecture de fichiers Avro avec des schémas récursifs contenant des références cycliques à des types symboliques. Ces schémas sont désormais détectés et rejetés avec un message d’erreur clair. #102853 (Groene AI).
  • Correction d’un crash du serveur (assertion LOGICAL_ERROR) lorsqu’une fonction sur une colonne Variant atteint une memory limit ou une autre exception sans rapport avec une conversion de type pendant le transtypage du résultat dans FunctionVariantAdaptor. #102855 (Groene AI).
  • Correction d’un crash dans les builds debug/sanitizer lorsque std::length_error est levée pendant l’inférence de schéma. #102859 (Groene AI).
  • Correction d’un crash lors de l’utilisation d’une vue avec une clause WHERE où la requête interne produit des colonnes de types différents de ceux des métadonnées de la vue (par exemple Nullable issu d’un LEFT JOIN avec join_use_nulls). #102085 (Miсhael Stetsyuk).

Autres corrections de bugs

  • Correction d’un bug où des paramètres explicites envoyés avec compatibility dans la même requête pouvaient être ignorés silencieusement lorsque leur valeur correspondait à la valeur par défaut du serveur. #97078 (Raufs Dunamalijevs).
  • Correction du client qui signalait NETWORK_ERROR au lieu de l’erreur d’analyse syntaxique réelle (avec le bon numéro de ligne) lorsqu’un INSERT avec analyse parallèle rencontrait des données invalides. #97339 (Alexey Milovidov).
  • Correction de DROP DATABASE avec database_atomic_wait_for_drop_and_detach_synchronously, qui restait bloqué indéfiniment lorsque la requête était killée. #97586 (Alexey Milovidov).
  • Correction de KILL QUERY, qui ne pouvait pas terminer les requêtes bloquées lors de la génération WITH FILL, du chargement de dictionnaire via dictGet, ou d’un ALTER DELETE avec mutations_sync=1 sur ReplicatedMergeTree. #97589 (Alexey Milovidov).
  • Correction d’une erreur logique dans une requête de politique de masquage des données avec ON CLUSTER. #97594 (Bharat Nallan).
  • Correction d’un partition pruning incorrect lors de l’utilisation d’un DateTime64 antérieur à l’époque Unix avec la fonction toDate(). #97746 (Yarik Briukhovetskyi).
  • Correction d’une LOGICAL_ERROR Cannot schedule a file sur INSERT dans Distributed en raison d’une concurrence entre DROP et INSERT. #97822 (Azat Khuzhin).
  • Correction d’une erreur logique “Bad cast from type DB::ColumnConst to DB::ColumnArray” dans kql_array_sort_asc/kql_array_sort_desc lorsqu’elles sont appelées avec des arguments de tableau constants. #98251 (Alexey Milovidov).
  • Le serveur HTTP renvoie désormais un message d’erreur dans le corps de la réponse pour les réponses 400 Bad Request causées par des en-têtes mal formés, au lieu d’un corps vide. #98268 (Alexey Milovidov).
  • Correction de résultats erronés avec l’analyse distribuée des index (fonctionnalité expérimentale) et le cache des conditions de requête. #98269 (Azat Khuzhin).
  • Correction d’un échec d’une source de dictionnaire MongoDB avec les collections nommées. #98528 (Pablo Marcos).
  • Il est désormais interdit de supprimer une colonne lorsque ses sous-colonnes sont utilisées dans les expressions par défaut ou d’alias d’autres colonnes, et l’analyseur est désormais utilisé pour les expressions par défaut avec ALTER DROP COLUMN. #98569 (Nikita Mikhaylov).
  • Toutes les DB::Exception provenant de PocoHTTPClient::makeRequestInternalImpl ne peuvent désormais plus faire l’objet d’une nouvelle tentative, y compris HTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda).
  • Correction de deux bugs dans la compilation JIT d’expressions : une erreur de copier-coller dans la vérification des types de nativeCast qui rendait inaccessibles les branches de cast d’entier à entier et de flottant à flottant, ainsi que le passage d’un TargetMachine nullptr incorrect à LLVM PassBuilder. #98660 (Alexey Milovidov).
  • Correction d’une exception “Inconsistent KeyCondition behavior” dans les builds de débogage lorsque la clé primaire contient des valeurs flottantes NaN, en faisant en sorte que accurateLess et accurateEquals traitent les NaN de manière cohérente avec l’ordre de tri de ClickHouse. #98964 (Alexey Milovidov).
  • Correction de windowFunnel avec strict_deduplication, qui renvoyait un niveau incorrect lorsqu’un événement en double était rencontré. #99003 (Yash).
  • Les entrées system.trace_log pour les rechargements automatiques des dictionnaires ClickHouse ont désormais des ID de requête non vides. #98784 (Miсhael Stetsyuk).
  • Correction de SYSTEM START REPLICATED VIEW, qui ne relançait pas la tâche d’actualisation. #98797 (Pablo Marcos).
  • Correction de WITH FILL STALENESS, qui produisait des lignes remplies en trop lorsque les données étaient lues en plusieurs chunks (par exemple avec un index_granularity faible). #98895 (Alexey Milovidov).
  • Correction d’un plantage dans l’obfuscation des requêtes pour les identifiants commençant par une majuscule, comme Ab. #101450 (Xuewei Wang).
  • Correction du fait que TABLE_UUID_MISMATCH était ignoré dans le chemin de code sans analyzer. #99380 (Azat Khuzhin).
  • Correction de clickhouse format --obfuscate, qui produisait du SQL invalide en obfusquant les types de skip index, les noms de codecs de compression, les noms de database engine et les définitions de dictionary layout/source. #99260 (Raúl Marín).
  • Validation des changements de paramètres dans les requêtes CREATE lorsque l’engine lui-même prend aussi en charge des paramètres. #99279 (János Benjamin Antal).
  • Correction de insert_deduplication_token, qui était ignoré silencieusement pour les requêtes INSERT SELECT sans ORDER BY ALL. Fournir insert_deduplication_token suffit désormais à activer la déduplication, indépendamment de ORDER BY ALL. #99206 (Desel72).
  • Le traitement est désormais différé jusqu’à ce que le serveur ait fini de charger toutes les tables. #99700 (Seva Potapov).
  • Correction de l’analyse des guillemets de style shell dans les arguments de la table function executable. #99794 (Nikita Semenov).
  • Correction des requêtes d’async insert qui signalaient written_rows, read_rows et result_rows à zéro dans query_log et dans la sortie du client. #99879 (Sema Checherinda).
  • Correction d’un INSERT avec VALUES qui échouait lorsque les données étaient suivies d’un commentaire SQL final (-- ou /* */) sur la ligne suivante. Le commentaire est désormais ignoré au lieu d’être interprété comme une autre ligne. #100016 (Pratima Patel).
  • Correction d’une exception dans arrayRemove lors de la comparaison de tuples avec des composantes NULL. #100017 (Alexey Milovidov).
  • Traitement correct des valeurs négatives dans NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
  • Correction d’un problème où la fonction de table primes ne respectait pas correctement max_rows_to_read dans certains cas, en particulier lorsque offset et step sont présents. #100199 (Nihal Z. Miaji).
  • Les utilisateurs ne voient plus NATURAL CROSS JOIN lorsqu’ils interrogent l’AST d’une requête avec jointure naturelle réécrite en CROSS JOIN. #100223 (Peter Nguyen).
  • Quelques modifications mineures de fonctions : les fonctions h3 valident désormais mieux les limites ; readWKB vérifie les limites de taille (un nouveau paramètre, max_wkb_geometry_elements) ; les fonctions de génération aléatoire limitent le nombre maximal d’itérations. #100270 (Alexey Milovidov).
  • Correction d’un problème où cutURLParameter pouvait ignorer à tort des paramètres lorsqu’ils apparaissaient comme sous-chaînes d’autres paramètres. #100280 (Nikita Semenov).
  • Correction d’une exception LOGICAL_ERROR dans estimateCompressionRatio lorsque le paramètre block_size_bytes est extrêmement grand. #100298 (Alexey Milovidov).
  • Correction de DROP TABLE, qui pouvait rester bloqué indéfiniment sur les tables du moteur Kafka lorsque les consumers sont bloqués dans un rebalance après une erreur de heartbeat. #100388 (Alexey Milovidov).
  • Validation des dimensions du shape du format Npy par rapport à la taille du fichier et aux limites d’overflow afin d’éviter un déni de service via des fichiers .npy malveillants. Les shapes vides sont également rejetés et la mémoire par ligne est plafonnée à 2 GiB. #100625 (Raúl Marín).
  • Correction d’un problème où session_timezone était ignoré lors de l’analyse des valeurs DateTime pendant les async inserts (TCP) et tous les inserts via HTTP. #100647 (Sema Checherinda).
  • StorageRabbitMQ::shutdown a été rendu idempotent et des vérifications défensives de nullité ont été ajoutées, puisqu’il est désormais appelé deux fois (dans StreamingStorageRegistry et DatabaseCatalog). #100455 (Miсhael Stetsyuk).
  • Correction d’une exception LOGICAL_ERROR lors de l’utilisation de accurateCastOrNull avec le type cible QBit. #100470 (Raufs Dunamalijevs).
  • Correction de la syntaxe LIMIT m OFFSET n WITH TIES, qui ne fonctionnait pas (équivalente à LIMIT n, m WITH TIES, qui fonctionnait déjà). #100491 (Nihal Z. Miaji).
  • Correction d’un segfault où SerializationInfoTuple::add effectuait un assert_cast sur une simple référence SerializationInfo lors de la fusion des parts après qu’ALTER MODIFY COLUMN a modifié une colonne d’un type non-Tuple vers un Tuple. #100509 (Miсhael Stetsyuk).
  • Correction d’une exception “No set is registered for key” lors de l’utilisation de IN avec des colonnes Nullable(Tuple) ayant des fields nommés et des éléments LowCardinality. #100523 (Alexey Milovidov).
  • Correction d’un problème où EXECUTE AS ignorait les clauses FORMAT et INTO OUTFILE spécifiées dans la query. #100538 (pufit).
  • Correction d’un formatage AST incohérent pour SAMPLE avec un OFFSET au niveau de la requête. #100579 (Pavel Kruglov).
  • Correction des erreurs “La table cible n’existe pas” pour les vues matérialisées avec tables internes lors du démarrage asynchrone, dues à un ordre incorrect des dépendances au démarrage. #100946 (Nikolay Degterinsky).
  • Correction d’une exception dans optimizeLazyMaterialization lorsqu’une projection avec PREWHERE est utilisée avec ORDER BY ... LIMIT. #101115 (Anton Popov).
  • Correction d’un message d’erreur incorrect lors de l’appel à intExp10 avec un argument NaN — il indiquait intExp2 au lieu de intExp10. #101582 (Krishna Chaitanya).
  • Correction du fait que allow_statistics=0 ne bloquait pas ALTER TABLE ADD STATISTICS ni ALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya).
  • Correction de CREATE TABLE ... AS merge(), qui ignorait la liste explicite de colonnes et inférait automatiquement les colonnes à partir des tables sources, ce qui provoquait des erreurs NOT_FOUND_COLUMN_IN_BLOCK lorsque merge_table_max_tables_to_look_for_schema_inference était suffisamment faible et que les tables sources avaient des schémas différents. #101663 (Miсhael Stetsyuk).
  • Correction de la création de dictionnaires RANGE_HASHED, qui acceptait silencieusement un attribut de plage MAX inexistant et utilisait une configuration de type incorrecte lorsque les attributs de plage min et max avaient des types différents. #101732 (Yakov Olkhovskiy).
  • Correction de bugs dans les fonctions arrayLevenshteinDistanceWeighted et arraySimilarity. #101767 (Mikhail f. Shiryaev).
  • Correction de l’API Query de Prometheus, qui ignorait les corps de formulaires POST. #101794 (James Cunningham).
  • Correction d’un faux négatif de shouldPatchFunction dans SYSTEM INSTRUMENT ADD lorsque la chaîne recherchée apparaissait d’abord dans un argument Template du nom de symbole démêlé. #101885 (Pablo Marcos).
  • Correction de la description system.codecs pour AES_256_GCM_SIV, afin d’indiquer AES-256 au lieu de AES-128. #101917 (Jimmy Aguilar Mena).
  • Correction d’un comportement indéfini lors de l’analyse des paquets Query du protocole natif contenant des valeurs QueryProcessingStage invalides. #101972 (Raúl Marín).
  • Fermeture de la connexion TCP lorsqu’une exception se produit pendant l’analyse de la requête initiale, afin d’éviter la lecture de données incohérentes depuis un flux désynchronisé. #101989 (Raúl Marín).
  • Correction des cas où Time avec des valeurs négatives renvoyait un résultat incorrect lors d’une comparaison avec DateTime. #102056 (Yarik Briukhovetskyi).
  • Correction des espaces manquants lors du formatage de unlock snapshot. #102063 (Han Fei).
  • Correction de l’échec d’initialisation, sur une replica fraîche, des tables alias sans table cible dans Database Replicated. #102397 (Nikolay Degterinsky).
  • Les INSERT simples sans vues matérialisées ne demandent plus un nombre excessif de slots et de threads ConcurrencyControl (max_threads au lieu de max_insert_threads), ce qui évite l’épuisement des slots CC et l’explosion du nombre de threads sur les clusters avec un fort débit d’INSERT. #102961 (Sema Checherinda).
  • ArrowMemoryPool a été réintroduit afin de pouvoir lever MEMORY_LIMIT_EXCEEDED et éviter un OOM du noyau. #102999 (Azat Khuzhin).
  • Correction d’un type d’argument erroné signalé dans les messages d’erreur des fonctions de recherche de chaînes (par ex. locate, position) lorsque les arguments sont passés dans l’ordre inversé (locate(needle, haystack) avec function_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov).
  • Correction d’un blocage indéfini de waitForPause lorsque disableFailPoint est appelé alors qu’aucun thread n’est en pause au niveau du failpoint. #103119 (Shaohua Wang).
Last modified on June 29, 2026