Changements incompatibles avec les versions précédentes
Modifications des requêtes et de la syntaxe
- L’opérateur
INutilise désormais une sémantique de correspondance exacte des valeurs pour le typeBool: seules les valeurs0et1de l’ensemble correspondent à des valeursBool. Auparavant, les valeurs numériques supérieures à255dans l’ensembleINétaient incorrectement forcées à true, de sorte queSELECT CAST(1, 'Bool') IN (256)renvoyait1. Cette expression renvoie désormais correctement0. #93115 (Ashrith Bandla). - Correction de la priorité de l’opérateur
NOTpour l’aligner sur le standard SQL :NOTa désormais une priorité inférieure àIS NULL,BETWEEN,LIKEet aux opérateurs arithmétiques. Par exemple,NOT (x) IS NULLest désormais interprété commeNOT (x IS NULL)au lieu de(NOT x) IS NULL. Cela peut modifier le résultat des requêtes qui s’appuyaient sur l’ancien comportement (non standard). #97680 (Alexey Milovidov). SELECTn’est plus autorisé comme identifiant non cité dans un élément de liste d’expressionsWITH. #101059 (Aruj Bansal).- L’opérateur
INrejette désormais les conversionsDecimalavec perte à l’intérieur des types composites (Tuple,Array,Map), ce qui rend son comportement cohérent avec celui des comparaisons scalaires de niveau supérieur. Auparavant, les vérifications de précision n’étaient appliquées qu’aux valeurs scalaires de niveau supérieur : par exemple,CAST('33.3', 'Decimal64(1)') IN (33.33)renvoyait correctement0, maisCAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])renvoyait incorrectement1. Les deux cas renvoient désormais correctement0. #101812 (Nihal Z. Miaji).
Modifications des types de données
- Les versions de sérialisation des types de données sont désormais propagées aux types de données imbriqués. Par exemple, la version de sérialisation de String
with_size_streamn’était auparavant appliquée qu’aux colonnes String de premier niveau et aux éléments de Tuple ; elle s’applique désormais à tout type String à l’intérieur de n’importe quel type imbriqué, comme Array, Map, Variant ou JSON. Ce comportement est contrôlé par le paramètre MergeTreepropagate_types_serialization_versions_to_nested_types, désormais activé par défaut. Après cette modification, les nouvelles data parts créées ne peuvent plus être lues par les anciennes versions, mais les anciennes parts peuvent être lues par la nouvelle version. Les mises à niveau sont sûres, mais pas les retours à une version antérieure. #94859 (Pavel Kruglov). - Correction du boutisme de la sérialisation binaire de
QBitafin d’utiliser le format little-endian. #101378 (Raufs Dunamalijevs).
Modifications du stockage et des index
- Correction des métadonnées des projections normales afin que les projections avec des clés de tri multicolonnes soient correctement reconnues. #91352 (Amos Bird).
- Correction des fichiers d’index de saut qui ne respectaient pas le paramètre
replace_long_file_name_to_hash, ce qui provoquait des erreurs « Nom de fichier trop long » ainsi que des erreurs de lecture d’index pour les index aux noms longs. Les noms de fichiers des index de saut sont désormais hachés lorsqu’ils dépassentmax_file_name_length, comme pour les fichiers de colonne. Ce changement est rétrocompatible (les nouveaux serveurs lisent les anciennes parts), mais une rétrogradation (ou d’anciens serveurs lors d’une mise à niveau progressive) peut entraîner l’ignorance des index aux noms longs. #97128 (Raúl Marín).
Fonctionnalités supprimées
- Suppression du type de skip index
hypothesis. Il s’agissait d’une fonctionnalité expérimentale peu utilisée et d’un intérêt pratique limité. La création de tables avecINDEX ... TYPE hypothesisgénère désormais une erreur. #96874 (Alexey Milovidov). - Suppression de la fonction expérimentale
detectProgrammingLanguage. #99567 (Alexey Milovidov).
Modifications des paramètres et de la configuration
- La valeur par défaut de
mysql_datatypes_support_levela été modifiée, passant de vide àdecimal,datetime64,date2Date32, ce qui active par défaut le mapping correct de MySQLDATEversDate32, deDECIMAL/NUMERICversDecimalet deDATETIME/TIMESTAMPavec précision versDateTime64. Auparavant, les colonnes MySQLDATEétaient mappées versDate, qui ne peut pas représenter les dates antérieures au 1970-01-01, ce qui entraînait une corruption des données. #97716 (Alexey Milovidov).
Modifications des insertions et de la déduplication
- L’async insert est désormais activé par défaut — ClickHouse regroupe par lots toutes les petites insertions. Ce comportement est régi par le paramètre
compatibility: définircompatibilitysur une version inférieure à 26.2 rétablit l’ancienne valeur par défaut,false. Les insertions asynchrones peuvent être activées ou désactivées à plusieurs niveaux : dans les profils utilisateur de la config, pour la session, pour la requête ou pour la table MergeTree. #97590 (Sema Checherinda).
Modifications des tables système
- Restauration de la colonne
skip_indexesdanssystem.query_log. #101018 (Alexey Milovidov).
Autres changements incompatibles
mergeTreeAnalyzeIndexes{,UUID}accepte désormais un tableau de noms de parties au lieu d’une expression régulière, car les expressions régulières sont lentes (fonctionnalité expérimentale). #98474 (Azat Khuzhin).- La bibliothèque H3 a été mise à jour vers la v4, ce qui améliore la précision des calculs de longueur, de surface et d’autres mesures. Ce changement est incompatible avec les versions précédentes, car les nouveaux résultats diffèrent des anciens. #100348 (Alexey Milovidov).
- La manière dont la table
Mergegère les colonnes virtuelles a été modifiée. Si la table sous-jacente contient_tableou_database, ces colonnes sont lues depuis le stockage ; sinon, elles sont renseignées après l’étape de lecture, via l’étape d’expression. #101742 (Mikhail Artemenko).
Nouvelles fonctionnalités
Fonctions
- Ajout de la fonction
naturalSortKey(s)pour les clés de tri naturel. #90322 (Nazarii Piontko). - Ajout de la fonction
arrayAutocorrelation(arr [, max_lag]), qui calcule l’autocorrélation normalisée d’un tableau de nombres pour chaque décalage. Prend en charge les types de tableaux d’entiers, de nombres à virgule flottante et décimaux. #94776 (Wenyu Chen). - La fonction
has()est désormais prise en charge pour le type JSON afin de vérifier l’existence d’un chemin, comme avecMap. #96927 (DQ). - Ajout de la fonction de table
mergeTreeTextIndex(database, table, index), qui lit les données directement depuis un text index. Elle peut être utilisée pour l’introspection ou pour effectuer des aggregations sur les données du text index. #97003 (Anton Popov). - Ajout de la fonction SQL
obfuscateQuery. #98305 (Xuewei Wang). - Ajout des fonctions
caseFoldUTF8etremoveDiacriticsUTF8pour le repliement de casse Unicode et la suppression des signes diacritiques. #98973 (George Larionov). - La fonction
printfprend désormais en charge les chaînes de format non constantes, ce qui permet d’utiliser un format différent pour chaque ligne en fonction des valeurs des colonnes. #98991 (Yash). - Ajout de la fonction
highlight(), qui entoure les occurrences des termes de recherche dans une chaîne de texte avec des balises HTML (par défaut<em>/</em>). Prend en charge la correspondance ASCII insensible à la casse, la fusion automatique des correspondances qui se chevauchent, ainsi que des balises d’ouverture et de fermeture personnalisées. #99131 (Peng). - Ajout de la fonction de chaîne
normalizeUTF8NFKCCasefoldpour la normalisation Unicode NFKC_Casefold, qui combine la normalisation NFKC avec le repliement de casse. #99276 (George Larionov). - Ajout du tokenizer
unicode_wordpour les full-text indexes et de la fonctiontokens. Il segmente le texte selon les règles de délimitation des mots Unicode : les mots ASCII sont formés avec des caractères de liaison (tiret bas, deux-points, point, apostrophe), tandis que les caractères Unicode non ASCII deviennent des tokens d’un seul caractère. Les stop words configurables utilisent par défaut la ponctuation CJK courante. #99357 (Amos Bird). - Ajout de la fonction
arrayTranspose, qui prend un tableau bidimensionnel (matrice) et le transpose. #101214 (Vitaly Baranov). - Ajout de la fonction
hasPhrase(aliasmatchPhrase) pour la recherche de phrases (séquences continues de tokens). La recherche s’effectue en brute-force et n’est pas encore prise en charge par le text index. #101997 (Elmi Ahmadov). - Ajout de
dotProductcomme fonction de distance prise en charge pour les vector similarity indexes. La direction du tri est désormais validée pour toutes les fonctions de distance afin d’éviter des résultats incorrects sans avertissement. #102254 (Renzo). - La fonction
stempeut désormais appliquer la racinisation à tous les mots/tokens dans les colonnesString,FixedString,Array([Fixed]String),Nullable,LowCardinalityetConst. #99137 (Jimmy Aguilar Mena). - La fonction
stemn’est plus expérimentale (auparavant, il fallait activerallow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). - Ajout de la fonction
JSONAllValues, qui renvoie toutes les valeurs d’une colonneJSONsous forme deArray(String), les valeurs étant sérialisées en représentation textuelle et ordonnées selon leur nom de chemin. Ajout également de la prise en charge des index textuels pour l’expressionJSONAllValuessur les colonnesJSON: lorsqu’un index textuel est créé surJSONAllValues(json_column), il est automatiquement utilisé pour filtrer les requêtes sur les sous-colonnesJSON(par exemplejson_column.key1 = 'value'). #100730 (Anton Popov). - Ajout d’unités compatibles avec PostgreSQL à l’opérateur
EXTRACT:EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADEetMILLENNIUM. Correction également deEXTRACT(WEEK FROM date), qui renvoyait auparavant une erreur. #100274 (Alexey Milovidov). - Ajout de la prise en charge, via un sucre syntaxique du parseur, de la syntaxe SQL standard de la fonction
OVERLAY. La fonctionoverlayexiste déjà ; cela ajoute la prise en charge de la forme basée sur des mots-clés utilisantPLACING,FROMetFORcomme séparateurs. #101681 (Desel72). - Les valeurs
DateetDate32peuvent désormais être additionnées aux valeursTimeetTime64à l’aide de l’opérateur+, produisant un résultatDateTimeouDateTime64. Par exemple,SELECT toDate('2024-01-15') + toTime('14:30:25')renvoie2024-01-15 14:30:25. Le résultat est calculé dans le fuseau horaire de la session, et les résultats hors plage sont gérés conformément au paramètredate_time_overflow_behavior. #102421 (Nihal Z. Miaji).
Fonctionnalités SQL et de requête
- Lorsqu’un paramètre est de type
Nullableet n’est pas spécifié, sa valeur est désormais considérée commeNULL. #93869 (Vikash Kumar). - ClickHouse peut désormais éliminer des data parts entières dans les requêtes
SELECTen s’appuyant sur les statistiques min/max. #94140 (zoomxi). - Ajout de la prise en charge des Materialized CTEs, qui n’évaluent les CTE qu’une seule fois pendant l’exécution de la requête et stockent leurs résultats dans des tables temporaires. #94849 (Dmitry Novik).
- Certaines fonctions peuvent désormais être utilisées sans parenthèses en SQL. #95949 (Aly Kafoury).
- Ajout de la syntaxe de subcolumn combinée
json.@pathpour le typeJSON. Elle renvoie la valeur littérale sous forme deDynamicsi le chemin contient un scalaire, le sub-object sous forme deDynamicsi le chemin contient un objet imbriqué, ouNULLsi le chemin est absent. #98788 (Pavel Kruglov). - Ajout du keyword
SOMEpour les expressions de subquery. Son comportement est identique à celui deANY. #99842 (Artem Kytkin). - Ajout de la prise en charge de
SET TIME ZONE 'tz'comme alias deSET session_timezone. #99883 (phulv94). - Ajout de la prise en charge de la clause SQL standard
VALUEScomme expression de table dansFROM, par exempleSELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). - Ajout de la prise en charge des littéraux d’intervalle composés conformes au standard SQL avec des qualificateurs de plage
TO, par exempleINTERVAL '1:30' HOUR TO MINUTE, décomposés en interne en sommes d’intervalles. #100453 (Desel72). - Ajout de la commande
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'pour les modes ordered et unordered. #100709 (Bharat Nallan).
Moteurs de table et stockage
- Ajout de la prise en charge de la lecture incrémentielle pour le moteur de table
Paimon, avec suivi de la progression des snapshots via Keeper, y compris des lectures delta ciblées de snapshots viapaimon_target_snapshot_id. #93655 (XiaoBinMu). - Ajout de la prise en charge de ZooKeeper auxiliaire dans
DatabaseReplicated. #95590 (RinChanNOW). - Ajout de la prise en charge de la lecture des types de timestamp à la nanoseconde d’Iceberg v3 (
timestamp_nsettimestamptz_ns), mappés versDateTime64(9)etDateTime64(9, 'UTC'). Cela permet à ClickHouse de lire des données Iceberg utilisant ces types dans le schéma ; cela ne constitue ni une prise en charge complète d’Iceberg v3, ni la possibilité d’écrire en Iceberg v3 avec ces types. #97132 (Dmitry Kovalev). - Ajout de
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')pour les tables Iceberg. #97904 (murphy-4o). - Ajout d’un nouveau cache SLRU pour les métadonnées Parquet afin d’améliorer les performances de lecture en évitant de retélécharger des fichiers uniquement pour lire les métadonnées. #98140 (Grant Holly).
- Ajout de la prise en charge des index de saut de MergeTree pour les colonnes JSON à l’aide de
JSONAllPathsavec les types d’indexbloom_filter,tokenbf_v1,ngrambf_v1ettext(inversé), permettant d’ignorer des granules en fonction de l’ensemble des chemins JSON présents dans chaque granule. #98886 (Pavel Kruglov). - Ajout de l’index de projection
commit_order, qui réorganise les données dans l’ordre d’insertion. #99004 (Mikhail Artemenko). - Ajout de la sérialisation par buckets pour les colonnes
Mapdans MergeTree (map_serialization_version = 'with_buckets'). Les clés sont réparties dans des buckets basés sur le hachage afin que la lecture d’une seule clé (m['key']) ne lise qu’un seul bucket au lieu de la colonne entière, ce qui offre une accélération de 2 à 49x pour les recherches sur une seule clé selon la taille de la map. Le nombre de buckets et la stratégie de répartition peuvent être contrôlés par les nouveaux paramètres MergeTreemap_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficientetmap_buckets_min_avg_size. Le paramètremap_serialization_version_for_zero_level_partsconserve la sérialisation de base pour les insertions afin d’éviter une surcharge d’écriture, tandis que les parts fusionnées utilisent des buckets. Les index de saut surmapKeys/mapValuessont pris en charge avec la sérialisation par buckets, etoptimize_functions_to_subcolumnsréécritm['key']en lecture d’une subcolumn par clé lorsque des buckets sont disponibles. #99200 (Pavel Kruglov).
Insertion et déduplication
- Mise en place d’un nouveau comportement pour
max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rowsetmin_insert_block_size_bytesdans le processus de squashing, régi par le paramètre de compatibilitéuse_strict_insert_block_limits. #94207 (Kirill Kopnev).
Paramètres et configuration
- Ajout du paramètre MergeTree
table_readonlypour marquer les tables en lecture seule et empêcher les insertions et les modifications. #97652 (Alexey Milovidov). - Ajout du paramètre
use_partition_pruning(aliasuse_partition_key). Définissez-le surfalsepour désactiver l’élagage des partitions en fonction de la clé de partition. #97888 (Nihal Z. Miaji). - Chaque entrée
type=httpdans<protocols>peut désormais spécifier une clé<handlers>personnalisée pointant vers une section de configuration<http_handlers_*>distincte, ce qui permet d’appliquer des règles de routage HTTP différentes selon le port. #98414 (Amos Bird). - Ajout de deux paramètres MergeTree —
replicated_fetches_min_part_leveletreplicated_fetches_min_part_level_timeout_seconds— qui permettent aux répliques d’éviter de récupérer auprès de leurs homologues des parts récemment insérées (non fusionnées), réduisant ainsi la surcharge liée à la réplication lors d’une ingestion intensive. #98625 (tanner-bruce). - Ajout du paramètre serveur
restore_access_entities_with_current_grants. Lorsqu’il est activé, les privilèges des utilisateurs/rôles restaurés sont limités à ce que l’utilisateur effectuant la restauration est autorisé à accorder (même sémantique queGRANT CURRENT GRANTS), au lieu d’échouer avecACCESS_DENIED. #98795 (pufit). - Ajout des paramètres
max_skip_unavailable_shards_numetmax_skip_unavailable_shards_ratiopour limiter le nombre de shards pouvant être ignorés silencieusement lorsqueskip_unavailable_shardsest activé. Si le nombre ou la proportion de shards indisponibles dépasse le seuil configuré, une exception est levée au lieu de renvoyer silencieusement des résultats incomplets. #99369 (Alexey Milovidov). - Implémentation de quotas par hash de requête normalisée pour protéger les services ClickHouse publics contre les abus.
NORMALIZED_QUERY_HASHest pris en charge comme type de clé de quota — avec un quota distinct pour chaque requête normalisée unique, de sorte queCREATE QUOTA q KEYED BY normalized_query_hashsuit chaque requête distincte indépendamment.QUERIES_PER_NORMALIZED_HASHest pris en charge comme type de ressource de quota — limitant le nombre maximal d’exécutions d’une même requête normalisée dans un intervalle, de sorte queMAX queries_per_normalized_hash = 100empêche un même modèle de requête de s’exécuter plus de 100 fois. #99586 (Alexey Milovidov). - Le paramètre MergeTree
auto_statistics_typesa désormais pour valeur par défautminmax, uniq, de sorte que des statistiques minmax et uniq sont créées automatiquement pour toutes les colonnes appropriées dans les nouvelles tables.materialize_statistics_on_inserta désormais pour valeur par défautfalse, de sorte que les statistiques sont construites lors des fusions plutôt qu’au moment de l’insertion, réduisant ainsi la surcharge des insertions. Définissezmaterialize_statistics_on_insert = 1pour rétablir l’ancien comportement. #101275 (Han Fei). - Ajout du paramètre d’actualisation
prefer_dependency_replicapour les chaînes de dépendances de vues matérialisées afin de réduire les données manquantes dues au décalage de réplication entre répliques. #101591 (Seva Potapov).
Authentification
- Ajout de l’option de configuration LDAP par serveur
<follow_referrals>(par défautfalse) pour contrôler si le client LDAP suit les renvois. Désactiver le suivi des renvois évite les timeouts et les blocages lors des recherches à partir d’une base DN racine de domaine Active Directory, et réduit le bruit dans les journaux. #96765 (paf91).
Tables système
- Ajout de
system.histogram_metric_log, une nouvelle table système qui prend périodiquement des instantanés de toutes les métriques sous forme d’histogrammes (par ex. les latences S3/Azure, les durées des étapes de traitement des requêtes de Keeper). La colonnevaluedesystem.histogram_metricsest désormais de typeFloat64pour offrir davantage de flexibilité et une meilleure compatibilité avec le modèle de données Prometheus. #103046 (Miсhael Stetsyuk).
Fonctionnalités expérimentales
- Ajout du codec de compression ALP pour nombres à virgule flottante (sans fallback ALP_rd pour les doubles non compressibles). #91362 (Nazarii Piontko).
- Ajout des Lazy Type Hints expérimentaux pour les colonnes JSON. Lorsqu’ils sont activés via
allow_experimental_json_lazy_type_hints,ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName), lorsqu’il ajoute ou modifie uniquement des indications de type, s’exécute instantanément comme une simple opération sur les métadonnées, sans réécriture des données historiques. Les indications de type sont appliquées au moment de la requête pour les anciennes parts et matérialisées lors des INSERT et des fusions en arrière-plan. #97412 (tanner-bruce). - Ajout de la prise en charge des dialectes SQL externes via la bibliothèque
polyglot. #99496 (Alexey Milovidov). - Ajout du paramètre
query_plan_optimize_join_order_randomize, qui rend aléatoires les statistiques utilisées pour la réorganisation des jointures, ce qui est utile pour les tests. #100643 (Vladimir Cherkasov). - Ajout de la prise en charge des AI functions dans ClickHouse, permettant aux utilisateurs d’appeler des points de terminaison OpenAI et Anthropic en SQL.
aiGenerateest la première fonction de ce type incluse. #100831 (George Larionov). - Ajout des AI functions
aiClassify,aiExtractetaiTranslatepour exploiter des API de LLM dans ClickHouse. #100832 (George Larionov). - Ajout de la prise en charge des data lakes sur Azure avec Delta Kernel. #102202 (Smita Kulkarni).
Améliorations des performances
Performances des JOIN
- Quelques améliorations ont été apportées à
HashJoinetConcurrentHashJoin. #96663 (Yarik Briukhovetskyi). - Ajout de la prise en charge de l’inversion des côtés des JOIN
ANTI,SEMIetFULLen fonction des statistiques de l’optimiseur. #97498 (Hechem Selmi). - Réduction de la contention du cache dans les JOIN
RIGHTetFULLen vérifiant siJoinUsedFlagsest défini avant écriture. #99274 (Hechem Selmi). - Accélération des hash joins sur des clés
Int32etInt64couvrant une petite plage, grâce à l’utilisation d’une table de hachage à index direct. #99275 (Hechem Selmi).
Optimisation des requêtes
- Optimisation du saut de granules pour
pointInPolygonsur de grands polygones, et correction d’une erreur dans l’analyse d’index depointInPolygonqui se produisait lors de l’élagage par clé primaire. #91633 (Nihal Z. Miaji). optimize_read_in_orderest désormais pris en compte lors de la lecture des projections. #95885 (Andrey Zvonov).- Légère optimisation de la lecture depuis le dictionnaire du text index, ce qui améliore les performances globales de l’analyse du text index. #97519 (Anton Popov).
- Amélioration des performances de l’analyse du text index pour les requêtes comportant des conditions combinées impliquant à la fois des colonnes indexées et non indexées. Auparavant, l’optimisation de sortie anticipée lors de l’analyse d’index était désactivée à tort dans ce type de cas. #98096 (Anton Popov).
- Amélioration des performances des requêtes avec des expressions constantes qui génèrent des arrays ou des maps très volumineux. #98287 (Alexey Milovidov).
- Correction de l’analyse des conditions sur la clé pour les clés primaires
DateTime64comparées à des constantes entières, ce qui empêchait auparavant tout élagage de granules. #98410 (Amos Bird). - Le paramètre
optimize_syntax_fuse_functionsest désormais activé par défaut. #98424 (Alexey Milovidov). - L’élagage des partitions est désormais autorisé lorsque le prédicat contient n’importe quel opérateur de comparaison (
=,<,>,!=) et que la clé de partition est enveloppée dans une chaîne de fonctions déterministes (par exemple, avecPARTITION BY x, des prédicats commecityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026outoYYYYMM(x) != 2026utiliseront tous la clé de partition pour l’élagage). #98432 (Nihal Z. Miaji). - L’optimisation de lecture dans l’ordre et l’élagage par clé primaire sont désormais autorisés lorsque le type cible de
CASTestNullableet que la conversion est monotone ; par exemple, avecPRIMARY KEY x, ClickHouse peut utiliser l’optimisation de lecture dans l’ordre pourORDER BY x::Nullable(UInt64)et l’élagage par clé primaire pour des prédicats tels queWHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji). - L’élagage d’index et le pushdown des filtres sont désormais autorisés lorsqu’une colonne entière est comparée à un littéral flottant ; par exemple, des prédicats comme
WHERE x < 10.5peuvent désormais utiliser la clé primaire pour l’élagage, et des filtres tels queprime < 1e9ounumber < 1e5sont désormais poussés vers les table functionsprimes()etnumbers()au lieu d’entraîner une exécution non bornée. #98516 (Nihal Z. Miaji). - Les requêtes qui filtrent sur des colonnes de clé primaire MergeTree avec des alternances Regex sur des chaînes littérales, telles que
^(abc-1|abc-2), peuvent désormais utiliser l’élagage par clé primaire lorsque les alternatives partagent un préfixe commun. #98988 (Yash). - Optimisation de
INTERSECT ALLetEXCEPT ALL. #99097 (Raufs Dunamalijevs). - Ajout de la prise en charge de l’optimisation
read_in_order_use_virtual_rowpour les lectures en ordre inverse. #99198 (Vladimir Cherkasov). - Requêtes discontinues plus rapides pour les colonnes
LowCardinalityavec un seul dictionnaire. #99285 (Ivan Babrou). - Correction de la dégradation des performances de mise à l’échelle pour les requêtes courtes avec agrégation sur des machines dotées d’un grand nombre de cœurs. Lorsqu’une requête lit peu de marks, le pipeline ne s’étend plus jusqu’à
max_threadsaprès l’agrégation, ce qui évite le surcoût lié à des streams presque vides. #99493 (Alexey Milovidov). - Amélioration des performances des requêtes avec répliques parallèles grâce à une sélection correcte de la taille des tâches de lecture. #99801 (Nikita Taranov).
- Suppression des éléments
ORDER BYredondants en fin de clause une fois que toutes les clésGROUP BYsont couvertes par le préfixeORDER BY. #100157 (Alexey Milovidov). - Optimisation des requêtes en appliquant la clause
LIMITau niveau deUNION ALL. #100364 (Alexey Milovidov). - Ajout de la prise en charge de la compilation JIT pour les comparaisons de colonnes
StringetFixedStringdansORDER BY, améliorant de 6 à 17 % les performances de tri pendant la phase de fusion pour les clés de tri riches en chaînes. #100577 (Raúl Marín). - Lorsque
read_in_order_use_virtual_rowest activé avec le nouveau paramètreread_in_order_use_virtual_row_per_block, les informations de limite des lignes virtuelles sont désormais émises après chaque block lu depuis MergeTree, ce qui permet à la fusion de redonner la priorité aux sources en cours de stream pour les parts dont les données sont entièrement filtrées parWHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov). - Meilleure parallélisation des requêtes avec des views simples (sur une table MergeTree sous-jacente) exécutées avec des répliques parallèles. #100815 (Igor Nikonov).
- Ajout de la prise en charge des répliques parallèles sur des views simples (y compris les views
UNION ALLéligibles sur des tablesMergeTree) lorsqueparallel_replicas_allow_view_over_mergetree=1. Cela parallélise la requête externe de la view plutôt que la requête interne, augmentant ainsi la parallélisation des requêtes entre les nœuds. #100958 (Igor Nikonov). - Optimisation de la lecture dans l’ordre de la clé primaire pour
full_sorting_mergelorsque des filtres avecINsont présents dans le plan de requête. #101261 (Nikita Taranov). - Amélioration des performances de
INSERT VALUESpour les colonnesMap,ArrayetTuplelorsque les valeurs sont transmises sous forme de chaînes échappées (par exemple'{\'key\':1}'), évitant un recours inutile à l’analyseur d’expressions SQL. #102119 (Joanna Hulboj).
Performance des fonctions et de l’agrégation
- Amélioration des performances de la fonction
levenshteinDistance. #94543 (Joanna Hulboj). - Optimisation des conversions par lots de types décimaux en évitant les appels de fonction pour chaque élément. #95923 (Konstantin Bogdanov).
- Amélioration des performances des requêtes
LIKE. #98149 (Elmi Ahmadov). - Optimisation de la fonction d’agrégation
avgWeightedgrâce à l’utilisation d’accumulateurs locaux au lieu d’un transfert par stockage pour chaque ligne via un état d’agrégation, avec un gain de performances pouvant atteindre 27 % pour les entréesNullable. #98793 (Antonio Andelic). - Accélération des fonctions
var*Stableetstddev*Stablepour les colonnesFloat64grâce à la dévirtualisation de la boucle interne. Cela permet des optimisations du compilateur (FMA/registres) qui modifient les résultats en virgule flottante au niveau de l’ULP. #99460 (Riyane El Qoqui). - Utilisation de l’encodage base58 optimisé de Firedancer pour les entrées de 32/64 octets (automatique pour
base58Encode), avec en plus la possibilité d’utiliser le décodage base58 optimisé si le résultat décodé fait 32/64 octets (explicitement avecbase58Decode('...', 32)). #99461 (Joanna Hulboj). - Optimisation de la fonction
cutURLParameteren supprimant les décalages mémoire inutiles. #100218 (Nikita Semenov). - Conversion plus rapide des flottants en chaînes pour les grandes valeurs entières grâce à l’extension du chemin rapide
itoaavec un arrondi compatible avec dragonbox. #100649 (Raúl Marín). - Remplacement de dragonbox par zmij pour une conversion des flottants en chaînes 1,5 à 3 fois plus rapide. #100650 (Raúl Marín).
- Conversion plus rapide de
Int128/UInt128en chaînes grâce au remplacement de la division logicielle par la réduction de Barrett et au déroulage de la boucle de conversion. #100671 (Raúl Marín). - Évite la création de threads redondants lors du merge parallèle de
UniqExactSet. #100686 (Jiebin Sun). - Ajout d’un merge parallèle par lots pour
UniqExactSet. #100687 (Jiebin Sun).
Performances du stockage et des E/S
- Réduction de la contention sur les verrous lors des opérations en lecture seule sur les tables ReplicatedMergeTree avec mutations terminées. #95771 (Eduard Karacharov).
- Iceberg peut désormais préremplir de manière asynchrone les métadonnées dans le cache, via le paramètre
iceberg_metadata_async_prefetch_period_msdéfini lors de la création de la table. Les requêtesSELECTsur les tables Iceberg peuvent désormais spécifier le paramètreiceberg_metadata_staleness_ms, ce qui permet à ClickHouse de s’appuyer sur la version des métadonnées en cache si elle est plus récente que le seuil d’obsolescence indiqué ; sinon, le catalogue Iceberg distant est interrogé pour récupérer les métadonnées les plus récentes. Cela peut supprimer les appels au catalogue Iceberg pendant le traitement des requêtes, avec un gain de performances notable à la clé. #96191 (Arsen Muk). - Le mode ordered de S3Queue utilise désormais
ListObjectsV2StartAfterde S3 pour éviter de relister tout l’historique du préfixe, ce qui réduit les appels àListObjects. #96370 (Venkata Vineel). - Activation des lectures parallèles avec le moteur de table YTsaurus. #97343 (MikhailBurdukov).
- Amélioration des performances des lacs de données. Dans les versions précédentes, la lecture depuis le stockage d’objet n’adaptait pas la taille du pipeline au nombre de threads de traitement. #99548 (Alexey Milovidov).
- Autorisation du prefetch lors de la lecture d’un fichier distant via le userspace page cache. #99919 (Alexey Milovidov).
- Correction d’une régression significative des performances d’INSERT lorsque
deduplicate_insert=enable(valeur par défaut depuis 26.2), en reportant le calcul du hash des données de l’étape de squashing vers le sink et en utilisant le hachage par lot des colonnes viaupdateHashWithValueRange, ce qui réduit la surcharge d’environ 2,5 s à environ 0,5 s pour 5 M de lignes avec 22 colonnes. #101494 (Sema Checherinda).
Optimisation de la mémoire
- Pour les insertions synchrones, le bloc d’origine (nécessaire à la déduplication) peut désormais être omis afin d’économiser de la mémoire. #96661 (Sema Checherinda).
- Amélioration des performances et réduction de l’utilisation mémoire pour les fonctions de fenêtre parallèles dans certains scénarios, ainsi que pour les charges de travail
arrayFoldavec de grands tableaux. Cela peut également réduire la pression liée aux défauts de page et améliorer la stabilité lorsque les requêtes concernées sont soumises à des limites mémoire strictes. #98892 (filimonov).
Améliorations
Requêtes et SQL
- Les projections agrégées sont désormais correctement prises en charge dans les vues. #88798 (Amos Bird).
optimize_aggregators_of_group_by_keysoptimise désormais correctement les fonctions d’agrégation dans les requêtesGROUPING SETS. #93935 (Xiaozhe Yu).- Ajout de la prise en charge de l’optimisation convertissant les jointures
OUTERenINNERavecjoin_use_nulls. #95968 (Vladimir Cherkasov). cast_keep_nullablea été étendu pour fonctionner avec les typesDynamic/JSON. Lorsqu’il est activé, le transtypage deNULLà partir de types pouvant êtreNullablerenvoieNULL; sinon,NULLgénère une erreurCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).- Ajout de la clause
ROLEàCREATE USER. #97074 (Vitaly Baranov). - Ajout d’informations sur les filtres différés sous forme d’élément distinct dans la sortie de la requête
EXPLAIN(lors de l’utilisation de politiques de lignes/PREWHERE avec FINAL). #97374 (Yarik Briukhovetskyi). - Ajout de la prise en charge des expressions de jointure de tables entre parenthèses dans la clause
FROM, par exempleSELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - Application des index de saut de données lors de l’analyse d’index distribuée. #97767 (Azat Khuzhin).
- La clé de tri d’une table peut désormais être une expression comme
toDate(time), et la décision de ne pas différer de telles expressions est désormais prise lorsqu’elles font partie de filtres. #98237 (Yarik Briukhovetskyi). - L’optimiseur d’ordre des jointures déduit désormais des prédicats transitifs d’équi-jointure à partir des conditions de jointure existantes. Par exemple, avec
A.x = B.x AND B.x = C.x, l’équivalenceA.x = C.xest reconnue, ce qui permet à l’optimiseur d’envisager des jointures directes entre des tables connectées transitivement. Cela peut améliorer la qualité du plan pour les schémas en étoile et en flocon. Cette fonctionnalité est contrôlée par le nouveau paramètreenable_join_transitive_predicates(désactivé par défaut). #98479 (Alexander Gololobov). - Lorsque
apply_row_policy_after_finalouapply_prewhere_after_finalest activé, les conditions composéesANDdans les politiques de lignes etPREWHEREsont désormais décomposées pour extraire les atomes de clé de tri en vue de l’analyse de l’index de clé primaire. Auparavant, si un filtre différé contenait un mélange de prédicats sur la clé de tri et hors clé de tri (par exemplex > 1 AND y != 'foo'), l’expression entière était exclue de l’analyse d’index. #98513 (Yarik Briukhovetskyi). - Seules les répliques “actives” (joignables) participent désormais à l’analyse d’index distribuée. #98521 (Azat Khuzhin).
- Le nombre de nœuds utilisés dans l’heuristique automatique des répliques parallèles a été plafonné au nombre réel de nœuds du cluster (et non plus au seul paramètre
max_parallel_replicas). #98668 (Nikita Taranov). - Mise en œuvre des requêtes spéculatives et de la lecture asynchrone pour l’analyse d’index distribuée. #98724 (Azat Khuzhin).
- Ajout de la prise en charge de la clause
SAMPLEdans l’analyse distribuée des index. #98931 (Azat Khuzhin). - Ajout de la prise en charge de la monotonie pour la multiplication, ce qui permet l’élagage de la clé primaire pour les expressions
key * constant. #98983 (Amos Bird). - Les messages d’erreur de l’analyzer ne listent plus toutes les colonnes d’une table (ce qui pouvait produire des exceptions de plus de 150 KB). Les listes de colonnes sont désormais limitées à 10 entrées. #99002 (Yash).
- Les statistiques de colonnes issues de sous-requêtes avec jointures sont désormais correctement renvoyées afin que la requête parente puisse les utiliser pour réordonner les jointures. #99096 (Alexander Gololobov).
ALTER TABLE MODIFY COLUMN x TTL ...est désormais autorisé sans qu’il soit nécessaire de préciser le type de la colonne. #99208 (Nikolay Degterinsky).- Sortie
EXPLAIN PLAN pretty=1améliorée : affichage des colonnes de sortie de la requête de plus haut niveau, des libellés/symboles de relation de jointure avec estimation du nombre de lignes résultantes et de la localité, et inclusion des colonnes de sortie pour chaque étape de jointure/source. #99462 (Kirill Kopnev). - Correction d’un échec de la table function
merge()avec une erreurUNKNOWN_IDENTIFIERlors de requêtes sur des colonnes absentes de certaines tables distribuées/distantes sous-jacentes. #99833 (Alexey Milovidov). ConditionSelectivityEstimatorn’est plus utilisé dans l’optimiseur lorsque la condition n’est pas sous forme CNF (par exemplewhere a = 0, qui est une condition unique pour laquelle les statistiques ne peuvent pas aider). #100110 (Han Fei).distributed_index_analysis_min_indexes_bytes_to_activateest désormais appliqué après l’élagage des partitions. #100477 (Azat Khuzhin).EXPLAIN PIPELINEprend désormais en charge le paramètredistributed=1pour inclure les fragments de pipeline distants. #100513 (Nikita Taranov).use_partition_pruning = 0désactive désormais également l’élagage de l’indexMinMaxet l’optimisation de comptage sur les colonnes de clé de partition, en plus de désactiver l’élagage basé sur les clés de partition. #100904 (Nihal Z. Miaji).EXPLAIN [PLAN] pretty=1affiche désormais les expressions dans un format lisible. #100927 (Kirill Kopnev).accurateCastOrNulletaccurateCastOrDefaultprennent désormais en charge les types ciblesTuple, y compris lesTuplesimbriqués avec des élémentsNullable. Auparavant, ces fonctions rejetaient les ciblesTupleparce queTuplene pouvait pas se trouver à l’intérieur deNullable. #100942 (Nihal Z. Miaji).- Vous pouvez désormais utiliser une virgule finale dans la clause
WITHavant une requêteSELECT. #101093 (Aruj Bansal). - Mise en œuvre de la matérialisation différée des colonnes pour ReplacingMergeTree avec FINAL lorsque le prédicat est suffisamment sélectif. #101647 (Nikolai Kochetov).
- Amélioration des estimations de sélectivité par défaut pour les conditions sans statistiques, afin de les aligner sur les heuristiques standard du secteur : 0,1 pour la sélectivité de la condition
LIKE, 0,33 pour la sélectivité d’une condition inconnue. #101653 (Alexander Gololobov). - Intégration directe de la sous-requête VIEW dans l’arbre de requête afin de permettre davantage d’optimisations sur la VIEW. #100830 (Dmitry Novik).
Fonctions
- Vous pouvez désormais utiliser une entrée JSON/Object native avec les fonctions
JSONExtract. #96711 (Fisnik Kastrati). - Ajout de la fonction SQL
tokensForLikePattern, qui découpe les motifsLIKEen tokens tout en respectant la sémantique des caractères génériques :%et_sont traités comme des caractères génériques, les caractères génériques échappés (\%,\_) comme des littéraux, et les tokens adjacents à des caractères génériques non échappés sont ignorés. #97872 (Amos Bird). - Implémentation de la fonction
toDaysInMonth(), qui renvoie le nombre de jours dans le mois de la date spécifiée. #99227 (Vitaly Baranov). - Le tokenizer
unicodeWorda été renommé enasciiCJK. #100956 (George Larionov). - Ajout d’un sucre syntaxique au niveau du parseur pour la syntaxe de fonction
OVERLAYdu standard SQL. La fonctionoverlayexiste déjà ; cela ajoute la prise en charge de la forme basée sur des mots-clés, avecPLACING,FROMetFORcomme séparateurs. #101681 (Desel72). - La fonction
ngramsrejette désormais les longueurs de ngram non valides. Par exemple,SELECT ngrams('abc', 0)renvoie désormais une erreur. #101922 (Robert Schulze). - Ajout de la prise en charge du tokenizer
arraydans l’optimisationLIKE. #102880 (Elmi Ahmadov).
Moteurs de table et stockage
- Ajout d’un thread de nettoyage dédié pour MergeTree afin d’éviter les retards de nettoyage en cas de forte charge de merges. #91574 (Amos Bird).
- Les tables avec des règles
DELETE TTLpeuvent désormais utiliser l’algorithme de fusion verticale. #97332 (murphy-4o). - Les index marks des index secondaires sont désormais préchargés lorsque le paramètre
prewarm_mark_cacheest activé (chargés dans l’index mark cache pendant les fetches de data parts et au démarrage de la table). #97772 (Anton Popov). - Des index textuels peuvent désormais être créés sur des colonnes
Nullable([Fixed]String)etArray(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena). - Annulation anticipée des merges en arrière-plan dans
DROP DATABASEpour ordinary shared merge tree. #98161 (Shaohua Wang). - Ajout du paramètre
finalize_projection_parts_synchronouslypour permettre la finalisation synchrone des projection parts pendant INSERT, réduisant le pic d’utilisation mémoire pour les tables comportant de nombreuses projections, tout en conservant par défaut le comportement asynchrone existant. #98228 (Amos Bird). - Ajout du paramètre MergeTree
share_nested_offsets(valeur par défaut :true). Lorsqu’il est défini surfalse, les colonnes Array avec des noms à points (par exemplen.a,n.b) sont traitées comme des colonnes indépendantes au lieu de partager des fichiers d’offset et de vérifier l’égalité des tailles de tableau dans le cadre de l’ancienne sémantique Nested. #98416 (Amos Bird). - Optimisation de
TRUNCATE DATABASE TABLES LIKEpar pré-annulation des merges en parallèle. #98597 (Shaohua Wang). - Réduction de la contention sur les verrous dans
MergeTreeBackgroundExecutoren libérant les ressources des tâches sans acquérir le verrou. #98604 (Dmitry Novik). TRUNCATE DATABASEprend désormais en charge l’annulation de requête. #98828 (Shaohua Wang).- Redémarrage du cache de statistiques après modification d’un paramètre MergeTree. #98520 (Han Fei).
- Ajout du paramètre MergeTree
compress_per_column_in_compact_partspour contrôler l’organisation des blocs compressés au sein des compact parts. Quandtrue(par défaut, ce qui préserve le comportement actuel), chaque colonne démarre un nouveau bloc compressé, ce qui permet une décompression sélective. Quandfalse, toutes les colonnes d’une granule sont regroupées dans un même bloc compressé, ce qui améliore le taux de compression et les performances de lecture pour les workloads qui lisent systématiquement toutes les colonnes. #101114 (Amos Bird). - L’index textuel est désormais GA et reste activé quelle que soit la valeur du paramètre
compatibility, ce qui évite une désactivation inattendue lors des restaurations de sauvegarde ou en mode de compatibilité. #101518 (Nikita Fomichev). - Ajout de la prise en charge de l’index textuel construit sur
mapValues(map)avec l’opérateurIN. #99286 (Anton Popov). - Amélioration de l’analyse de plusieurs index textuels utilisés simultanément dans une même requête. Le paramètre
use_skip_indexes_on_data_readn’est plus requis pour l’optimisation de lecture directe des index textuels. #102255 (Anton Popov). - Ajout de la prise en charge de l’analyse des index de texte pour la fonction
hasPhraseen modeHINT. #102438 (Elmi Ahmadov). - Les statistiques MinMax des colonnes stockent désormais les valeurs minimale et maximale sous forme de
Field(typé) au lieu deFloat64. Le format sérialisé inclut le nom du type de la colonne en plus des valeurs. La version du fichier de statistiques passe à V2 ; les fichiers écrits par des versions antérieures doivent être rematérialisés (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).
Lacs de données
- Ajout d’une nouvelle requête pour vérifier l’état de
DataLakeCatalog. #94690 (Smita Kulkarni). - Amélioration des écritures Iceberg pour Unity Catalog. #98162 (Konstantin Vedernikov).
- Reconstruction des entités dans
IcebergManifestFileafin de rendre la maintenance du code moins sujette aux erreurs (corrige également certains problèmes de mise en cache des fichiers manifeste). #98231 (Daniil Ivanik). - Amélioration d’Iceberg
ALTER TABLE ... EXECUTE expire_snapshots(...)avec une prise en charge plus complète des arguments. #99130 (murphy-4o). - Modification de l’interface des insertions Iceberg avec le catalogue. Les paramètres
storage_catalog_type,storage_aws_access_key_idet autres paramètres similaires sont désormais obsolètes. #100334 (Konstantin Vedernikov). - Correction de la gestion incohérente des chemins dans Iceberg causée par l’utilisation mixte des chemins de stockage et des chemins de métadonnées ; obligation pour les tables Iceberg d’écrire un emplacement de table qui soit soit une URL, soit un chemin absolu ; ajout d’un mécanisme de repli pour le calcul de la taille des fichiers dans Azure ; prise en charge de
version-hint.txtde manière compatible avec Spark ; introduction d’abstractions au niveau des types pour éviter de confondre les types de chemins ; et correction de l’utilisation des suppressions positionnelles. #100420 (Daniil Ivanik). - Évite d’analyser l’ensemble du catalogue distant de lac de données pour les suggestions de table « Maybe you meant … » lorsque
show_data_lake_catalogs_in_system_tablesest désactivé. #100452 (Alsu Giliazova). - Les informations sur les objets utilisées pour analyser les fichiers de données Iceberg contiennent désormais le nombre de lignes du fichier et sa taille en octets, extraits du fichier manifeste. #100645 (Daniil Ivanik).
- Ajout d’un mécanisme d’élagage Delta Lake avec des colonnes virtuelles. #101634 (Konstantin Vedernikov).
S3 et stockage d’objets
- Ajout d’un espace réservé
{_schema_hash}pour le moteur de table S3, qui insère un hachage des définitions des colonnes de la table dans le chemin S3. #98265 (Miсhael Stetsyuk). - Ajout d’une nouvelle option pour forcer le style virtuel/par chemin pour les endpoints S3. #102378 (Konstantin Vedernikov).
Paramètres et configuration
- Les utilisateurs peuvent désormais spécifier plusieurs méthodes d’authentification dans la configuration
users_xml. #91998 (Flip-Liquid). - Vous pouvez désormais définir les paramètres
internal_replicationpour un cluster créé par la base de données Replicated. #97228 (Pervakov Grigorii). - Ajout du paramètre
allow_nullable_tuple_in_extracted_subcolumns, qui contrôle si les sous-colonnesTuple(...)extraites deTuple,Variant,DynamicetJSONsont renvoyées sous la formeNullable(Tuple(...))(NULLpour les lignes où la valeur est manquante) ou sous la formeTuple(...)(valeurs de tuple par défaut pour les lignes où la valeur est manquante). Désactivé par défaut ; ne peut être modifié qu’en redémarrant le serveur. #97299 (Nihal Z. Miaji). type_json_allow_duplicated_key_with_literal_and_nested_objectest désormais activé par défaut, ce qui évite les erreurs liées aux clés dupliquées lors de l’analyse de JSON comme{"a" : 42, "a" : {"b" : 42}}que ClickHouse peut produire à partir des données d’origine{"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).- Les statistiques de colonnes sont désormais disponibles en GA. Le paramètre
allow_experimental_statistics(par défautfalse) devient obsolète au profit deallow_statistics(par défauttrue) ;allow_statistics_optimizepasse de bêta à GA ; ClickHouse crée des statistiquesminmaxetuniqpour les nouvelles colonnes (paramètre MergeTreeauto_statistics_types) ; et, pour éviter de ralentir les INSERT,materialize_statistics_on_insertest désormais désactivé par défaut. #97487 (Han Fei). - La relation entre
enable_parallel_replicasetautomatic_parallel_replicas_modea été clarifiée : une requête ne peut utiliser des répliques parallèles que sienable_parallel_replicas > 0. Avecautomatic_parallel_replicas_mode=1, la décision est prise lors de la planification en fonction des statistiques collectées ; avecautomatic_parallel_replicas_mode=0, les répliques parallèles sont utilisées pour toutes les requêtes prises en charge, indépendamment des statistiques. Les opérations insert-select sur Distributed avec des répliques parallèles se comportent toujours comme siautomatic_parallel_replicas_mode=0. #97517 (Nikita Taranov). - La fonctionnalité d’usurpation d’identité (EXECUTE AS target_user) a été activée par défaut. #97870 (Vitaly Baranov).
- Ajout du paramètre
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(activé par défaut), qui interdit l’utilisation de profils de paramètres définis dans la configuration (à l’exception du profildefault) pour les utilisateurs définis en SQL. #98662 (Alexander Tokmakov). - Ajout d’un paramètre pour contrôler le comportement en cas d’incompatibilité de type pour
VariantetDynamic(throwou retour deNULL). #99085 (Bharat Nallan). - La valeur par défaut de
stderr_reactiona été remplacée, passant dethrowàlog_last, pour les UDFs exécutables. Les UDFs qui écrivent des avertissements sur stderr n’échouent plus lorsque le code de sortie est 0, et les exceptions liées au code de sortie incluent désormais le contenu de stderr. #99232 (Xu Jia). - Ajout du paramètre
input_format_column_name_matching_mode, qui permet différents modes de sensibilité à la casse pour les formats d’entrée. #99346 (manerone). - Les statistiques automatiques ne sont plus activées pour les tables système, car elles en tirent rarement parti. #102862 (Han Fei).
Tables système et monitoring
- Les index de saut de données utilisés lors de l’exécution des requêtes sont désormais suivis dans
system.query_log, dans une nouvelle colonneskip_indices. #99793 (Grant Holly). - La colonne
projections_duration_msa été ajoutée àsystem.part_log; elle enregistre, pour chaque projection, la durée de fusion/reconstruction en millisecondes. #98292 (Amos Bird). - L’alias de colonne
INDEX_LENGTHa été ajouté àinformation_schema.tables. #101705 (Robert Schulze). information_schema.tablesignore désormais les parties de table inactives, ce qui rend les valeurs de taille affichées plus réalistes. #101706 (Robert Schulze).
ClickHouse Keeper
find_super_nodesne se bloque plus lors du parcours des enfants du premier super-nœud, ce qui permet d’en trouver plusieurs. #97819 (pufit).- Marque une session ZooKeeper comme expirée dès le début de la finalisation, au lieu d’attendre la fin du thread d’envoi. Cela permet aux autres threads d’établir une nouvelle session sans délai. #99102 (Raúl Marín).
- Ignore les requêtes Keeper obsolètes pour les sessions déjà déconnectées, évitant ainsi des allers-retours Raft inutiles. Le nombre de sessions terminées suivies est plafonné par le paramètre de coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic). - Empêche la commande Keeper
mntrde se bloquer à cause de contentions sur les verrous. #99472 (Antonio Andelic). - Réduction de la contention sur les verrous dans le dispatcher Keeper grâce à l’appel des callbacks et à la distribution des requêtes de lecture en dehors de la portée du mutex, avec ajout de gardes de verrou profilés pour l’observabilité. #99751 (Antonio Andelic).
Gestion de la mémoire
- Ajout du paramètre de configuration
use_separate_cache_arenapour contrôler la séparation de l’arène de cache. #100664 (Seva Potapov).
Formats de données
- Ajout du paramètre
output_format_trim_fixed_stringpour supprimer les octets nuls de fin des valeursFixedStringdans les formats de sortie texte. #97558 (NeedmeFordev). - Il est désormais possible de lire des fichiers GeoParquet contenant différents types Geo dans une même colonne. #97851 (Mark Needham).
- La désérialisation des états binaires
AggregateFunctionexige désormais la consommation complète de l’entrée. Si des octets de fin superflus sont présents, ClickHouse lève une exception au lieu d’accepter des données d’état mal formées. #98786 (Nihal Z. Miaji). - Les utilisateurs peuvent désormais écrire les types de données intervalle de ClickHouse au format Arrow. #99519 (Peter Nguyen).
- Ajout de la prise en charge native de l’importation et de l’exportation des types de données UUID dans les formats Arrow et Parquet, avec inférence logique automatique pour les UUID de premier niveau et prise en charge d’indications de schéma explicites pour les UUID imbriqués. #99521 (Ivan).
- Tolérance à l’absence de padding à la fin du dernier bloc des fichiers Parquet. #99857 (Seva Potapov).
- L’exportation des UUID vers Parquet via l’encodeur Arrow inclut désormais l’annotation de type UUID correcte, ce qui évite de devoir convertir manuellement les données
FixedString(16)lors de la relecture des fichiers. #100150 (Ivan). - Ajout de la prise en charge native de l’importation des types de données Apache Arrow
StringViewetBinaryViewdans des colonnes ClickHouseString, ce qui améliore la compatibilité de l’ingestion basée sur Arrow. #100762 (Ivan). - Ajout de la prise en charge de
Nullable(Tuple)dans les formatsArrow,ArrowStream,ORCet l’ancien formatParquet. #101272 (Nihal Z. Miaji).
Collections nommées et dictionnaires
- Ajout de
sslmodeaux clés autorisées pour les sources de dictionnaire PostgreSQL, ce qui permet de configurer le mode SSL pour les connexions de dictionnaire PostgreSQL (par exemple avec AWS RDS, qui impose SSL par défaut). #98014 (mcalfin). - Évite la suppression des collections nommées dont dépendent des sources de dictionnaire. #98127 (Pablo Marcos).
- Ajout de la prise en charge des types
MapetJSON/Objectcomme attributs de dictionnaire. Les dictionnaires peuvent désormais stocker et récupérer des types complexes, notammentMap(String, String),Map(String, Array(String)),JSONetNullable(JSON), dans les layouts FLAT et HASHED. #98627 (yanglongwei). SYSTEM RELOAD DICTIONARIESrecharge désormais les dictionnaires dans un ordre topologique, afin que les dictionnaires dont la source est un autre dictionnaire utilisent des données à jour après le rechargement. #98356 (Alexey Milovidov).- Les dictionnaires de type cache ne prennent plus de verrou exclusif dans
hasKeys, ce qui réduit la contention sur les verrous grâce à l’utilisation d’un verrou partagé pour les lectures du cache. #100796 (liuguangliang).
Autres améliorations
- Les messages
ACCESS_DENIEDne révèlent plus les noms de colonnes, sauf si l’utilisateur peut afficher toutes les colonnes requises ; les noms de base de données et de table restent visibles dans le message. #91067 (filimonov). - Rechargement de la configuration du cluster si les adresses IP du nom d’hôte du serveur local changent, plutôt que lors d’un changement d’adresse IP de n’importe quel hôte. #93726 (Zhigao Hong).
- Vidage des buffers de logging asynchrone en cas de crash. #97836 (Azat Khuzhin).
- Réduction du verrouillage dans le contrôle d’accès. #97894 (Nikita Taranov).
- Mise à jour de ClickStack vers la version 2.20.0. #98252 (Aaron Knudtson).
- Désactivation de la génération SQL par IA (commande
??) dans le client intégré (protocoles SSH et WebSocket) afin d’empêcher l’accès aux variables d’environnement du serveur. #100290 (Alexey Milovidov). - Envoi d’un NACK pour les messages défectueux lors de l’utilisation du moteur de stockage RabbitMQ. #102157 (Seva Potapov).
Corrections de bugs
Tous les correctifs de bugs (cliquer pour afficher)
Tous les correctifs de bugs (cliquer pour afficher)
Correctifs JOIN
- Correction d’une colonne manquante lorsqu’un alias d’identifiant non standard était utilisé dans un JOIN avec l’ancien analyseur. #95679 (Zhigao Hong).
- Correction d’un résultat incorrect lorsque l’algorithme
grace_hashétait utilisé avec des joins non-équi et que le bloc de gauche ne pouvait pas être traité entièrement en raison de contraintes de taille sur le résultat du JOIN. #97866 (János Benjamin Antal). - Correction d’une erreur logique avec
analyzer_compatibility_join_using_top_level_identifieretARRAY JOIN. #98179 (Vladimir Cherkasov). - Correction d’une exception
LOGICAL_ERRORlorsqu’unRIGHT JOINencapsulé dans unCROSS JOINétait permuté par l’optimisationquery_plan_join_swap_tabledans le chemin de code hérité de l’étape de join. #98279 (Alexey Milovidov). - Correction d’une exception “Pipeline stuck” dans les joins
full_sorting_merge, provoquée par un interblocage dansPingPongProcessorlorsque l’optimisationFilterBySetOnTheFlycréait une dépendance circulaire avecMergeJoinTransform. #98454 (Alexey Milovidov). - Correction d’une erreur logique lorsque
CROSS JOINétait utilisé avecINNER JOIN USING. #98459 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERRORlorsquearrayJoinétait utilisé dans une expression de filtre avecOUTER JOINetjoin_use_nullsactivé. #98464 (Alexey Milovidov). - Correction d’une exception
BAD_GETet de résultats de requête incorrects lorsqu’une expression non booléenne (par ex.sin(col)) était utilisée à la fois dansWHEREetSELECTavec un JOIN, en raison d’une optimisation de descente de filtre qui corrompait des nœuds DAG partagés. #98681 (Alexey Milovidov). - Correction d’une
LOGICAL_ERROR“Replica decided to read in Default mode, not in WithOrder” lors de l’utilisation deread_in_order_through_joinavec des répliques parallèles. #98685 (Alexey Milovidov). LEFT ANTI JOINavec plusieurs colonnes de clé de jointure renvoyait des résultats incorrects lorsqueenable_join_runtime_filters=1(par défaut). #98871 (Alexander Gololobov).- Correction d’un bug dans l’optimisation
query_plan_convert_any_join_to_semi_or_anti_joinqui renvoyait un résultat incorrect pour les lignes sans correspondance. #99112 (Yarik Briukhovetskyi). - Correction d’une exception dans les fonctions opérant sur
ColumnReplicatedavec des lignes non référencées produites par un JOIN. #99564 (Hechem Selmi). - Correction d’un cas rare où un join avec réordonnancement pouvait produire un résultat incorrect. #100790 (Yarik Briukhovetskyi).
- Correction de résultats incorrects lorsqu’un JOIN avec l’optimisation shard-by-PK utilisait le cache des conditions de requête et que certaines parts étaient filtrées par des conditions mises en cache. #100926 (Groene AI).
- Correction d’une exception
NOT_FOUND_COLUMN_IN_BLOCKlors de l’utilisation deARRAY JOINavecJOIN USINGetanalyzer_compatibility_join_using_top_level_identifieractivé. #101507 (Vladimir Cherkasov). - Correction d’un ordre des lignes incorrect dans les requêtes utilisant
ORDER BYavec l’algorithme de jointuregrace_hash, ce qui pouvait produire un résultat incorrect sans avertissement. #102036 (János Benjamin Antal). - Correction d’une
LOGICAL_ERROR(taille inattendue du type d’index) qui pouvait se produire dans les requêtesRIGHT JOINetFULL JOINlorsquemax_bytes_in_joinétait configuré. #102042 (Jimmy Aguilar Mena).
Correctifs pour les requêtes et l’analyseur
- Correction de la façon dont la cible d’une table Alias est enregistrée comme dépendance DDL lorsqu’elle n’est pas entièrement qualifiée : elle est désormais enregistrée avec la base de données de la table Alias au lieu de la base de données de session. #95175 (Enric Calabuig).
- Correction d’une erreur
Block structure mismatch in streamcausée par des colonnes superflues renvoyées par la matérialisation paresseuse. #96682 (Nikolai Kochetov). - Correction d’une exception dans la comparaison de tuples impliquant des éléments de type
Nothing(par ex. lors d’une comparaison avec des éléments de tupleNULL) lorsqu’elle est utilisée avecGROUPING SETSetORDER BY. #97509 (Alexey Milovidov). - Correction d’une exception “Context has expired” pour les sous-requêtes corrélées contenant des fonctions de table comme
url(). #97544 (Alexey Milovidov). - Correction d’exceptions et d’un comportement incorrect dans
optimize_syntax_fuse_functionsavec les projections agrégées, les types Date et la préservation des noms de colonnes. #97545 (Alexey Milovidov). - Suppression d’une réécriture de requête incorrecte de
replaceRegexpOneversextractqui produisait des résultats erronés lorsque la regexp ne correspondait pas ; correction également d’une exception lorsquereplaceRegexpOneétait utilisé avecGROUP BY ... WITH CUBEetgroup_by_use_nulls=1. #97546 (Alexey Milovidov). - Correction d’exceptions
LOGICAL_ERRORcausées parLowCardinalityà l’intérieur de types composés (Variant,Dynamic,Tuple) dansconcatWithSeparator,format, les sous-requêtesIN,GLOBAL INet les jointures avec des filtres d’exécution. #97831 (Raúl Marín). - Correction d’une exception
LOGICAL_ERROR“Chunk info was not set for chunk in MergingAggregatedTransform” lors de l’utilisation deARRAY JOINavec la fonction de tablemerge()sur plusieurs tables Distributed combinées avecGROUP BY. #97838 (Raúl Marín). - Correction d’un bug qui empêchait l’utilisation des CTE avec des insert-select distribués. #97889 (Yarik Briukhovetskyi).
- Correction d’une incompatibilité entre colonnes. #97921 (Kai Zhu).
- Correction d’un segfault dans l’optimisation du plan de requête lors de la conversion d’une jointure externe en jointure interne avec
arrayJoindans une expression de filtre. #98147 (Alexey Milovidov). - Correction d’un
LOGICAL_ERROR“Trying to execute PLACEHOLDER action” lorsque des colonnes corrélées de requêtes externes étaient référencées à l’intérieur de fonctions lambda telles quearrayMap. #98285 (Alexey Milovidov). - Correction d’une exception d’erreur logique dans
caseWithExpressionlorsque l’expressionCASEimpliquaitmaterialize(NULL)ou d’autres argumentsNullable(Nothing). #98290 (Alexey Milovidov). - Correction d’une exception de transtypage invalide lors du filtrage de la colonne virtuelle
_tabledans la fonction de tablemerge. #98291 (Alexey Milovidov). - Correction d’une exception lorsque
ORDER BY ... WITH FILLétait utilisé avecLIMIT BY. #98361 (Alexey Milovidov). - Correction d’une exception “Column … query tree node does not have valid source node” lors d’une jointure entre une table
Merge(encapsulant une tableDistributed) et une autre table. #98376 (Alexey Milovidov). - Correction d’une exception “Column identifier is already registered” lorsque
count_distinct_optimizationétait utilisé avec une clauseQUALIFY. #98433 (Alexey Milovidov). - Correction d’une exception “cannot be inside Nullable type” lors de l’utilisation de
IN/NOT INavec des arguments de colonneLowCardinality(par ex.a NOT IN (b)oùaest de typeLowCardinality(String)). #98443 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERROR“Projection cannot increase the number of rows in a block” lors de la fusion de parts avec un TTL qui supprime toutes les lignes et une projection agrégée avec une cléGROUP BYconstante. #98458 (Alexey Milovidov). - Correction d’une exception dans les requêtes
DISTINCTlorsque l’utilisation de projections agrégées et dematerializeprovoquait des différences de typeLowCardinalityentre la requête et la projection. #98462 (Alexey Milovidov). - Correction d’une exception d’erreur logique “Replica decided to read in WithOrder mode, not in ReverseOrder” lors de l’utilisation de répliques parallèles avec
optimize_aggregation_in_order. #98467 (Alexey Milovidov). - Correction d’un résultat inattendu avec
read_in_order_use_virtual_rowet des fonctions monotones. #98514 (Vladimir Cherkasov). - Correction d’une exception
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'lors de l’utilisation dePREWHEREavec une sous-requêteINsur des tables MergeTree. #98522 (Alexey Milovidov). - Correction d’une exception “Sorting column wasn’t found in the ActionsDAG’s outputs” lorsque
query_plan_convert_join_to_inétait activé avecquery_plan_merge_expressions = 0. #98526 (Alexey Milovidov). - Correction d’une
LOGICAL_ERRORlorsqu’unIdentifierétait vide après substitution des paramètres. #98530 (Pervakov Grigorii). - Correction de l’analyse d’index distribuée avec des expressions (et pas seulement des colonnes) dans la clé primaire, ce qui entraînait l’absence de filtrage des granules redondants sur les répliques distantes. #98561 (Azat Khuzhin).
- Correction d’une erreur logique “TABLE_FUNCTION is not allowed in expression context” lorsqu’une table function avec un alias apparaissait plusieurs fois dans la même portée de requête (par ex. dans les clauses
PREWHEREetQUALIFY). #98557 (Alexey Milovidov). - Correction d’une exception “Bad cast from type
DB::TableFunctionNodetoDB::QueryNode” lors de l’utilisation de la fonction de tableinputcomme argument deremote. #98694 (Alexey Milovidov). - Correction d’une exception dans
LogicalExpressionOptimizerPasslorsqu’une fonction booléenne dans une comparaisonequalsrenvoyait un typeVariant. #98712 (Alexey Milovidov). - Correction d’une exception
UNKNOWN_IDENTIFIERlors de l’interrogation de la fonction de tablemerge()ou du moteurMergesur des tables avec des colonnes JSON ayant des paramètres différents et des colonnes ALIAS référençant des sous-chemins JSON, avec le nouvel analyseur activé. #98753 (Pavel Kruglov). - Correction de l’optimisation
optimize_skip_unused_shardsavec l’analyseur lorsqu’un stockageDistributedétait utilisé dans uneView. #98754 (Nikolai Kochetov). - Correction d’une exception
LOGICAL_ERROR(incompatibilité de structure de bloc dansremoveUnusedColumns) qui pouvait se produire avecFINAL+PREWHERE+ une expressionWHEREconstante + des agrégats indépendants des colonnes commecount(). #98778 (Alexey Milovidov). - Correction d’une exception “Inconsistent table names” lors de l’utilisation de la fonction de table
view()contenant des JOIN imbriqués dans un autre JOIN (uniquement avec l’ancien analyseur). #98809 (Alexey Milovidov). - Correction d’une exception lors de la composition de
loopavec des fonctions de table de cluster. #98860 (Konstantin Bogdanov). - Correction d’une
LOGICAL_ERROR“RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin). - Correction d’une exception “Scalar doesn’t exist” lors de l’interrogation d’un shard distant avec
optimize_const_name_sizeactivé etenable_scalar_subquery_optimization = 0. #98979 (andriibeee). - Correction de
NOT_FOUND_COLUMN_IN_BLOCKpour certaines requêtes avecGROUP BYet des expressions incluant une recherche inverse dans un dictionnaire, des comparaisons de conversionDate/DateTimeet des comparaisons de tuples. #98980 (Nihal Z. Miaji). - Correction d’un bug où
EXISTSignorait les clausesLIMITetOFFSETdans les sous-requêtes, provoquant des résultats incorrects lorsque la sous-requête ne renvoyait aucune ligne en raison d’un décalage ou d’une limite nulle. #99005 (andriibeee). - Correction d’une exception “Block structure mismatch” lorsque l’optimisation de push-down des filtres rencontrait une expression
ANDqui se court-circuitait en constante avecGROUPING SETS. #99010 (Alexey Milovidov). - Correction d’une
LOGICAL_ERRORlors de l’interrogation d’une table ayant à la fois une ROW POLICY et une colonne ALIAS utilisantdictGet, causée par un accès prématuré à l’expression de table pendant la résolution de la colonne ALIAS dans le nouvel analyseur. #99065 (Peng). - Correction d’un segfault dans une CTE récursive avec
remote()+view(). #99081 (Konstantin Bogdanov). - Suppression d’une analyse d’index supplémentaire inutile lorsque l’optimisation de lecture dans l’ordre est appliquée. #99084 (Vladimir Cherkasov).
- Correction des vérifications d’accès dans
InverseDictionaryLookupPassen n’effectuant le contrôle d’accès qu’une seule fois avant l’exécution de la passe d’optimisation. #99210 (Mikhail Artemenko). - Correction de
optimize_skip_unused_shardsavec le nouvel analyseur lorsqu’une tableDistributedétait utilisée dans une sous-requêteIN. #99436 (Nikolai Kochetov). - Correction d’un heap-use-after-free dans
INTERSECT/EXCEPTlorsque la requête produisait des noms de colonnes en double. #99471 (Alexey Milovidov). - Correction d’une erreur logique dans
ALTER TABLE ... DROP PARTlorsqu’un paramètre de requête typé était utilisé pour le nom de la part. #99489 (Alexey Milovidov). - Correction d’une exception
std::length_errorlors de requêtes sur des tables système vides avec le format Pretty via l’interface HTTP. #99541 (Alexey Milovidov). - Correction d’une dégradation des performances dans l’analyseur grâce à l’élimination des colonnes inutilisées de
ARRAY JOIN. #99587 (Dmitry Novik). - Correction d’une exception (
Bad get: has Tuple, actual type String) dansConditionSelectivityEstimatorlorsqu’une requête utilisaitINavec un seul paramètre de requête scalaire (par ex.WHERE col IN ({p:String})) sur une table ayant des statistiques de colonnes et avecuse_statisticsactivé. #99614 (Ilya Yatsishin). - Correction d’une exception “Block structure mismatch” dans des requêtes avec une clause
HAVINGoù l’expression de filtre contenait à la fois un agrégat encapsulé dans une fonction produisant NULL etmaterialize(0). #99915 (Alexey Milovidov). - Correction d’une erreur logique liée à une sous-requête corrélée dans un argument
untuple. #99917 (Vladimir Cherkasov). - Correction d’une exception “Inconsistent AST formatting” pour
ALTER TABLE ... MODIFY QUERYavec des sous-requêtes imbriquées contenantSETTINGSlorsque l’instructionALTERelle-même comportait aussiSETTINGS. #99938 (Nikita Mikhaylov). - Correction d’une exception
LOGICAL_ERROR“Not-ready Set” dans la fonctionINpendant l’optimisation du plan de requête avecconvertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERROR“Unexpected node type for table expression … Actual IDENTIFIER” lorsqu’une sous-requête scalaire était utilisée dans un argument de fonction de table non résolu. #100014 (Alexey Milovidov). - Correction du nombre quadratique de requêtes exécutées lorsque
distributed_index_analysisétait utilisé avec des prédicats contenant des sous-requêtesIN. #100287 (Anton Popov). - Correction d’une exception “Block structure mismatch” lors de l’utilisation de
GROUP BY ... WITH TOTALS HAVINGcombiné àUNION DISTINCTet à des expressionsNullable. #100293 (Alexey Milovidov). - Correction d’une exception “Inconsistent AST formatting” dans les versions de débogage lors de l’utilisation de
GROUP BY CUBE(...) WITH ROLLUPou de combinaisons similaires. #100376 (Alexey Milovidov). - Correction d’une exception lors de la création d’une vue avec des alias de colonnes et
SELECT *ou des requêtesEXCEPT/INTERSECT. #100386 (Alexey Milovidov). - Correction d’une exception
TOO_MANY_ROWSpour les requêtesSELECT count()avecmax_rows_to_read/force_primary_keylorsque les données étaient réparties sur plusieurs parts avec des frontières de granules non alignées. #100408 (Alexey Milovidov). - Correction de cas
NOT_FOUND_COLUMN_IN_BLOCKoù la partieSELECTde la projection contenait des colonnes qui n’existaient pas dans la partieSELECTd’origine de la requête. #100623 (Yarik Briukhovetskyi). - Ajout de la prise en charge du passage d’une clé de sharding aux fonctions de table
cluster()etclusterAllReplicas()lors de l’utilisation d’une fonction de table comme source (par ex.cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy). - Correction de types d’argument
AggregateFunctionincorrects dans le count trivial optimisé, ce qui provoquait une exceptionNUMBER_OF_ARGUMENTS_DOESNT_MATCHlors de requêtes sur des expressions commecount(v0 + v1)sur des tables distribuées. #100794 (YjyJeff). - Correction d’une erreur logique “Invalid action query tree node” lors de l’utilisation de
INTERSECT ALL/UNION ALLavec des expressions constantes simplifiées. #100977 (Alexey Milovidov). - Correction d’une erreur
UNKNOWN_IDENTIFIERincorrecte lorsque le même alias était utilisé pour plusieurs expressions dansSELECT; l’erreur correcteMULTIPLE_EXPRESSIONS_FOR_ALIASest désormais renvoyée. #101040 (Alexey Milovidov). - Correction d’une exception dans
DirectJoinMergeTreeEntitylorsque les blocks du pipeline contenaient des colonnesColumnConstfusionnées avec des colonnes ordinaires. #101046 (Alexey Milovidov). - Correction d’un espace superflu dans le formatage des alias de colonnes de CTE (
WITH t (a, b)→WITH t(a, b)). #101049 (Alexey Milovidov). - Correction d’un échec des fonctions de table
remote/clusteravec des fonctions de table imbriquées commemergelorsque l’analyseur était activé. #101055 (Alexey Milovidov). - Correction de l’application d’
OFFSETen double dans les requêtes distribuées lorsqueprefer_localhost_replica=1, ce qui produisait moins de lignes que prévu. #101071 (Nihal Z. Miaji). - Correction d’une erreur “Illegal type Decimal64 of start parameter” dans les fonctions d’agrégation de séries temporelles lors de l’utilisation de
serialize_query_plan=1avec des répliques parallèles. #101083 (Groene AI). - Correction de résultats de requête incorrects lorsqu’une grande constante entière (par ex. 256, 2147483648) était utilisée comme prédicat booléen dans une clause
WHEREavecANDsur des tables MergeTree. #101287 (Groene AI). - Correction d’un plantage avec “Logical error: Reading from materialized CTE before materialization” lorsqu’une sous-requête scalaire référençait une chaîne de CTE matérialisées dépendantes. #101305 (Groene AI).
- Correction d’une exception lors de la conversion d’une chaîne avec des données résiduelles vers le type vide
Tuple(). #102011 (Alexey Milovidov). - Correction d’une erreur logique lors de l’analyse d’une chaîne de tuple vide incorrecte. #102289 (Nihal Z. Miaji).
- Correction de résultats d’agrégation incorrects (lignes dupliquées) lors de l’utilisation de
optimize_aggregation_in_order=1avec des colonnesGROUP BYordonnées différemment de la clé de tri de la table. #102299 (Groene AI). - Correction d’une exception dans
getStructureOfRemoteTablelorsque le shard local renvoyait des colonnes vides en raison de DDL concurrentes. #102604 (Alexey Milovidov). - Optimisation des chaînes de
ORdans les row policy enINdans le nouvel analyseur. #102915 (Azat Khuzhin). - Correction de résultats incorrects renvoyés par
WHERE x AND toNullable(N)sur des tablesMergeTreelorsqueNest un entier plus grand queUInt8(par ex.256,65535,2147483648ou tout entier négatif). #103077 (Groene AI).
Correctifs MergeTree et stockage
- Correction d’une erreur logique lors de l’attachement d’une part dans MergeTree lorsqu’il y avait plusieurs renommages en chaîne entre le détachement et l’attachement. #96351 (Alexey Milovidov).
- Correction d’un calcul non déterministe de
uncompressed_hashpour les parts Compact MergeTree lorsque plusieurs codecs de compression sont utilisés, ce qui pouvait entraîner un comportement incorrect de déduplication. #97522 (Alexey Milovidov). - Correction d’exceptions
MEMORY_LIMIT_EXCEEDEDsignalées à tort commeCORRUPTED_DATAlors des merges de SummingMergeTree et CoalescingMergeTree. #97537 (János Benjamin Antal). hasPartitionIdrenvoie désormais false si une autre partition avec un ID de partition plus élevé existe dans l’ensemble des parts de données. #97748 (Mikhail Artemenko).- Correction d’une mutation après une lightweight update avec des index secondaires. #98044 (Raúl Marín).
- Correction de résultats incorrects de requêtes FINAL lors du mélange d’index de saut sur clé primaire et hors clé primaire. #98097 (Raúl Marín).
- Si les colonnes de la clé de partition ne sont pas couvertes par la clé de tri, l’élagage des partitions pouvait ignorer à tort des partitions contenant des lignes qui devaient “l’emporter” lors de la déduplication FINAL. #98242 (Yarik Briukhovetskyi).
- Correction d’un interblocage potentiel lorsque deux opérations
MOVE PARTITIONconcurrentes travaillent sur la même paire de tables dans des directions opposées. #98264 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERROR“Invalid binary search result inMergeTreeSetIndex” déclenchée par une conversiontoDatesur des colonnes clés avec des données franchissant la limite de 65535. #98276 (Alexey Milovidov). - Correction d’un échec sporadique de déduplication, où des réinsertions étaient dédupliquées à tort en raison d’un ordre de nettoyage incohérent entre les répertoires ZooKeeper
blocks/etdeduplication_hashes/. #98293 (Alexey Milovidov). - Correction de mutations
MATERIALIZE INDEXetMATERIALIZE PROJECTIONbloquées lorsque l’index ou la projection est supprimé avant la fin de la mutation. #98369 (Alexey Milovidov). - Correction de résultats incorrects d’élagage des partitions après fusion de parts avec des colonnes de clé de partition
Nullable, en raison de bornes d’index min-max erronées. #98405 (Amos Bird). - Correction d’une exception
LOGICAL_ERRORdansrenameAndCommitEmptyPartsqui pouvait se produire lorsqueTRUNCATE TABLEs’exécutait simultanément avecOPTIMIZE TABLEen utilisant des transactions MergeTree. #98508 (Alexey Milovidov). - Correction d’un dépassement Decimal lors de l’élagage des partitions avec
DateTime64. #98628 (Yarik Briukhovetskyi). - Correction de la résurrection de parts de données obsolètes causée par un nettoyage incorrect de parts de couverture vides. #98698 (Shaohua Wang).
- Correction de la détection de l’utilité de l’index de saut de type Set avec un prédicat
ORsur false (c.-à-d.or(x, 0)). #98776 (Azat Khuzhin). - Correction du problème où les skip indexes (et les conditions de clé primaire) n’étaient pas appliqués aux colonnes ALIAS lorsque la fusion des expressions du plan de requête est désactivée (
query_plan_merge_expressions = 0ouquery_plan_enable_optimizations = 0). #98960 (Peng). - Correction d’un pruning incorrect ou insuffisant lorsque
startsWith,LIKEouNOT LIKEétaient utilisés avec une colonneFixedString. De plus, la fonction de conversion de type deFixedStringversStringpeut désormais élaguer les granules lorsqu’elle est appliquée à une colonne clé. #99001 (Nihal Z. Miaji). - Correction d’une exception lors de la lecture de patch parts (lightweight updates) sans la colonne
_part_offsetdans le plan de requête. #99023 (Alexey Milovidov). - Une requête comme
SELECT * FROM table WHERE pk_id = '', oùpk_idest une clé primaireString, utilise désormais correctement l’index de clé primaire pour filtrer les granules. #99027 (Shankar Iyer). - Correction d’une exception lors de la création d’une table avec une colonne
EPHEMERALportant le même nom qu’une colonne virtuelle (par ex._part_offset). #99031 (Alexey Milovidov). - Correction de
LOGICAL_ERRORdue à un ordre de colonnes incohérent dans les patch parts. #99164 (Pablo Marcos). - Correction du problème où
ALTER TABLE UPDATE/DELETEéchouait avec une erreurMissing columnslorsqu’une table possède une colonne MATERIALIZED dont l’expression dépend d’une colonne EPHEMERAL. #99281 (Yash). - Correction de la compatibilité lors de la mise à niveau de tables répliquées avec des index minmax implicites de la version 25.10 vers des versions plus récentes. #99392 (Raúl Marín).
- Correction d’un rare marquage erroné d’une data part comme corrompue, suivi de son détachement après une requête
DETACH/ATTACH TABLE. #99529 (Anton Popov). - Correction d’un échec d’assertion
rows_sourceslors d’une vertical merge quandSYSTEM STOP/START MERGESest activé/désactivé rapidement pendant la fusion d’une table avec des colonnesDynamic. #99532 (Alexey Milovidov). - Correction d’un partition pruning incorrect pour
toWeek()qui faisait que les requêtes avecWHERE toWeek(date, mode) = Nrenvoyaient des résultats vides pour les semaines 49 à 52 sur des tables partitionnées partoYYYYMM(date). #99542 (Takumi Hara). - Correction d’une
LOGICAL_ERRORlors de l’utilisation deALTER TABLE ADD COLUMNpour créer une colonneEPHEMERALportant le même nom qu’une colonne virtuelle (par ex._part_offset). #99549 (Alexey Milovidov). - Correction du fait que
CLEAR COLUMNne reconstruisait pas les projections et ne réévaluait pas les colonnes matérialisées qui dépendent de la colonne effacée, ce qui pouvait provoquer des exceptions ou une corruption des données lors des fusions suivantes. #99565 (Desel72). - Une partie avec des projections inconnues n’est plus marquée comme définitivement perdue. #99623 (Sema Checherinda).
- Correction d’une référence pendante dans
injectRequiredColumnsqui provoquait un crash lors d’une fusion. #99679 (Tuan Pham Anh). - Correction d’une erreur logique lors de la fusion de parties de projection après
CLEAR COLUMNsur une table avec des projections et des parties compactes. #100068 (Pavel Kruglov). - Correction d’une
LOGICAL_ERROR“Stream … not found” lors de l’insertion dans une table avec des colonnes imbriquéesArray(JSON)dans des parties wide avecoptimize_on_insert=0. #100475 (Pavel Kruglov). - Les arguments du engine pour
StorageAliassont désormais évalués avant le stockage de la définition, afin que des expressions commecurrentDatabase()soient résolues en littéraux avant d’être enregistrées dans la base de données. #100902 (Nikolay Degterinsky). - Correction d’un problème où
divideetintDivrenvoyaientILLEGAL_DIVISIONlorsqu’ils étaient utilisés dans des expressions de filtre lors de l’analyse des index, dans certains cas. #100928 (Nihal Z. Miaji). - Correction d’un problème où une optimisation
minmax_count_projectionet l’optimisation trivialeCOUNT(*)restaient désactivées de façon permanente après un lightweight delete, même après la fusion de toutes les parties comportant un masque de lightweight delete. #101212 (Anton Popov). - Correction d’une data race sur
storage_iddansIStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky). - Correction d’un problème où
materialize_skip_indexes_on_merge=falsene supprimait pas les index textuels (full-text) lors d’une fusion. Auparavant, seuls les skip indexes non textuels (minmax, set, bloom_filter) étaient supprimés. #101932 (Groene AI). - Les entrées du cache de l’index de similarité vectorielle sont désormais supprimées après la suppression d’une partie (par exemple lors d’une fusion), ce qui corrige un problème empêchant leur éviction en raison de clés de cache non concordantes. #99575 (Seva Potapov).
- Correction d’une fausse exception
LOGICAL_ERRORlors du redimensionnement dynamique du cache du système de fichiers, due à une condition de concurrence dans la promotion d’une sous-file SLRU. #99850 (Alexey Milovidov). - Correction d’une possible erreur logique lors de la lecture de sous-colonnes de type Map. #101641 (Pavel Kruglov).
- Correction de la priorité de la correspondance exacte des sous-colonnes par rapport à la correspondance par préfixe dans
getSubcolumnData, afin d’éviter un possible crash. #101645 (Pavel Kruglov). - Correction de l’utilisation d’extrêmes incorrects dans un index min-max créé sur une colonne JSON, ce qui entraînait des résultats de query erronés. #101918 (Pavel Kruglov).
- Correction d’un bug de concurrence SLRU dans le cache du système de fichiers (26.1+) qui pouvait entraîner une erreur logique de réservation d’espace. #101991 (Kseniia Sumarokova).
- Correction d’une erreur logique
Having zero bytesdans le cache, qui se produisait lorsqu’un objet distant était écrasé entrelistetread, ce qui entraînait auparavant des métadonnées d’objet obsolètes. #101219 (Kseniia Sumarokova). - Correction d’un échec d’assertion
file_offset_of_buffer_end <= getFileSize()lors de la lecture de tablesLogouStripeLogsur un stockage objet S3 en présence d’écritures concurrentes. #100763 (Alexey Milovidov). - Correction du plafonnement de la taille du cache lors du rechargement de la configuration. #100659 (Aleksei Filatov).
- Correction d’un arrêt
LOGICAL_ERRORlors du redimensionnement dynamique du cache du système de fichiers SLRU, causé par des statistiques d’éviction partagées entre les sous-files d’attente et par un chemin de récupération incorrect pour les candidats en échec. #102396 (Antonio Andelic). - Correction de la désactivation permanente d’une optimisation
minmax_count_projectionet de l’optimisation triviale deCOUNT(*)après un lightweight delete. #102900 (Anton Popov).
Corrections relatives aux types de données et à la sérialisation
- Correction d’un résultat incorrect ou d’une exception lors de la lecture des sous-colonnes de colonnes ALIAS. #95408 (Pavel Kruglov).
- Correction du fait que la fonction d’agrégation
sumCountne pouvait pas lire d’anciens états sérialisés après l’introduction deNullable(Tuple). #97502 (Nihal Z. Miaji). - Correction d’une erreur logique liée à un flux manquant lors d’un
INSERT SELECTavec JSON et des buckets dans les données partagées. #97523 (Pavel Kruglov). - Correction de plantages possibles lors de la lecture de granules vides dans les données partagées avancées en JSON. #97778 (Pavel Kruglov).
- Correction d’une mauvaise compilation JIT de la fonction
signpour les types entiers plus larges queInt8— les valeurs en dehors de la plage -128..127 pouvaient produire un signe incorrect. #98012 (Alexey Milovidov). - Correction du fait que le format
ProtobufListne fonctionnait pas avec le Kafka engine, car l’état de lecture n’était pas réinitialisé entre les messages. #98151 (Alexey Milovidov). - Correction d’une corruption silencieuse des données lors de l’insertion d’une colonne
DateParquet/Arrow dans une colonneEnum— la conversion de type incompatible est désormais correctement rejetée au lieu de stocker des valeurs d’enum invalides. #98364 (Alexey Milovidov). - Correction d’une exception lors de la lecture d’un fichier Arrow avec une colonne
Arraydans une table avec une colonneNested. #98365 (Alexey Milovidov). - Correction d’une exception lors de la lecture depuis
Nullable(Tuple(...))lorsqu’un nom d’élément deTupleentrait en collision avec la sous-colonnenulldeNullable. #98372 (Alexey Milovidov). - Correction d’une conversion incorrecte de Parquet
BoolversFixedStringdans le lecteur natif V3, qui produisait des octets bruts au lieu d’une représentation sous forme de chaîne. #98378 (Alexey Milovidov). - Correction de
tryGetColumnDescriptionafin de filtrer les sous-colonnes par type de colonne parente, conformément aux autres méthodes de recherche de colonnes. #98391 (Alexey Milovidov). - Correction du rollback de colonne dans le moteur Buffer lors du traitement d’une exception pendant l’ajout d’un nouveau block. L’ancienne logique pouvait entraîner un état corrompu des colonnes en mémoire. #98551 (Pavel Kruglov).
- Correction d’une exception
Bad cast from type ColumnConst to ColumnDynamicdans une comparaison null-safe (<=>/IS NOT DISTINCT FROM) avec des colonnes constantesDynamicouVariantetNULL. Correction également du fait queIS DISTINCT FROMavecDynamic/VariantetNULLrenvoyait toujours 0 à tort. #98553 (Alexey Milovidov). - Correction du fait que
parseDateTimeBestEffortanalysait incorrectement les mots commençant par des préfixes de mois ou de jours de la semaine. #98742 (Pavel Kruglov). - Correction d’une exception
reverseUTF8sur une entrée UTF-8 invalide (tronquée). #98770 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERRORdans les fonctions financières (financialNetPresentValue,financialInternalRateOfReturn, etc.) lors du passage d’arguments de typeBFloat16. #98958 (Alexey Milovidov). - SummingMergeTree n’additionne plus les colonnes
Bool(ni les autres colonnes de type domaine) ; les valeursBoolsont désormais conservées telles quelles au lieu d’être additionnées arithmétiquement. #98976 (Yash). - Correction d’un comportement indéfini (déréférencement de pointeur nul) lors de la modification d’une colonne version/sign/is_deleted en
EPHEMERALouALIASdans les moteurs MergeTree. Ces modifications sont désormais correctement rejetées. #98985 (Alexey Milovidov). - Correction de
parseDateTimeBestEffort, qui analysait incorrectement des mots commençant par des préfixes de mois au format DD-month-YYYY. #99350 (Pavel Kruglov). - Correction de
CHECK TABLEavec une sérialisation sparse à l’intérieur d’un Tuple avec Dynamic. #99351 (Pavel Kruglov). - Correction d’une erreur logique
unordered_map::at: key not founddans le format de sortie Avro lors de la sérialisation de colonnesEnum8/Enum16contenant des valeurs absentes de la définition de l’enum. #99332 (Desel72). - Correction d’un bug qui rendait confuse la comparaison entre les types
Time[64]etDateTime[64]; les valeursTime[64]sont désormais converties enDateTime[64]en ajoutant1970-01-01comme partie date. #99267 (Yarik Briukhovetskyi). - Correction de la désérialisation de
\N(NULL) pour le typeVariantdans les formats texte Escaped/Raw. #99648 (Pavel Kruglov). - Correction d’un comportement indéfini dans le lecteur du format Avro lors de la lecture de valeurs numériques dépassant la capacité du type de colonne cible. Les requêtes échouent désormais en cas de dépassement au lieu de produire silencieusement des valeurs incorrectes. #99697 (asyablue22).
- Correction d’un faux positif provoquant un arrêt dans
NativeReaderlors de la désérialisation d’un flux au format Native avec une discordance du nombre de lignes :LOGICAL_ERRORa été remplacé parINCORRECT_DATA. #99822 (Rahul Nair). - Correction d’un arrêt du processus lors de la désérialisation d’une colonne
Tuplelorsque le type de sérialisation dans le flux binaire estDETACHED. #99823 (Rahul Nair). - Correction du paramètre
aggregate_functions_null_for_emptypour qu’il fonctionne avec des fonctions d’agrégation renvoyant des types non-Nullable tels queArrayouMap(par exemplegroupArray,sumMap). #99839 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERRORdans la fonctionmidpointlorsqu’elle est appelée avec un mélange de types entiers signés et non signés. #99867 (Alexey Milovidov). - Correction d’une exception
LOGICAL_ERRORdans des requêtes impliquant des colonnesDynamic, des jointures croisées et des filtres d’exécution, causée par le fait queColumnVariant::filterpartageait des pointeurs vers des colonnes Variant au lieu de les cloner dans le chemin d’optimisationhasOnlyNulls. #100234 (Pavel Kruglov). - Correction d’un bug sur les tableaux de
Variantqui pouvait réinterpréter le type de données lors de l’appel àarrayFirst/arrayLast. Par exemple,Array(Variant(Date, Bool))était converti enBoolalors que le type Variant sous-jacent réel étaitDate. #100255 (timothygk). - Correction d’un problème empêchant les formats
CSVetMsgPackd’analyser correctementNullable(Tuple). #100038 (Nihal Z. Miaji). - Correction d’un problème où les fonctions
accurateCastOrDefaultetto*OrDefaultne conservaient pas le type de colonne Const pour les entrées constantes. #100132 (Alexey Milovidov). - Les paramètres de requête omis de type
LowCardinality(Nullable(T))prennent désormais correctementNULLcomme valeur par défaut, comme pourNullable(T). #100144 (Denys Melnyk). - Correction d’un dépassement d’entier signé (comportement indéfini) dans
toStartOfIntervallors d’un appel avec de très grandes valeurs d’intervalle en millisecondes/microsecondes surDateTime64à haute précision. #100156 (Alexey Milovidov). - Correction des filtres d’exécution de jointure sur le type de données
Variant. #100182 (Dmitry Novik). - Correction d’un cast de
Time64versUInt64qui pouvait limiter les valeurs à 24 heures. #100025 (Yarik Briukhovetskyi). - Correction d’une exception lors du calcul du supertype commun pour des tuples vides et non vides avec
use_variant_as_common_typeactivé. #100699 (Antonio Andelic). - Correction d’un comportement indéfini dans
positiveModulolorsque le diviseur non signé ne tient pas dans le type de résultat signé. #100705 (Raúl Marín). - Correction d’un comportement indéfini (dépassement d’entier signé) dans
toStartOfIntervallors de l’utilisation d’intervalles Week, Quarter ou Year avec un argumentoriginet des valeurs d’intervalle extrêmes. #100817 (Raúl Marín). - Correction des combinators de fonctions d’agrégation
If,Distinct,DistinctIfetIfStateavec un type de retourTupleet un ou plusieurs argumentsNullable, qui ne pouvaient pas lire les anciens états sérialisés après l’introduction deNullable(Tuple). #100826 (Nihal Z. Miaji). cast_keep_nullable, lorsqu’il est activé, ne lève plus d’exception lors du cast d’une valeur NULLDynamicvers unVariant. #100864 (Seva Potapov).- Correction d’une exception dans
intDiv/intDivOrZerosur des tableaux de tuplesNullable. #100895 (Raúl Marín). - Correction d’un comportement indéfini (dépassement d’entier signé) dans
parseDateTimeBestEffortlors de l’analyse de chaînes de date/heure comportant plus de 18 chiffres de fraction de seconde. #100948 (Vasily Chekalkin). - Correction d’un problème empêchant la fonction d’agrégation
sumCountOrDefault, avec un ou plusieurs argumentsNullable, de lire d’anciens états sérialisés après l’introduction deNullable(Tuple). #101021 (Nihal Z. Miaji). - Correction des colonnes ALIAS de type
DateTime/DateTime64qui n’appliquaient pas la conversion de fuseau horaire lorsque le fuseau horaire déclaré différait de celui de l’expression. #101043 (Alexey Milovidov). - Suppression de
Nullablede la colonne de résultat dansarrayIntersectet les fonctions associées afin d’éviter un décalage entre sérialisation et désérialisation. #101569 (George Larionov). - Correction de
positiveModulo(tuple, number), qui utilisait à tort la division au lieu du modulo. #101709 (ClickGap AI Bot). - Correction d’une sortie incorrecte dans
formatDateTimeavec le formatter%Wsous certains paramètres de formatting non par défaut. #101847 (Robert Schulze). - Correction d’une exception d’incompatibilité de type dans
transformlorsque la colonne par défaut est const sur certains blocks. #100616 (Pavel Kruglov). - Autorisation des row groups vides dans Parquet. #100653 (Vitaly Baranov).
min/max/argMin/argMaxtraitent désormais NaN de manière cohérente avecORDER BY: NaN est toujours ignoré (il n’est renvoyé que si toutes les valeurs sont NaN). Auparavant, les résultats dépendaient de la position de NaN dans les données en raison de la sémantique de comparaison non ordonnée d’IEEE 754. #100448 (Raúl Marín).- Correction d’une inférence incorrecte du type de date en cas de dépassement après ajustement du fuseau horaire. #102674 (Pavel Kruglov).
- Correction de
CASEavec une expressionDynamicqui renvoyaitELSEpour toutes les lignes. #102684 (Pavel Kruglov). - Correction de la sérialisation du type
Dynamicaplati avec des types de données encodés en binaire. #102692 (Pavel Kruglov). - Correction du fait que
cast_string_to_date_time_modeétait ignoré pourCASTversNullable(DateTime). #103035 (Pavel Kruglov). - La représentation de null dans la sérialisation des colonnes répliquées et sparse respecte désormais les paramètres (par ex.
format_tsv_null_representation). #102888 (Hechem Selmi).
Corrections des index de texte et des index de saut
- Correction de l’utilisation du text index avec d’autres skip indexes. Auparavant, des erreurs logiques telles que “Trying to get non-existing mark” pouvaient être levées lorsqu’un filtre de query utilisait simultanément un text index et d’autres skip indexes classiques. #98555 (Anton Popov).
- Correction de la reconstruction des text indexes lors des merges avec TTL. #99107 (Anton Popov).
- Correction d’une validation trop stricte du preprocessor du text index. #99359 (Anton Popov).
- Suppression de la prise en charge des fonctions niées (
notEquals,notLike,notIn) dans l’analyse d’index du text index. Ces fonctions ne pouvaient jamais ignorer de granules ; leur analyse par l’index n’ajoutait donc que du surcoût. #99393 (Anton Popov). - Correction d’une exception
NOT_FOUND_COLUMN_IN_BLOCKlorsqu’un predicate de text index (par ex.hasAllTokens) était référencé à la fois dans les clausesSELECTetWHEREvia un alias. #99504 (Anton Popov). - Correction de résultats incorrects lors de l’utilisation de
hasAllTokensavecORsur des columns dotées de text indexes distincts. #99505 (Anton Popov). - Correction de la lecture du text index dans une table comportant des lightweight deletes existants et des row policies. #99661 (Anton Popov).
- Correction de l’analyse des predicates avec la fonction
INpar le text index avec le preprocessor, ainsi que d’une collision entre tokens recherchés qui pouvait entraîner des résultats incorrects. #99755 (Anton Popov). - Correction d’une utilisation incorrecte du text index avec les fonctions
startsWithetendsWithpour les tokenizers qui ne prennent pas en charge la correspondance par substring (array,splitByString). Auparavant, ces tokenizers pouvaient produire silencieusement des résultats erronés. #100151 (Anton Popov). - Correction d’un crash rare lorsqu’une exception “Memory Limit” était levée pendant la construction du text index. #100213 (Anton Popov).
- Correction des erreurs “Not-ready Set is passed as the second argument” pendant l’analyse d’un text index construit sur
mapValuespour des predicates contenant une clauseIN. #100224 (Anton Popov). - Correction d’un crash lors de l’utilisation d’un index de recherche textuelle avec une clause
INcontenant une sous-requête de tuple, par ex.WHERE (id, str) IN (SELECT (id, str) FROM ...), ou lorsque le nombre de columns dans la sous-requête ne correspondait pas au tuple situé à gauche deIN. #100959 (Anton Popov). - Le tokenizer
splitByStringrejette désormais les chaînes de séparation vides. #101928 (Robert Schulze). - Le tokenizer
sparseGramsgénérait des tokens plus longs que la longueur maximale fournie (en raison d’un+2codé en dur dans l’implémentation). #101934 (Elmi Ahmadov). - Correction d’une exception lors de l’exécution de requêtes sur des tables
MergeouDistributedavec un index de texte intégral et des conditions de filtrage combinées mêlanthas*TokensetLIKE, lorsquequery_plan_direct_read_from_text_indexest activé. #101939 (Jimmy Aguilar Mena). - Correction de
hasToken/hasTokenOrNullavec des motifs de recherche composés uniquement de séparateurs (par ex.'()','!!!') sur des colonnes avec un index de texte intégral : auparavant, l’index ignorait silencieusement toutes les granules au lieu de leverBAD_ARGUMENTS(pourhasToken) ou de renvoyerNULL(pourhasTokenOrNull). #102544 (Jimmy Aguilar Mena). - Les paramètres de l’index de texte intégral (
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read) ne sont plus désactivés lorsque le paramètrecompatibilitypointe vers une version antérieure à 26.1. #102422 (Nikita Fomichev). - Ajout de la prise en charge des colonnes
ALIASdans l’optimisation de lecture directe depuis l’index de texte. #103037 (Anton Popov).
Correctifs du lac de données
- Correction d’une condition de concurrence logique lors d’un changement de version de snapshot dans le moteur de table
DeltaLake, et suppression de rechargements de snapshot lourds et redondants. #96226 (Kseniia Sumarokova). - Correction d’une exception
DUPLICATE_COLUMNet de valeurs NULL silencieuses lors de la lecture de tables Delta Lake utilisant le mode de mapping de colonnes “name” avec des champs de struct dont les noms contiennent des points. #98013 (Caio Ishizaka Costa). - Correction d’un bug lors de l’utilisation de Unity Catalog sur GCS. #98456 (Melvyn Peignon).
DataLakeCatalogrespecte désormais la configurationhttp_forbid_headersdu serveur lors de la validation du paramètreauth_header. #98827 (Michael Anastasakis).- La création, l’attachement et la mise à jour de tables de data lake locales en dehors des chemins utilisateur sont désormais interdits ; cette vérification est effectuée lors de la création et de la mise à jour de
IDataLakeMetadata. #98936 (Daniil Ivanik). - Correction des lectures Iceberg BigLake : les identifiants ADC sont désormais transmis au client S3 de GCS (ce qui corrige les erreurs 403), les identifiants OAuth2 sont encodés dans l’URL avant l’envoi, et le parcours de l’espace de noms ne s’interrompt plus sur les réponses HTTP 400 de BigLake. #98998 (Nikita Fomichev).
- Correction d’une erreur de dépassement de limites lors de l’interrogation exclusive des colonnes virtuelles d’une table Iceberg contenant des données Avro. #99080 (alesapin).
- Correction d’un crash dans
ALTER TABLE ... REMOVE SETTINGSpour le moteur de table Iceberg. #99108 (alesapin). - Correction d’un crash très rare lorsqu’une table Iceberg contient des fichiers de formats mixtes (ORC et Parquet). #99168 (alesapin).
- Correction d’un crash (déréférencement de pointeur nul) lors de l’exécution de
ALTER TABLE ... MODIFY COLUMN ... COMMENTsur des tables Iceberg. #99838 (Desel72). - ClickHouse gère désormais correctement les tables au format Spark (avec un chemin absolu complet pour chaque fichier ou un chemin relatif vers le chemin commun de la table). #99935 (alesapin).
- Correction d’une exception lorsqu’un paramètre de chemin de fichier des métadonnées Iceberg contient un octet nul. #100283 (Alexey Milovidov).
- Correction d’un bug de copier-coller où
delta_lake_snapshot_end_version, défini sansdelta_lake_snapshot_start_version, était ignoré silencieusement au lieu de produire une erreurBAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar). - Correction d’une erreur logique dans des tables Iceberg triées pendant les mutations. #100499 (alesapin).
- Correction du Polaris Catalog avec Azure : depuis la version 25.12, le catalog ajoutait le bucket au début du chemin. #100583 (Konstantin Vedernikov).
- Correction d’une exception
Logical error: 'partitions_count > 0'lors de l’exécution d’ALTER TABLE UPDATEconsécutifs sur une table Iceberg partitionnée. #101278 (Desel72). - Correction de l’
insert-selectdepuis un cluster Delta Lake avec ReplicatedMergeTree. #101299 (Konstantin Vedernikov). - Déclenche une erreur lorsque les paramètres
delta_lake_snapshot_versionou de version CDF sont utilisés sans DeltaKernel activé, au lieu de renvoyer silencieusement des données incorrectes. #101489 (Desel72). - Correction d’une boucle de tentatives d’INSERT Iceberg qui échouait lorsque la table était créée avec
iceberg_metadata_file_pathet que la version cible des métadonnées existait déjà. #101548 (Groene AI). - Correction d’un plantage du serveur (
LOGICAL_ERROR) lors d’un SELECT depuis une vue matérialisée reposant sur un moteur de table IcebergLocal. #101577 (Groene AI). - Correction d’un plantage dans IcebergLocal
ALTER TABLE ... UPDATElors de l’utilisation du format Avro, dû au fait que les types wrapperLowCardinality/Nullablen’étaient pas désencapsulés avant la sérialisation. #102337 (Desel72). - Ajout de la colonne
hostnamemanquante àsystem.delta_lake_metadata_logetsystem.iceberg_metadata_log. #102162 (Michael Russell). - Correction dans CoalescingMergeTree pour le type Array. #102384 (Konstantin Vedernikov).
Correctifs S3/Azure/stockage objet
- Correction d’une exception provenant de
CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova). - Correction d’un crash : l’interrogation de fichiers avec un motif glob (par ex.
file('dir/**', 'LineAsString')) levait une exception du système de fichiers non gérée si le répertoire contenait un lien symbolique orphelin. Les liens symboliques orphelins sont désormais ignorés sans bruit. #98143 (Mark Andreev). - Correction d’une utilisation mémoire excessive (~514 MiB) lors de la détection automatique du format pendant la lecture de données non Arrow (par ex. du JSON depuis
url()oufile()sans format explicite), causée par le lecteur ArrowStream qui interprétait les premiers octets comme une longueur de métadonnées énorme. #98893 (Konstantin Bogdanov). - Correction d’une situation de concurrence pouvant provoquer une exception “ReadBuffer is canceled” dans les requêtes utilisant
urlClusterou des fonctions table cluster similaires. #98955 (Alexey Milovidov). - Correction d’un message trompeur “inflate failed: buffer error” lors de la lecture de fichiers compressés inexistants via la fonction table
url()avec des motifs glob. #99034 (Alexey Milovidov). - Correction des appels
HeadObjectN+1 pour les motifs glob S3 avec expansion d’accolades. #99219 (Konstantin Bogdanov). - Correction de cas où des nombres avec des zéros initiaux dans un chemin de partitionnement Hive provoquaient des erreurs. #99458 (Yarik Briukhovetskyi).
- Correction d’un
seekincorrect dansAsynchronousReadBufferFromFileDescriptoravecO_DIRECT. #99678 (Pavel Kruglov). - Correction d’un bug où ClickHouse pouvait ignorer des fichiers si l’en-tête
Content-Lengthétait absent de la réponse à leur requête HEAD (par exemple, en raison d’un transcodage décompressif dans GCS). #99971 (Yarik Briukhovetskyi). - Le serveur n’échoue plus au démarrage lorsqu’un disque Azure blob storage est configuré mais que l’endpoint est temporairement inaccessible (par ex. échec DNS). #100701 (Raúl Marín).
- Correction d’un segfault dans
s3Clusteret les requêtes distribuées dû à une libération prématurée dans le pool de connexions. #100837 (Konstantin Bogdanov). - Correction d’une exception s’échappant du destructeur S3
Client::~Client, provoquant l’arrêt du serveur. #101798 (Gagan Dhakrey). - Correction de l’hôte et du port qui n’étaient pas correctement consignés lors de la reconnexion. #102280 (Grant Holly).
- Correction d’une exception côté serveur dans ClusterDiscovery lorsqu’un cluster statique (défini dans la config) n’avait temporairement aucun nœud actif. #102661 (Kseniia Sumarokova).
Correctifs S3Queue
- S3Queue : correction d’une assertion en échec après une perte de connexion à ZooKeeper, malgré un commit réussi. #100210 (Kseniia Sumarokova).
- Correction de l’inversion du texte de description de la colonne
alterabledanssystem.s3_queue_settingsetsystem.azure_queue_settings— la signification de0et1a été permutée pour correspondre au comportement réel du code. #101703 (ClickGap AI Bot).
Correctifs de sécurité et de contrôle d’accès
- La fonction de table
loopappelait directementinner_storage->read(), en contournant la couche d’interprétation où sont appliquées les row policies, les grants au niveau des colonnes et les autres contrôles de sécurité. Cela permettait à un utilisateur restreint par des row policies de lire toutes les lignes vialoop(table). #97682 (pufit). - Application des vérifications
READ ON FILEpour le scalairefile()etDESCRIBE TABLE file(). #98115 (Nikolay Degterinsky). - Prise en charge des credentials base64 sans padding dans HTTP Basic Auth. Certains clients HTTP omettent le padding final
=dans l’en-têteAuthorization: Basic, ce qui provoquait auparavant des échecs d’authentification. #98392 (Amos Bird). - Correction d’un contournement de RBAC qui permettait aux utilisateurs d’exécuter
DESCRIBEsur n’importe quelle table viaremote(),remoteSecure(),cluster()ouclusterAllReplicas()pointant vers localhost, sans nécessiter le privilègeSHOW_COLUMNS. #98669 (pufit). - Correction d’un problème où
system.grantsomettait les paramètres de regular expression pour les grantsURLetS3dans la colonneaccess_object. #98987 (DQ). - Correction d’un contournement de RBAC qui permettait aux utilisateurs d’obtenir la structure d’une table via
DESCRIBE TABLEouCREATE TABLE ASsur des fonctions de table (mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc(), etc.) sans les privilèges d’accès à la source requis. Pour les fonctions qui déduisent le schéma à partir de serveurs distants, cela permettait également de déclencher des connexions sortantes (SSRF) sans autorisation. #99122 (pufit). - Limitation des settings constraints dans le worker DDL pour les distributed DDL queries. #99317 (Pablo Marcos).
- Correction de problèmes mineurs liés à l’authentification TOTP : l’option CLI
--one-time-passwordavec un mot de passe vide, ainsi que la validation des valeurs de configuration<digits>et<period>. #99322 (Vladimir Cherkasov). - Les credentials dans les connection strings JDBC, ODBC et NATS sont désormais masqués dans les query logs et la sortie de
SHOW CREATE. Pour les connection strings de type URI, seule la partie mot de passe est masquée. Le settingnats_tokenest désormais lui aussi masqué. #99344 (János Benjamin Antal). - Interdiction de lire les credentials Google depuis un fichier local, ce qui n’était pas sûr, car cela permettait de lire d’autres credentials si le file path était connu. #99584 (Konstantin Vedernikov).
- Correction du contournement de
RemoteHostFilterpar la source de dictionnaire MySQL pour les paramètres DDL inline. #99720 (Shaohua Wang). - Correction de
system.completionsafin de filtrer correctement les databases, tables et columns selon les access rights dans toutes les combinaisons de grants : revoke par table, par DB et par colonne. #100432 (Shaohua Wang). - Nettoyage de
query_iddans le handler HTTP afin d’empêcher l’injection CRLF dans les headers de réponse via l’en-têteX-ClickHouse-Query-Id. #100500 (Pablo Marcos). - Certains catalogues pouvaient afficher des secrets dans la section
SETTINGSdeSELECT * FROM system.databases. Ce n’est désormais plus possible. #100800 (Konstantin Vedernikov). - Les politiques au niveau des lignes n’étaient pas propagées des sous-planificateurs vers le planificateur parent pour la journalisation, elles étaient donc absentes de
query_logpour les vues, les sous-requêtes et les insert-selects. Elles sont désormais conservées dansQueryAccessInfopour la journalisation. #101044 (Narasimha Pakeer).
Correctifs de sauvegarde et de restauration
- Correction du problème empêchant l’application de
max_execution_timeaux opérations de sauvegarde/restauration. #99205 (Kseniia Sumarokova). - Correction d’une exception
ReadBuffer is canceled. Can't read from it.dans les opérations de sauvegarde/restauration utilisant des archives zip. #100400 (Alexey Milovidov). - Validation des chemins des entrées de fichier dans les métadonnées de sauvegarde afin de rejeter les traversées de répertoires, les chemins absolus et les noms vides lors de
RESTORE. #100483 (Pablo Marcos). - Correction de la mise en forme et du clonage de l’AST pour
BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
Correctifs ClickHouse Keeper
- Correction d’une data race dans le client ZooKeeper entre le thread d’envoi et le thread de réception. #97887 (Pablo Marcos).
- Correction d’une perte de données dans Keeper après redémarrage lors de l’utilisation d’Azure Blob Storage avec des métadonnées
s3_plainpour le stockage des logs. #97987 (Antonio Andelic). - Définition du composant
Watchpour les réponses de watch dansaggregated_zookeeper_log, au lieu de le laisser vide. #98202 (Antonio Andelic). - Correction d’un problème où ClickHouse Keeper déconnectait les clients ZooKeeper Java après une requête
addWatch. Le client Java attend un corpsErrorResponsede 4 octets, mais Keeper envoyait un corps vide, ce qui provoquait uneEOFExceptionet la déconnexion de la session. #98499 (Antonio Andelic). - Correction d’un problème où les métriques Keeper
zk_followersetzk_synced_followersne diminuaient pas lorsqu’un follower tombait en panne. Ajout des nouvelles métriqueszk_learnersetzk_synced_non_voting_followersà la commandemntr. #98504 (Antonio Andelic). - Correction d’un problème où le port Raft sécurisé de Keeper ignorait
cipherListetdhParamsFilede la configurationopenSSL. #98509 (Antonio Andelic). - Correction de messages de log Keeper trompeurs, comme “Receiving request for session X took 9963 ms”, alors que le temps indiqué correspondait en réalité à l’attente inactive dans
poll()entre deux heartbeats. #98510 (Antonio Andelic). - Correction d’un problème où des connexions TCP de Keeper empêchaient l’arrêt gracieux du serveur en ne répondant pas au signal d’arrêt. #98525 (Alexey Milovidov).
- Correction d’une assertion de débogage dans
DDLWorker, causée par unfirst_failed_task_nameobsolète après la suppression d’une entrée ZooKeeper pendant la récupération lors de la réinitialisation. #99099 (Antonio Andelic). - Correction d’un cas de plantage de Keeper. #99133 (JIaQi Tang).
- Correction d’un bug dans Keeper où une requête de lecture pouvait rester bloquée (provoquant un timeout de session) si une autre session sans rapport sur le même serveur était fermée au mauvais moment. #99484 (Michael Kolupaev).
- Correction d’un SEGFAULT dans NuRaft dû à une race condition. #100444 (Pablo Marcos).
- Correction d’un problème où
CREATE TABLEdeKeeperMapéchouait avec “Cannot create metadata for table” lorsque des nœuds ZooKeeper résiduels issus d’un drop partiel antérieur à la version 25.1 ne contenaient pas le nœuddrop_lock_version. #101623 (Antonio Andelic). - Correction d’une perte du registry UDF lorsqu’une session ZooKeeper expirait pendant un refresh périodique — toutes les user-defined functions pouvaient devenir indisponibles jusqu’à la réussite d’un full refresh. #101891 (Nikita Fomichev).
- Correction d’un plantage lors du refresh des UDF, causé par
ZooKeeperRetriesControl, qui réessayait sur une session ZooKeeper obsolète (expirée) sans la renouveler. #102059 (Nikita Fomichev).
Correctifs de crash et de stabilité
- Correction d’un crash dans les fonctions du dialecte Kusto
bin(),bin_at(),extract()etindexof()lorsque des arguments vides sont fournis. #95736 (NeedmeFordev). - Correction d’un crash/assertion du serveur dans
mapContainsKey/mapContainsKeyLikeavec un skip indextokenbf_v1. #97826 (Shankar Iyer). - Correction d’un crash du serveur (
std::terminate) provoqué par une exception non interceptée dans le destructeur du pool de connexions HTTP lorsque la limite stricte du groupe de connexions est atteinte en cas de forte concurrence. #97850 (Antonio Andelic). - Correction d’un accès hors limites dans
ColumnConst::getExtremesqui pouvait provoquer un crash lorsqueextremes = 1est activé. #98263 (Alexey Milovidov). - Validation des données corrompues lors de la désérialisation de
DDSketchafin d’éviter des segfaults, des exceptions, des boucles infinies et des OOM lors de la lecture d’états de fonctions d’agrégationquantilesDDcorrompus. #98284 (Alexey Milovidov). - Correction d’une exception rare dans l’exécuteur du pipeline, qui pouvait se manifester par
Received signal 6(dans les builds de débogage), lorsque l’expansion du pipeline entrait en concurrence avec l’annulation de la requête. #98428 (Alexey Milovidov). - Correction d’un déréférencement de pointeur nul dans
dictGetOrDefaultlorsque l’argument de clé estNullable. #98460 (Alexey Milovidov). - Correction d’un interblocage du pipeline lors de l’utilisation de
sort_overflow_mode = 'break'avec des fonctions de fenêtre. #98543 (Alexey Milovidov). - Correction d’un crash provoqué par le déréférencement d’un pointeur nul dans des tables système créées entre la capture d’un snapshot des tables dans
IDatabaseTablesIterator::table()et leur modification par un autre thread lors d’une itération ultérieure. #98792 (Grant Holly). - Correction d’une dérive du suivi mémoire provoquée par l’absence d’annulation des allocations échouées, le comportement indéfini de
nallocx(0)et une erreur de décalage d’une unité dans le suivi du pic global. Extension du suivi pour couvrir les buffers en anneauio_uring. #98915 (Antonio Andelic). - Correction d’un crash du serveur (
std::terminate) lors de l’exécution deALTER TABLE ... DROP PARTsur une patch part après un changement de schéma (par ex. ADD COLUMN). #99036 (Peng). - Correction d’un crash du serveur qui pouvait se produire si une exception de dépassement de la limite mémoire était levée pendant une lecture sur disque mise en cache. #99042 (Shankar Iyer).
- Correction d’un crash déclenché par une exception de limite mémoire levée pendant l’application d’une patch part. #99086 (Anton Popov).
- Correction d’un crash lors de l’utilisation d’une Buffer table avec
SAMPLElorsque la destination ne le prend pas en charge. #99141 (Kseniia Sumarokova). - Correction d’un heap-use-after-free lorsqu’une table est supprimée de façon concurrente alors qu’une requête de lecture est en cours d’exécution. #99483 (Alexey Milovidov).
- Correction d’un heap-buffer-overflow dans
CompressionCodecT64et d’un arrêt du processus dansCompressionCodecMultiplelors de la décompression de données compressées malformées. Les codecs lèvent désormais une exception au lieu de provoquer un crash. #99680 (Rahul Nair). - Correction d’une boucle infinie lors de la lecture de fichiers au format
Npyavec des dimensions de forme négatives. #99812 (Desel72). - Correction d’un global-buffer-overflow dans la fonction
CRC32sur des argumentsFixedStringlorsqu’elle est évaluée sur zéro ligne pendant le calcul de l’en-tête du plan de requête. #99835 (Alexey Milovidov). - Correction d’un échec d’assertion dans
sipHash128Keyed(et des fonctions de hachage à clé similaires) lorsque l’argument de données est un Map avec des clés de tableau ou d’autres types de tableaux imbriqués. #99921 (Alexey Milovidov). - Correction d’un échec d’assertion lors de la multiplication des états d’agrégation
NumericIndexedVectorpar une constante entière paire, causé par un auto-XOR sur des bitmaps Roaring aliasés danspointwiseAddInplace. #99976 (Desel72). - Correction d’un déréférencement de nullptr dans le lecteur Parquet lorsque le chemin filter-in-decoder rencontre des pages filtrées. #99677 (Alexey Milovidov).
- Correction d’un crash du serveur local lorsque
CREATE DICTIONARYcontient une définition avec une valeur de liste contenant une fonction inexistante. #100036 (Yakov Olkhovskiy). - Correction d’un SIGSEGV lors de la lecture de patch parts après
ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky). - Correction de l’utilisation d’une valeur non initialisée dans
StringSearcher.h. #100225 (Konstantin Bogdanov). - Correction d’un crash du serveur (échec d’assertion) lors de l’utilisation de fonctions d’agrégation paramétriques avec le combinator Array et des arguments NULL, comme
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot). - Correction d’un heap-buffer-overflow dans
sorted_buffer_gt::insert()de usearch, pouvant provoquer un crash ou corrompre silencieusement la mémoire pendant une recherche de similarité vectorielle. #100537 (Dustin Healy). - Correction d’un crash du serveur (erreur logique “Unexpected return type from __topKFilter”) lorsque
use_top_k_dynamic_filteringest activé et que la colonneORDER BYest de typeDynamicouVariant. #100742 (Groene AI). - Correction d’un crash du serveur lors de l’utilisation de la fonction
has()avec PREWHERE/WHERE sur une clé Tuple contenant des éléments LowCardinality. #100760 (Groene AI). - Correction d’un segfault dû à un déréférencement de pointeur nul lors du chargement des dictionnaires pendant l’arrêt du serveur. #100839 (Miсhael Stetsyuk).
- Correction d’un buffer overflow dans
ULIDStringToDateTimelorsque l’entrée contient des octets non ASCII. #100843 (Konstantin Bogdanov). - Correction d’un crash (
LOGICAL_ERROR) lors d’une requête sur une tableMerge(ou la fonction de tablemerge()) qui regroupe plusieurs tables, dont une tableDistributed, avecdistributed_group_by_no_merge=1activé. #100859 (Groene AI). - Correction d’un crash lors de la construction d’un dictionnaire Polygon à partir d’une table
MergeTreeutilisant une sérialisation clairsemée des colonnes. #100964 (Anton Popov). - Correction d’un crash (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) dans les algorithmes de fusion lorsque la réplication lazy des colonnes (enable_lazy_columns_replication) produit des colonnesColumnReplicatedqui arrivent dans des pipelines de tri par fusion avec des entrées tardives. #101036 (Groene AI). - Correction d’un crash du serveur (
SIGABRT) lors de l’utilisation de fonctions d’agrégation avec le combinatorNull, réservé à un usage interne (par ex.sumNull,avgNull), etaggregate_functions_null_for_empty = 1. #101147 (Groene AI). - Correction d’un use-after-free dans le chemin d’écriture du cache du système de fichiers, qui pouvait entraîner des lectures depuis une mémoire déjà libérée lors de la journalisation des segments de fichier terminés. #101161 (Groene AI).
- Correction d’un crash du serveur avec “Trying to attach external table to a ready set without explicit elements” lorsque l’analyse distribuée des index rencontre un prédicat
GLOBAL INdont le Set a été construit sans éléments explicites. #101178 (Groene AI). - Correction des fonctions d’agrégation
MAX/MINsur des colonnesDecimalqui renvoyaient des résultats incorrects lorsque la compilation JIT est activée. #101203 (Raúl Marín). - Correction d’un crash du serveur (
LOGICAL_ERROR: Bad cast fromColumnVectortoColumnLowCardinality) lors d’une requête sur une table MergeTree avecORDER BY CAST(lc_column, 'Type'), oùlc_columnest de type LowCardinality. #101220 (Groene AI). - Correction d’un comportement indéfini dans
mergeTreeAnalyzeIndexes()en cas d’argument d’optimisation invalide. #101253 (Azat Khuzhin). - Correction d’un crash du serveur (Logical error: “Variant … is empty”) lorsqu’une requête lit simultanément une colonne Tuple contenant un type Map Dynamic et sa sous-colonne. #101448 (Groene AI).
- Correction d’un crash
LOGICAL_ERROR“Current component is empty” lors d’une requête sursystem.part_moves_between_shardsavecenforce_keeper_component_trackingactivé. #101462 (Groene AI). - Correction d’une erreur de segmentation dans
DataTypeDynamic::create()lorsque le fuzzer génère un AST de type Dynamic mal formé. #101464 (Groene AI). - Correction d’un crash
LOGICAL_ERROR(“ColumnUnique can’t contain null values”) lors de la comparaison d’une colonneLowCardinalityavec une constante NULL de typeVariant, alors queuse_variant_default_implementation_for_comparisonsest désactivé. #101690 (Groene AI). - Ajout d’une protection contre les flux vides à
Bzip2ReadBufferafin qu’il renvoie EOF au lieu de leverUNEXPECTED_END_OF_FILElorsque le flux interne est vide. #101691 (ClickGap AI Bot). - Correction d’un crash de type use-after-free dans l’ordonnanceur de lease CPU lorsque le temporisateur d’attente survit au worker thread dont il référence
ProfileEvents::Counters. #101761 (Antonio Andelic). - Correction d’un use-after-scope dans la désérialisation en parallèle des chemins dynamiques de type
Object, qui pouvait provoquer des crashs lors de la lecture de tables comportant de nombreux chemins dynamiques. #101823 (Antonio Andelic). - Correction d’un SIGSEGV dans
MergeTreeDataPartWriterWide::cancellorsqu’un constructeur de flux lève une exception pendantaddStreams, laissant une entrée nulle danscolumn_streams. #101936 (Antonio Andelic). - Correction d’un segfault dans les mutations sur des colonnes matérialisées sans expression. #102342 (zoomxi).
- Correction d’un segfault (ou de
LOGICAL_ERRORdans les builds de débogage) lors de la lecture de fichiers Parquet avec le push-down du bloom filter activé et des conditions d’égalité/inégalité dans la clauseWHERE, causé par un accès mémoire hors limites dans le prefetcher Parquet. #102385 (Groene AI). - Correction d’une lecture hors limites dans les fonctions de recherche de chaînes (
countSubstrings,position, etc.) lors de la recherche d’un needle composé uniquement de null bytes. #102401 (Raúl Marín). - Correction d’une lecture hors limites dans
printfavec un%final. #102472 (Raúl Marín). - Correction d’un crash
LOGICAL_ERROR“Unexpected number of rows in column subchunk” dans le lecteur natif Parquet V3 lors de la lecture de colonnes Nullable avec un filtreWHERE. #102628 (Groene AI). - Correction d’un crash du serveur (SIGSEGV) lors de la lecture de fichiers Avro avec des schémas récursifs contenant des références cycliques à des types symboliques. Ces schémas sont désormais détectés et rejetés avec un message d’erreur clair. #102853 (Groene AI).
- Correction d’un crash du serveur (assertion
LOGICAL_ERROR) lorsqu’une fonction sur une colonneVariantatteint une memory limit ou une autre exception sans rapport avec une conversion de type pendant le transtypage du résultat dansFunctionVariantAdaptor. #102855 (Groene AI). - Correction d’un crash dans les builds debug/sanitizer lorsque
std::length_errorest levée pendant l’inférence de schéma. #102859 (Groene AI). - Correction d’un crash lors de l’utilisation d’une vue avec une clause
WHEREoù la requête interne produit des colonnes de types différents de ceux des métadonnées de la vue (par exempleNullableissu d’unLEFT JOINavecjoin_use_nulls). #102085 (Miсhael Stetsyuk).
Autres corrections de bugs
- Correction d’un bug où des paramètres explicites envoyés avec
compatibilitydans la même requête pouvaient être ignorés silencieusement lorsque leur valeur correspondait à la valeur par défaut du serveur. #97078 (Raufs Dunamalijevs). - Correction du client qui signalait
NETWORK_ERRORau lieu de l’erreur d’analyse syntaxique réelle (avec le bon numéro de ligne) lorsqu’un INSERT avec analyse parallèle rencontrait des données invalides. #97339 (Alexey Milovidov). - Correction de
DROP DATABASEavecdatabase_atomic_wait_for_drop_and_detach_synchronously, qui restait bloqué indéfiniment lorsque la requête était killée. #97586 (Alexey Milovidov). - Correction de
KILL QUERY, qui ne pouvait pas terminer les requêtes bloquées lors de la générationWITH FILL, du chargement de dictionnaire viadictGet, ou d’unALTER DELETEavecmutations_sync=1surReplicatedMergeTree. #97589 (Alexey Milovidov). - Correction d’une erreur logique dans une requête de politique de masquage des données avec
ON CLUSTER. #97594 (Bharat Nallan). - Correction d’un partition pruning incorrect lors de l’utilisation d’un
DateTime64antérieur à l’époque Unix avec la fonctiontoDate(). #97746 (Yarik Briukhovetskyi). - Correction d’une
LOGICAL_ERRORCannot schedule a filesurINSERTdansDistributeden raison d’une concurrence entreDROPetINSERT. #97822 (Azat Khuzhin). - Correction d’une erreur logique “Bad cast from type DB::ColumnConst to DB::ColumnArray” dans
kql_array_sort_asc/kql_array_sort_desclorsqu’elles sont appelées avec des arguments de tableau constants. #98251 (Alexey Milovidov). - Le serveur HTTP renvoie désormais un message d’erreur dans le corps de la réponse pour les réponses 400 Bad Request causées par des en-têtes mal formés, au lieu d’un corps vide. #98268 (Alexey Milovidov).
- Correction de résultats erronés avec l’analyse distribuée des index (fonctionnalité expérimentale) et le cache des conditions de requête. #98269 (Azat Khuzhin).
- Correction d’un échec d’une source de dictionnaire
MongoDBavec les collections nommées. #98528 (Pablo Marcos). - Il est désormais interdit de supprimer une colonne lorsque ses sous-colonnes sont utilisées dans les expressions par défaut ou d’alias d’autres colonnes, et l’analyseur est désormais utilisé pour les expressions par défaut avec
ALTER DROP COLUMN. #98569 (Nikita Mikhaylov). - Toutes les
DB::Exceptionprovenant dePocoHTTPClient::makeRequestInternalImplne peuvent désormais plus faire l’objet d’une nouvelle tentative, y comprisHTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda). - Correction de deux bugs dans la compilation JIT d’expressions : une erreur de copier-coller dans la vérification des types de
nativeCastqui rendait inaccessibles les branches de cast d’entier à entier et de flottant à flottant, ainsi que le passage d’unTargetMachinenullptrincorrect à LLVMPassBuilder. #98660 (Alexey Milovidov). - Correction d’une exception “Inconsistent KeyCondition behavior” dans les builds de débogage lorsque la clé primaire contient des valeurs flottantes NaN, en faisant en sorte que
accurateLessetaccurateEqualstraitent les NaN de manière cohérente avec l’ordre de tri de ClickHouse. #98964 (Alexey Milovidov). - Correction de
windowFunnelavecstrict_deduplication, qui renvoyait un niveau incorrect lorsqu’un événement en double était rencontré. #99003 (Yash). - Les entrées
system.trace_logpour les rechargements automatiques des dictionnaires ClickHouse ont désormais des ID de requête non vides. #98784 (Miсhael Stetsyuk). - Correction de
SYSTEM START REPLICATED VIEW, qui ne relançait pas la tâche d’actualisation. #98797 (Pablo Marcos). - Correction de
WITH FILL STALENESS, qui produisait des lignes remplies en trop lorsque les données étaient lues en plusieurs chunks (par exemple avec unindex_granularityfaible). #98895 (Alexey Milovidov). - Correction d’un plantage dans l’obfuscation des requêtes pour les identifiants commençant par une majuscule, comme
Ab. #101450 (Xuewei Wang). - Correction du fait que
TABLE_UUID_MISMATCHétait ignoré dans le chemin de code sans analyzer. #99380 (Azat Khuzhin). - Correction de
clickhouse format --obfuscate, qui produisait du SQL invalide en obfusquant les types de skip index, les noms de codecs de compression, les noms de database engine et les définitions de dictionary layout/source. #99260 (Raúl Marín). - Validation des changements de paramètres dans les requêtes CREATE lorsque l’engine lui-même prend aussi en charge des paramètres. #99279 (János Benjamin Antal).
- Correction de
insert_deduplication_token, qui était ignoré silencieusement pour les requêtesINSERT SELECTsansORDER BY ALL. Fournirinsert_deduplication_tokensuffit désormais à activer la déduplication, indépendamment deORDER BY ALL. #99206 (Desel72). - Le traitement est désormais différé jusqu’à ce que le serveur ait fini de charger toutes les tables. #99700 (Seva Potapov).
- Correction de l’analyse des guillemets de style shell dans les arguments de la table function
executable. #99794 (Nikita Semenov). - Correction des requêtes d’async insert qui signalaient
written_rows,read_rowsetresult_rowsà zéro dansquery_loget dans la sortie du client. #99879 (Sema Checherinda). - Correction d’un
INSERTavecVALUESqui échouait lorsque les données étaient suivies d’un commentaire SQL final (--ou/* */) sur la ligne suivante. Le commentaire est désormais ignoré au lieu d’être interprété comme une autre ligne. #100016 (Pratima Patel). - Correction d’une exception dans
arrayRemovelors de la comparaison de tuples avec des composantes NULL. #100017 (Alexey Milovidov). - Traitement correct des valeurs négatives dans
NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik). - Correction d’un problème où la fonction de table
primesne respectait pas correctementmax_rows_to_readdans certains cas, en particulier lorsque offset et step sont présents. #100199 (Nihal Z. Miaji). - Les utilisateurs ne voient plus
NATURAL CROSS JOINlorsqu’ils interrogent l’AST d’une requête avec jointure naturelle réécrite enCROSS JOIN. #100223 (Peter Nguyen). - Quelques modifications mineures de fonctions : les fonctions h3 valident désormais mieux les limites ;
readWKBvérifie les limites de taille (un nouveau paramètre,max_wkb_geometry_elements) ; les fonctions de génération aléatoire limitent le nombre maximal d’itérations. #100270 (Alexey Milovidov). - Correction d’un problème où
cutURLParameterpouvait ignorer à tort des paramètres lorsqu’ils apparaissaient comme sous-chaînes d’autres paramètres. #100280 (Nikita Semenov). - Correction d’une exception
LOGICAL_ERRORdansestimateCompressionRatiolorsque le paramètreblock_size_bytesest extrêmement grand. #100298 (Alexey Milovidov). - Correction de
DROP TABLE, qui pouvait rester bloqué indéfiniment sur les tables du moteur Kafka lorsque les consumers sont bloqués dans un rebalance après une erreur de heartbeat. #100388 (Alexey Milovidov). - Validation des dimensions du shape du format Npy par rapport à la taille du fichier et aux limites d’overflow afin d’éviter un déni de service via des fichiers
.npymalveillants. Les shapes vides sont également rejetés et la mémoire par ligne est plafonnée à 2 GiB. #100625 (Raúl Marín). - Correction d’un problème où
session_timezoneétait ignoré lors de l’analyse des valeursDateTimependant les async inserts (TCP) et tous les inserts via HTTP. #100647 (Sema Checherinda). StorageRabbitMQ::shutdowna été rendu idempotent et des vérifications défensives de nullité ont été ajoutées, puisqu’il est désormais appelé deux fois (dansStreamingStorageRegistryetDatabaseCatalog). #100455 (Miсhael Stetsyuk).- Correction d’une exception
LOGICAL_ERRORlors de l’utilisation deaccurateCastOrNullavec le type cibleQBit. #100470 (Raufs Dunamalijevs). - Correction de la syntaxe
LIMIT m OFFSET n WITH TIES, qui ne fonctionnait pas (équivalente àLIMIT n, m WITH TIES, qui fonctionnait déjà). #100491 (Nihal Z. Miaji). - Correction d’un segfault où
SerializationInfoTuple::addeffectuait unassert_castsur une simple référenceSerializationInfolors de la fusion des parts après qu’ALTER MODIFY COLUMNa modifié une colonne d’un type non-Tuple vers un Tuple. #100509 (Miсhael Stetsyuk). - Correction d’une exception “No set is registered for key” lors de l’utilisation de
INavec des colonnesNullable(Tuple)ayant des fields nommés et des élémentsLowCardinality. #100523 (Alexey Milovidov). - Correction d’un problème où
EXECUTE ASignorait les clausesFORMATetINTO OUTFILEspécifiées dans la query. #100538 (pufit). - Correction d’un formatage AST incohérent pour
SAMPLEavec unOFFSETau niveau de la requête. #100579 (Pavel Kruglov). - Correction des erreurs “La table cible n’existe pas” pour les vues matérialisées avec tables internes lors du démarrage asynchrone, dues à un ordre incorrect des dépendances au démarrage. #100946 (Nikolay Degterinsky).
- Correction d’une exception dans
optimizeLazyMaterializationlorsqu’une projection avec PREWHERE est utilisée avecORDER BY ... LIMIT. #101115 (Anton Popov). - Correction d’un message d’erreur incorrect lors de l’appel à
intExp10avec un argument NaN — il indiquaitintExp2au lieu deintExp10. #101582 (Krishna Chaitanya). - Correction du fait que
allow_statistics=0ne bloquait pasALTER TABLE ADD STATISTICSniALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya). - Correction de
CREATE TABLE ... AS merge(), qui ignorait la liste explicite de colonnes et inférait automatiquement les colonnes à partir des tables sources, ce qui provoquait des erreursNOT_FOUND_COLUMN_IN_BLOCKlorsquemerge_table_max_tables_to_look_for_schema_inferenceétait suffisamment faible et que les tables sources avaient des schémas différents. #101663 (Miсhael Stetsyuk). - Correction de la création de dictionnaires
RANGE_HASHED, qui acceptait silencieusement un attribut de plageMAXinexistant et utilisait une configuration de type incorrecte lorsque les attributs de plage min et max avaient des types différents. #101732 (Yakov Olkhovskiy). - Correction de bugs dans les fonctions
arrayLevenshteinDistanceWeightedetarraySimilarity. #101767 (Mikhail f. Shiryaev). - Correction de l’API Query de Prometheus, qui ignorait les corps de formulaires POST. #101794 (James Cunningham).
- Correction d’un faux négatif de
shouldPatchFunctiondansSYSTEM INSTRUMENT ADDlorsque la chaîne recherchée apparaissait d’abord dans un argument Template du nom de symbole démêlé. #101885 (Pablo Marcos). - Correction de la description
system.codecspourAES_256_GCM_SIV, afin d’indiquerAES-256au lieu deAES-128. #101917 (Jimmy Aguilar Mena). - Correction d’un comportement indéfini lors de l’analyse des paquets Query du protocole natif contenant des valeurs
QueryProcessingStageinvalides. #101972 (Raúl Marín). - Fermeture de la connexion TCP lorsqu’une exception se produit pendant l’analyse de la requête initiale, afin d’éviter la lecture de données incohérentes depuis un flux désynchronisé. #101989 (Raúl Marín).
- Correction des cas où
Timeavec des valeurs négatives renvoyait un résultat incorrect lors d’une comparaison avecDateTime. #102056 (Yarik Briukhovetskyi). - Correction des espaces manquants lors du formatage de unlock snapshot. #102063 (Han Fei).
- Correction de l’échec d’initialisation, sur une replica fraîche, des tables alias sans table cible dans Database Replicated. #102397 (Nikolay Degterinsky).
- Les
INSERTsimples sans vues matérialisées ne demandent plus un nombre excessif de slots et de threadsConcurrencyControl(max_threadsau lieu demax_insert_threads), ce qui évite l’épuisement des slots CC et l’explosion du nombre de threads sur les clusters avec un fort débit d’INSERT. #102961 (Sema Checherinda). ArrowMemoryPoola été réintroduit afin de pouvoir leverMEMORY_LIMIT_EXCEEDEDet éviter un OOM du noyau. #102999 (Azat Khuzhin).- Correction d’un type d’argument erroné signalé dans les messages d’erreur des fonctions de recherche de chaînes (par ex.
locate,position) lorsque les arguments sont passés dans l’ordre inversé (locate(needle, haystack)avecfunction_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov). - Correction d’un blocage indéfini de
waitForPauselorsquedisableFailPointest appelé alors qu’aucun thread n’est en pause au niveau du failpoint. #103119 (Shaohua Wang).