Modifications non rétrocompatibles
Modifications des requêtes et de la syntaxe
- Les window functions
RANKetDENSE_RANKrefusent désormais les arguments et lèventNUMBER_OF_ARGUMENTS_DOESNT_MATCH, conformément à la norme SQL. Auparavant, des requêtes telles queRANK(x) OVER (ORDER BY id)étaient acceptées silencieusement et l’argument était ignoré, ce qui semait fréquemment la confusion chez les utilisateurs. Pour rétablir le comportement permissif précédent, définissezallow_rank_dense_rank_arguments = 1. #104324 (groeneai).
Modifications des types de données
icebergHasheticebergBucketrejettent désormais explicitement les argumentsInt128,UInt128,Int256,UInt256etDecimal256avec une erreur. Auparavant, ils tronquaient silencieusement les valeurs de plus grande taille, ce qui produisait des hachages identiques. La spécification Iceberg ne définit le hachage que pour les entiers sur 32/64 bits et les décimaux d’une précision maximale de 38 ; effectuez une conversion versInt64ouDecimal128pour conserver le comportement précédent pour les valeurs compatibles. #105866 (Algunenano).toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault, leCASTversUUIDetNullable(UUID),accurateCastOrNullversUUID, ainsi que les formats d’entrée qui analysent un UUID à partir de texte (Avro,MsgPack,JSONExtract, …) rejettent désormais les chaînes ayant la bonne longueur mais contenant des caractères non hexadécimaux. Auparavant, de telles entrées étaient silencieusement transformées en un UUID fabriqué de toutes pièces, en dépassant la fin de la table de correspondance des chiffres hexadécimaux. Désormais,toUUIDlèveCANNOT_PARSE_UUID, et les variantesOr*renvoientNULL/ l’UUID nul / la valeur par défaut fournie. #104370 (groeneai).- Les types
DynamicetVariantsont désormais validés dans la clausePARTITION BYd’une window ; cette vérification n’avait pas lieu auparavant lorsqueallow_suspicious_types_in_group_byest désactivé. Les requêtes qui partitionnent une window sur une colonneDynamicouVariantlèvent désormais une erreur, sauf siallow_suspicious_types_in_group_by = 1. #105450 (Avogar).
Modifications du stockage et des index
- Rejette les Dynamic/Variant imbriqués dans les agrégats min/max et les index minmax. Auparavant, seuls les Dynamic/Variant de premier niveau étaient vérifiés. #105468 (Avogar).
- La valeur par défaut du paramètre serveur
insert_deduplication_versionpasse decompatible_double_hashesànew_unified_hash. La déduplication des insertions s’applique désormais à l’ensemble du bloc inséré (par insertion) plutôt qu’à chaque part/partition : une nouvelle tentative de la même insertion est toujours dédupliquée, mais deux insertions distinctes produisant une part identique ne sont plus dédupliquées l’une par rapport à l’autre, et les insertions des mêmes lignes dans un ordre différent ne sont plus dédupliquées. Définissezinsert_deduplication_version = compatible_double_hashespour restaurer le comportement précédent. Avecnew_unified_hash, la déduplication des insertions asynchrones est également régie par la fenêtre de synchronisation : son activation (replicated_deduplication_window) et sa durée de conservation (replicated_deduplication_window_seconds, 1 heure par défaut) suivent les paramètres de synchronisation. Par conséquent,*_for_async_insertsest legacy et ne s’applique qu’àold_separate_hashes/compatible_double_hashes. Les instances mises à niveau directement depuis une version dont la valeur par défaut étaitold_separate_hashesdoivent d’abord fonctionner aveccompatible_double_hashesjusqu’à l’expiration de la plus longue fenêtre de déduplication pertinente (y comprisreplicated_deduplication_window_for_async_inserts, une semaine par défaut, si des insertions asynchrones sont utilisées), avant de s’appuyer surnew_unified_hash. Les charges de travail asynchrones passant decompatible_double_hashesdoivent d’abord augmenterreplicated_deduplication_window[_seconds]jusqu’à la valeur de la fenêtre asynchrone (et attendre une fenêtre asynchrone complète), interrompre les insertions asynchrones ou rester surcompatible_double_hashes, carnew_unified_hashne vérifie plus les identifiantsasync_blocksconservés plus longtemps. #107886 (CheSema). - Corrige le fait que
hasToken, lorsqu’il reçoit une aiguille contenant un séparateur, renvoie silencieusement des résultats via un index de texte au lieu de générer l’erreurBAD_ARGUMENTS. #108189 (Ergus).
Fonctionnalités supprimées
- Il n’est plus possible d’utiliser le Parquet reader et le writer obsolètes basés sur Arrow. L’implémentation native est toujours utilisée à la place. Les paramètres qui sélectionnaient les anciennes implémentations ou les ajustaient sont désormais obsolètes et ignorés :
input_format_parquet_use_native_reader_v3,output_format_parquet_use_custom_encoder,output_format_parquet_version,output_format_parquet_compliant_nested_typesetoutput_format_parquet_unsupported_types_as_binary. Le Native writer écrit toujours du Parquet V2.6+ avec des types imbriqués conformes, et lèveUNKNOWN_TYPEpour les types non pris en charge au lieu de les écrire en binaire brut. #100949 (alexey-milovidov). - Suppression du paramètre obsolète
allow_experimental_query_deduplicationet de son comportement expérimental non pris en charge de déduplication des requêtes. #99398 (devcrafter). ALTER TABLE ... REPLACE PARTITION ... FROM ...ne supprime plus silencieusement les données de la partition de destination lorsque la table source ne contient aucune part dans la partition demandée. Auparavant, une telle requête supprimait la partition de destination sans rien écrire à sa place. Elle est désormais rejetée avecBAD_ARGUMENTSpar défaut. Il s’agit d’un changement non rétrocompatible : unREPLACE PARTITIONà partir d’une source vide qui réussissait auparavant (en vidant la destination) lèvera désormais une exception après la mise à niveau. Pour rétablir le précédent comportement de vidage silencieux, définissez le nouveau paramètreallow_replace_partition_from_empty_source = 1(par requête ou dans le profil), ou définissezcompatibilitysur26.5ou une version antérieure. Pour supprimer explicitement les données de destination, utilisezALTER TABLE ... DROP PARTITION .... #104939 (groeneai).- Suppression des fonctions KQL (Kusto) expérimentales
array_sort_ascetarray_sort_desc, ainsi que de leurs implémentations SQLkql_array_sort_ascetkql_array_sort_desc. Ces fonctions étaient expérimentales, de mauvaise qualité et à l’origine de bogues de correction et d’analyse syntaxique. Les requêtes utilisant ces noms renvoient désormaisUNKNOWN_FUNCTION. #108101 (groeneai).
Nouveautés
Fonctions
- Ajout de la prise en charge de la fonction PromQL
histogram_quantiledans les fonctions de tableprometheusQueryetprometheusQueryRange. Cette fonction permet de calculer des quantiles à partir des buckets d’histogrammes Prometheus classiques identifiés par le labelle. #103477 (Yasumoto). - Ajout de la fonction
h3PolygonToCellsWithContainment, qui prend en charge les modes de couverture par centre, entièrement contenue et par chevauchement. #104455 (yousefQadry). - Il est désormais possible de spécifier un argument facultatif de précision pour les fonctions
formatReadableSize,formatReadableDecimalSizeetformatReadableQuantity, afin de contrôler le nombre de chiffres après la virgule. La valeur par défaut est 2, ce qui conserve le comportement antérieur. #104648 (antoniofilipovic). - Ajout des alias d’agrégation
min_byetmax_bypourargMinetargMax. #105712 (itsjoeoui).
Fonctionnalités SQL et des requêtes
formatReadableTimeDeltaaccepte désormais en entrée une expressionINTERVALd’un type autre queMonthetYear. #64315 (Beetelbrox).- Ajout de la prise en charge du format de sortie PNG, permettant de restituer directement les résultats de requêtes sous forme d’images PNG. #74691 (m7kss1).
- Introduction d’une fonctionnalité de réservation de mémoire pour les charges de travail. Consultez la documentation sur la planification des charges de travail. #82414 (serxa).
- Ajout des options
IPV4_PREFIX_BITSetIPV6_PREFIX_BITSpour les quotas basés surIP_ADDRESSouFORWARDED_IP_ADDRESS, permettant de partager les limites de quota par sous-réseau IP plutôt que de les appliquer séparément à chaque adresse complète. #89270 (adityachopra29). - Implémentation de
ADD ENUM VALUESdans les requêtesALTER TABLEafin de simplifier l’ajout de nouvelles valeurs à un type Enum existant sans devoir spécifier à nouveau toutes les valeurs Enum actuelles. #93830 (ilejn). - Ajout du format d’entrée
GeoJSONpour la lecture. #98124 (mneedham). - Ajout d’un postprocesseur à l’index de texte, qui transforme les jetons après la tokenisation. #98939 (Ergus).
- Ajout d’une prise en charge facultative des nœuds TTL dans ClickHouse Keeper. Les nœuds TTL expirent automatiquement après leur durée de vie configurée et ne peuvent pas avoir d’enfants. #100397 (scanhex12).
- Ajout du stockage des positions de jetons pour les index de texte afin de prendre en charge les recherches exactes avec
hasPhrase. Activez l’argument d’indexsupport_phrase_searchet le paramètreMergeTreeallow_experimental_text_index_phrase_search. #103172 (ahmadov). - Ajout des fonctions arrayTopK et arrayBottomK : -
arrayTopK(k, array)renvoie les K plus grands éléments par ordre décroissant -arrayBottomK(k, array)renvoie les K plus petits éléments par ordre croissant. #104563 (vitlibar). - Ajout de la prise en charge de la sélection de colonnes par motif de nom avec
* LIKE '<pattern>'et* ILIKE '<pattern>', y compris les formes qualifiées telles quetable.* LIKE '<pattern>'ettable.* ILIKE '<pattern>'.LIKEétablit une correspondance avec les noms de colonnes en respectant la casse, tandis queILIKEne tient pas compte de la casse. #104569 (niyue). - Ajout de requêtes continues pour les tables
MergeTreeà l’aide d’une séquence de lectures d’instantanés. #105114 (Michicosun). - Ajout du format
RowBinaryWithNamesAndTypesAndDefaultspour améliorer la prise en charge de l’évolution du schéma. #105736 (mzitnik). - Ajout de fonctions permettant de générer des Mapbox Vector Tiles directement depuis SQL :
MVTEncodeGeomprojette une géométrie dans l’espace de pixels d’une tuile slippy-map et l’écrête,MVTEncodeagrège les géométries projetées d’un groupe dans les octets binaires d’une tuile à une seule couche, etMVTBoundingBox/MVTBoundingBoxMercatorrenvoient la boîte englobante d’une tuile afin de limiter les lignes à celle-ci. Les géométries de type point, ligne et polygone sont prises en charge. Également disponibles sous les alias PostGISST_AsMVTGeometST_AsMVT. #106107 (saarthak2002). - Ajout de
LOCALTIMEetLOCALTIMESTAMP(syntaxe SQL standard / PostgreSQL).LOCALTIMESTAMPest un alias denow()(renvoieDateTime) ;LOCALTIMErenvoie l’heure actuelle sous la forme d’une valeurTime. #106139 (thomas-cabral). - Ajout de deux nouvelles stratégies
load_balancing,hostname_longest_common_prefixethostname_longest_common_suffix, qui privilégient la réplique dont le hostname partage le plus long préfixe commun (respectivement suffixe) avec celui de l’initiateur. Elles sont utiles lorsque le centre de données est encodé comme préfixe ou suffixe de hostnames dont les segments numériques sont de longueur variable, cas dans lequel les stratégies existantesnearest_hostnameethostname_levenshtein_distancesélectionnent la mauvaise réplique. #107360 (den-crane). - Nouvelles fonctions
quantizeBFloat16ToInt8etdequantizeInt8ToBFloat16: un codec scalaire qui compresse les composants d’embedding sur 8 bits à l’aide d’un quantificateur gaussien Lloyd-Max à 256 niveaux, dont des codes Int4/Int2/binaires peuvent être extraits par troncature de bits. #108102 (alexey-milovidov).
Moteurs de table et stockage
Paramètres et configuration
- Ajout d’un paramètre
output_format_always_write_decimal_point_in_float_and_decimalpour toujours afficher un point décimal pour les nombres à virgule flottante etDecimaldans les formats texte, même lorsque la valeur est un nombre entier. Par exemple, affiche1.au lieu de1. Désactivé par défaut. #62614 (qoega). - Ajout d’un nouveau paramètre immuable de
MergeTree,allow_tuple_element_aggregation, désactivé par défaut. Lorsqu’il est activé,SummingMergeTree,AggregatingMergeTreeetCoalescingMergeTreeaplatissent récursivement les colonnesTupleet agrègent chaque élément terminal indépendamment lors des fusions, comme s’il s’agissait d’une colonne de premier niveau :SummingMergeTreel’additionne,AggregatingMergeTreefusionne son état de fonction d’agrégation etCoalescingMergeTreeconserve sa dernière valeur non-NULL. Le paramètre doit être spécifié lors de la création de la table et est ignoré silencieusement par les moteurs qui ne le prennent pas en charge. #98039 (JingYanchao). - Ajout du paramètre
output_format_float_precisionpour contrôler le nombre de chiffres décimaux dans la sortie texte des nombres à virgule flottante. #99721 (phulv94). - Ajout des paramètres de table
MergeTreematerialize_projections_on_insertetmaterialize_projections_on_merge. Lorsquematerialize_projections_on_insert = 0, les INSERT ne créent pas de parts de projection, ce qui améliore le débit d’insertion pour les tables comportant de nombreuses projections. Lorsquematerialize_projections_on_merge = 1, une fusion recrée une projection absente de toutes ses parts sources, ce qui permet de créer les projections lors des fusions plutôt qu’à l’insertion. Les fusions ne combinent toujours que des parts partageant le même ensemble de projections. #100993 (cwurm). - Ajout d’un nouveau paramètre S3Queue
after_processing_move_preserve_path. Lorsqu’il est activé avecafter_processing='move'etafter_processing_move_prefix, les objets traités sont déplacés tout en préservant leur chemin source complet sous le préfixe de destination, au lieu d’être réduits au seul nom de fichier. #105354 (asya-ch). - Ajout des éléments de configuration du gestionnaire HTTP
url_prefixetfull_url_prefixpour faire correspondre tous les chemins commençant par un préfixe donné, ainsi que des éléments explicitesurl_regexp,full_url_regexpetheaders_regexp. La forme héritée<url>regex:...</url>reste prise en charge. #107492 (vitlibar).
Authentification
- Ajout d’un identifiant
external_idfacultatif pour l’accès à S3 basé sur les rôles. #106941 (eliangidoni). - Ajout à la table
system.session_logdes informations du certificat client TLS (sujets, numéro de série, émetteur et période de validité) afin d’améliorer l’observabilité de l’authentification par certificat. #107679 (alexey-milovidov).
Tables système
- Ajout de la table
system.iceberg_files, qui expose les métadonnées par fichier des tables Iceberg, avec une ligne par fichier de données ou de suppression dans le snapshot actuel de chaque table. #104415 (asya-ch). - Ajout d’index de saut de données hypothétiques. Utilisez
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...pour définir un index de saut de données virtuel limité à la session, puisEXPLAIN WHATIF SELECT ...pour estimer son taux d’exclusion et son coût sans le matérialiser. Les index définis sont visibles dans la nouvelle tablesystem.hypothetical_indexes. #104608 (yariks5s). - Ajout de la table système
system.constraints, qui fournit des informations sur toutes les contraintes CHECK et ASSUME de toutes les tables, y compris le nom, le type et l’expression de la contrainte. #105337 (PedroTadim). - Ajout d’une nouvelle table système
system.documentation, qui regroupe dans une seule table la documentation de référence intégrée des composants uniformes du système (fonctions, moteurs de table, types de données, paramètres, formats et autres), avec une documentation rendue au format Markdown. #107463 (alexey-milovidov).
Fonctionnalités expérimentales
- Ajout de l’algorithme expérimental de réordonnancement des jointures
dphyppour les jointures internes, en tant qu’option du paramètrequery_plan_optimize_join_order_algorithm, ainsi que du paramètrequery_plan_optimize_join_order_max_searched_plans, qui limite la recherche de l’ordre des jointures et bascule vers l’algorithme suivant de la chaîne lorsque cette limite est dépassée ; définissez-le sur0pour conserver le comportement précédent de recherche non limitée. #98798 (davenger). - Ajout du mode d’application différée des posting lists pour l’index de texte. Lorsqu’il est activé via
SET allow_experimental_text_index_lazy_apply = 1etSET text_index_posting_list_apply_mode = 'lazy', les posting lists sont décodées à la demande, à la granularité des blocs packed, à l’aide d’une approche basée sur un curseur, au lieu d’être entièrement matérialisées en bitmaps Roaring, ce qui réduit l’utilisation de la mémoire et le temps CPU pour les requêtes sélectives sur l’index de texte. #100035 (fastio). - Permet d’attacher des gestionnaires Prometheus au port HTTP principal avec un préfixe facultatif. #104975 (JTCunning).
- Ajout d’un paramètre MergeTree expérimental,
packed_skip_index_max_bytes, qui regroupe les petits substreams d’index de saut de données dans une seule archiveskp_idx.packedpar part, réduisant la pression sur les inodes lorsque de nombreux index de saut de données sont définis sur une table. La décision est prise pour chaque substream au moment de l’écriture : les substreams dont la taille sérialisée reste inférieure au seuil sont placés dans l’archive, tandis que les plus volumineux conservent la disposition autonomeskp_idx_<name>.idx2/.mrk2. Une même part peut combiner les deux dispositions. Les index de texte intégral ne sont pas pris en charge et sont toujours stockés dans des fichiers distincts. La valeur par défaut est 0 (packing désactivé). #105321 (Algunenano). - Prise en charge de la sérialisation
Bufferspour les UDF WebAssembly utilisantABI BUFFERED_V1, et ajout dewebassembly_udf_enable_fuelcomme paramètre persistant de fonction UDF WASM. #105574 (antonio2368). - Exécution de requêtes distribuées en plusieurs étapes : le planificateur divise le plan de requête en étapes reliées par des échanges scatter / broadcast / gather / shuffle et répartit les fragments de plan entre les nœuds workers. Les données entre les étapes sont transmises en streaming via TCP ou via des fichiers temporaires dans un stockage d’objets partagé. Cette fonctionnalité prend en charge les hash joins distribués de type shuffle et broadcast, l’agrégation shuffle et le tri distribué. Elle est expérimentale et désactivée par défaut. #106020 (davenger).
- Le moteur expérimental de plan de requête distribué (
make_distributed_plan) peut désormais utiliser, pour chaque worker, un port distinct pour la répartition des tâches et les échanges en streaming, configuré par réplique dans<remote_servers>avecstateless_worker_portetstreaming_exchange_port. S’ils ne sont pas définis, les ports précédents au niveau du serveur (stateless_worker_client.portetdistributed_query.streaming_exchange_port) sont utilisés. Cela permet d’exécuter plusieurs workers sur un même hôte. #107885 (davenger).
Améliorations des performances
Performances des JOIN
- Application différée des index de sélecteur et de réplication lorsqu’un JOIN est suivi d’un LIMIT sélectif, d’un TopN ou d’un autre JOIN. Pour contrôler le nombre de colonnes de payload requis pour activer l’indexation différée des sélecteurs, utilisez le paramètre
query_plan_min_columns_for_join_lazy_indexing(0 signifie que l’optimisation est désactivée). Pour définir la valeur de LIMIT à laquelle l’optimisation s’applique, utilisez le paramètrequery_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi). ASOF JOINpeut désormais utiliser l’algorithme de jointureparallel_hash, en parallélisant la phase de construction entre les différentes valeurs de clés d’égalité. Auparavant, ASOF était systématiquement exclu deparallel_hash. #105375 (gregakinman).- Partage de la FixedHashMap de la jointure par hachage comme filtre d’exécution de JOIN côté sondage. Lorsque la table de hachage côté construction est (ou peut être convertie en) une FixedHashMap, elle est publiée comme filtre d’exécution et remplace le
Set/BloomFilterqueBuildRuntimeFilterStepinstallerait autrement. Contrôlé par le nouveau paramètreenable_join_runtime_filter_shared_fixed_hash_table(activé par défaut :true). #105640 (wudidapaopao). - La réorganisation DP des JOIN est désormais autorisée avec des répliques parallèles. #105889 (nickitat).
- Amélioration du plan de requête lorsque les JOIN utilisent des filtres d’exécution (
enable_join_runtime_filtersactivé par défaut) : le modèle de coût de réorganisation des jointures traverse désormaisWindowTransform(et les autres étapes du plan préservant les lignes) dans le sous-arbre de droite et utilise le nombre de lignes sous-jacent ainsi que le NDV par colonne, au lieu de considérer qu’aucune statistique n’est disponible. #107229 (UnamedRus).
Optimisation des requêtes
- Amélioration des performances de l’analyse des index de texte pour les recherches portant sur plusieurs jetons grâce à une gestion optimisée des jetons rares. #98226 (CurtizJ).
- Amélioration des performances des fonctions
encrypt,decryptethalfMD5en évitant les recherches implicites du fournisseur OpenSSL pour chaque ligne dans OpenSSL 3.x. #99105 (thevar1able). - Regroupement des blocs sources avant
projection.calculate()lors deMATERIALIZE PROJECTIONafin de réduire le nombre de parties de projection temporaires et le surcoût des fusions. Accélération d’environ 3,4 fois sur une table de 50 millions de lignes. #100047 (amosbird). - Les utilisateurs bénéficient désormais de meilleures performances des filtres d’exécution approximatifs et des index de filtre de Bloom. #100201 (cv4g).
- Accélération des requêtes
ORDER BY ... LIMIT BYen exécutantLIMIT BYdans chaque flux trié en parallèle lors deSort, lorsque les colonnes deLIMIT BYconstituent un préfixe de celles deORDER BY. Cela réduit le nombre de lignes passant par la fusion de tri finale et les étapes ultérieures du pipeline. Cette optimisation est contrôlée par le nouveau paramètrequery_plan_push_limit_by_into_sort(activé par défaut). #104000 (nihalzp). - Réduction du surcoût par requête pour les requêtes
SELECTsimples (analyse syntaxique, analyse et planification). Par exemple,SELECT count() FROM hitsexécutée depuis une seule connexion est environ 50 % plus rapide. #104513 (Algunenano). - Amélioration des performances de
bitmapContainspour les étatsgroupBitmapautres queUInt64en évitant les appels répétés àrb_maxlors des vérifications de plage. #105960 (niyue). - Amélioration des performances d’insertion pour les colonnes
LowCardinalitydotées d’indexbloom_filter. #106410 (EmeraldShift). - Amélioration des performances des fonctions
L2DistanceTransposedetcosineDistanceTransposedpour le type de donnéesQBit. #106701 (rienath). - Amélioration des performances de l’analyse des requêtes sur des tables comportant de nombreuses colonnes : évite le calcul des hachages des nœuds de colonne (qui incluent l’expression complète de la table source) lorsqu’il n’est pas nécessaire. L’analyse de sous-requêtes
SELECT *imbriquées sur une table d’environ 1 200 colonnes est désormais environ 50 fois plus rapide. #106957 (novikd). - Amélioration des performances des fonctions
encrypt,decrypt,tryDecrypt,aes_encrypt_mysqletaes_decrypt_mysqljusqu’à un facteur dix, compensant les performances perdues lors de la migration de BoringSSL vers OpenSSL 3.x (24.4). #107339 (thevar1able). - Amélioration de l’exécution de
arrayElementsurArray(LowCardinality(String))et des fonctionsLIKEsur les maps dont les clés ou les valeurs sont de typeLowCardinality(String), en évitant la matérialisation inutile de chaînes. #107450 (EmeraldShift). - Réduction de l’utilisation du CPU et amélioration des performances d’évaluation des skip-index pour les requêtes filtrant des colonnes
DateTime64. #107707 (shankar-iyer). - Amélioration des performances des recherches de sous-chaînes insensibles à la casse, notamment
positionCaseInsensitiveUTF8,ILIKEetmultiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano). - Correction d’une régression de débit d’environ 16 % du codec à virgule flottante
FPCsur ARM, apparue lorsque ses tables de prédiction ont commencé à utiliserVectorWithMemoryTracking. #108182 (groeneai). - Correction d’une régression de performances où un seul
DELETEléger désactivait le cache des conditions de requête pour l’ensemble de la table. Les requêtes sélectives répétées sur une table ayant déjà fait l’objet d’unDELETEléger ne permettaient plus d’élaguer les granules et entraînaient la lecture de chaque marque. #112947 (fm4v). - Limitation du coût de l’estimation de la sélectivité de
col IN (...)à partir des statistiques de colonnes, qui pouvait ajouter plusieurs centaines de millisecondes à la planification d’une seule requête. L’estimateur n’exécute plus la sous-requête decol IN (subquery)pour remplir un ensemble dont il n’a besoin que pour obtenir une valeur de sélectivité : un ensemble non construit est ignoré. Pour un ensemble dont la taille dépasse le nouveau paramètrestatistics_max_set_size_for_exact_selectivity_estimation(10000 par défaut), la sélectivité est désormais déduite de la taille de l’ensemble et de la plage qu’il couvre. #114389 (nickitat).
Performances des fonctions et des agrégations
- Optimisation de l’analyse de l’index de clé primaire pour les clés primaires longues et à forte cardinalité. Pour une clé primaire longue, le temps d’exécution de l’analyse de l’index dépend désormais principalement de la complexité du filtre de la requête (les colonnes de clé qu’il utilise réellement), et non de la longueur de la clé primaire. Par conséquent, l’extension de la clé de tri n’entraîne qu’une surcharge négligeable pour l’analyse de l’index des requêtes qui ne filtrent que sur quelques-unes de ses colonnes. Pour une clé primaire à forte cardinalité, lorsque ClickHouse ne conserve en mémoire qu’un préfixe sélectif des colonnes de clé sans charger les suivantes, l’analyse de l’index ne porte désormais que sur ce préfixe en mémoire plutôt que sur l’ensemble de la clé. L’optimisation est activée par défaut et peut être désactivée avec le nouveau paramètre
use_lightweight_primary_key_index_analysis. #91836 (nihalzp). - Réduction du pic d’utilisation de la mémoire lors de la fusion de résultats d’agrégation partiels à deux niveaux avec de grands états d’agrégation (par ex.
groupArray), grâce à la libération progressive des états sources de chaque compartiment pendant la fusion, au lieu de tous les conserver jusqu’à sa fin. #102330 (yurifedoseev). - Nouvelle optimisation de
GROUP BYpour les clés à forte cardinalité uniformément réparties, qui répartit les lignes entre les threads par hachage de la clé de regroupement, afin que chaque thread agrège un sous-ensemble distinct de clés sans phase de fusion. Définissezenable_sharding_aggregator = 1pour l’activer. #104233 (nihalzp). - Accélération des requêtes
LIMIT BYsur les tablesMergeTreepartitionnées en exécutantLIMIT BYen parallèle dans le flux de chaque partition, au lieu de fusionner tous les flux en un seul avant d’appliquer la limite. Cela s’applique lorsque l’expression de partition est une fonction déterministe des colonnesLIMIT BY, de sorte qu’aucun groupeLIMIT BYne peut s’étendre sur deux partitions. Contrôlé par le nouveau paramètreallow_limit_by_partitions_independently(activé par défaut). #105126 (nihalzp). - Accélération des requêtes
SELECT ... LIMIT N BY <cols>lorsque<cols>constitue un préfixe de la clé de tri de la table, ou le devient après queWHERE col = consta fixé les colonnes initiales. Lorsque cette option est activée,MergeTreelit les données dans l’ordre de la clé primaire etLIMIT BYles filtre d’abord en flux, avec une mémoire O(1) par flux trié, ce qui élimine la plupart des données, avant d’appliquer leLIMIT BYnormal aux données réduites afin d’obtenir le résultat final. Contrôlé par le nouveau paramètreoptimize_limit_by_in_order(activé par défaut). #105135 (nihalzp). - Accélération des requêtes
LIMIT BYpar suppression des expressions de clé redondantes : une clé qui est une fonction déterministe des autres clés est supprimée (par ex.LIMIT 5 BY x, f(x)devientLIMIT 5 BY x), et une fonction injective d’une clé est remplacée par son argument (par ex.LIMIT 5 BY toString(x)devientLIMIT 5 BY x). Cela permet d’évaluer moins d’expressions, et des expressions moins coûteuses, par ligne. Contrôlé par les nouveaux paramètresoptimize_limit_by_function_keysetoptimize_injective_functions_in_limit_by, tous deux activés par défaut. #106818 (nihalzp). - Accélération de l’analyse des requêtes comportant de nombreux appels de fonctions ou des appels de fonctions profondément imbriqués, grâce à la suppression d’un hachage redondant de l’arbre de requête du cache de résolution des fonctions. #107516 (novikd).
- Parallélisation du traitement du résultat d’une CTE récursive : un
GROUP BYou toute autre opération sur un volumineux résultat deWITH RECURSIVEn’est plus limité à un seul thread. #107694 (alexey-milovidov).
Performances du stockage et des E/S
- Les clients S3 utilisant le même point de terminaison et le même compartiment partagent un cache, ce qui évite la découverte redondante des régions. #96802 (zvonand).
- Amélioration des performances de copie dans le stockage d’objets grâce à la copie parallèle des blobs. #105089 (asya-ch).
- Évite de lire le contenu des fichiers lors de l’utilisation du format d’entrée One avec des fonctions de table de type fichier telles que file et s3. #105157 (niyue).
- La clé primaire de
MergeTreeet les index de saut de données peuvent désormais élaguer des granules pour les filtres dans lesquelsifNulloucoalesceencapsule une condition, commeifNull(key = 0, 0)oucoalesce(key = 0, 0). Ces prédicats — souvent générés par des générateurs de requêtes pour convertir une comparaison potentiellementNULLen valeur booléenne définie — étaient auparavant opaques pour l’analyse des index et ne permettaient pas d’ignorer des granules. Cette modification étend le paramètre existantallow_key_condition_coalesce_rewrite(activé par défaut). #106272 (andyzzhao). - Amélioration des performances de décodage des colonnes Parquet
FLOATetDOUBLEencodées avecBYTE_STREAM_SPLIT. #106376 (Algunenano). - Correction des blocages prolongés lors de la connexion et du démarrage des requêtes avec le stockage d’accès répliqué lorsque de nombreuses entités d’accès (politiques de lignes, rôles, quotas, profils de paramètres) changent simultanément. Chaque cache par entité est désormais recalculé une seule fois par lot de notifications, au lieu d’une fois par entité modifiée, éliminant ainsi un travail quadratique susceptible de maintenir le verrou d’accès pendant plusieurs minutes. #107672 (azat).
- Correction d’une régression de performances : la lecture de nombreux petits fichiers depuis un stockage d’objets via
s3et d’autres fonctions de table ne préchargeait plus les données et basculait vers des lectures synchrones, ce qui ralentissait considérablement les lectures monothreadées ou à faible concurrence de nombreux petits fichiers. #108872 (fm4v). - Activation du préchargement initial des petits objets lorsque les lectures du stockage d’objets passent par le cache du système de fichiers (
filesystem_cache_name). Auparavant, les lectures de nombreux petits fichiers, comme lors de l’ingestionS3Queue, restaient synchrones et limitées par la latence lorsque le cache du système de fichiers était activé. #109478 (fm4v). - Amélioration de l’optimisation
PREWHEREpour les sous-colonnesMapen tenant compte de leur taille sur disque. #110623 (Avogar). - La matérialisation différée s’applique désormais aux requêtes avec
FINAL, un filtre et un petitLIMIT, même sansORDER BY(pourReplacingMergeTree). #110722 (KochetovNicolai). - Réduction du temps CPU consacré à la déduplication lors des vidages d’insertions asynchrones couvrant de nombreuses partitions. #111150 (valerypetrov).
- Correction d’une régression CPU pour les requêtes effectuant de nombreuses petites lectures indépendantes dans la même part
MergeTreelorsque la table possède des colonnesLowCardinality. La vérification déterminant si une part possédait un unique dictionnaire partagé parcourait chaque marque de l’ensemble de la part à chaque tâche de lecture ; elle identifie désormais chaque séquence de marques identiques par recherche binaire. Les requêtes de ce type sur des tables avec une faibleindex_granularitypouvaient être plusieurs fois plus lentes depuis la version 26.6. #116134 (groeneai).
Optimisation de la mémoire
- Réduction jusqu’à 10 fois de la mémoire utilisée par les métadonnées du type
Enumpour les tables contenant des colonnesEnum. Les recherches de valeur à nom restent aussi rapides, voire plus rapides, tandis que les recherches de nom à valeur lors de l’analyse syntaxique et de la désérialisation peuvent être plus lentes. #95668 (qoega). - Réduction du pic d’utilisation de mémoire de
BACKUPen évitant de copier la liste interne des informations de fichiers lors de l’écriture des entrées de sauvegarde (ce qui est particulièrement significatif pour les sauvegardes contenant des millions de fichiers). #111162 (jkartseva).
Améliorations
Requêtes et SQL
- Identification des colonnes par position (plutôt que par nom) lors de la suppression des colonnes inutilisées du plan de requête. Cela permet de supprimer les colonnes inutilisées lorsque des noms de colonnes sont dupliqués. #100586 (antaljanosbenjamin).
- Ajout de
SESSION_USERcomme alias non sensible à la casse decurrentUser()pour assurer la compatibilité avec PostgreSQL et le standard SQL. #106081 (takumihara). - Réduction de la latence d’annulation des requêtes exécutées via le protocole filaire PostgreSQL : KILL QUERY interrompt désormais la sérialisation de la sortie au sein d’un seul fragment, au lieu d’attendre que l’intégralité du fragment soit envoyée au client. #106535 (rvasin).
- Correction d’une erreur
ILLEGAL_TYPE_OF_ARGUMENTpour les requêtes distribuées avecserialize_query_plan = 1contenant une lambda avec un argument constant (par ex.arrayMap(t -> t.2, ...)). Les colonnes constantes des nœudsINPUTd’ActionsDAGsont désormais préservées lors de la sérialisation du plan de requête. #107124 (alexey-milovidov). - Réduction de la latence d’annulation des requêtes exécutées via le protocole filaire MySQL : KILL QUERY interrompt désormais la sérialisation de la sortie au sein d’un seul fragment, au lieu d’attendre que l’intégralité du fragment soit envoyée au client. #107228 (rvasin).
Fonctions
EXPLAIN SYNTAXformate désormais systématiquement les opérateurs sous forme d’appels de fonction dans la sortie d’explication (par exempleplus(1, 2)au lieu de1 + 2). #94681 (1abdelhalim).- La syntaxe de type PostgreSQL
expr OP SOME(array)/expr OP ALL(array)(avec un membre droit qui n’est pas une sous-requête) est désormais prise en charge et réécrite enhas/NOT haspour=/<>, ou en lambdasarrayExists/arrayAllpour les autres opérateurs de comparaison.ANYn’est pas accepté dans la forme tableau, caranyest également une fonction d’agrégation ; utilisez plutôtSOME. La forme sous-requête deANY/SOME/ALLcontinue d’être convertie enIN/NOT IN. #105129 (alexey-milovidov). - Ajout de la prise en charge des fonctions
multiSearchAny,multiSearchAnyUTF8etmultiMatchAnydans les index de texte. L’analyse des index de texte a également été améliorée pour la fonctionmatch: les motifs comportant des groupes d’alternatives peuvent désormais ignorer davantage de granules. #106279 (CurtizJ). - La fonction
h3PolygonToCellsapplique désormais la taille maximale de tableau à l’ensemble des polygones d’unMultiPolygon, valide les codes de retour de la bibliothèque H3 sous-jacente et rejette les argumentsMultiLineStringau lieu de renvoyer silencieusement un résultat vide. #106399 (Algunenano). - La désérialisation des états des fonctions d’agrégation
contingency,cramersV,cramersVBiasCorrectedettheilsUvérifie désormais que les comptes stockés forment une table de contingence cohérente et lève une exceptionCORRUPTED_DATAdans le cas contraire. #107185 (nihalzp). - Amélioration de l’estimation de cardinalité dans l’optimiseur de plans de requête : une colonne produite par une fonction déterministe à un seul argument (par ex.
toYear(date)) hérite désormais du nombre de valeurs distinctes de son argument comme limite supérieure, au lieu de rester sans statistiques, ce qui permet un réordonnancement des jointures plus précis. #107757 (davenger).
Moteurs de table et stockage
- Corrige les consommateurs du moteur de table Kafka qui continuaient à utiliser un intervalle de poll court après l’affectation des partitions, afin qu’ils reviennent au
kafka_poll_timeout_msconfiguré et évitent les polls à vide excessifs, les parts insérées de plus petite taille et la surcharge de fusion supplémentaire après les rééquilibrages. #100431 (sugaf1204). - Les moteurs de table de lac de données, notamment
IcebergetDeltaLake, peuvent désormais utiliser des disques S3 et Azure avec cache, ce qui permet aux lectures répétées d’utiliser le cache du système de fichiers. #102017 (RinChanNOWWW). - Permet de fusionner, lors d’un second passage de l’optimiseur, les filtres introduits après la sélection PREWHERE initiale (pushdown de prédicats, filtres d’exécution ou PREWHERE explicite associé à une clause WHERE définie par le planificateur) avec le PREWHERE existant, plutôt que de les conserver sous forme d’étape Filter distincte au-dessus de la lecture MergeTree. #105445 (yariks5s).
- Ajout du paramètre
wait_for_part_commit_in_dependent_materialized_views. Lorsqu’il est activé, une vue matérialisée en cascade qui effectue une jointure avec sa source peut voir la ligne en cours d’insertion. #105943 (ahmadov). - Prise en charge, compatible avec PostgreSQL, de
EXTRACT(TIMEZONE_HOUR FROM dt)etEXTRACT(TIMEZONE_MINUTE FROM dt)pour extraire les composantes heure et minute d’un décalage de fuseau horaire, ainsi que deEXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>)pour extraire la valeur d’un intervalle. #106227 (vinayakj592). - Implémentation de
SYSTEM RESTART DISK <name>: cette commande recharge désormais les métadonnées d’un disque en mémoire et analyse de nouveau les parts de données des tables de répliques readonly qui s’y trouvent. Cela permet à une réplique readonly d’une table sur un stockage partagéplain_rewritabled’observer à la demande les données écrites par un autre serveur, sans attendrerefresh_parts_intervalni redémarrer le serveur. #106645 (jrdi). - Évite les chargements inutiles de fichiers de marques pour les données partagées JSON avancées. #107051 (Avogar).
- Ajout du paramètre
materialized_postgresql_use_extended_date_and_time_types, défini à la création, pour le moteur de base de donnéesMaterializedPostgreSQL. Par défaut (activé), les colonnes PostgreSQLdate/timestampsont inférées commeDate32/DateTime64; le définir sur0lors deCREATE DATABASEentraîne l’inférence des types plus restreintsDate/DateTime. Ce paramètre ne s’applique pas au moteur de tableMaterializedPostgreSQL. #107428 (alexey-milovidov). - MergeTree peut désormais lire un flux compressé dont les blocs utilisent différents codecs. Il s’agit du prérequis côté lecture pour la sélection adaptative de codec. #108592 (rienath).
- Utilise l’index de saut de données
bloom_filterpour les prédicatsINsur une colonne directement indexée lorsquetransform_null_in = 1et que l’ensembleINne contient aucune valeurNULL. Auparavant, l’index était ignoré pour ces requêtes, ce qui imposait un parcours complet. #111329 (groeneai).
S3 et stockage d’objets
- Enregistre les privilèges dans
system.query_log.used_privilegespour toutes les vérifications d’accès autorisées, y compris celles qui empruntent le cheminisGrantedne levant pas d’exception (checkAccessWithFilter). Auparavant, seuls les privilèges vérifiés via des points d’entrée levant des exceptions (checkAccess/checkGrantOption) étaient enregistrés, ce qui rendaitREAD ON FILE/READ ON S3/READ ON AZURE/READ ON URLinvisibles dans le journal d’audit pour les requêtesDESCRIBE,CREATE TABLE ASet similaires utilisant les fonctions de tablefile/s3/azure/url. L’application des contrôles d’accès reste inchangée. #104693 (alexbakharew). - Effectue de manière asynchrone la requête finale de téléversement multipart vers S3 via le suivi des tâches, afin qu’elle puisse se chevaucher avec le téléversement de la dernière partie au lieu de s’exécuter en série lors de la finalisation. #105487 (asya-ch).
- Augmente de une à six heures la valeur par défaut du paramètre
persistent_processing_node_ttl_secondspourS3QueueetAzureQueue, afin d’éviter qu’un traitement de longue durée ou redémarré ne perde trop tôt son verrou de bucket. #106838 (kssenii). - Prend en charge les valeurs
REDUCED_REDUNDANCY,STANDARD_IA,ONEZONE_IA,GLACIER_IRetEXPRESS_ONEZONE(en plus deSTANDARDetINTELLIGENT_TIERING) pour le paramètres3_storage_class_name. #107251 (adityaksolves). - Le chemin d’exemple de partitionnement Hive pour les tables de stockage d’objets (par exemple,
S3) est résolu lors de la première utilisation de la table plutôt que lors deCREATE/ATTACH, de sorte qu’un endpoint non joignable ne bloque plus la création de tables ni le démarrage du serveur. #111842 (evillique).
Paramètres et configuration
- La stratégie de partitionnement hive devient la valeur par défaut avec le paramètre de compatibilité
file_like_engine_default_partition_strategy. #86746 (kssenii). - Ajout de quatre nouveaux paramètres de table MergeTree pour contrôler les paramètres par défaut des index de texte :
text_index_dictionary_block_size,text_index_dictionary_block_frontcoding_compression,text_index_posting_list_block_sizeettext_index_posting_list_codec. Ces paramètres permettent d’ajuster le comportement des index de texte au niveau de la table sans spécifier de paramètres dans chaque définition d’index. Les arguments explicites définis pour chaque index restent prioritaires. #100626 (CurtizJ). - Ajout du paramètre
output_format_pretty_use_nbsp_for_paddingafin de restituer les espaces de remplissage des tableaux dans les formatsPrettysous forme d’espaces insécablesU+00A0lorsqueoutput_format_pretty_grid_charsetest défini surUTF-8. Cela permet à la sortiePrettycopiée de conserver l’alignement des tableaux dans les outils qui réduisent les espaces ordinaires. Le paramètre est désactivé par défaut et la sortie avec le jeu de caractèresASCIIconserve les espaces ordinaires. #103559 (ashrithb). - Prise en charge de la compatibilité avec l’ancien analyseur via le paramètre
analyzer_compatibility_allow_non_aggregate_in_having. S’il est activé, les conjonctions non agrégées sont déplacées de HAVING vers WHERE. #104232 (novikd). OPTIMIZE TABLE ... ON CLUSTERet les autres DDL ne restent plus bloqués lorsque la table cible atable_readonly = 1. Le paramètre génère désormais un nouveau code d’erreur dédié,TABLE_IS_PERMANENTLY_READ_ONLY, queDDLWorkertraite comme non réessayable (à la différence de l’erreur transitoireTABLE_IS_READ_ONLY, qui survient lors de déconnexions temporaires de ZooKeeper pourReplicatedMergeTree). Le paramètretable_readonlyest également désormais explicitement refusé pourReplicatedMergeTree, tant lors de la création que viaALTER MODIFY SETTING. #105109 (alexey-milovidov).- L’ordre de tri décroissant dans les clés de tri
MergeTree(par exempleORDER BY (time DESC, key)) est désormais toujours pris en charge et ne nécessite plus le paramètre expérimentalallow_experimental_reverse_key, devenu obsolète. #106440 (nikitamikhaylov). - Prise en charge de
keyed_by_normalized_query_hashpour les quotas définis dans la configuration statique du serveur (users.xml), conformément à la syntaxe DDL existanteCREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov). - Le paramètre de compatibilité n’applique plus les paramètres obsolètes ; il ne les marque donc plus comme modifiés et ne génère plus d’avertissements à leur sujet. #107737 (UberDever).
- Ajout du paramètre
analyzer_compatibility_multiple_joins_qualify_column_names(valeur par défaut :false). Lorsqu’il est activé et que la clauseFROMd’une requête contient au moins deuxJOIN, les noms des colonnes de résultat produits par l’analyseur reproduisent la réécriture des jointures multiples de l’ancien analyseur : les colonnes développées à partir de*sont nommées<alias-or-table>.<column>, et une référence à une colonne sans alias dans la listeSELECTconserve son nom exactement tel qu’il est écrit. Cela permet aux requêtes externes qui référencent de tels noms qualifiés, commeSELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), de fonctionner comme avec l’ancien analyseur. Correction également d’un problème où l’analyseur perdait les noms qualifiés des colonnes de résultat développées à partir de*lorsquegroup_by_use_nullsétait combiné avecROLLUP,CUBEouGROUPING SETS, ce qui produisait des noms de colonnes de résultat dupliqués et empêchait les références externes à ces colonnes. #110746 (novikd). - Ajout du paramètre
analyzer_compatibility_apply_final_to_all_joined_tables, qui rétablit l’ancien comportement selon lequel le modificateurFINALappliqué à la table située le plus à gauche d’un JOIN l’était également aux autres tables jointes. Ce paramètre est enregistré dans l’historique des modifications de paramètres, de sorte quecompatibilityavec des versions antérieures à 26.6 rétablit automatiquement l’ancienne sémantique. #111589 (fm4v). - Ajout d’un nouveau paramètre MergeTree
text_index_versionqui contrôle la version du format sur disque des index de texte :v0_initial,v1_with_codecouv2_with_positions. Lors d’une mise à niveau progressive ou avant une rétrogradation, définissez-le sur une version antérieure afin que les serveurs plus récents continuent d’écrire les parties d’index de texte dans un format que les serveurs plus anciens peuvent encore lire ; le paramètre de compatibilité l’ajuste automatiquement. #111803 (CurtizJ).
Tables système et supervision
- Renseigne
used_storagesdanssystem.query_logavec le nom du moteur de stockage lors de l’interrogation de tables via DataLakeCatalog. #100706 (melvynator). - Ajoute les colonnes
current_projection,current_projection_progress,projections_completedetprojections_remainingàsystem.mergesafin d’exposer la progression des fusions de projections. #102611 (amosbird). - Les moteurs de table intègrent désormais de la documentation embarquée, consultable via les nouvelles colonnes
description,syntax,examples,introduced_inetrelatedde la tablesystem.table_engines. #106177 (alexey-milovidov). - Les moteurs de base de données intègrent désormais de la documentation embarquée, consultable via les nouvelles colonnes
description,syntax,examples,introduced_inetrelatedde la tablesystem.database_engines. #106178 (alexey-milovidov). - Les types de données intègrent désormais de la documentation embarquée, consultable via les nouvelles colonnes
description,syntax,examples,introduced_inetrelatedde la tablesystem.data_type_families. #106180 (alexey-milovidov). - Les formats d’entrée/sortie intègrent désormais de la documentation embarquée, consultable via les nouvelles colonnes
description,examples,introduced_inetrelatedde la tablesystem.formats. #106181 (alexey-milovidov). - Les combinateurs de fonctions d’agrégation intègrent désormais de la documentation embarquée, consultable via les nouvelles colonnes
description,syntax,examples,introduced_inetrelatedde la tablesystem.aggregate_function_combinators. #106185 (alexey-milovidov). - Ajout d’une nouvelle table
system.data_skipping_index_typesqui répertorie les types d’index d’évitement de données disponibles, accompagnés de leur documentation embarquée (description,syntax,examples,introduced_in,related). #106186 (alexey-milovidov). - Ajout d’une nouvelle table
system.disk_typesqui répertorie les types de disques disponibles, accompagnés de leur documentation embarquée (description,syntax,examples,introduced_in,related). #106187 (alexey-milovidov). - Ajout des métriques asynchrones
TotalUncompressedBytesOfMergeTreeTablesetTotalUncompressedBytesOfMergeTreeTablesSystem, qui indiquent la taille totale non compressée des données stockées dans les tables de la famille MergeTree. #106364 (alexey-milovidov). - Ajoute l’événement de profil
GlobalMemoryLimitExceededafin que les opérateurs puissent surveiller les dépassements de la limite de mémoire globale du serveur. #106466 (sacheendra). - Ajout des métriques asynchrones
ExecutableUserDefinedFunctionMemoryResidentBytesetExecutableUserDefinedFunctionProcesses, qui indiquent la mémoire résidente (VmRSS) et le nombre de processus actifs des fonctions définies par l’utilisateurexecutableetexecutable_pool, y compris les processus descendants et les workers inactifs du pool. #107300 (HanziJiang). - Ajout de
show_remote_databases_in_system_tables, activé par défaut, permettant aux utilisateurs de masquer les bases de donnéesMySQLetPostgreSQLdesystem.tables,system.columnsetsystem.completions.show_data_lake_catalogs_in_system_tablescontinue de contrôler uniquement la visibilité deDataLakeCatalog. #104416 (pamarcos). #109082 (pamarcos).
ClickHouse Keeper
- Diverses modifications apportées à Keeper, le rendant globalement environ deux fois plus rapide (meilleur traitement par lots, acheminement en pipeline des messages vers le leader et ajout en pipeline au journal). #101757 (al13n321).
- Ajout d’événements de profil Keeper supplémentaires (côté serveur et côté client) pour les watches. #105336 (scanhex12).
- Ajout d’une table
system.keeper_snapshotsréservée à Keeper, contenant des informations sur les snapshots ClickHouse Keeper locaux. #105571 (mstetsyuk). - Ajout d’une table
system.keeper_changelogsréservée à Keeper, contenant des informations sur les fichiers changelog (journal Raft) locaux de ClickHouse Keeper. #105617 (mstetsyuk). - Ajout d’une table
system.keeper_clusterréservée à Keeper. Elle contient une ligne par membre du cluster Raft tel que vu par le Keeper actuel. #105646 (mstetsyuk). - Réduction de la consommation maximale de mémoire lors de l’application des snapshots reçus dans ClickHouse Keeper avec
KeeperMemoryStorage. #105851 (antonio2368). - Ajout de paramètres
coordination_settingsà Keeper pour limiter l’admission des entrées de journal non validées deNuRaftet réguler les sondes inversées append-entries. #106108 (antonio2368).
Gestion de la mémoire
- Correction des messages d’erreur de syntaxe susceptibles d’inclure des octets issus de zones mémoire adjacentes après que l’analyseur syntaxique est revenu en arrière au-delà de la fin d’une instruction. #105086 (groeneai).
- Réduction de l’utilisation de la mémoire lors de l’ouverture d’une sauvegarde (pour
RESTOREou comme base d’unBACKUPincrémentiel). Les métadonnées.backupsont désormais analysées sous forme de flux au lieu d’être chargées dans une arborescence de documents XML en mémoire, ce qui évite, pour les sauvegardes volumineuses (en particulier incrémentielles), d’allouer une arborescence DOM de plusieurs gigaoctets. #109107 (jkartseva). - Réduction de l’utilisation maximale de la mémoire lors de la finalisation d’un
BACKUP. L’écriture des métadonnées de sauvegarde ne copie plus les informations de tous les fichiers dans un vecteur temporaire (ce qui, pour les sauvegardes contenant des millions de fichiers, nécessitait temporairement plusieurs gigaoctets) ; elles sont désormais parcourues sur place. #109861 (jkartseva).
Formats de données
- Les utilisateurs peuvent désormais insérer des champs Avro Fixed pour des variantes d’entiers de 8, 16, 32 ou 64 bits. #98139 (patrickpichler).
- Le format
AvroConfluentréessaie désormais le client HTTP de Confluent Schema Registry en cas d’échecs transitoires (dépassements de délai de transport, connexions refusées, erreurs DNS, erreurs HTTP5xx/408/429) avec un backoff exponentiel, au lieu d’interrompre l’INSERT au premier incident réseau. Les nouveaux paramètresformat_avro_schema_registry_max_retries(valeur par défaut :5) etformat_avro_schema_registry_retry_initial_backoff_ms(valeur par défaut :100) contrôlent cette politique. Les erreurs de validation de schéma (HTTP409, JSON Avro malformé) restent fatales. #106661 (groeneai). - Les codes d’erreur ClickHouse d’origine sont désormais préservés pour les erreurs renvoyées via Apache Arrow. #107267 (azat).
Collections nommées et dictionnaires
- Ajout du paramètre
enable_compressionpour la fonction de tablemysql, le moteur de tableMySQL, le moteur de base de donnéesMySQL, la source de dictionnaireSOURCE(MYSQL)et les collections nommées. Lorsqu’il est activé, ClickHouse négocie la compression au niveau du protocole MySQL pour toutes les données transférées via la connexion. #103229 (bernardlim). - Ajout d’une nouvelle table
system.dictionary_layoutsqui répertorie les layouts de dictionnaire disponibles ainsi que leur documentation intégrée (description,syntax,examples,introduced_in,related). #106182 (alexey-milovidov). - Ajout d’une nouvelle table
system.dictionary_sourcesqui répertorie les sources de dictionnaire disponibles ainsi que leur documentation intégrée (description,syntax,examples,introduced_in,related). #106184 (alexey-milovidov). - Le type de stockage effectif des collections nommées est désormais disponible sous
named_collections_storage.typedanssystem.server_settingset viagetServerSetting('named_collections_storage_type'). #111806 (pamarcos).
Autres améliorations
- Amélioration des suggestions de noms de tables dans les messages d’erreur : elles ne proposent plus exactement le même nom et incluent le nom de la base de données dans la suggestion (par ex., “Peut-être vouliez-vous dire other_db.my_table ?”). #95116 (matt-metivier).
- Amélioration du message d’erreur pour les identifiants non résolus dans les requêtes sans clause FROM, afin de suggérer d’en ajouter une. #101769 (Onyx2406).
- Correction d’un problème où
PREWHEREavec une sous-requêteINsur des colonnes de clé primaire n’utilisait pas l’index de clé primaire pour l’élagage des granules, entraînant des parcours complets de la table au lieu de ne lire que les granules pertinents. #102570 (nikitamikhaylov). - Les vues matérialisées actualisables continuent désormais de s’actualiser après le remplacement de leur table cible avec
EXCHANGE TABLESet la suppression de l’ancienne table. Auparavant, les actualisations pouvaient échouer avec une exceptionUNKNOWN_TABLE, car elles conservaient l’UUID de l’ancienne table. #102724 (seva-potapov). - Activation de
enable_join_transitive_predicatespar défaut. #103724 (davenger). - Les vues matérialisées actualisables prennent désormais en charge
REFRESH DEPENDS ONafin de déclencher leur actualisation en fonction de l’actualisation d’une autre RMV, plutôt que selon une planification temporelle. (REFRESH EVERY ... DEPENDS ONexistait déjà, mais ne pouvait pas être utilisé de manière fiable dans ce cas d’utilisation.) Consultez la documentation CREATE MATERIALIZED VIEW. #104440 (al13n321). - Ajout de l’option
EXPLAIN PIPELINEpour compacter les chaînes de processeurs répétées. #104662 (niyue). - Ajout de
REGEXP_SUBSTRcomme alias insensible à la casse deregexpExtractpour assurer la compatibilité avec Oracle, MySQL et Snowflake. #105122 (alexey-milovidov). - Ajout de
date_part('unit', expr)comme raccourci syntaxique pourEXTRACT(unit FROM expr). Les types d’intervalles standard et les extensions PostgreSQL (epoch,dow,doy,isodow,isoyear,century,decade,millennium) sont tous pris en charge. #105127 (alexey-milovidov). - Le
QueryConditionCacheenregistre désormais individuellement les granules exclues par le filtrage, même dans les lots de lecture qui passent partiellement PREWHERE, réduisant ainsi le nombre de marques relues par les requêtes ultérieures avec la même condition. #105335 (hanfei1991). - Ajout de la prise en charge de BFloat16 pour les fonctions de prédicat numérique. #105391 (mohhddhassan).
- Prise en charge des statistiques de base, des statistiques compactes par colonne qui stockent les valeurs numériques minimales et maximales, la longueur moyenne des chaînes et le nombre de valeurs NULL, le cas échéant. #106048 (hanfei1991).
- Prise en charge d’un modificateur
NULL/NOT NULLfinal dansALTER TABLE ... ADD/MODIFY COLUMN, à l’image deCREATE TABLE. #106150 (takumihara). - L’optimiseur PREWHERE regroupe désormais les conjonctions qui font référence au même ensemble de colonnes avant d’estimer la sélectivité, afin que des conditions telles que
a > 2500 AND a < 2502soient évaluées conjointement comme une plage combinée (sélectivité d’environ 0,02 %) plutôt que comme deux prédicats indépendants (environ 50 % chacun). Cela permet un ordonnancement plus précis des conditions PREWHERE lorsque des statistiques de colonnes sont disponibles. #106337 (hanfei1991). - Le préambule “Trace de pile (lors de la copie de ce message, incluez toujours les lignes ci-dessous) :” n’est plus affiché dans les messages d’exception lorsque la trace de pile est vide. #106524 (alexey-milovidov).
- Correction de
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)sur les disques chiffrés, qui copiait les données au lieu de créer des liens physiques. #106731 (nikitamikhaylov). - Correction de la lecture des données de table par les bases de données
DataLakeCatalogaveccatalog_type = 'onelake', qui utilisent désormais par défaut le point de terminaison Blob OneLake (.blob.fabric.microsoft.com). Définissezonelake_use_blob_endpoint = falsepour conserver le comportement précédent utilisant le point de terminaison DFS (.dfs.fabric.microsoft.com). #106843 (scanhex12). - Réduction de la surcharge CPU de la journalisation asynchrone à des débits de journaux élevés, en notifiant le consommateur de journaux uniquement lors du passage d’une file vide à non vide, plutôt que pour chaque message. #107352 (nikitamikhaylov).
- Correction de la lecture de la longueur de
auth_responsedans la négociation initiale MySQL, où un octet de longueur>= 128était interprété comme une valeur de plusieurs gigaoctets, car lu comme uncharsigné. #107384 (uwezkhan). MaterializedPostgreSQLassocie désormais les colonnes PostgreSQLnumeric(p, 0)dont la précision est supérieure à 76 (par ex.numeric(78, 0), utilisé pour les entiers 256 bits) àInt256de ClickHouse, au lieu d’échouer avec “Precision too big”. Les valeurs qui ne tiennent pas dansInt256sont rejetées avec une erreur explicite. #107431 (alexey-milovidov).Nullable(Tuple(...))est désormais en bêta. Désactivé par défaut ; définissezenable_nullable_tuple_type = 1pour l’utiliser. #107754 (nihalzp).- Les insertions asynchrones ne journalisent plus la liste complète des
query_idaux niveauxtrace/debug, ce qui, depuis la version 26.2, pouvait saturertext_logsur les services traitant un volume important d’insertions asynchrones. Les lignes détaillées sont désormais au niveautest. #107852 (CheSema). - Réduction de l’utilisation des métadonnées du cache du système de fichiers grâce à la libération rapide des entrées de priorité invalidées. #107903 (kssenii).
- Un index de saut
bloom_filtersur une colonneArrayest désormais utilisé pourarrayJoin(column) IN (set),arrayJoin(column) GLOBAL IN (set)etarrayJoin(column) = const, comme c’était déjà le cas pourhasAny(column, set)ethas(column, const). Auparavant, ces formesarrayJoin ...recouraient à un parcours complet. #109536 (groeneai). IS NOT DISTINCT FROMetIS TRUEutilisent désormais les index de clé primaire et minmax pour éliminer des granules, comme=. Auparavant,k IS NOT DISTINCT FROM 42et(k = 42) IS TRUEparcouraient tous les granules. #110006 (groeneai).
Corrections de bogues
Correctifs JOIN
- Correction de la fonction
nested(utilisée en interne parARRAY JOIN) qui supprimaitLowCardinalitydes types de colonnes, entraînant la conversion deArray(LowCardinality(String))enArray(String)dans la sortie. #98974 (Onyx2406). - Correction du réordonnancement des jointures qui supprimait silencieusement les lignes sans correspondance d’une jointure
RIGHT/LEFT JOINlorsqu’elle était jointe par virgule (cross join) à une autre table, par exemplet1 RIGHT JOIN t2 ON t1.c = t2.c, t3. La requête renvoyait auparavant le résultat d’une jointure interne au lieu de celui d’une jointure externe. #101684 (groeneai). - Correction d’une
LOGICAL_ERROR(“Port is not connected”, code 49) susceptible de se produire lors de l’exécution de requêtes impliquant une VIEW avec agrégation dans une JOIN. #102574 (Ergus). - Correction de l’ignorance silencieuse de
max_rows_to_transferetmax_bytes_to_transferpour les requêtesGLOBAL INetGLOBAL JOINavec le nouvel analyseur. Ces paramètres déclenchent désormaisSET_SIZE_LIMIT_EXCEEDED(ou interrompent l’exécution, selontransfer_overflow_mode) lorsque la table externe matérialisée dépasse la limite configurée, conformément au comportement de l’ancien analyseur. #104119 (groeneai). - Correction de résultats incorrects ou d’échecs de requêtes
JOINutilisantjoin_algorithm = 'direct'avec une tableMergeTreeà droite lorsque l’optimisation réordonnait les colonnes de recherche. #104174 (groeneai). - Correction d’un bug où les requêtes combinant
arrayJoinavecORDER BY ... LIMITaprès uneJOINpouvaient renvoyer silencieusement zéro ligne. L’optimisation du plan de requête qui remonte l’évaluation des fonctions au-dessus deSortingStepne s’applique plus lorsque l’expression remontée contientarrayJoin, cararrayJoinpeut modifier le nombre de lignes. #104558 (groeneai). - Correction d’une erreur logique dans certains cas d’utilisation de
LIMIT BYnégatif avecARRAY JOIN. #105403 (nihalzp). - Ajout d’un nouveau paramètre de compatibilité
analyzer_compatibility_prefer_alias_over_subcolumn(désactivé par défaut). Lorsqu’il est activé, le nouvel analyseur privilégie l’interprétation comme préfixe d’alias plutôt que les correspondances avec des sous-colonnes Tuple ou des colonnes avec point pour les identifiants en plusieurs parties, rétablissant le comportement de l’interpréteur précédent. Cela évite les erreursAMBIGUOUS_IDENTIFIER(et similaires) lorsqu’une requête joint une table dont le nom correspond à une table interne d’une CTE/sous-requête utilisantSELECT *sur une jointure, où les colonnes renommées par l’astérisque (par exempleb.id) feraient sinon fuiter les identifiants de la table interne dans la portée externe. #105491 (vdimir). - Correction de résultats potentiellement incorrects pour les requêtes combinant une jointure externe avec une jointure interne ultérieure référençant le côté de la jointure externe qui fournit les valeurs nulles. Le réordonnancement des jointures pouvait sélectionner un plan qui déplaçait les conditions de jointure interne dans la clause ON de la jointure externe. #105992 (vdimir).
- Meilleure compatibilité avec l’ancien analyseur. Si la table comporte des colonnes telles que
x.a Array, x.b Array, x String, les tableaux sont privilégiés pourARRAY JOIN x. #106069 (KochetovNicolai). - Correction d’une exception pour les requêtes
INNER JOINavec une tableMergeTreegauche vide lorsqueenable_parallel_replicas,query_plan_use_new_logical_join_stepetquery_plan_optimize_join_order_algorithm = 'greedy'sont activés. #106338 (KochetovNicolai). - Correction d’une erreur logique (
Left and right columns have same names) dans l’optimiseur de l’ordre des jointures, susceptible de se produire pour les jointures exécutées avec des répliques parallèles lorsque deux relations du graphe de jointures partagent des noms de colonnes. #106418 (alexey-milovidov). - Correction d’une
LOGICAL_ERROR(Invalid number of rows in Chunk) dansJoiningTransformpour unLEFT JOINavec des clés uniques à droite, une conditionONmixte et une faible valeur demax_joined_block_size_rows. #106928 (groeneai). - Correction d’une exception (
LOGICAL_ERROR) dans le filtre d’exécution des JOIN lorsque la clé de jointure contient un typeVariantouDynamicimbriqué dans unTuple,ArrayouMap, et que le côté droit de la jointure ne comporte qu’une seule valeur distincte. #106931 (groeneai). - Correction d’une
LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y) lors de l’exécution d’une fonction sur une colonneDynamicconstruite par une JOIN surDynamic(par exemple, les lignes non jointes d’unRIGHT/FULL JOINou une sous-requêteEXISTScorrélée et décorrélée en jointure). #107095 (groeneai). - Correction d’une exception d’erreur logique
Bad cast from type DB::IColumn const* to DB::ColumnNullable const*lorsqu’un astérisque qualifié (t.*) appliqué à une cléJOIN ... USINGest transmis à une fonction d’agrégation et que l’autre côté d’une jointure externe possède une cléNullable(avecjoin_use_nulls = 0). #107129 (groeneai). - Correction d’une erreur logique (
Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) lorsque l’optimisation de poussée des disjonctions (prédicats partiels) pousse une condition sur une cléUSINGdont le type est élargi par la JOIN. Correction également d’un plantage du serveur (erreur de segmentation) dans l’analyseur lors de la résolution d’identifiants dans des requêtesJOIN ... USINGcontenant des branchesif/multiIfréductibles en constantes et référençant des identifiants inconnus. #107407 (groeneai). - Correction du filtre d’exécution des JOIN qui produisait des résultats incorrects pour les colonnes JSON. #107663 (Avogar).
- Correction d’une exception d’erreur logique
Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>lorsqu’un astérisque qualifié (t.*) sélectionne une cléJOIN USINGet que cette jointure est imbriquée sous une jointurePASTE/CROSS/par virgule ou une jointure externeON, avecjoin_use_nulls = 0. #108043 (groeneai). - Correction d’un bogue dans le nouvel analyseur où FINAL sur une table d’une JOIN (par ex.
FROM t1 FINAL JOIN t2) était également appliqué à tort aux autres tables jointes, ce qui pouvait ralentir ces requêtes. #108979 (vdimir). - Avec
analyzer_compatibility_join_using_top_level_identifier = 1, un identifiant dansJOIN ... USINGpeut désormais être résolu à partir d’un alias défini sur une sous-expression de la liste SELECT (par exemple,SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), conformément au comportement de l’ancien analyseur. Auparavant, seuls les alias de projection de niveau supérieur étaient pris en compte, et ces requêtes échouaient avec une exceptionUNKNOWN_IDENTIFIERmême avec le paramètre activé. L’indication d’erreur suggérant ce paramètre est désormais également produite lorsque l’alias correspondant est imbriqué. #110739 (novikd). - Correction de l’erreur
INCOMPATIBLE_TYPE_OF_JOINpour une jointureANYsur une table utilisant le moteurJoin, lorsqu’un filtreWHEREsur une colonne du côté droit permettait au planificateur de requêtes de réécrire la jointure enSEMIouANTI. Une table du moteurJoinpossède une strictness déclarée fixe qui ne peut pas être modifiée ; la conversion est donc désormais refusée pour ces tables. #111362 (groeneai). - Correction de
TYPE_MISMATCH(“Le type de clé pour une clé complexe … ne correspond pas”) lorsqu’uneJOINavec un dictionnaire utilise une clé de jointureNullable,LowCardinalityouLowCardinality(Nullable), alors que la clé du dictionnaire n’est pas encapsulée. La recherche dans le dictionnaire pour les jointures directes normalise désormais la clé selon le type de clé déclaré du dictionnaire (comme le font déjàdictGet/dictHas), et une cléNULLne correspond jamais. #111857 (groeneai). - Correction de
AMBIGUOUS_COLUMN_NAME(Incompatibilité de structure de block dans (les colonnes portant le même nom doivent avoir une structure identique)) pour une requête qui répète une conditionJOIN ONdansWHEREavecjoin_use_nulls = 1. Une telle requête renvoie désormais son résultat au lieu d’échouer. #112007 (groeneai). - Correction de résultats incorrects ou de l’arrêt du serveur pour des
JOINdirects avec un dictionnaire dont la clé utilise une sérialisation creuse. #112327 (groeneai). - Correction de résultats incorrects lorsqu’une jointure par hash possède une seule clé
LowCardinalityd’un type dépassant 8 octets (UInt128,Int128,UInt256,Int256et leurs variantesNullable). Une telle jointure renvoyait silencieusement des lignes dont les valeurs de clé ne sont pas égales. #113230 (groeneai). - Correction de l’élagage des parts et des granules pour une condition
JOIN ONimpliquant des colonnes constantes de l’autre côté. #113484 (vdimir). - Correction d’une valeur erronée renvoyée pour une colonne virtuelle telle que
_tableou_database, sélectionnée du côté droit d’une JOIN traitée parDirectKeyValueJoin(un stockage clé-valeur tel queEmbeddedRocksDB,KeeperMap,Redisou un dictionnaire). La requête renvoyait à la place le contenu d’une colonne de données, ou échouait avecLOGICAL_ERROR. #113698 (groeneai).
Correctifs apportés aux requêtes et à l’analyseur
- Corrige un bogue où splitMultipartQuery levait une erreur “Requête vide” pour les requêtes se terminant par un commentaire après un point-virgule. #85491 (yariks5s).
- Corrige le cas où un alias placé après une sous-requête dans DESCRIBE TABLE n’était pas accepté par l’analyseur syntaxique, ce qui entraînait une erreur de syntaxe. #100205 (yariks5s).
- Corrige le fait que la clause
FORMATétait consommée parINSERTau lieu de s’appliquer à la sortie deEXPLAINdansEXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406). - Corrige le ralentissement important des requêtes SELECT lors de l’exécution d’INSERT concurrents. Auparavant, un pipeline INSERT réservait des créneaux CPU jusqu’à
max_threadsau démarrage de la requête, même si la plupart n’étaient jamais utilisés, privant ainsi les SELECT concurrents de ressources. L’allocation des créneaux CPU est désormais à la demande : le pipeline ne demande des créneaux qu’à mesure qu’il soumet du travail parallélisable. Cela s’applique tant au contrôle de concurrence qu’à l’ordonnanceur CPU préemptif des charges de travail. Le nouveau paramètre serveurconcurrent_threads_lazy_allocation(valeur par défaut :true) permet de revenir au comportement précédent. #102928 (seva-potapov). - Corrige un bogue où
ALTER TABLE ... MODIFY SETTINGsur une tableEmbeddedRocksDBpouvait enregistrer une valeur de paramètre non valide dans le fichier de métadonnées de la table, même lorsque le serveur rejetait la requête. Au redémarrage suivant du serveur, la table ne pouvait pas être attachée en raison deCANNOT_PARSE_BOOL(ou d’une erreur d’analyse similaire) et, dans les bases de données où les échecs de chargement sont fatals, le serveur refusait de démarrer. Les valeurs de paramètre non valides sont désormais rejetées avant toute écriture de métadonnées. #103417 (groeneai). - Corrige les
INSERTen continu avecinput_format_max_block_wait_mspour l’interfaceHTTPetINSERT SELECT FROM input, afin que les blocs d’entrée partiels soient vidés avant la fin de la requête. #104534 (alexey-milovidov). - Corrige l’expression
CASE, qui renvoyait la brancheELSEau lieu de la brancheTHENcorrespondante lorsque l’expression et une valeurWHENétaient toutes deuxNULL. #105556 (Algunenano). - Corrige la prise en charge des UDF SQL
WASMdans les définitions deMATERIALIZED VIEW. #106161 (niyue). - Corrige
INTERPOLATE (), qui levaitINVALID_WITH_FILL_EXPRESSIONlorsque des colonnes ORDER BY recevaient des alias dans la liste SELECT avec l’ancien analyseur. #106252 (yakov-olkhovskiy). - Les fonctions
base58Encode,base58DecodeettryBase58Decoderespectent désormaismax_execution_timeet l’annulation des requêtes pour les entrées volumineuses, et rejettent les entrées de plus de 10 KB au lieu de s’exécuter pendant très longtemps. La limite est configurable via le nouveau paramètrefunction_base58_max_input_size(0la désactive). #106428 (alexey-milovidov). - Corrige un bogue produisant des résultats incorrects :
WHERE c0 = constne renvoyait aucune ligne pour les tables avecORDER BY f(c0)lorsquef(const)s’évalue à NaN, par exempleORDER BY sqrt(c0)avec une constante négative. L’analyse de la clé primaire écartait incorrectement chaque granule et corrompait le cache des conditions de requête pour les requêtes suivantes. #106507 (groeneai). - Correction de résultats incorrects pour
SELECT c, count() FROM t WHERE c GROUP BY csur des tables utilisant la projection implicite_minmax_count_projection, une projection d’agrégat explicite ou une projection standard : tous les groupes étaient auparavant fusionnés en une seule ligne avec une clé constante et le nombre total de lignes. #106590 (groeneai). FORMATs’applique désormais aussi à la sortie deEXPLAINdansEXPLAIN ... INSERT ... SELECT ... FORMAT ..., y compris lorsqueSETTINGSprécèdeFORMATou que le format de sortie estValues. #106686 (alexey-milovidov).- Correction d’une rare erreur parasite
RESOURCE_ACCESS_DENIED(“Scheduler queue with resource request is about to be destructed”) pour une requête qui avait effectivement obtenu l’accès à une ressource de charge de travail, causée par la réutilisation d’un objet de requête local au thread qui conservait l’échec d’une requête précédente. #106690 (alexey-milovidov). - Correction de
match,extract,extractAlletcountMatches, qui renvoyaient des résultats incorrects pour des expressions régulières contenant des séquences d’échappement hexadécimales ou octales. #106709 (ofeliacode). - Correction d’un sous-dépassement d’entier dans l’analyseur du protocole filaire PostgreSQL : un message dont le champ de longueur était inférieur à 4 provoquait un dépassement par retour à zéro de
size - 4et unresize/ignoresurdimensionné. #107485 (uwezkhan). - Avec
enable_analyzer = 1(valeur par défaut), l’interrogation d’une table par son nom non qualifié, lorsqu’elle n’existe que dans une autre base de données, suggère désormais la bonne table. Par exemple,SELECT * FROM functionsrenvoieMaybe you meant system.functions?. Auparavant, le nouvel analyseur renvoyait l’erreurUnknown table expression identifiersans suggestion, tandis que l’ancien analyseur proposait déjà cette suggestion utile. #107550 (groeneai). - Correction d’un arrêt du serveur (
std::terminate, signal 6) lors de l’arrêt d’une requête utilisant un plan distribué (make_distributed_plan = 1), lorsqu’une vérification de l’état d’un worker ne parvenait pas à planifier la vérification suivante (par exempleCANNOT_SCHEDULE_TASKlors de l’arrêt ouMEMORY_LIMIT_EXCEEDED). La requête échoue désormais proprement et le serveur continue de fonctionner. #107575 (groeneai). - Correction de résultats incorrects dans des requêtes distribuées sélectionnant des colonnes
ALIASpartageant une sous-expression commune : les colonnes pouvaient être mal alignées et les valeurs renvoyées sous la mauvaise colonne. #107675 (vdimir). - Correction d’une erreur logique
Inconsistent AST formattingpour une fonction fenêtre sans argument dans une déclaration deCODECou de moteur (par ex.CODEC(cume_dist() OVER (...))) ; cette fonction conserve désormais ses parenthèses afin que la requête résiste à un aller-retour de formatage/analyse. #107806 (alexey-milovidov). getClientHTTPHeaderest désormais correctement traité comme non déterministe, de sorte que son résultat n’est plus réutilisé à tort par le cache de résultats de requête. #108029 (alexey-milovidov).- Correction de résultats incorrects lors de l’utilisation de
SELECT [...] SAMPLE [...]avec le cache de conditions de requête (paramètreuse_query_condition_cache = 1, qui est aussi la valeur par défaut). #108488 (groeneai). - Correction de
NOT_FOUND_COLUMN_IN_BLOCKlorsqu’un prédicat composé reçoit un alias dansGROUP BYpuis est de nouveau référencé, avecenable_identifier_resolve_cacheactivé (valeur par défaut). L’optimisationoptimize_and_compare_chainn’était pas idempotente, et un nœud résolu partagé accumulait un conjonctif transitif en double. #108553 (groeneai). - Correction de l’erreur
NUMBER_OF_COLUMNS_DOESNT_MATCHlorsqu’une sous-requête sur une tableDistributedlit au moins deux colonnesALIASqui se développent en la même expression (par exemplea1 String ALIAS toString(x), a2 String ALIAS toString(x)) et alimente une requête externe, par ex.SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai). - Correction de l’erreur
UNKNOWN_IDENTIFIERavecALTER TABLE ... DROP COLUMNlorsqu’une autre colonne possède une expressionDEFAULTouMATERIALIZEDqui définit et référence un alias intégré. #109374 (alexey-milovidov). - Correction de
system.tables, qui ignorait silencieusement des bases de données pour les utilisateurs disposant d’autorisations par base de données lorsque la requête ne lisait que les colonnesname/database. Introduit dans la version 26.2. #109723 (samay-sharma). - Correction de l’erreur
UNKNOWN_IDENTIFIERpour les colonnes qualifiées par le nom d’une CTE (cte_name.column) dans les requêtes stockées dans des vues lorsque l’analyseur est activé. #111386 (novikd). - Correction de
NOT_FOUND_COLUMN_IN_BLOCKlorsqu’une requêteFINALfiltre sur une colonne de la clé de tri absente de la listeSELECTet que le filtre est déplacé versPREWHERE(par exempleSELECT s FROM t FINAL WHERE k GROUP BY savecoptimize_move_to_prewhere_if_final = 1). #111721 (groeneai). - Correction de l’échec du démarrage du serveur et de
ATTACHavecWITH RECURSIVE is not supported with the old analyzerpour une vue contenant une CTE récursive lorsqueenable_analyzer = 0est la valeur par défaut du serveur. #112784 (evillique). - Correction de la propagation des paramètres de requête et de la gestion des valeurs NULL dans
accurateCastOrDefault. #114912 (alexey-milovidov). - Correction de
read_rows,read_bytes,written_rowsetwritten_bytesdanssystem.query_thread_log, qui rapportaient un total cumulé sur la durée de vie d’un thread au lieu des valeurs de la requête enregistrée. Les lignes des threads regroupés à longue durée de vie, en particulier le threadHTTPHandlerayant initié la requête, étaient affectées. #115596 (groeneai).
Correctifs liés à MergeTree et au stockage
- Les parties détachées portant le suffixe
tryNpeuvent désormais être supprimées. #58957 (antaljanosbenjamin). - Correction d’une exception
MULTIPLE_EXPRESSIONS_FOR_ALIASpour les requêtes comportant des alias de projections en double (par exempleSELECT *, day + 365 AS day) dans des sous-requêtes imbriquées exécutées avec des répliques parallèles. #80310 (alexey-milovidov). - Correction d’une sélection incorrecte du codec de compression pour les parties
MergeTreelorsque le paramètre de tabledefault_compression_codecétait explicitement configuré. Les parties écrites lors des insertions, des fusions et pour les projections utilisaient le codec par défaut du serveur au lieu du paramètre de table (cela couvre désormais également la partie vide produite par une mutation supprimant toutes les données). #101784 (Onyx2406). - Correction des erreurs
MULTIPLE_EXPRESSIONS_FOR_ALIASlevées par des répliques distantes lors de l’exécution, avec des répliques parallèles etparallel_replicas_local_plan = 0, de requêtes référençant des alias de projections dansPREWHERE/WHERE/HAVING/QUALIFY(par ex.SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) ou de requêtesSELECT *sur des auto-jointures comportant des noms de colonnes en commun. #103806 (groeneai). - Correction d’une partie de correctif corrompue après
ALTER TABLE ... DROP PARTITION ID 'patch-...', suivi deDETACH/ATTACH TABLE. Auparavant, la partie de couverture vide était écrite sanspartition.datnisource_parts.dat, ce qui entraînait l’apparition d’une entréebroken-on-start_patch-...danssystem.detached_partsaprès l’attachement suivant ou le redémarrage du serveur. #104353 (groeneai). - Correction du remplacement silencieux de données par des valeurs par défaut lorsque
ALTER TABLE ... RENAME COLUMNs’exécutait simultanément avecOPTIMIZE TABLE ... FINALou une autre fusion en arrière-plan. #104822 (groeneai). - Correction de deux cas de
LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materializedlevés par des requêtes avecenable_materialized_cte: (1) une CTE matérialisée réutilisée et filtrée parIN (subquery)sur une autre CTE matérialisée, et (2) une CTE matérialisée référencée à la fois directement et dans un filtreWHERE ... IN (...)qui accède à une clé primaire MergeTree via une sous-requête IN imbriquée.EXPLAINsur ces mêmes requêtes était également affecté, car les bogues se déclenchaient lors de l’optimisation du plan. #105041 (novikd). - Avec
skip_cache_on_disk_failure = 1, les requêtes se poursuivent désormais lorsqueFileCachene parvient pas à créer un répertoire de cache sur disque. L’échec est journalisé au lieu de faire échouer la requête. #105250 (Diskein). - Correction de l’exception d’erreur logique
Mutation of Memory table produced incomplete outputlevée parALTER TABLE <memory_table> APPLY PATCHESetALTER TABLE <memory_table> APPLY DELETED MASK. Les tablesMemoryne possèdent pas de parties de correctif ni de masques de suppression ; les deux commandes sont donc désormais correctement traitées comme des opérations sans effet. #105286 (groeneai). - Correction de
CANNOT_CONVERT_TYPEpourMergesurMergesurDistributedavecdistributed_group_by_no_merge=1. #105330 (azat). - Correction de
singleValueOrNullMerge, qui renvoyait une valeur concrète au lieu deNULLlors de la fusion d’un état ayant déjà observé plusieurs valeurs distinctes. #105734 (fallintoplace). - Corrige un plantage dans la fonction de table
mongodb, le stockage MongoDB et la source de dictionnaire MongoDB lorsque le nom de la collection est vide ou contient des octets NUL. #105776 (Algunenano). - Corrige le rejet de
ALTER TABLE ... CLEAR COLUMNpour les colonnescolumns_to_sumexplicitement définies deSummingMergeTreeetCoalescingMergeTree. #105785 (antonio2368). - Corrige les erreurs
UNKNOWN_DATABASElors de la création d’une vue paramétrée dont le nom de la base de données est fourni par un paramètre de requête. #105799 (groeneai). - Rétablit l’optimisation de lecture dans l’ordre pour les tables
Mergelors de l’utilisation de l’analyseur. #105867 (KochetovNicolai). - Corrige les mutations
UPDATEetDELETEsur les tables Iceberg accessibles via un catalogue, y compris les mises à jour et suppressions répétées qui ne correspondent à aucune ligne. #106111 (scanhex12). - Corrige le fait que
optimize_skip_unused_shardsne s’appliquait pas (et que force_optimize_skip_unused_shards échouait à tort) lorsqu’une tableDistributedest interrogée via une tableMergeou la fonction de tablemerge, avec le prédicat appliqué au niveau supérieur. #106250 (KochetovNicolai). - Corrige une erreur logique
Column identifier ... is already registeredlorsqu’un prédicat de mutation (DELETE/UPDATE) contient une sous-requêteIN/EXISTSqui lit une expression de table par défaut imbriquée dans une autre sous-requête. #106414 (alexey-milovidov). - Corrige des résultats parfois incorrects pour les requêtes
ORDER BY ... DESClors de la lecture en ordre inverse de parties larges avecread_in_order_use_virtual_row_per_block = 1et une faible valeur demax_block_size. #106429 (vdimir). - Corrige une exception
Bad cast exceptionpour les dictionnaires Redis utilisantSTORAGE_TYPE 'simple'avec une dispositioncache/directet une clé complexe constituée d’une seule chaîne ; ces dictionnaires fonctionnent désormais, et les clés composites avec le stockagesimplesignalent une erreur explicite. #106501 (vdimir). - Corrige l’exception
Mutation of Memory table produced incomplete outputlevée par les commandesALTER TABLE <memory_table>n’ayant aucun effet sur les données ligne par ligne d’un moteurMemory, notammentAPPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTIONetREWRITE PARTS. Les tablesMemoryne possèdent pas ces structures ; ces commandes sont donc désormais traitées comme des opérations sans effet. #106621 (groeneai). - Corrige l’échec du démarrage du serveur avec
Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)lorsqu’une tableMergeTreecomporte une partie d’index de saut avec zéro granule et un fichier de marques non vide sur le disque. #106675 (groeneai). - Corrige le cas où les répliques parallèles n’étaient pas appliquées à une vue avec UNION en raison d’une table vide dans l’UNION. #106900 (devcrafter).
- Corrige une exception d’erreur logique
conflicted_part_name.has_value()pouvant survenir lors d’un insert synchrone dans une tableReplicatedMergeTreelorsque le bloc inséré était entièrement dédupliqué et que le nœud de déduplication de la part en conflit avait déjà été supprimé (par exemple par unDROP PARTITIONconcurrent). #107026 (groeneai). - Corrige la rare
LOGICAL_ERROR“Tentative de libérer un contexte de requête inexistant” et le crash du serveur associé lors de la lecture de tablesMergeTreevia un disque de cache du système de fichiers créé avecenable_filesystem_query_cache_limit = 1. #107028 (groeneai). - Corrige un crash du serveur lors du déplacement d’une part vide vers un disque
plain_rewritable(par exemple avecALTER TABLE ... MOVE PARTITION ... TO DISKpour une part vide conservée avecremove_empty_parts = 0). #107040 (groeneai). - Corrige une exception
Logical error: Too large size passed to allocatorlors d’unINSERTdans une tableMergeTreelorsqueadaptive_write_buffer_initial_sizeest défini sur une valeur extrêmement élevée. La taille initiale du tampon d’écriture adaptatif est désormais plafonnée à la taille maximale du tampon. #107104 (groeneai). - Corrige les lots
ALTER TABLE ... ON CLUSTERmélangeantMODIFY SETTING/RESET SETTINGet une modification de commentaire (par exempleMODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123), qui n’étaient appliqués que sur la réplique leader, laissant les autres répliques désynchronisées. Corrige également unMODIFY COLUMN ... COMMENTpositionnel ou avecSETTINGSpar colonne, qui était à tort considéré comme une modification locale des métadonnées limitée au commentaire, excluant ainsi le réordonnancement des colonnes des métadonnées répliquées et pouvant provoquerINCOMPATIBLE_COLUMNSau redémarrage d’une réplique. #107142 (groeneai). - Corrige l’erreur
Argument ... of GROUPING function is not a part of GROUP BY clausepour les requêtes utilisant la fonctiongroupingavec le paramètregroup_by_use_nullsactivé. #107206 (KochetovNicolai). - Corrige les requêtes
UPDATElégères avec les anciennes répliques parallèles activées sur des tablesMergeTreenon répliquées. #107246 (groeneai). - Corrige une possible exception d’erreur logique dans SYSTEM SYNC DATABASE REPLICA … STRICT et garantit que le modificateur STRICT prend réellement effet pour les répliques de base de données. #107344 (PedroTadim).
- Corrige
Logical error: 'Duplicate announcement received for replica number N', qui pouvait survenir avec des répliques parallèles lorsqu’une sous-requête scalaire contenait des sous-requêtes imbriquées lisant la même table. #107381 (groeneai). - Corrige une perte silencieuse de données sur
MergeTreesimple (non répliqué) lorsqueREPLACE PARTITION,MOVE PARTITION,DETACH PARTITIONouDETACH PARTest exécuté sur une partition comportant encore des correctifsUPDATElégers non appliqués. Ces opérations rejettent désormais la commande (comme le fait déjàReplicatedMergeTree) et indiquent d’utiliserALTER TABLE ... APPLY PATCHES, au lieu d’annuler silencieusement la mise à jour validée. #107386 (groeneai). - Corrige l’arrêt silencieux de la réplication des modifications par
MaterializedPostgreSQLlorsque le nom de la base de données ou de la table PostgreSQL contient des lettres majuscules (le consommateurpgoutputdemandait un nom de publication non entre guillemets et en minuscules, qui ne correspondait pas à la publication préservant la casse). #107423 (alexey-milovidov). - Corrige l’erreur
THERE_IS_NO_COLUMNlorsqueoptimize_if_transform_strings_to_enum = 1et que l’expression optimiséeif/transformappliquée à des littéraux de chaînes est une clé deGROUP BYouORDER BYsur une table Distributed ou des répliques parallèles. #107455 (groeneai). - Corrige le fait que
SELECT ... FINALetOPTIMIZE TABLE ... FINALrenvoyaient des lignes dupliquées après l’adoption, parCREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROMouMOVE PARTITION ... TO TABLE, de parts issues d’uneMergeTreesimple dans uneReplacingMergeTree,SummingMergeTreeouAggregatingMergeTree. Le niveau de fusion de la part adoptée est désormais réinitialisé à 0 lorsque les moteurs source et de destination diffèrent, afin qu’elle soit dédupliquée lors de la fusion suivante. #107481 (groeneai). - Le suivi de l’annulation des requêtes est désormais amélioré lors de l’attente du quorum dans ReplicatedMergeTree. #107513 (nickitat).
- Prend désormais en compte, dans le memory tracker, la mémoire utilisée par la bibliothèque rapidjson (dans
prettyPrintJSON,JSONMergePatchet l’analyseur JSON de rapidjson), afin que les entrées pathologiques soient rejetées avecMEMORY_LIMIT_EXCEEDEDau lieu d’entraîner des allocations sans limite. #107555 (Algunenano). - Corrige une
Logical error: Stream ... variant_discr ... is not foundpouvant se produire lors de la fusion ou de la lecture d’une partMergeTreeproduite par la mutation d’une table comportant une colonneDynamic. #107562 (alexey-milovidov). - Corrige une
LOGICAL_ERROR(updateFormatPrewhereInfo called more than once) levée lors de l’interrogation d’une sourcefile(),url()ou de stockage d’objets avec unPREWHEREexplicite et unWHERE, lorsqueoptimize_prewhere_after_pushdownétait activé. #107568 (groeneai). - Corrige une exception du serveur (erreur logique
Digest does not match) pouvant survenir avecRENAME TABLE,RENAME DATABASEouCREATE OR REPLACE TABLEimpliquant une tableTimeSeriesdans une base de donnéesReplicated. Le renommage d’une tableTimeSeriesest désormais pris en charge. #107583 (groeneai). - Corrige
DROP TABLEsur une tableTimeSeriesdans une base de donnéesReplicated, qui laissait auparavant les tables internes et faisait réessayer indéfiniment la tâche de suppression en arrière-plan (DROP TABLE ... SYNCse bloquait). #107604 (groeneai). - Corrige deux vulnérabilités de traversée de répertoires dans le protocole de récupération des parts répliquées, qui pouvaient permettre à une réplique malveillante d’écrire des fichiers en dehors du répertoire de la part. #107606 (antonio2368).
- Corrige
ALTER TABLE ... REPLACE PARTITIONsur une tableMergeTreesimple, qui faisait réapparaître les parts remplacées après un redémarrage du serveur, entraînant le renvoi par la table à la fois des lignes de remplacement et des anciennes lignes remplacées. #107623 (groeneai). - Corrige une
LOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) lors de l’insertion dans une vue matérialisée dont la table cibleTOdéclare une colonne avec unEnumplus large que celui produit par leSELECTde la vue. L’élargissement valide de l’Enumest désormais appliqué lors de l’insertion dans la vue matérialisée, comme pour unINSERT ... SELECTdirect. #107648 (groeneai). - Correction de l’erreur
NUMBER_OF_COLUMNS_DOESNT_MATCHlors de l’interrogation d’une tableDistributed(ou de l’utilisation de répliques parallèles) comportant plusieurs colonnesALIASqui se développent en une même expression et sont référencées avecORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy). - Une erreur transitoire lors de l’actualisation des parties de données d’une table en lecture seule n’interrompt plus définitivement la tâche d’actualisation en arrière-plan. #108034 (alexey-milovidov).
index_granularity_bytesest désormais respecté pour les colonnes contenant des étatsAggregateFunction. Auparavant, la limite de taille des granules en octets était ignorée pour ces colonnes (par exemple, les étatsuniqExactdans les tablesAggregatingMergeTreeet les projections d’agrégation), ce qui produisait des granules bien plus grands que la limite configurée et augmentait l’amplification des lectures ainsi que la mémoire utilisée lors des requêtes. #108297 (groeneai).- Correction de
insert_quorum = 'auto', qui ne rejetait pas immédiatement les insertions lorsque moins de la majorité des répliques étaient actives. Ces insertions échouent désormais immédiatement avecTOO_FEW_LIVE_REPLICASau lieu d’écrire une partie locale, puis d’expirer avecUNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey). - Correction d’un plantage du serveur lors d’une insertion asynchrone avec déduplication lorsque
optimize_on_insertvide le bloc inséré (par exemple, des lignes dont la somme est nulle dansSummingMergeTree). #109229 (Diskein). - Correction de la perte de données d’une colonne sans expression par défaut lorsqu’une fusion s’exécute simultanément avec
ALTER TABLE ... RENAME COLUMN, ou lorsque les seules valeurs de la colonne proviennent d’unUPDATEléger. La colonne pouvait être supprimée de la partie fusionnée, de sorte que toutes ses valeurs étaient lues comme NULL. #109356 (groeneai). - Correction d’un arrêt rare du serveur lors de la fusion en parallèle d’états d’agrégat
uniqExactavecGROUPING SETS,ROLLUPouCUBE. #109389 (groeneai). - Correction des fusions de rollup qui étaient replanifiées indéfiniment. #109410 (Michicosun).
- Correction des mutations
GROUP BYpour les tables dotées de colonnes virtuelles matérialisées ou persistantes. #109532 (Michicosun). - Correction de l’erreur
UNKNOWN_IDENTIFIER: Missing columns: '_block_offset'lors de l’exécution deALTER TABLE ... MATERIALIZE INDEXsur l’index minmax implicite créé paradd_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_columnpour une table comportant des parties fraîchement insérées (niveau 0). L’index est désormais créé pour ces parties au lieu de provoquer un échec. #110236 (groeneai). - Correction d’une réplique de stockage d’objets en lecture seule (un disque configuré avec
read_only = true) qui ne détectait pas les nouvelles parties viarefresh_parts_interval, ainsi que detable_disk = true, qui était rejeté sur un tel disque avec “table_disk is not supported for non-ObjectStorage disks”. #110460 (jkartseva). - Correction d’une LOGICAL_ERROR (“No set is registered for key”) dans les mutations ALTER TABLE … DROP COLUMN, ALTER TABLE … DELETE/UPDATE et DELETE léger, sur les tables comportant une colonne ALIAS dont l’expression utilise l’opérateur IN, y compris via une autre colonne ALIAS. #111039 (PedroTadim).
- Corrige les cas où une politique de lignes n’était pas appliquée aux projections MergeTree lors de l’exécution des requêtes. #112329 (yariks5s).
- Corrige l’erreur logique
ReadBufferFromEncryptedFile: Wrong file positionlors de la lecture d’une partieCompactdepuis un disqueencryptedavec des E/S directes, qui bloquait les fusions danssystem.replication_queue. #112943 (alexey-milovidov). - Corrige la lecture de la base de données interne
_temporary_and_external_tablesvia la fonction de tablemergeet le moteur de tableMerge, qui permettait à une session de lire les tables temporaires d’autres sessions et d’autres utilisateurs, et provoquait une exception lors de l’utilisation de l’ancien analyseur. Une expression régulière de base de données exclut désormais cette base, et la nommer explicitement est refusé, tout comme l’accès direct à celle-ci. #113224 (alexey-milovidov). - Corrige le fait qu’une politique de lignes contenant une sous-requête scalaire n’était évaluée qu’une seule fois, puis réutilisée indéfiniment après lecture de la table via une table
Merge. La condition de politique analysée est mise en cache et partagée par toutes les requêtes, et sa lecture viaMergeréécrivait l’expression en cache sur place, ce qui provoquait également une course de données entre des requêtes concurrentes utilisant la même politique. #113563 (alexey-milovidov). - Corrige les erreurs
CANNOT_CONVERT_TYPElors de la lecture d’une tableMergecontenant une tableDistributedavec des répliques parallèles utilisant une clé personnalisée. #113742 (alexey-milovidov). - Corrige l’erreur
Logical error: No set is registered for key ...lors de la lecture via une tableMergedont une table enfant déclare une colonneALIAScontenantINet dont les tables enfants n’ont pas la même valeur par défaut pour cette colonne. #113757 (groeneai). - Corrige un contournement de politique de lignes où la fonction de table mergeTreeIndex exposait les valeurs de la clé primaire et de l’index minmax des lignes masquées par une politique de lignes SELECT sur la table source ; la lecture de mergeTreeIndex pour une table dotée d’une politique de lignes est désormais refusée. #115304 (yariks5s).
Correctifs liés aux types de données et à la sérialisation
- Correction d’une exception dans
ARRAY JOINlors de l’utilisation de types numériquesLowCardinality. #91784 (Ergus). - Correction de la création silencieuse de colonnes
NOT NULLen tant queNullablelorsquedata_type_default_nullable = 1et que la table est créée dans une base de donnéesReplicatedou viaON CLUSTER. #97572 (xiaohuanlin). - Correction d’un nombre de lignes incorrect renvoyé par une requête sur une
MaterializedViewavecquery_plan_enable_optimizations = 0lorsque la vue associe une colonneintegerà une colonneBool. #100692 (Maximus5). - Correction de métadonnées de parties incohérentes après des mutations de colonnes utilisant des sérialisations non par défaut. #102817 (korowa).
- Correction de la propagation de
NULLlors de la lecture de sous-colonnes extraites de colonnesNullable(Tuple(...)). Par exemple, pourtup Nullable(Tuple(s Nullable(String))),SELECT tup.srenvoie désormais correctementNULLdans les lignes où le tuple externe estNULL, au lieu de valeurs indésirables. Cela couvre tous les types d’éléments pouvant représenterNULL:Nullable,Dynamic,VariantetLowCardinality(Nullable(...)). #102942 (nihalzp). - Correction de
recursiveRemoveLowCardinality, qui supprimait les noms personnalisés de types géométriques (par ex.LineStringau lieu deRing,MultiLineStringau lieu dePolygon), entraînant une mauvaise interprétation du type géométrique. #103041 (jh0x). - Correction de
dictGetOrNull, qui écrasait silencieusement d’autres colonnes de la projectionSELECTparNULLlorsqu’il était appelé avec une colonne cléNullabledont les valeurs sont absentes du dictionnaire. La fonction modifiait sur place une map de valeurs nulles aliasée en entrée ; elle effectue désormais une copie profonde de la colonne de résultat avant de la modifier. #104327 (groeneai). - Correction d’une exception pour des requêtes distribuées contenant un tuple
INvide sur la clé de partitionnement lorsqueoptimize_skip_unused_shards_rewrite_inest activé. #104966 (alexey-milovidov). - Correction de l’estimation de la sélectivité
PREWHEREdes statistiques count-min pour les colonnesFloat32, y compris lors de comparaisons avec des littérauxFloat64. #105047 (hanfei1991). - Correction de
ILLEGAL_TYPE_OF_ARGUMENTlors de la fusion des états d’agrégatquantileExactWeightedInterpolated,quantileDDouquantilePrometheusHistogramavec leurs équivalents au plurielquantilesXxxMerge(et inversement). Les variantes au singulier et au pluriel de ces trois familles de quantiles partagent le même état d’agrégat interne, mais n’étaient pas répertoriées dans la table interne de mappage des noms ; la fusion d’états entre fonctions — ainsi que l’optimisation de fusion de fonctions pour ces familles — était donc rejetée. #105189 (groeneai). - Correction des résultats incorrects de
toStartOfWeek,toLastDayOfWeek,toMonday,toStartOfMonth,toLastDayOfMonth,toStartOfQuarterettoStartOfYearpour les argumentsDate32etDateTime64dont le résultat se situe hors de la plageDate: au lieu de déborder sur des dates arbitraires, les résultats antérieurs au1970-01-01sont désormais bornés à1970-01-01et ceux postérieurs au2149-06-06à2149-06-06. Corrige également les résultats de requête erronés (parties et granules incorrectement élagués) lorsque ces fonctions étaient utilisées dansWHEREsur une cléDate32ouDateTime64contenant des valeurs hors plage. #105244 (yariks5s). - Correction d’une erreur logique dans
arrayRemovelorsque le premier argument est un tableau deVariantdont toutes les alternatives sont incompatibles avec le type du second argument et quevariant_throw_on_type_mismatchest désactivé. La fonction considère désormais la comparaison comme “jamais égale” et renvoie le tableau inchangé au lieu de provoquer un échec deassertTypeEqualitycôté serveur. #105248 (groeneai). - Correction de
toFloat64/toUInt32/toString/etc. surDynamic, qui ignoraientcast_keep_nullable. #105467 (Avogar). - Correction d’un segfault du serveur dans
uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(et des chaînes de combinators similaires suruniq) lorsqu’ils sont utilisés avecGROUP BY ... WITH ROLLUP,WITH CUBEouWITH TOTALSet un argument Nullable. #105470 (groeneai). - Correction de
toStartOfMillisecondettoStartOfMicrosecond, qui renvoyaient un résultat décalé de presque une seconde pour des valeursDateTime64négatives (antérieures à l’époque Unix), ainsi que d’un dépassement d’entier signé détecté parUndefinedBehaviorSanitizerdanstoStartOfSecond,toStartOfMillisecondettoStartOfMicrosecondpour des entréesDateTime64proches deINT64_MIN. #105482 (groeneai). - Correction d’un arrêt du serveur lors de la désérialisation d’états
singleValueOrNullpourJSON. #105535 (Avogar). - Correction de la prise en compte de
input_format_try_infer_datetimeslors de l’insertion dans des données partagées en JSON. #105544 (Avogar). - Correction du bouclage de
DateTimepour les valeurs hors plage dansJSONExtractet lors des désérialisations de texte. #105551 (Avogar). - Correction d’un plantage lors de l’insertion de tuples de tailles différentes, dans la même clause VALUES, dans une colonne String. #105582 (Avogar).
- Correction de l’erreur NOT_IMPLEMENTED dans
toStringà partir d’unDateTimeavec un fuseau horaire contenant une valeur NULL. #105587 (yariks5s). - Ajout d’une validation des colonnes
Dynamicaplaties mal formées en entrée Native. #105666 (Avogar). - Correction d’une
LOGICAL_ERROR(Unexpected return type from if) levée lors de la planification d’une requête pour les expressionsifdont le type de résultat estVariantet dont la deuxième ou la troisième branche est unifà condition constante appliqué à un littéralUInt64pouvant tenir dansInt64. #105680 (groeneai). - Correction de l’erreur
Bad get: has Decimal32, requested Decimal128avecsumMapetsumMapWithOverflowsur une colonneNested(... Nullable(Decimal(P, S)))lorsque l’état d’agrégation est sérialisé (p. ex. répliques parallèles,sumMapStatevia un formateur d’état binaire, agrégation externe). #105816 (groeneai). - Correction des erreurs
Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinalitylorsqueapply_mutations_on_fly = 1est utilisé sur une table comportant des mutationsUPDATE/DELETEà la volée en attente, mises en file avant une mutationALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano). - Correction de l’erreur
Cannot find columnpour les requêtes distribuées avec un filtreIN Array(...)dans le nouvel analyseur. #105894 (KochetovNicolai). - Correction d’un arrêt du serveur lorsqu’une colonne avec
STATISTICSétait modifiée enNullablealors qu’un autreALTERla supprimait simultanément. #105917 (groeneai). - Rejet des octets
IntervalKindhors plage lors du décodage des typesRowBinaryWithNamesAndTypes(input_format_binary_decode_types_in_binary_format = 1) avec une erreurINCORRECT_DATAexplicite, au lieu de construire unDataTypeIntervalavec un type invalide susceptible d’entraîner ultérieurement un comportement indéfini dans les chemins de hachage. #106261 (groeneai). - Lecture de la sous-colonne ‘null’ comme chemin JSON dans Nullable(JSON), au lieu du null-map. #106295 (Avogar).
- Correction d’une lecture hors limites dans
sipHash64Keyed,sipHash128KeyedetsipHash128ReferenceKeyedlors du hachage d’une colonne dont tous les tableaux sont vides et dont la clé n’est pas constante. #106355 (Algunenano). - Correction d’un bogue empêchant l’utilisation de sous-requêtes scalaires dans le premier argument de
INlorsque le second argument est un tuple non constant. #106610 (yariks5s). - Correction de l’ignorance de
session_timezonelors de la sérialisation de colonnesLowCardinality(DateTime)dans des formats textuels (CSV, TSV, JSONEachRow, etc.). Auparavant, après la première écriture d’une colonneLowCardinality(DateTime)sur un serveur, chaque requête ultérieure écrivant une telle colonne affichait la chaîne correspondant à l’heure locale dans le premier fuseau horaire rencontré, indépendamment desession_timezone. #106634 (groeneai). - Correction d’un arrêt du serveur dans
ifetmultiIflorsque la condition est une valeur constanteNullable(Nothing). #106678 (groeneai). - Annulation d’un changement qui faisait rejeter par
sumMap/ le combinateur-Maples types numériques de valeurs portant un nom personnalisé (tels queSimpleAggregateFunction(sum, T)etBool) avecILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, ce qui empêchait des agrégations auparavant fonctionnelles. #106729 (fm4v). - Correction d’une exception
Bad castlors de l’élagage de parties à l’aide des statistiquesMinMaxlorsqu’une colonne clé estLowCardinalityet que la constante du prédicat estLowCardinality(Nullable(...)). #106793 (groeneai). - Corrige une erreur logique dans
parseDateTimeavec des octets d’entrée non ASCII. #106856 (Avogar). - Corrige l’exception
THERE_IS_NO_COLUMNpour les requêtes distribuées impliquant l’optimisationoptimize_rewrite_aggregate_function_with_iflorsque l’argument de la fonction d’agrégation nécessite une conversion vers le type Nullable. #106908 (yakov-olkhovskiy). - Corrige un dépassement d’entier signé (comportement indéfini) dans
arrayLevenshteinDistanceWeightedetarraySimilaritylorsque les tableaux de poids contiennent de grandes valeurs entières. La distance pondérée est désormais accumulée dans un entier de plus grande taille pour les poids entiers, afin que les grandes valeurs de poids ne provoquent plus de dépassement et restent exactes. #106934 (groeneai). - Corrige un plantage (
Source column is not Map/SIGSEGV) lors de la fusion de blocs triés contenant une colonneVariantavec une varianteMapdont l’ordre de stockage local diffère de l’ordre global. #107011 (groeneai). - Corrige l’erreur
TYPE_MISMATCH(“Cannot convert string … to type …”) pour les requêtesORDER BY <numeric column> ... LIMIT nlorsque la matérialisation paresseuse plaçait une autre colonne avant la colonne de tri. Le seuil top-K est désormais lu dans la bonne colonne de tri. #107060 (groeneai). - Corrige une instruction composée
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO aqui réutilise un nom de colonne libéré (un “échange”) entre des colonnes de types différents. La partie matérialisée enregistrait le mauvais type de colonne, de sorte qu’unSELECTultérieur échouait avecConversion between numeric types and IPv6 is not supported(ou s’arrêtait lors du chargement de la partie dans les builds de débogage). #107064 (groeneai). - Corrige les résultats non déterministes de la fonction
roundDownlorsque le tableau de limites contientNaN. Une même valeur d’entrée pouvait renvoyer une limite finie ouNaNselon les lignes environnantes d’un lot. Les limitesNaNsont désormais ignorées, de sorte que le résultat ne dépend que des limites finies. #107065 (groeneai). - Corrige le fait que
quantileTDigestetquantileTDigestWeightedlèventDECIMAL_OVERFLOWpour des argumentsDateetDateTimelorsque le quantile interpolé est fractionnaire mais reste dans la plage (par exemple,quantileTDigestWeighted(date, weight)sur des valeurs toutes représentables par le type). Le résultat fractionnaire est désormais tronqué au type de résultat, comme dansquantilesTDigestWeighted; les valeurs réellement hors plage lèvent toujours une erreur. #107066 (groeneai). - Corrige la troncature silencieuse de valeurs entières hors plage dans les définitions de type
Enum8/Enum16.Enum8('a' = 200)lève désormaisARGUMENT_OUT_OF_BOUNDau lieu de créer silencieusementEnum8('a' = -56). #107081 (groeneai). - Corrige un ordre de lignes incorrect (ainsi qu’une
LOGICAL_ERROR“Rows are not sorted with permutation” dans les builds de débogage) pour les requêtesORDER BY ... LIMITà plusieurs colonnes qui trient selon des colonnesNullablelorsque plusieurs lignes sont ex æquo sur les premières colonnes. #107094 (groeneai). - Correction de
Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple'lors de la lecture d’une colonneArray(Tuple(...))dont la valeur est définie sur les valeurs par défaut, par exemple aprèsALTER TABLE ... ADD COLUMNou après une mutationALTER TABLE ... CLEAR COLUMNinachevée appliquée à la volée. #107232 (groeneai). - Rejet, lors de l’exécution de
CREATE TABLE, des utilisations non prises en charge de colonnesAggregateFunctiondans les expressions TTL (par exempleTTL toDateTime(state)), au lieu d’échouer ultérieurement, pendant l’exécution de la TTL, avecILLEGAL_TYPE_OF_ARGUMENT. Cela couvre également les états contenus dans des alternativesVariantet des valeursDynamic. Les consommateurs valides tenant compte des états, tels quefinalizeAggregation, restent acceptés. #107366 (Ria-K912). - Correction de
arrayResizeavec un argument de tailleDecimal: la taille est désormais interprétée selon sa valeur réelle (par exemple,arrayResize([1, 2, 3], 1.5::Decimal(2, 1))renvoie un élément) plutôt que selon sa représentation brute non mise à l’échelle. #107389 (alexey-milovidov). - Correction de
LOGICAL_ERROR: Unexpected return type from materialize(et d’erreurs similaires d’incompatibilité de types) lorsqueapply_mutations_on_fly = 1est utilisé sur une table avec unUPDATEà la volée en attente, dont la colonne cible est également lue comme entrée de fonction par unUPDATEà la volée antérieur, avant une mutationALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai). - Correction de la conversion silencieuse de valeurs NULL en chaînes vides lors de l’insertion de données Arrow/ORC dans une colonne LowCardinality(Nullable(…)). Il s’agissait d’une régression introduite dans la version 26.5. #107532 (Ergus).
- Correction d’une
LOGICAL_ERROR(“Input nodes size mismatch in dag”) lorsqu’une requête avecmake_distributed_plan = 1effectue une jointure sur une clé encapsulée dans une fonction, dont les deux côtés n’ont pas de type commun (par exempleON intDiv(-1, t1.key) = t2.keyavec une clé de droiteUInt64). #107701 (groeneai). - Correction de la déduplication des insertions, qui calculait des hachages incorrects pour les colonnes
StringetArrayavec le paramètre serveurinsert_deduplication_version = new_unified_hash: des insertions identiques pouvaient ne pas être dédupliquées, car le hachage de déduplication dépendait de la position de la ligne dans le bloc inséré. #107915 (CheSema). - Correction d’un arrêt du serveur dans
haslors d’une recherche dans unMapavec des clésDynamicà l’aide d’un argumentLowCardinality. #107956 (groeneai). - Correction d’une régression de performances pour les sous-colonnes
Maputilisées avecPREWHERE. #107988 (Avogar). - Correction d’une erreur logique lors de la conversion d’une colonne
DynamicouVariantimbriquée dans unTuplevers un type d’élément nonNullableavecaccurateCastOrNullouaccurateCastOrDefault. #108061 (alexey-milovidov). - Correction d’une exception d’erreur logique
Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>lorsqu’une requêteLIKElit un indextextvia le chemin de repli de lecture directe sur une colonne stockée de manière sparse. #108068 (groeneai). - Corrige une
LOGICAL_ERROR(“Unexpected return type from if”) lors de la lecture d’une colonne avecapply_mutations_on_fly = 1, après unALTER UPDATE col = ... WHERE <cond>dont la condition est non constante ou fausse, suivi d’unALTER MODIFY COLUMN col <new type>. #108128 (groeneai). - Corrige un
signed integer overflow(comportement indéfini) dansdateDiffavec les unitéshouretminutepour des valeursDateTime64extrêmes proches des limites de la plageInt64. #108229 (groeneai). - Corrige une exception du serveur (
Logical errordansIColumn::insertFrom) lors de la conversion d’unArray(Dynamic)ou d’unArray(Variant)enQBitavecaccurateCastOrNull, par exempleaccurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai). - Corrige
parseDateTimeBestEffortavec un fuseau horaire, qui levait CANNOT_PARSE_DATETIME pour les lignes NULL de toString(Nullable(DateTime64)). #108310 (yariks5s). - Corrige un plantage du serveur (dépassement de pile) provoqué par des expressions profondément imbriquées telles que
[[[ ... ]]]ouarray(array( ... ))lorsquemax_parser_depthest défini sur une valeur élevée. #108493 (Algunenano). - Corrige une projection
SELECT *qui renvoyait la valeur par défaut du type d’une colonne (par ex.0) au lieu de sa valeurDEFAULT(par ex.-1) lors de la lecture d’une colonne ajoutée avecALTER TABLE ... ADD COLUMN ... DEFAULTaprès la création de la projection. Les lectures depuis la table de base étaient déjà correctes ; seules celles servies par la projection étaient affectées, jusqu’à sa reconstruction. #108569 (tiandiwonder). - Corrige la désactivation silencieuse de l’élagage des partitions et des clés primaires lorsqu’une colonne de clé
LowCardinality(FixedString)(ouLowCardinality(Nullable(FixedString))) était encapsulée dans une fonction de clé, par exemplePARTITION BY sipHash64(k) % NavecWHERE k = 'literal'. Ces requêtes analysaient toutes les partitions au lieu de les élaguer. #108777 (groeneai). - Préserve l’ordre d’origine des clés dans la sérialisation Map par compartiments afin de corriger les opérations de comparaison qui en dépendent. #109178 (Avogar).
- Corrige l’inférence de schéma pour les formats
Arrow,ArrowStream,Avroet les lecteurs héritésORCetParquet, qui renvoyaitNullable(Tuple)pour les colonnes struct nullables alors que le typeNullable(Tuple)n’est pas autorisé (allow_experimental_nullable_tuple_typeest désactivé).DESCRIBErenvoyait un type refusé parCREATE TABLE, de sorte que la création d’une table ou l’insertion de données à l’aide du schéma inféré échouait avec l’erreurNullable Tuple type is not allowed. #109185 (nihalzp). - Corrige un bug où les valeurs
DEFAULTdes colonnes n’étaient pas appliquées pourINSERT INTO TABLE FUNCTION(par exempleremote(...)oufile(...)) avec des donnéesVALUESintégrées lorsque le serveur analysait lui-même ces données (send_table_structure_on_insert_with_inline_data = 0). UnNULLexplicite inséré dans une colonne non-Nullableavec unDEFAULTdevenait0au lieu de la valeur par défaut déclarée. Le comportement est désormais identique à celui d’unINSERTdans une table classique et du protocole HTTP. #109258 (groeneai). - Correction d’un segfault dans
groupArrayLastMerge. La désérialisation de l’état d’une fonction d’agrégation est désormais validée. Un état corrompu ne peut donc plus entraîner d’accès hors limites. #109485 (mstetsyuk). - Correction d’un segfault dans la fonction d’agrégation
largestTriangleThreeBucketsen rejetant les états de fonction d’agrégation corrompus lors de la désérialisation. #109492 (mstetsyuk). - Correction de la lecture d’une colonne Parquet avec un
Tuplenon nullable lorsque le type ClickHouse demandé l’encapsule dansNullable(p. ex.Nullable(Tuple(...))), ce qui échouait auparavant avecTYPE_MISMATCH. #109615 (groeneai). - Le lecteur natif Parquet v3 peut désormais lire une colonne
structphysiquement nullable (un groupe Parquet OPTIONAL) commeNullable(Tuple(...)). Auparavant, cela levaitTYPE_MISMATCH. #109898 (groeneai). - Correction d’un crash du serveur (dépassement de pile natif) lors de la copie ou de la destruction d’un littéral
Array/Tuple/Map/Objectfortement imbriqué, par exemple dans une requête contenant un littéral très profondément imbriqué avec une valeur élevée demax_parser_depth. #110393 (Algunenano). - Correction de résultats erronés pour
IS NULL/IS NOT NULL/count()avecoptimize_functions_to_subcolumnssur une colonne rendueNullablepar unALTER MODIFY COLUMN Tlimité aux métadonnées versNullable(T). Pour les parties écrites avant la conversion, la sous-colonne.nullétait renseignée avec la valeur par défaut du type de stockage (NULL), au lieu d’être dérivée de la colonne parente physiquement présente ; les lignes existantes non nulles étaient donc à tort signalées comme NULL. #110584 (groeneai). - Correction d’une
LOGICAL_ERROR(“Bad cast from ColumnString to ColumnLowCardinality”) lors de l’analyse de l’index de clé primaire lorsqu’une colonne cléLowCardinalityest encapsulée dans une chaîne deCASTimbriqués qui réintroduitLowCardinality, p. ex.WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. Dans les builds de débogage et avec sanitizer, cela provoquait l’arrêt du serveur ; dans les builds de production, la requête échouait. #111050 (groeneai). - Correction de la lecture de données
ArrowetArrowStreamcontenant des colonnesArrayouMapimbriquées vides produites par Apache Arrow Java avant la version 19.0.0 (fourni avec Apache Spark), qui étaient auparavant rejetées avec une erreurINCORRECT_DATAindiquant que le tampon des offsets était trop petit. #111101 (Algunenano). - Correction d’une erreur logique
Block structure mismatch(dans les builds de débogage et avec sanitizer) et d’une erreurIllegal types of argumentspour les opérations ensemblistes sur des colonnes d’états d’agrégation compatibles (p. ex.quantileStateetquantilesState(0.9)) imbriquées dans des colonnes conteneurs telles queTuple,Array,Map,NullableouVariant. #111191 (alexey-milovidov). - Ajout d’une validation des données d’index répliqué corrompues reçues via le protocole natif. #112331 (Avogar).
- Correction d’une lecture hors limites lors de la déduplication des insertions lorsqu’un
INSERTpasse par une vue matérialisée qui modifie le nombre de lignes avant l’écriture dans une table cible partitionnée. #112649 (CheSema). - Correction d’une écriture hors limites lors de la lecture d’une colonne
DECIMALParquetdont le type physique est plus large que celui correspondant à sa précision déclarée, par exempleDECIMAL(9, 2)stocké avec le type physiqueINT64. Ces fichiersParquetsont valides et peuvent être produits par d’autres outils d’écriture, mais le lecteur dimensionnait la colonne de destination à partir de la précision déclarée tandis que le décodeur écrivait sur la largeur physique, ce qui corrompait la mémoire. La lecture d’un tel fichier déclenche désormais aussiDECIMAL_OVERFLOWlorsqu’une valeur ne tient pas dans la précision déclarée, au lieu de renvoyer des données corrompues, et s’effectue sans perte avec une indication de type au moins aussi large que le type physique. #113046 (groeneai). - Correction de l’échec de
ATTACH PARTITION FROM,REPLACE PARTITION,MOVE PARTITION TO TABLEet de l’ajout d’une répliqueReplicatedMergeTree, qui pouvaient échouer avecTables have different ...,METADATA_MISMATCHouINCOMPATIBLE_COLUMNSpour les tables dont les définitions comportaient des parenthèses redondantes, telles quePARTITION BY (a),ORDER BY (b),INDEX ix (b * c) TYPE minmax,PROJECTION p (SELECT (b) ...),CONSTRAINT c CHECK (a > 0),TTL (d + INTERVAL 10 YEAR)ouDEFAULT (a + 1). #114188 (alexey-milovidov). - Correction d’un bogue où une entité d’accès contenant un paramètre de type
Map, tel qu’un profil de paramètres avechttp_response_headersouadditional_table_filters, était stockée dans un format que ClickHouse ne pouvait pas relire, laissant l’entité définitivement impossible à charger après un redémarrage. #114620 (groeneai). - Correction de
has,indexOf,countEqual,mapContainsKey,mapContainsValueet de l’accès par indice àMap, qui renvoyaient “not found” pour une valeur recherchée constanteLowCardinalityégale à la valeur par défaut du type d’élément, telle qu’uneStringvide ou zéro. #114624 (groeneai). - Correction des résultats incorrects de l’optimisation triviale
GROUP BY ... LIMIT(paramètreoptimize_trivial_group_by_limit_query) pour les requêtes avecDISTINCT,QUALIFY, des fonctions fenêtre ouarrayJoindans la projection : ces éléments consomment ou filtrent les groupes après l’agrégation, de sorte que limiter l’agrégation àLIMIT + OFFSETclés pouvait renvoyer trop peu de lignes ou des valeurs incorrectes. L’optimisation ne s’applique plus à ces requêtes. #114695 (alexey-milovidov). - Correction des résultats incorrects pour
SELECT count(arrayJoin(arr))avec la valeur par défautoptimize_trivial_count_query = 1. Le nombre de lignes stocké était renvoyé à la place du nombre d’éléments du tableau, et avecfile()eturl(), la requête renvoyait0. #115227 (groeneai). - Correction de
uniq,uniqExact,uniqHLL12etuniqTheta, qui renvoyaient un résultat incorrect pour un argument encapsulé dans une fonction injective masquant la nullabilité, tel queuniqExact(tuple(x))sur une colonneNullable. L’optimisationoptimize_injective_functions_inside_uniqsupprimait la fonction encapsulante, après quoi les lignes NULL étaient ignorées au lieu d’être comptées. #115466 (vdimir). - Les lecteurs KeeperMap acceptent désormais des métadonnées partagées lorsque des clés primaires équivalentes ne diffèrent que par des parenthèses externes redondantes. #115642 (skuznetsov-clickhouse).
Corrections apportées aux index de texte et aux index d’exclusion
- Corrige l’arrêt du serveur lorsqu’une requête utilise des comparaisons
coalesce/ifNullimbriquées (par ex.WHERE coalesce(a, b, coalesce(c, d), e) = const) sur une tableMergeTreedotée de plusieurs index de sautminmaxet deuse_skip_indexes_for_disjunctions = 1. La réécriture d’index de saut de<op>(coalesce(...), const)est désormais appliquée récursivement aux arguments internes decoalesce, afin que la RPNKeyConditionde chaque index corresponde à la RPN du modèle, comme le suppose déjà le code de suivi des disjonctions. #103929 (groeneai). - Corrige l’erreur
NOT_FOUND_COLUMN_IN_BLOCKlevée parALTER TABLE ... MATERIALIZE INDEXsur des parties créées en version 25.8 et contenant un index de saut sur une colonne ajoutée via unALTER TABLE ... ADD COLUMNdistinct. Lors du recalcul forcé, la mutation lit désormais correctement toutes les colonnes requises par chaque index de saut et projection préexistants dans la partie. #105039 (groeneai). - Corrige une sous-estimation silencieuse dans les requêtes
SELECTlorsqueuse_query_condition_cache = 1(valeur par défaut). Une requête de la formePREWHERE pk_prefix = X WHERE non_pk IN (...)sur une colonne dotée d’un index de saut par filtre de Bloom empoisonnait leQueryConditionCachepour le prédicatpk_prefix = X, si bien qu’une requêteSELECT count() ... WHERE pk_prefix = Xultérieure et valide renvoyait un résultat incorrect, sous-estimé. Toutes les versions 26.x étaient affectées. #105686 (groeneai). - Corrige une exception lorsqu’une requête de recherche vectorielle utilise un index vectoriel ainsi qu’un autre index de saut tel que
minmax, avecuse_skip_indexes_on_data_read = 1. #106473 (shankar-iyer). - Corrige l’erreur « Too many marks » pour un index de texte sur une partie fusionnée vide. #106867 (azat).
- Corrige des résultats erronés lors de l’interrogation d’une table
ReplacingMergeTreeavecFINALet un filtre sur un index de texte lorsquequery_plan_optimize_lazy_finalétait activé. L’optimisationFINALdifférée générait des étapes de lecture qui ne reproduisaient pas la lecture directe depuis l’index de texte, de sorte que le filtre supprimait toutes les lignes correspondantes. #106894 (Ergus). - Corrige
LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) lorsqu’une constanteVariantcontenant un membreLowCardinalityest comparée à une colonne clé dont l’expression de clé est une fonction déterministe non monotone (par exemple, un index de sautminmaxsursipHash64(col)). #107111 (groeneai). - Corrige des résultats erronés, souvent vides, avec
ORDER BY <col> LIMIT nlorsque l’optimisationuse_skip_indexes_for_top_kest active et qu’une partie dotée d’un index de sautminmaxsur la colonne de tri contient des lignes supprimées par unDELETEléger. L’optimisation ne classe plus le minmax obsolète des parties affectées par des suppressions légères avant les parties contenant les premières lignes encore actives. #107320 (groeneai). - Corrige l’index de saut
set, qui n’élaguait pas les granules des colonnesLowCardinality. #107868 (thevar1able). - Le paramètre
use_skip_indexes_on_data_readpeut désormais être rétabli à sa valeur par défaut antérieure à la version 26.1 (false) via le paramètrecompatibility, offrant une solution de repli en cas de régression de performances où le chemin de lecture des données empêche l’élagage des plages de marques par les index de sautminmax/set/bloom_filter. #108330 (egor-click). - Correction de la lecture directe à partir de plusieurs index de texte partiellement matérialisés. #108607 (CurtizJ).
- Correction d’un index de texte défini sur
mapValues(map)oumapKeys(map)qui n’était pas utilisé silencieusement lorsqu’une table était interrogée via une table du moteurDistributedavec l’analyseur. L’index était utilisé pour la table locale et viacluster()/remote(), mais une requête passant par une table du moteurDistributedl’ignorait (et échouait avecINDEX_NOT_USEDsousforce_data_skipping_indices). #109188 (groeneai). - Correction d’un plantage du serveur avec
CREATE HYPOTHETICAL INDEX ... TYPE set(ainsi quengrambf_v1/tokenbf_v1) lorsque l’argument d’index requis est omis. Ces instructions sont désormais rejetées avec un message d’erreur explicite. #109294 (groeneai). - Correction de résultats incorrects pour les fonctions
has,mapContainsKeyetmapContainsValueavec un motif vide lorsqu’un index de texte est présent. #110246 (rschu1ze). - Correction de l’erreur
ATTEMPT_TO_READ_AFTER_EOFlors de la fusion de parties dotées d’un index de texte si l’une des parties fusionnées était vide, par exemple après une mutation ayant supprimé toutes ses lignes. #112490 (CurtizJ). - Correction d’un blocage de l’optimisation du plan de requête lorsqu’une clause
WHEREcontient une longue constante de chaîne comportant de nombreux points et que la table possède un index de sautbloom_filter,tokenbf_v1,ngrambf_v1outext. La comparaison d’un nom de colonne de filtre avec les colonnes d’indexJSONAllPaths(...)énumérait toutes les divisions du nom sur les points, ce qui rendait quadratique, par rapport à la longueur de la constante, la construction des conditions d’index de saut. #113289 (groeneai). - Correction de
ORDER BY ... LIMIT, qui renvoyait moins de lignes que demandé, voire aucune, lorsqu’une politique de lignes était le seul filtre de la requête et que la colonne de tri possédait un index de sautminmax. L’optimisation top-K ramenait la lecture avant l’application de la politique de lignes. #114073 (alexey-milovidov).
Correctifs relatifs au lac de données
- Correction d’une exception d’erreur logique lors de la lecture de tables Iceberg dont la version du format avait été mise à niveau par un outil externe (p. ex. Spark). #100407 (alexey-milovidov).
- Correction d’une exception (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') lors de la lecture de tables Iceberg contenant des fichiers de données ORC avec l’optimisation PREWHERE activée. #101206 (groeneai). - Correction des exceptions
LOGICAL_ERRORlors de la lecture de tables de lac de donnéesIcebergouDeltaLakevia des chemins susceptibles d’atteindre le pipeline de lecture sansdatalake_table_statefixé, notamment lors de mises à jour concurrentes des métadonnéesIcebergou de lecturesmergesur des tablesDeltaLake. #102033 (groeneai). - Correction de l’erreur sporadique
Logical error: 'Database <name> not found'émise parDataLakeConfiguration::getCataloglorsqu’une table utilisant le moteurIcebergest chargée dans une base de données classique pendant le chargement asynchrone des métadonnées. #103775 (groeneai). - Correction des lectures excessives de métadonnées de catalogue et S3 lorsqu’une instruction INSERT ou DDL référence une table inexistante dans une base de données de catalogue DataLake avec
show_data_lake_catalogs_in_system_tablesactivé. Le mécanisme de suggestion en cas de faute de frappe chargeait les métadonnées Iceberg complètes de chaque table de l’ensemble du catalogue, ce qui pouvait épuiser la mémoire sur les catalogues volumineux. #104124 (il9ue). - Correction de
read_bytessurestimé (ainsi que des octets/s dérivés affichés danssystem.query_log, la barre de progression, etc.) lors de la lecture de fichiers Parquet. L’implémentation précédente signalait la taille compressée totale du groupe de lignes à chaque fragment, de sorte que la lecture de K colonnes sur N entraînait une surestimation d’un facteurN / K. Cette valeur n’est désormais additionnée que pour les colonnes sélectionnées. Corrige également le suivi de la progression au niveau des fichiers pour les tables Iceberg, qui ne signalait auparavant jamais la taille du fichier de données. #105413 (groeneai). - Correction de résultats erronés lors de la lecture d’une table Iceberg avec
iceberg_use_version_hint = 1après qu’un autre écrivain (tel que la fonction de tableicebergLocal/icebergS3) sans ce paramètre a fait évoluer la table.version-hint.textest désormais maintenu synchronisé par chaque écrivain dès que le fichier existe, afin que les lecteurs ultérieurs utilisant l’indication voient le dernier instantané. #105682 (groeneai). - Les écritures Iceberg préservent désormais les valeurs NULL dans les colonnes de partition
Nullable(T). Auparavant, un NULL écrit par ClickHouse apparaissait comme la valeur par défaut du type interne (0pourint) lors de sa relecture par Spark ou d’autres lecteurs Iceberg. #105862 (groeneai). - Correction des suppressions par position merge-on-read d’
Icebergv2 qui renvoyaient des lignes erronées lorsqu’un même fichier de suppression référençait plusieurs fichiers de données et que plusieurs fichiers de suppression s’appliquaient au même fichier de données. Les entrées de suppression sont désormais filtrées selon le chemin du fichier auquel elles font référence. #105888 (groeneai). - Correction du moteur de table
IcebergLocalqui passait en lecture seule après un cycleDETACH+ATTACHou un redémarrage du serveur, entraînant l’échec de chaqueINSERTultérieur avecLocal object storage Local is readonly. (READONLY). #106016 (groeneai). - Correction du cache du système de fichiers, qui était silencieusement désactivé pour Azure Blob Storage (p. ex. les tables Delta Lake sur Azure), car les métadonnées d’objet n’incluaient pas l’ETag du blob. #106091 (thewisenerd).
- Ajout d’une validation des chemins pour les tables Delta Lake afin d’empêcher les métadonnées d’accéder à des objets situés en dehors de l’emplacement de stockage configuré. #106115 (scanhex12).
- L’élagage des partitions Iceberg gère désormais correctement les filtres
WHERE partition_col = (SELECT ... FROM ...), lorsque l’analyseur encapsule le résultat de la sous-requête scalaire dans un_CAST(Const, 'TargetType')interne dont les types source et cible correspondent. Auparavant, ces filtres désactivaient l’élagage des partitions et entraînaient un parcours complet de la table. #106204 (groeneai). - Correction d’un problème où des catalogues REST
Icebergcontenant des tables étaient signalés à tort comme vides. #106301 (LefterisXefteris). - Correction d’une exception
NOT_FOUND_COLUMN_IN_BLOCKlors de l’interrogation d’une table Iceberg ou S3 avec une clauseWHEREcomposée contenantIS NOT NULLsur une colonne absente de la listeSELECT, avec le lecteur natif Parquet V3. #106443 (tiandiwonder). - Correction d’un rapport de progression surestimé lors de la lecture de tables Iceberg avec des filtres
_fileou_path. Auparavant, la progressiontotal_bytes_to_readincluait tous les fichiers du manifeste, indépendamment du filtrage. #106491 (PedroTadim). - Correction d’une exception du serveur (erreur logique
std::out_of_range) lors de l’insertion dans une tableIcebergdont les noms de colonnes du bloc d’écriture ne correspondent pas aux ID de champ du schéma le plus récent (par exemple, après qu’un rédacteur concurrent a renommé une colonne pendant la fenêtreiceberg_metadata_staleness_ms). L’insertion échoue désormais avec une erreur de requête claire au lieu d’arrêter le serveur. #107279 (groeneai). - Correction d’un possible débordement de pile du serveur (crash) lors de la lecture d’un schéma ou d’une valeur profondément imbriqués dans les formats MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg et Paimon. Ces entrées profondément imbriquées sont désormais rejetées avec une exception. #107341 (Algunenano).
- Correction d’un crash (
LOGICAL_ERRORdans les builds de débogage) et d’un bogue produisant silencieusement des résultats incorrects (dans les builds de production) lors de la lecture d’une table Iceberg dont les métadonnées réassocient unschema-idexistant à un schéma différent entre les versions de métadonnées. Ces métadonnées sont désormais rejetées avecICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai). - Correction de la lecture des tables Iceberg v3 dont les fichiers de données Parquet contiennent des colonnes réservées de traçabilité des lignes (telles que
_row_id) ; le lecteur Parquet natif ne génère plusICEBERG_SPECIFICATION_VIOLATIONpour les ID de champ réservés qui ne font pas partie du schéma de la table. #107377 (gregakinman). - Correction d’une exception parasite
filesystem error: in last_write_time: No such file or directorylors du listage d’un répertoire de stockage d’objets sur disque local (par exemple, une table Iceberg sur un disquelocal) alors que des fichiers sont remplacés simultanément. Une entrée supprimée entre-temps est désormais omise du listage au lieu d’interrompre celui-ci. #107432 (groeneai). - Correction de l’erreur ‘Account must be specified error’ lors de la lecture d’une table Delta Lake sur Azure. #107620 (SmitaRKulkarni).
- Correction d’un crash lors de la lecture de tables Iceberg avec des fichiers de suppression par égalité. Si une colonne est nullable dans le fichier de suppression par égalité, mais non nullable dans le schéma de la table (ou inversement), les valeurs lues dans le fichier de suppression étaient insérées dans une colonne d’un type différent via un cast non vérifié (une confusion de types de colonnes), ce qui corrompait la colonne et faisait planter le serveur. #109551 (mstetsyuk).
- Correction d’une fausse erreur
ICEBERG_SPECIFICATION_VIOLATIONlors de la lecture d’une table Iceberg dont le type decimal (ou un autre type primitif paramétré) est sérialisé avec des espaces différents selon les fichiers de métadonnées, par exempledecimal(20,0)dans les métadonnées de la table etdecimal(20, 0)dans le manifeste. Ces chaînes de types équivalentes selon la spécification sont désormais comparées sans tenir compte des espaces. #109676 (groeneai). - Correction de la lecture des tables Iceberg dont l’ordre de tri par défaut référence une colonne nécessitant d’être entourée de guillemets (par exemple
@timestamp). Ces tables étaient illisibles, car la clauseORDER BYde stockage générée était construite à partir du nom brut de la colonne et ne pouvait pas être analysée, entraînant l’erreurSYNTAX_ERROR. #110233 (groeneai). - Correction de la lecture des tables Paimon contenant une colonne
ARRAYouMAPnullable. Ces tables ne pouvaient pas être lues, car le mappeur de schéma encapsulait le type composite dansNullable, ce que ClickHouse interdit. Ainsi,DESCetSELECTéchouaient avecNested type Array(Nullable(Int32)) cannot be inside Nullable type. Une colonne composite nullable est désormais mappée vers un type composite non-Nullable, et une valeurNULLest lue comme une valeur vide. #113450 (groeneai). - Enregistrement de l’espace de noms Iceberg dans le catalogue avant l’écriture des fichiers de table (nécessaire pour SeaweedFS) #114285 (azat).
Correctifs S3/Azure/de stockage d’objets
- Correction de l’exception « Distributed task iterator is not initialized » lors de l’utilisation des fonctions de table
url,s3ou similaires dans des requêtes avec des répliques parallèles activées. #100146 (alexey-milovidov). - Correction d’un possible segfault du serveur dans les fonctions de table de cluster (
s3Cluster,urlCluster,fileCluster, …) lorsque le planificateur génère unSELECTavec l’indicateurrecursive_withdéfini, mais sans expressionWITH. #105433 (groeneai). - Correction du pushdown de filtre
ParquetetORCpour les prédicatsIN (subquery), permettant l’élagage des groupes de lignes, pages et filtres de Bloom lors des lectures depuisfile,url,s3et le stockage d’objets. #105863 (arsenmuk). - Correction de l’exception
LOGICAL_ERRORlors du pré-téléchargement dans le cache lorsqu’un objet S3 distant est remplacé par un contenu plus court entre son listage et sa lecture. #106375 (fm4v). - Correction du fait que la fonction de table
s3ignorait silencieusement unepartition_strategypositionnelle en minuscules (par ex.hive). #107297 (jkartseva). - Correction d’une régression où le paramètre
compatibility = '26.6'(qui active implicitement la stratégie de partitionnementhive) acceptait silencieusement{_partition_id}dans les chemins de tableS3et de stockage d’objets au lieu de générerBAD_ARGUMENTS. #107437 (LefterisXefteris). - Correction du fait que
s3et d’autres fonctions de table de stockage d’objets généraientLOGICAL_ERRORau lieu deBAD_ARGUMENTSlorsqu’un argument clé-valeur était dupliqué, par ex.s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai). - Correction d’une exception serveur (
Logical error: 'index >= result.start') lors du formatage d’une requête malformée mélangeant les formes positionnelle et nommée de l’argument secret des fonctions de tables3/gcs, par ex.s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai). - Correction de la priorité des paramètres S3 afin qu’un bloc d’endpoint
<s3>associé à une URL ait préséance sur les valeurs par défaut<s3>de niveau supérieur. #109251 (bharatnc). - Correction des erreurs
411 Length Requiredrenvoyées par les services Azure : le transport HTTP Azure basé sur Poco définit désormaisContent-Lengthà partir du corps de la requête pour les clients SDK qui ne définissent pas eux-mêmes l’en-tête (par ex. Azure Key Vault). #110299 (thevar1able).
Correctifs de S3Queue
- Corrige un plantage du serveur (accès hors limites) dans
S3Queue/AzureQueueavecenable_hash_ring_filtering = 1lorsqu’un lot contenait un fichier impossible à traiter et que la requête Keeper visant à marquer le lot comme en cours de traitement échouait simultanément. #108977 (groeneai). - Corrige les fuites d’identifiants dans
SHOW CREATE,system.query_log, les journaux du serveur et la sortie deEXPLAIN. Toutes les formes de localisateursS3masquent désormaissession_tokenet les secrets Google ADC, les valeurs deextra_credentials/headers, quelle que soit la position de l’argument, les clés secrètes dupliquées ou construites par une expression, les formes positionnelles non valides (échec sécurisé) et les identifiants intégrés aux URL S3 ; cela couvre les fonctions de tables3/s3Clusteravec URL explicite et collection nommée, les moteurs de table basés sur S3 (S3,GCS, les moteurs de lac de données,S3Queue), le moteur de base de donnéesS3,BACKUP ... TO S3et le moteur de base de donnéesBackup. De plus, les arguments secrets deencrypt/decrypt/HMAC construits par une expression (y compris ceux intégrés depuis une UDF SQL) sont désormais masqués dans les noms de projection,EXPLAIN QUERY TREEetEXPLAIN actions. #109768 (Algunenano). - Corrige le mode ordonné de
S3Queue/AzureQueueavec des nœuds de traitement persistants : les verrous de bucket sont désormais renouvelés pendant le streaming afin que le nettoyage TTL (persistent_processing_node_ttl_seconds) ne supprime pas les verrous d’un processeur actif. Si la propriété d’un verrou est néanmoins perdue, cela est détecté et signalé (une erreur logique et l’événement de profilObjectStorageQueueBucketLockLostOwnership), et le streaming reprend avec un nouvel itérateur de fichiers. #110292 (kssenii).
Correctifs de sécurité et de contrôle d’accès
- Correction d’un crash du serveur (SIGSEGV) accessible à tout utilisateur disposant du droit
CREATE TABLElors de l’envoi, via HTTP ou le protocole natif, deCREATE TABLE ... TO INNER UUID '...'sans clauseENGINE. Le même bogue faisait également planter le client. L’analyseur renvoie désormais une erreurBAD_ARGUMENTSappropriée au lieu de déréférencer un pointeur nul. #105579 (groeneai). - Correction d’un crash du serveur lors de l’interrogation de tables DeltaLake avec
allow_experimental_delta_kernel_rsactivé et des informations d’identification ou une option contenant des octets non valides (la FFI Rust paniquait au-delà de la frontièreextern "C"). #106109 (Algunenano). - Correction de plusieurs lectures hors limites du tas dans le lecteur du format Arrow IPC (
ArrowColumnToCHColumn). Un fichier Arrow malformé pouvait déclarer davantage de lignes que n’en contiennent ses buffers, déclarer des longueurs d’enfants de type liste/struct/map incohérentes avec leur parent, fournir des offsets de liste non monotones ou tronquer un bitmap de validité enfant, entraînant des lectures au-delà de la fin des allocations du tas. Cette vulnérabilité est exploitable par tout utilisateur disposant du privilègeSELECTviafile(),format(), les fonctions de table ou des entrées ArrowFlight. Tous les buffers de données, d’offsets, de view-struct et de bitmap de validité sont désormais validés avant tout accès à des pointeurs bruts, et la cohérence des formes et des offsets des listes/struct/maps est vérifiée. #106395 (Algunenano). - Correction d’un bogue où les colonnes
used_privilegesetmissing_privilegesdesystem.query_logpouvaient contenir des chaînes de privilèges provenant de requêtes antérieures non liées, exécutées par un autre utilisateur, sur une autre base de données ou dans une autre session. #106425 (alexey-milovidov). - Correction d’un dépassement de buffer du tas (crash du serveur) dans
decodeHTMLComponentlors du décodage de chaînes contenant les entités HTML à expansion≫⃒ou≪⃒, exploitable par tout utilisateur avec un seulSELECT. #106741 (Algunenano). - Correction de résultats de requête incorrects causés par le cache de conditions de requête lorsque des mutations à la volée (
apply_mutations_on_fly) ou des patch parts filtraient des lignes avantPREWHERE. Une requête lue avecapply_mutations_on_fly = 1pouvait empoisonner le cache, de sorte qu’une requête ultérieure avecapply_mutations_on_fly = 0et le même prédicat ignorait des marques qu’elle aurait dû lire et renvoyait trop peu de lignes. Le même correctif couvre également les politiques de sécurité au niveau des lignes, ajoutées comme filtre avantPREWHERE: une requête exécutée avec une politique de ligne restrictive pouvait empoisonner le cache pour une requête ultérieure utilisant le même prédicat sans cette politique. #107145 (groeneai). - Correction d’un dépassement de buffer du tas (crash du serveur) dans
windowFunnellors de la finalisation d’un état de fonction d’agrégation spécialement conçu avec un type d’événement hors plage, exploitable par tout utilisateur avec un seulSELECT. #107412 (uwezkhan). - Correction d’un problème où
currentUser(),user(),SESSION_USERetauthenticatedUser()renvoyaient une chaîne vide lors du vidage des insertions asynchrones (avecasync_insert = 1). Cela affectait les expressions de colonneDEFAULT/MATERIALIZEDet les vues matérialisées qui référencent ces fonctions, lesquelles stockaient silencieusement une chaîne vide au lieu de l’utilisateur effectuant l’insertion. #107541 (groeneai). - Lorsque plusieurs quotas sont attribués au même utilisateur ou rôle, ils sont désormais tous appliqués conjointement (une requête est rejetée si l’un d’eux est dépassé), au lieu qu’un seul quota soit appliqué et choisi de façon non déterministe.
SHOW QUOTAetsystem.quota_usageaffichent désormais tous les quotas appliqués pour l’utilisateur courant. #107664 (alexey-milovidov). SYSTEM RESET DDL WORKERnécessite désormais le nouveau privilègeSYSTEM RESET DDL WORKER. Auparavant, tout utilisateur authentifié (y compris les utilisateurs enreadonly) pouvait l’exécuter et réinitialiser à plusieurs reprises l’état du worker DDL, bloquant les DDLON CLUSTER. #108460 (groeneai).- Correction de l’identification des utilisateurs par
ssl_certificateafin qu’un unique caractère générique*corresponde exactement à un composant de nom (RFC 6125 6.4.3). Auparavant, un caractère générique dans un sujet SANCNouDNS:(par exemple*.corp.example.com) correspondait également à des noms comportant plusieurs libellés, tels queevil.deep.corp.example.com, permettant au détenteur d’un certificat pour un sous-domaine plus profond de s’authentifier en tant qu’utilisateur générique. La correspondance des SANURI:reste inchangée. #108472 (groeneai). - Les commandes du protocole MySQL
COM_FIELD_LIST(mysql_list_fields) etCOM_INIT_DB(USE database) appliquent désormais le même contrôle d’accès que leurs équivalents SQL (SHOW COLUMNS/DESCRIBEetUSE). Auparavant, elles pouvaient divulguer les noms de colonnes de tables pour lesquelles l’utilisateur ne disposait que de privilèges partiels sur les colonnes, et changer la base de données courante sans le privilègeSHOW DATABASES. #108508 (groeneai). http_forbid_headersest désormais mis en correspondance sans distinction entre majuscules et minuscules. Les noms d’en-têtes HTTP ne distinguent pas les majuscules des minuscules. Ainsi, interdireAuthorizationbloque désormais aussiauthorization,AUTHORIZATIONet les autres variantes de casse. Les modèlesheader_regexpconfigurés sont désormais mis en correspondance sans distinction entre majuscules et minuscules, sans nécessiter d’indicateur(?i)explicite. #108509 (groeneai).- Correction d’une divulgation de métadonnées :
DESCRIBE loop('db', 'table')etDESCRIBE loop(<inner table function>)contournaient la vérification de l’accèsSHOW COLUMNS/ de l’accès à la source, permettant à un utilisateur non privilégié de lire le schéma des colonnes d’une table. #108624 (groeneai). - Correction d’un échec de démarrage : une base de données
DataLakeCatalogcréée par une version antérieure (25.12 ou précédente) avec unauth_headermal formé ne pouvait pas être attachée après une mise à niveau vers la version 26.2 ou ultérieure, ce qui empêchait le démarrage du serveur. Leauth_headern’est désormais validé que lors deCREATEet, lors deATTACH, le catalogue est construit de manière différée, à sa première utilisation plutôt qu’au démarrage. Ainsi, une seule base de données de catalogue mal configurée ou non joignable ne bloque plus le démarrage du serveur. #108674 (groeneai). - Renforcement des connexions RabbitMQ contre les trames AMQP malveillantes excessivement volumineuses et application systématique des vérifications
remote_url_allow_hostsàrabbitmq_address. #112479 (kssenii). - Correction d’un cas où
CREATE TABLE ... ENGINE = Distributed(...)sans liste de colonnes pouvait révéler la structure d’une table locale que l’utilisateur à l’origine de la création n’est pas autorisé à consulter. Lors d’unCREATEexécuté par le serveur local lui-même, la structure est désormais déduite dans le contexte de l’utilisateur, de sorte que le privilègeSHOW COLUMNSsur la table cible est requis, comme c’est déjà le cas pour le moteurRemote. UnCREATErejoué depuis la DDL queue (ON CLUSTERou au sein d’une base de donnéesReplicated) n’est pas couvert. #113220 (groeneai). - Correction d’un cas où
CREATE TABLE ... ENGINE = Buffer(...)sans liste de colonnes pouvait révéler la structure d’une table de destination que l’utilisateur à l’origine de la création n’est pas autorisé à consulter. Lorsqu’unCREATEest exécuté par le serveur local lui-même, la structure est désormais inférée dans le contexte de l’utilisateur. La permission d’exécuterSHOW COLUMNSsur la destination est donc requise, comme c’est déjà le cas pourMergeetRemote. UnCREATErejoué depuis la file d’attente DDL (ON CLUSTERou au sein d’une base de donnéesReplicated) n’est pas concerné. #113372 (groeneai). - Limitation de la taille du message de démarrage du protocole PostgreSQL, lu avant l’authentification. #115708 (alexey-milovidov).
Correctifs de sauvegarde et de restauration
- Corrige un arrêt du serveur lors de la commande
RESTOREde sauvegardes contenant des tables aux dépendances cycliques. #103824 (thevar1able). - Corrige la non-prise en compte de la classe de stockage S3 (
s3_storage_class/s3_storage_class_name) pour les objets écrits via un téléversement multipartite sur les disquesS3et le stockage d’objets, ce qui entraînait la création de gros objets avec la classeSTANDARDpar défaut. Le nom de l’option est désormais accepté sous les formess3_storage_classets3_storage_class_namepour les disques, le stockage d’objets et les sauvegardes. #106214 (alexey-milovidov). - Corrige le fait que
SYSTEM RELOAD CONFIGignorait les paramètres Azure Blob Storage spécifiques aux endpoints (tels queuse_native_copy), ce qui empêchait la prise en compte des paramètres configurés d’un disque pourBACKUP/RESTOREjusqu’au redémarrage du serveur. #106357 (jkartseva). - Corrige l’échec des sauvegardes avec FILE_DOESNT_EXIST lorsqu’une cible REPLACE d’une vue matérialisée actualisable est collectée sur une base de données Replicated ou Shared dont la vue matérialisée n’est pas encore instanciée sur la réplique qui initie la sauvegarde. #106411 (jkartseva).
- Corrige le fait qu’Azure BACKUP/RESTORE ignorait les paramètres d’endpoint pour les disques
azure_blob_storageau format hérité. #106784 (jkartseva). - Corrige
BACKUPversAzureBlobStorage: la copie d’un fichier de données au sein d’une sauvegarde écrivait l’objet de destination hors du répertoire de sauvegarde. Les vérifications de l’existence d’objets de sauvegarde sur les destinationsS3utilisent désormais des requêtesHeadObjectexactes au lieu d’un listage par préfixe, évitant les correspondances erronées avec des clés ayant des préfixes similaires. #107153 (pamarcos). - Les sauvegardes incrémentielles ne stockent plus les identifiants S3 dans le localisateur
<base_backup>du fichier de métadonnées.backup. Les sauvegardes créées avecuse_same_s3_credentials_for_base_backup = 1, ou avec des identifiants explicites de sauvegarde de base correspondant à ce localisateur, stockent un marqueur non secret et sont restaurées sans paramètres supplémentaires lors de la restauration ; pour les sauvegardes créées avec des identifiants explicites de sauvegarde de base différents ou des arguments d’authentification supplémentaires pour la sauvegarde de base, transmettez-les àRESTOREavec le paramètrebase_backup. Les sauvegardes créées par des versions antérieures avec des identifiants intégrés restent restaurables. #107357 (pamarcos). - Corrige
RESTOREpour les tablesReplicatedMergeTreeafin que les parties au contenu dupliqué d’une sauvegarde soient conservées au lieu d’être dédupliquées silencieusement. #107652 (pamarcos). - Un espace réservé
{_partition_id}dans le chemin d’un moteur de type fichier (S3,AzureBlobStorage,URL, etc.) sanspartition_strategyexplicite implique de nouveau la stratégiewildcard, indépendamment defile_like_engine_default_partition_strategy. Cela rétablit la rétrocompatibilité des DDL antérieurs à la version 26.6 qui commençaient à échouer avecBAD_ARGUMENTS(“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”). #111279 (fm4v).
Correctifs de ClickHouse Keeper
- Corrige le nettoyage des snapshots de
Keeperaprès des écritures échouées, afin que les snapshots partiels soient supprimés en toute sécurité et que les écritures puissent être réessayées sans faire progresserlatest_snapshot_meta. #105779 (antonio2368). - Corrige les défaillances de
Keeperlors du rattrapage d’un follower, lorsque la nouvelle file de réponses du répartiteur de requêtes pouvait se remplir avant le démarrage du thread de réponse. #106049 (antonio2368). - Corrige un blocage occasionnel de Keeper au démarrage lorsque le paramètre
nuraft_max_log_gap_in_streamest défini sur une valeur autre que celle par défaut (0, c’est-à-dire que le pipeline des requêtes append_entries est désactivé). #106220 (al13n321). - Le TLS Raft interne de Keeper respecte désormais le paramètre
openSSL.client.verificationMode. Auparavant, la vérification des certificats des pairs était toujours activée pour les communications Raft entre instances Keeper, indépendamment de ce paramètre, de sorte quenoneétait ignoré silencieusement. Désormais,nonedésactive explicitement la vérification des certificats des pairs Raft, tandis que l’absence de paramètre conserve le comportement précédent, sécurisé par défaut. Après la mise à niveau, les configurations qui définissent explicitementnonene vérifieront plus les certificats des pairs Raft, conformément à la configuration définie. #106726 (antonio2368). - Corrige la recréation intempestive de sessions ZooKeeper lors du rechargement de la configuration. #107096 (azat).
- Corrige un bogue dans ClickHouse Keeper où les métadonnées de snapshot signalées via
last_snapshot(etzk_latest_snapshot_sizedansmntr) pouvaient régresser après l’installation d’un snapshot obsolète ou dupliqué. Cela pouvait également permettre à un snapshot local ayant le même index d’écraser un fichier de snapshot enregistré alors qu’il était encore transmis en flux à un pair ou téléversé vers S3. #107321 (antonio2368). - Corrige le blocage d’une vue matérialisée actualisable si la connexion à ZooKeeper est perdue au mauvais moment. #108234 (al13n321).
- Corrige les mutations utilisant un paramètre de requête comme partition (
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}) : la valeur de partition substituée était sérialisée dans l’entrée de mutation sous une forme qui ne pouvait pas être analysée de nouveau, ce qui empêchait le chargement de la table (pour les tables répliquées, sur chaque réplique). Les commandes de mutation sont désormais également vérifiées pour s’assurer qu’elles peuvent être analysées de nouveau avant d’être écrites dans ZooKeeper ou sur disque, afin qu’une incompatibilité similaire fasse échouer la requêteALTERplutôt que de rendre la table inutilisable. #111518 (al13n321). - Corrige un dépassement numérique lors de l’analyse des données pour
system.zookeeper_info. #111629 (kssenii).
Correctifs de plantages et de stabilité
- Corrige l’exception NOT_FOUND_COLUMN_IN_BLOCK lors de l’utilisation de LIMIT BY avec des colonnes constantes, ainsi que de DISTINCT et ORDER BY avec le nouvel analyseur. #93195 (ashrithb).
- Améliore la stabilité de la connexion HiveCatalog en ajoutant un mécanisme de tentatives automatiques et une logique de reconnexion pour gérer les erreurs TTransportException lors des communications avec Hive Metastore. #98471 (otselnik).
- Corrige le repliement de constantes lors de l’analyse pour les fonctions à court-circuit (
if,multiIf,and,or, etc.), afin que les branches statiquement inaccessibles ne lèvent plus d’exceptions lors de l’analyse. Par exemple,WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))renvoie désormais correctement0au lieu d’échouer avec une erreur de division par zéro. #103157 (fastio). - Corrige un arrêt du serveur lorsque
runningAccumulateétait appelée sur une fonction d’agrégation renvoyant son propre état. #105085 (antaljanosbenjamin). - Corrige
getServerSettingafin qu’il renvoie la valeur effective actuelle des paramètres serveur modifiables à l’exécution (tels quemax_server_memory_usage,mark_cache_size,max_concurrent_queries, les tailles des pools de threads, etc.), conformément à ce que renvoiesystem.server_settings. #105172 (alexey-milovidov). - Corrige l’exception
NOT_FOUND_COLUMN_IN_BLOCKlors de la combinaison deORDER BY ... WITH FILL INTERPOLATEetLIMIT N BYavec l’analyseur activé. #105481 (yakov-olkhovskiy). - Corrige une exception du serveur (erreur logique
Trying to execute PLACEHOLDER action) lorsqu’une CTEMATERIALIZEDdont le corps est une sous-requête corrélée est utilisée comme opérande droit deIN. Une telle CTE est désormais rejetée lors de l’analyse, comme c’est déjà le cas lorsque le même modèle est référencé directement dansFROM. #105518 (groeneai). - Corrige le fait que
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=falsene capture pas les exceptions lors de l’exécution des fonctions. #105543 (Avogar). - Corrige l’exception NOT_FOUND_COLUMN_IN_BLOCK lorsqu’une expression TTL référence une sous-colonne. #105578 (Avogar).
- Corrige un crash du serveur pouvant survenir lorsqu’une requête lisant des données depuis PostgreSQL — via la fonction de table postgresql, le moteur de table PostgreSQL ou un dictionnaire utilisant une source PostgreSQL — était annulée (par exemple avec KILL QUERY) et que l’annulation de la requête PostgreSQL distante échouait. #105949 (rorylshanks).
- Corrige un éventuel crash dû à un littéral de chaîne trop volumineux envoyé dans la requête. #105996 (nickitat).
- Corrige l’exception
INVALID_WITH_FILL_EXPRESSIONlors de l’utilisation deINTERPOLATE ()(vide) avec un préfixe de tri dansORDER BYetuse_with_fill_by_sorting_prefixactivé. Les colonnes du préfixe de tri sont désormais correctement exclues de l’ensemble d’interpolation implicite, conformément au comportement deINTERPOLATE (col)lorsque les colonnes sont explicitement nommées. #106001 (yakov-olkhovskiy). - Les états
AggregateFunction(uniqTheta, ...)mal formés provenant d’une entréeRowBinaryou de paramètres de requête sont désormais rejetés avecCORRUPTED_DATAau lieu d’entraîner l’arrêt du serveur. #106260 (groeneai). - Corrige un crash et une possible erreur
NOT_FOUND_COLUMN_IN_BLOCKlorsque l’optimisation basée sur les contraintes (optimize_using_constraints) est utilisée avec des sous-requêtes corrélées. #106349 (Algunenano). - Corrige l’exception
NUMBER_OF_COLUMNS_DOESNT_MATCHlors de l’interrogation d’une tableDistributedcomportant au moins deux colonnes ALIAS qui se développent en la même expression (par ex. toutes deux définies commetoString(x)), ou lorsque la même expression est écrite à la fois comme référence à une colonne ALIAS et directement dans la liste SELECT, avec une clauseORDER BY. #106404 (yakov-olkhovskiy). - Corrige l’erreur
LOGICAL_ERROR“Trying to get name of not a column:ExpressionList” générée par des requêtes qui transmettent un astérisque dansmultiIfcomme argument d’une fonction de table, par ex.numbers(multiIf(*, ...), 2). La requête rejette désormais ce sélecteur impossible à résoudre avecUNSUPPORTED_METHOD. #106647 (groeneai). - Rejette les motifs glob pathologiques de
filequi entraîneraient une récursion non bornée lors de l’énumération de répertoires. Une profondeur de récursion maximale de 1000 est désormais appliquée ; les requêtes qui la dépassent génèrentTOO_DEEP_RECURSIONau lieu d’interrompre le serveur par dépassement de pile. #106676 (groeneai). - Corrige l’exception
'Trying to read from input() twice.'générée lorsque la fonction de tableinputest encapsulée dans une CTE non-MATERIALIZED référencée à plusieurs endroits dans la requête. La requête est désormais rejetée avec l’erreur expliciteINVALID_USAGE_OF_INPUTlors de la planification.inputest un flux client à usage unique et ne peut être consommé que par une seule source dans le plan de requête. #106682 (groeneai). - Corrige les colonnes incohérentes (qui entraînent ultérieurement une erreur LOGICAL_ERROR) en cas d’exception (par ex. MEMORY_LIMIT_EXCEEDED) durant l’analyse syntaxique. #106802 (azat).
- Corrige un crash du serveur (SIGSEGV) lors de la lecture de données Protobuf tronquées avec
input_format_allow_errors_num > 0. #106905 (atsarevskiy). - Corrige un crash du serveur (déréférencement d’un pointeur nul) lors de l’exécution de
TRUNCATEouDROPsur une tableEmbeddedRocksDBdont le handle RocksDB a été libéré, par exemple une tableread_onlydont le répertoire de données a été vidé par unTRUNCATEantérieur. #106940 (groeneai). - Corrige une exception (
std::length_errorsignalée comme uneLOGICAL_ERROR) lors de la lecture à partir d’une fonction de table*Cluster, telle queurlCluster, avec un paramètremax_streams_for_files_processing_in_cluster_functionstrès élevé. Le nombre de flux est désormais limité à une valeur raisonnable. #106946 (groeneai). - Corrige l’arrêt du serveur lorsqu’une requête distribuée était annulée immédiatement avant son envoi à un shard. #106950 (groeneai).
- Correction d’une exception du serveur (erreur logique
this->visited_views == right->visited_views) lors d’unINSERTlorsque deux vues matérialisées sur la même table source écrivent dans la même table cible et qu’une vue dépendante lit cette dernière, avecmaterialized_views_squash_parallel_insertsactivé. #107027 (groeneai). - Correction d’une exception
LOGICAL_ERRORlors de l’insertion dans une table DeltaLake dont les colonnes ne correspondent pas à son schéma d’écriture (par exemple, une colonneNestedqui est aplatie en sous-colonnes, ou une fonction de table avec un sous-ensemble explicite de colonnes). Ces insertions échouent désormais avec une erreurINCOMPATIBLE_COLUMNSsignalée à l’utilisateur. #107058 (groeneai). - Correction d’une
LOGICAL_ERROR(“Table expression … data must be initialized”) déclenchée lorsqu’un sélecteur astérisque qualifié (par exemplex.*) référençait une CTE récursive par son nom dans son propre terme récursif. Ces sélecteurs développent désormais les colonnes de la table récursive, comme le font déjà à cet emplacement une colonne qualifiée (x.a) ou un sélecteur non qualifié (*). #107144 (groeneai). - Correction d’une
LOGICAL_ERROR(“Unexpected exception in refresh scheduling”) qui pouvait entraîner le serveur dans une boucle de plantages au redémarrage lorsqu’une vue matérialisée actualisable possède une dépendanceREFRESH ... DEPENDS ON <name>dont le nom non qualifié correspond à une table temporaire ou à un nom de CTE. #107156 (groeneai). - Correction d’une
LOGICAL_ERROR(Variant N (T) has size X, but expected Y) lorsqu’une fonction telle quetoStringouconcatest appliquée à une colonneVariantouDynamiccontenant un seul variant non vide ainsi que des valeurs NULL, et que la fonction renvoie sa colonne d’entrée inchangée. #107374 (groeneai). - Correction d’une
LOGICAL_ERROR(block.rows() == getRows()) déclenchée lors d’unINSERTasynchrone dans une tableAliaslorsqueuse_strict_insert_block_limitsétait activé. #107400 (groeneai). - Correction d’une exception du serveur (
Logical error: Not-ready Set is passed as the second argument for function 'in') lorsqu’une expression de clé (ORDER BY,PRIMARY KEY,PARTITION BYou unINDEXde saut) contenait un opérateurINavec une table à droite, par exempleORDER BY (x IN some_table). Ces expressions de clé sont désormais rejetées lors de la création de la table. #107424 (groeneai). - Correction d’un plantage rare du serveur lors du traitement de
DISTINCT, qui pouvait se produire lorsqu’une allocation échouait (par exemple, lorsqu’une limite de mémoire était atteinte) pendant l’initialisation de l’ensemble de clés distinctes. #107467 (groeneai). - Correction des échecs d’opérations
DeltaLakeaprès l’expiration d’informations d’identification S3 temporaires, grâce à l’actualisation des informations d’identification mises en cache avant l’opération suivante. Les informations d’identification STS assume-role sont également actualisées après des échecs d’authentification. #107480 (ahmadov). - Correction d’une
Not-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR) lors de l’interrogation d’une table avec une cléPARTITION BYet une sous-requêteIN/NOT INintégrée à une expression plus large, par exempleWHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai). - Corrige un crash (déréférencement de pointeur nul) pouvant survenir lors de l’exécution locale d’un plan de requête distribué (
make_distributed_plan+distributed_plan_execute_locally) aveclog_formatted_queries = 1. #107570 (groeneai). - Corrige un crash du serveur lors de la lecture d’une vue matérialisée dont la cible est une table
Distributed, lorsque la requête s’exécute avecenable_analyzer = 0. #107653 (groeneai). - Corrige un crash du serveur (SIGSEGV) lors de la lecture de données Protobuf avec
input_format_allow_errors_num > 0, lorsqu’un message valide précède un message incorrect (pouvant être ignoré) dans le même bloc. #107739 (atsarevskiy). - Corrige le blocage pendant plusieurs minutes des fonctions de table
odbcetjdbc, qui ignoraient l’annulation des requêtes (KILL QUERY,max_execution_time) lorsque le pont ne répondait plus pendant l’inférence de la structure de la table distante. #107809 (alexey-milovidov). - Corrige un possible crash (déréférencement de pointeur nul) lorsque la surcharge
database/dbd’une collection nommée passée àremote()/remoteSecure()n’est pas un nom de base de données constant, par exempleremote(nc, database = (SELECT 1)). La requête échoue désormais avec une erreur explicite au lieu de provoquer un crash. #108271 (groeneai). - Les requêtes de recherche vectorielle qui sélectionnent la colonne
_distancerenvoient désormais une erreur appropriée au lieu d’échouer avec uneLOGICAL_ERROR. #108423 (rschu1ze). - Corrige un possible crash (dépassement de tampon sur le tas) lorsqu’une colonne d’état de fonction d’agrégation de la famille
quantileTDigestétait utilisée comme cléGROUP BYet sérialisée simultanément par plusieurs threads. #110263 (groeneai). - Corrige un élagage incorrect lors de l’analyse de l’index de clé primaire sur les tables dotées d’une clé de tri inverse (décroissante) (
ORDER BY (g, r DESC)). Un granule couvrant un changement dans une colonne de clé principale, suivi d’une colonne de clé décroissante, pouvait être élagué à tort, supprimant ainsi des lignes correspondantes. #111059 (nihalzp). - Corrige une erreur logique
block.rows() == getRows()(une lecture hors limites et une déduplication d’insertion défectueuse dans les builds de production) lorsqu’unINSERTpasse par une vue matérialisée dépendante dont la cible est unAliaset dont la requête interne modifie le nombre de lignes, avec une table assurant la déduplication accessible derrière l’alias. #111103 (alexey-milovidov). - Corrige une erreur de segmentation due à un accès mémoire hors limites lors de la désérialisation d’un état de fonction d’agrégation malformé contenant une valeur
String. Ces états sont désormais validés et rejetés au lieu d’entraîner des erreurs de segmentation. #111606 (mstetsyuk). - Corrige un crash lors de la lecture d’un fichier Parquet avec des métadonnées de filtre de Bloom incohérentes. Ces fichiers pouvaient également renvoyer silencieusement moins de lignes que prévu. #112498 (tiandiwonder).
- Corrige un segfault et une corruption silencieuse des données lorsqu’un
INSERTdans le moteurFileou la fonction de tablefileajoute des données à un fichier non vide dans un format qui ne prend pas en charge l’ajout, tel queAvro. L’écriture via un descripteur de fichier ou un chemin partitionné contournait la vérification existante : le préfixe de format était alors omis et un second en-tête était écrit après les octets existants, rendant le fichier illisible. Un telINSERTest désormais rejeté avecCANNOT_APPEND_TO_FILE, comme c’était déjà le cas pour un chemin simple. #112839 (groeneai). - Corrige le blocage de
DROP TABLEet deSYSTEM STOP VIEWlorsqu’une vue matérialisée actualisable est bloquée pendant la planification de sa requête d’actualisation. #113188 (evillique). - Corrige un arrêt rare du serveur lorsque des entrées de la file d’insertions asynchrones avaient des échéances identiques. #113363 (mstetsyuk).
- Corrige une corruption de la mémoire du tas lors de la lecture de Parquet via un format d’entrée qui possède son propre tampon de lecture, par exemple un dictionnaire avec
SOURCE(FILE(... format 'Parquet')). Les tâches d’extraction anticipée et de décodage en arrière-plan pouvaient encore lire et écrire dans le tampon après que le pipeline l’avait libéré, ce qui pouvait arrêter le serveur. #114668 (groeneai). - Corrige un blocage lors de la suppression d’une table
TimeSeriesdont le nom est classé lexicographiquement avant ceux de ses tables internes, par exemple une table nommée-ts, ou lors de la suppression d’une vue matérialisée déclarée avecENGINE = TimeSeries. La suppression entraînait un auto-interblocage sur le verrou DDL et ne pouvait pas être annulée avecKILL QUERY. #114953 (groeneai).
Autres corrections de bogues
- Les fonctions
like,ilike,notLike,notILikeetmatchprennent désormais en charge une chaîne de recherche constante avec un motif non constant (p. ex.'foo' LIKE pattern_column), ce qui provoquait auparavantILLEGAL_COLUMN. #100479 (Onyx2406). - Correction de l’erreur
NOT_FOUND_COLUMN_IN_BLOCKlors d’une sélection depuis une VIEW sur une table comportant une projection standard. #101218 (amosbird). - Rejet des valeurs Float64 négatives (p. ex.
-100.5) dans les paramètres de charge tels quemax_bytes_per_second,max_cpus, etc. Auparavant, seuls les entiers négatifs étaient validés, ce qui permettait aux flottants négatifs de créer silencieusement des nœuds de planificateur défectueux. #101842 (groeneai). - Les lectures depuis le stockage d’objets réagissent désormais rapidement à l’annulation des requêtes. #103016 (SmitaRKulkarni).
- Correction du problème où
input_format_max_block_size_bytesétait silencieusement ignoré lors de l’analyse d’INSERTlorsquemax_insert_block_size_bytesvaut0(valeur par défaut). Ce paramètre limite désormais correctement la taille des blocs produits par les formats d’entrée orientés lignes. #103068 (Fgrtue). - Correction d’un problème où ClickHouse produisait occasionnellement des jetons GSSAPI non valides en raison d’une suppression incorrecte des octets nuls de fin. #103114 (EmeraldShift).
- EXPLAIN SYNTAX développe les vues paramétrées. #103263 (jrdi).
- Correction de la corruption de données lors de l’écriture de fichiers Parquet (et d’autres formats avec pied de page, tels que ORC et Arrow) dans HDFS via
INSERT INTO FUNCTION hdfs(...). Depuis la version 26.1,WriteBufferFromHDFSne vidait pas son tampon de travail lors definalize(), si bien que les derniersDBMS_DEFAULT_BUFFER_SIZEoctets de chaque fichier pouvaient être silencieusement perdus, y compris le pied de page ParquetPAR1. La lecture de tels fichiers renvoyaitNot a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai). - Correction de résultats erronés et d’une possible erreur logique pour les sous-requêtes corrélées lorsqu’une limite de taille de jointure (
max_rows_in_join/max_bytes_in_join) est définie avecjoin_overflow_mode = 'break'. La jointure créée en interne pour évaluer une sous-requête corrélée ignore désormais ces limites définies par l’utilisateur, et ne peut donc plus s’arrêter prématurément ni omettre des lignes. #103322 (groeneai). - Correction de résultats erronés ou d’une projection non utilisée lorsqu’une projection agrégée contient plusieurs agrégats
sumIfavec différentes conditionsIN (...). #104765 (Ergus). - Correction de
deltaSumTimestamp, qui renvoyait des résultats erronés pour les types entiers signés passant par zéro. #104830 (thevar1able). - Correction de l’erreur
Logical error: 'Metadata is not initialized'déclenchée parDELETE FROMsur une tableIceberg,DeltaLakeouHudinouvellement attachée, dont le fichier de métadonnées est corrompu ou ne peut pas être chargé. Une exception standard destinée à l’utilisateur est désormais renvoyée et le serveur continue de fonctionner. #104917 (groeneai). - Les requêtes
ATTACH TABLE name <clauses>;qui fournissent des clauses de stockage (ORDER BY,PARTITION BY,PRIMARY KEY,SAMPLE BY,TTL,UNIQUE KEYou desSETTINGSde moteur) sansENGINEgénèrent désormais l’erreurBAD_ARGUMENTS, au lieu de rattacher silencieusement la table à partir de sa définition stockée tout en ignorant les clauses fournies par l’utilisateur. LesSETTINGSde session au niveau de la requête (tels quelog_comment) sont toujours appliqués. UtilisezATTACH TABLE t;pour rattacher la table avec ses métadonnées stockées, ouALTER TABLE t MODIFY SETTING ...aprèsATTACHpour modifier les paramètres. #105068 (groeneai). - Correction d’un dépassement de tampon sur le tas lors de la lecture de fichiers Arrow ou ArrowStream contenant des décalages intermédiaires corrompus dans une colonne binaire ou de chaînes, ainsi que d’un déréférencement de pointeur nul lors de la lecture de colonnes Arrow géoballisées. #105449 (Algunenano).
- Correction d’un arrêt du serveur lors de la lecture de sous-colonnes
Dynamicdepuis une tableMemorycompressée après unALTER. #105464 (Avogar). - Ajout de
skip_first_linesà la clé du cache de schéma pour les formatsWithNames. #105469 (Avogar). - Correction de
histogram, qui produisait des résultats erronés pour de petites entrées non triées. #105548 (Avogar). - Correction de l’utilisation de la table d’insertion dans les fonctions de table lorsque
optimize_trivial_insert_selectest activé. #105555 (Avogar). - Correction de la fonction de fenêtre
estimateCompressionRatio, qui perdait les données accumulées entre les lignes. #105581 (Avogar). - L’extraction des valeurs de partition Hive respecte désormais le paramètre
cast_string_to_date_time_modeet accepte par défaut les timestamps ISO 8601 avec des suffixes de fuseau horaire (par ex.+0000,+00:00,Z) dans les clés de partition. #105584 (alexey-milovidov). - Correction de la récupération après erreur du format d’entrée
Templateà la suite de lignes mal formées. #105735 (niyue). - Correction du formatage de
SYSTEM INSTRUMENT ADDafin que les arguments du gestionnaire soient séparés par une seule espace, et rejet des listes d’arguments d’instrumentationSLEEPnon valides contenant plus de deux valeurs ou une plage dont le minimum est supérieur au maximum. #105984 (pamarcos). - Correction de l’échec silencieux des opérations de partition
ALTER TABLEpour les clés de partition Bool. #106004 (Avogar). - Correction de
JSONExtractRawetJSONHaspour les chemins JSON typés avec des valeurs par défaut. #106005 (Avogar). - Correction d’un préfixe
/incorrect pour les chemins de base vides dans les configurations de lac de données. #106013 (thewisenerd). - Correction de
system.dictionaries, qui renvoyait 0 ligne lorsqu’une révocation partielle deSHOW DICTIONARIESétait appliquée. #106105 (Avogar). - Correction de résultats incorrects pour les requêtes sur des tables dont
ORDER BYcontient une fonction monotone décroissante telle que(c0 / -42)ouintDiv(c0, -42). Les prédicats sur la colonne sous-jacente (par exemple,c0 < 0) pouvaient à tort exclure des granules contenant des lignes correspondantes, entraînant l’absence de certains résultats. #106136 (nihalzp). - Ajout d’une validation des états d’agrégat
DDSketchmalformés lors de l’insertion. #106236 (yariks5s). - Correction de la cohérence du cache du système de fichiers après l’échec de rétrogradations
SLRU, empêchant les entrées de rester bloquées dans un état d’éviction. Correction également du redimensionnement du cache segmentéSystem/Dataet du nettoyage de l’espace libre, afin que les limites soient mises à jour atomiquement et que l’espace puisse être récupéré dans les deux segments du cache. #106286 (kssenii). - Correction d’une conversion incorrecte de valeurs
Float16subnormales enFloat32(par exemple lors de leur lecture depuis des fichiers.npyNumpy), causée par un décalage de mantisse d’une unité. #106343 (jh0x). - Correction de
regexpExtract(haystack, pattern)afin que les motifs sans groupe de capture renvoient la correspondance complète au lieu de leverINDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai). - Correction d’une erreur logique lors de la création d’un dictionnaire de polygones à partir de données source contenant des coordonnées de points
NaNou infinies. Ces coordonnées sont désormais rejetées avec un message d’erreur explicite. #106423 (alexey-milovidov). - Les dictionnaires HTTP peuvent désormais spécifier des en-têtes de requête via des collections nommées. #106459 (ZelvaMan).
- Les valeurs d’énumération
Avromalformées sont désormais validées et rejetées avec une exception au lieu de provoquer un accès mémoire hors limites et l’arrêt du serveur. #106476 (mstetsyuk). - Correction de
LIMIT WITH TIESet deLIMIT WITH TIESfractionnaire, qui ne respectaient pas la collation deORDER BY ... COLLATElors de la détermination des ex æquo. Les lignes égales selon la collation (par exemple'1'et'01'avec une collation numérique) étaient comparées octet par octet, de sorte que certaines lignes ex æquo étaient à tort exclues du résultat. #106539 (nihalzp). - Correction des optimisations
DISTINCTin order etLIMIT BYin order (y comprisLIMIT BYnégatif), qui renvoyaient des résultats incorrects lorsque l’entrée était triée avec une collation (ORDER BY ... COLLATE). Les lignes égales selon la collation (par exemple'a'et'A'avec une collation insensible à la casse) sont ordonnées par clé de collation et ne sont pas adjacentes en termes de valeur ; l’optimisation in order est donc désormais ignorée lorsqu’un collateur est utilisé. #106564 (nihalzp). - Correction d’une condition de concurrence lors de l’arrêt d’un consumer NATS qui pouvait entraîner l’arrêt du serveur. #106692 (mstetsyuk).
- Correction de plusieurs problèmes de sûreté mémoire et d’épuisement des ressources dans des lecteurs de formats accessibles via des entrées non fiables : une lecture hors limites du tas dans le traitement, par le lecteur Parquet natif, des longueurs des niveaux de définition et de répétition de
DataPageV2, un débordement de pile avec des fichiers Parquet dont les schémas sont profondément imbriqués, et des allocations ignorantmax_memory_usagelors de l’analyse de géométries WKB/WKT GeoParquet et de chaînes/octet Avro. #106739 (Algunenano). - Correction de
keeper_server.http_control.secure_port, qui envoyait des réponses HTTP en clair aux clients HTTPS. Le port sécurisé répond désormais correctement en HTTPS. #106822 (linjiayu1025-collab). - Correction de
SHOW CREATE ROW POLICY, qui produisaitrestrictive/permissiveen minuscules au lieu de majuscules, contrairement aux autres mots-clés. #106865 (valerypetrov). - Correction du marquage de parties comme corrompues et de leur détachement lors de tout rechargement de partie (redémarrage du serveur,
DETACHouATTACH) pour les tables dont la clé de partition contient une colonneLowCardinality(Nullable(...)). Depuis la version 26.5, le fichier d’index minmax par partie n’était pas écrit lorsque le minimum et le maximum d’une telle colonne étaientNULL, alors que la vérification de cohérence des parties exigeait toujours ce fichier. Les parties écrites par les versions concernées ne disposent pas du fichier d’index minmax et doivent encore être rattachées manuellement. #106945 (PedroTadim). - Correction de
elapsed_us, qui était toujours égal à zéro, et du sous-comptage deread_rows/read_bytesdanssystem.processors_profile_logetsystem.query_logpour les requêtes de vidage d’insertions asynchrones (AsyncInsertFlush). #106982 (cwurm). - Correction d’une erreur logique
Block structure mismatch in UnionStep stream(arrêt du serveur sur les builds de débogage/avec sanitizer,Code: 49sur les builds de production) qui se produisait lorsqu’une branche d’unUNION/INTERSECT/EXCEPTlisait une colonne sérialiséeSparse, tandis que l’autre branche lisait la même colonne en entier (par exemple lors d’une insertion dans une vue matérialisée). #107041 (groeneai). - Correction d’un ordre de lignes incorrect dans les requêtes
ORDER BYsurUNION ALLavecoptimize_read_in_orderetread_in_order_use_virtual_rowactivés. #107053 (vdimir). - Correction d’une erreur de syntaxe lorsqu’une clause
FORMAT,SETTINGSouINTO OUTFILEsuitSHOW ROW POLICIESouSHOW MASKING POLICIES(par ex.SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai). - Correction de
trimLeft,trimRightettrimBoth(ainsi que des aliasltrim,rtrim,trim) qui généraientTOO_LARGE_STRING_SIZElorsque le jeu de caractères de suppression personnalisé dépassait 16 caractères. Les jeux de caractères de suppression, quelle que soit leur longueur, sont de nouveau pris en charge. #107071 (fm4v). - Correction d’un dépassement d’entier signé dans
quantileExactExclusive,quantilesExactExclusive,quantileExactInclusiveetquantilesExactInclusive, qui pouvait produire un résultat incorrect pour des entréesInt64couvrant une vaste plage de valeurs. #107154 (groeneai). - Les rechargements de configuration ne relancent plus les scripts de démarrage, empêchant ainsi l’exécution répétée d’actions de démarrage ponctuelles. #107187 (mstetsyuk).
- Correction d’un ordre de résultat incorrect pour
ORDER BYsurUNION ALLavecoptimize_read_in_orderactivé lorsque le pipeline d’union était réduit en raison du paramètremax_streams_for_union_step; cette réduction est désormais ignorée lorsque le plan dépend de flux de sortie UNION triés. #107208 (vdimir). - Correction d’un possible déréférencement de pointeur nul lors de la résolution de la configuration du proxy pendant la phase finale d’arrêt du serveur. #107231 (PedroTadim).
- Correction de
ORDER BY ... WITH FILL, qui produisait des lignes supplémentaires lorsqu’une colonneORDER BYprécédant la colonne de remplissage utilisait une collationCOLLATE. Les lignes sont désormais regroupées par préfixe de tri à l’aide de cette collation, conformément à l’ordre de tri. #107365 (groeneai). - Correction d’un comportement indéfini lorsqu’une valeur à virgule flottante non finie (telle que
nanouinf) est transmise comme argument d’horodatage/de durée aux fonctions de tableprometheusQuery/prometheusQueryRange. Un tel argument déclenche désormaisBAD_ARGUMENTSau lieu de produire un horodatage erroné. #107417 (groeneai). - Correction de résultats incorrects dus à l’optimisation
optimize_rewrite_aggregate_function_with_ifpour les fonctions d’agrégation qui préservent les valeurs utilesNULL(famille*_respect_nulls:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls). L’optimisation ne réécrit plusf(if(cond, x, NULL))sous la forme-Ifpour ces fonctions. #107430 (groeneai). - Ajout d’une validation des limites mal formées dans les entrées ORC. #107580 (al13n321).
- Correction d’un déni de service non authentifié par épuisement de la mémoire sur le port du protocole MySQL. #107599 (tiandiwonder).
- Correction d’un problème rendant l’interface MySQL inutilisable avec
MySQL Connector/J8.2.0 et versions ultérieures (y compris 9.x). Le champinfodu paquetOKest désormais encodé avec une longueur, comme sur le serveur MySQL, afin que le pilote JDBC puisse se connecter. #107693 (alexey-milovidov). - Correction d’une erreur logique
Block structure mismatch in UnionStep stream(arrêt du serveur dans les builds de débogage/avec sanitizer,Code: 49dans les builds de publication) qui survenait lorsque des branches sœurs d’unUNION/INTERSECT/EXCEPTne différaient que par leur prédicatWHEREet que le prédicat de l’une d’elles était replié en constante dans une colonneConst. #107719 (groeneai). - La lecture de données
ArrowetArrowStreamcomportant des colonnesStringouBinaryvides, produites par Apache Arrow Java avant la version 19.0.0 (y compris Apache Spark), ne déclenche plusINCORRECT_DATA. #107764 (Algunenano). - Les blocs Native mal formés dont le discriminateur
Variantréférence une variante inexistante sont désormais rejetés de façon sûre. #107991 (uwezkhan). - Correction d’une régression des performances lors de la lecture de colonnes
Dynamicavec plusieurs threads. #107997 (Avogar). - Le paramètre de data lake obsolète
storage_catalog_urlest désormais correctement rejeté par la protection du catalogue (auparavant, seulsstorage_catalog_typeetstorage_aws_access_key_idétaient vérifiés), et le message d’erreur répertorie tous les paramètres obsolètes. #108040 (alexey-milovidov). - Correction d’un problème où la fonction/moteur de table
ArrowFlightrejetait une collection nommée omettant la clé facultativedataset, avec l’erreurNo such key 'dataset'. #108041 (alexey-milovidov). - Les secrets et les informations d’identification sont désormais masqués dans
system.query_views_log.view_queryau lieu d’apparaître dans le SQL journalisé des vues. #108214 (Fidelaggio). - Correction de
type_json_allow_duplicated_key_with_literal_and_nested_object, qui ne fonctionnait pas avec les chemins typés dans JSON. #108218 (Avogar). - Correction d’un comportement indéfini (pointeur nul passé à
memcpy) dans les fonctionsdetectCharsetetdetectLanguageUnknownlorsque la chaîne d’entrée dépasse 32 768 octets et qu’aucun jeu de caractères ne peut être détecté. #108250 (groeneai). - Correction de l’erreur
NOT_FOUND_COLUMN_IN_BLOCKpour les requêtes utilisant les colonnes virtuelles_part_starting_offset/_part_offsetdans WHERE avec la matérialisation paresseuse. #108287 (vdimir). - Masquage des arguments secrets de fonctions telles que
encrypt,decryptetHMACdans les sorties deEXPLAIN actions,EXPLAIN headeretEXPLAIN PIPELINElorsqueformat_display_secrets_in_show_and_selectest désactivé (paramètre par défaut). #108386 (Algunenano). CREATE OR REPLACEréussit désormais pour une vue matérialisée actualisable lorsque sa cibleTOappartient déjà à cette même vue. Les cibles appartenant à une autre vue restent refusées. #108392 (evillique).- Le chemin du modèle utilisé par
catboostEvaluateest désormais limité au répertoireuser_files, comme pourfile()et les sources de dictionnaires. Auparavant, la fonction acceptait un chemin de système de fichiers arbitraire sans vérification de confinement, ce qui permettait de vérifier l’existence de fichiers hors deuser_fileset d’en déclencher la lecture. Les modèles doivent désormais se trouver dansuser_files. #108463 (groeneai). - Correction de
CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE, qui laissait la nouvelle vue non abonnée à sa table source, entraînant la perte silencieuse de chaque ligne insérée après le remplacement. #108728 (alexey-milovidov). - Correction d’une erreur de segmentation lors de la fusion d’états d’agrégat
uniqExactavecGROUPING SETS,ROLLUPouCUBEetmax_threads > 1. #108928 (Algunenano). - Correction d’une possible erreur logique “Unexpected substream … for column …” lors de la mise à jour du paramètre de compatibilité. #109496 (Avogar).
- La fonction
getClientHTTPHeadertraite désormais les noms d’en-têtes sans distinction entre majuscules et minuscules, conformément à la RFC 9110 ; en particulier, l’en-têteauthorizationest désormais filtré quelle que soit sa casse. #109791 (Felixoid). - Correction d’une perte silencieuse de données avec les insertions asynchrones et la déduplication (
async_insert=1,async_insert_deduplicate=1). Lorsque plusieurs entrées async-insert avec des valeursinsert_deduplication_tokendistinctes étaient regroupées dans un seul flush écrivant dans des partitions disjointes, chaque jeton était enregistré dans le journal de déduplication de chaque partition concernée par le flush, et non seulement dans la partition où ses propres lignes avaient été écrites. Une insertion ultérieure réutilisant l’un de ces jetons dans une partition où il n’avait jamais écrit était alors silencieusement dédupliquée. Les jetons sont désormais enregistrés uniquement pour la partition où leurs lignes ont réellement été écrites. #111049 (groeneai). - Correction des insertions asynchrones au format Native afin qu’une entrée mise en mémoire tampon, devenue incompatible après
ALTER ... MODIFY COLUMN, n’entraîne plus l’échec de l’ensemble du lot. #111108 (Felixoid). - Correction de
CREATE OR REPLACEd’un dictionnaire par un objet d’un autre type : l’opération échouait avecCANNOT_DETACH_DICTIONARY_AS_TABLEalors que le remplacement avait déjà été validé, laissant une table_tmp_replace_*orpheline. #111142 (evillique). - Correction d’une fuite de mémoire liée au certificat pair lors des handshakes TLS avec vérification des certificats activée. #111425 (thevar1able).
- Correction d’une erreur logique
Block structure mismatch in IntersectOrExceptStep stream: different number of columnssusceptible de se produire lorsque l’optimisation de fractionnement des filtres (query_plan_split_filter) s’exécutait sur une clauseWHEREdont le nom de la colonne de filtre était également celui d’une colonne d’entrée. L’optimisation laissait une colonne interne__split_filterdans l’en-tête de sortie de la branche, qui différait alors de celui de la branche sœur d’une opération ensembliste telle queINTERSECTouUNION. #111930 (groeneai). - Correction de résultats incorrects pour les filtres ou les expressions
ORDER BYutilisanttoStringavec des valeursTime,Time64ouDateTimedans des fuseaux horaires appliquant l’heure d’été. Restauration également de l’optimisation de lecture dans l’ordre pourORDER BYsur un préfixe de la clé de tri de la table et pour les conversions deStringversNullable(String). #113291 (vdimir). - Correction de
ATTACHd’une tableKafkalorsquekafka_num_consumersdépasse la limite dérivée du nombre de cœurs CPU. #113390 (evillique). - Désactivation de l’analyse distribuée des index lorsque des projections sont utilisées afin d’éviter des résultats de requête incorrects. #115132 (azat).
- Correction d’un bug dans la fonction
formatRowNoNewlinesusceptible de produire des résultats incorrects ou une erreur logique lorsqu’une ligne est formatée en résultat vide. #115669 (alexey-milovidov). - Ne renvoie plus de mémoire non initialisée dans le résultat d’un littéral de chaîne binaire dont la longueur n’est pas un multiple de huit, ni depuis le décompresseur LZ4 lorsqu’un bloc compressé n’a pas de corps. #115704 (alexey-milovidov).
- Inclusion des chemins d’objet dans les hachages de déduplication afin d’empêcher la déduplication incorrecte de valeurs d’objet distinctes. #115866 (Felixoid).