Changement non rétrocompatible
- Autorise l’écriture de
SETTINGSavantFORMATdans une chaîne de requêtes avecUNIONlorsque les sous-requêtes sont entre parenthèses. Cela clôt #39712. Modifie le comportement lorsqu’une requête comporte deux fois la clause SETTINGS dans une séquence. La clause SETTINGS la plus proche aura la priorité pour la sous-requête correspondante. Dans les versions précédentes, la clause SETTINGS la plus externe pouvait avoir la priorité sur la clause interne. #60197#68614 (Alexey Milovidov). - Réimplémente le type Dynamic. Désormais, lorsque la limite des types de données dynamiques est atteinte, les nouveaux types ne sont plus convertis en String, mais stockés dans une structure de données spéciale au format binaire avec un type de données encodé en binaire. Désormais, tout type inséré dans une colonne Dynamic peut y être lu comme sous-colonne. #68132 (Pavel Kruglov).
- Les expressions comme
a[b].csont prises en charge pour les tuples nommés, ainsi que les indices nommés à partir d’expressions arbitraires, par exempleexpr().name. C’est utile pour le traitement du JSON. Cela clôt #54965. Dans les versions précédentes, une expression de la formeexpr().nameétait analysée commetupleElement(expr(), name), et l’analyseur de requêtes recherchait une colonnenameplutôt que l’élément de tuple correspondant ; dans la nouvelle version, cela devienttupleElement(expr(), 'name'). Dans la plupart des cas, l’ancienne version ne fonctionnait pas, mais on peut imaginer un scénario très inhabituel dans lequel ce changement pourrait entraîner une incompatibilité : si vous stockiez des noms d’éléments de tuple dans une colonne ou un alias portant un nom différent de celui de l’élément de tuple :SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a. Il est très peu probable que vous utilisiez de telles requêtes, mais nous devons tout de même marquer ce changement comme potentiellement non rétrocompatible. #68435 (Alexey Milovidov). - Lorsque le paramètre
print_pretty_type_namesest activé, il affichera le type de donnéesTuplesous une forme Pretty dans les instructionsSHOW CREATE TABLE, la fonctionformatQueryet en mode interactif dansclickhouse-clientetclickhouse-local. Dans les versions précédentes, ce paramètre s’appliquait uniquement aux requêtesDESCRIBEet àtoTypeName. Cela clôt #65753. #68492 (Alexey Milovidov). - La réorganisation des conditions de filtre de la clause
[PRE]WHEREest désormais autorisée par défaut. Elle peut être désactivée en définissantallow_reorder_prewhere_conditionssurfalse. #70657 (Nikita Taranov). - Corrige l’optimisation
optimize_functions_to_subcolumns(qui pouvait auparavant entraîner l’erreurInvalid column type for ColumnUnique::insertRangeFrom. Expected String, got LowCardinality(String)), en préservant le typeLowCardinalitydansmapKeys/mapValues. #70716 (Azat Khuzhin).
Nouvelle fonctionnalité
- Les vues matérialisées actualisables sont prêtes pour la production. #70550 (Michael Kolupaev). Les vues matérialisées actualisables sont désormais prises en charge dans les bases de données Replicated. #60669 (Michael Kolupaev).
- La fonction
toStartOfInterval()dispose désormais d’une nouvelle surcharge qui émule la fonctiontime_bucket()de TimescaleDB ou, de manière équivalente, la fonctiondate_bin()de PostgreSQL. (#55619). Elle permet d’aligner des valeurs de date ou de timestamp sur des multiples d’un intervalle donné à partir d’une origine arbitraire (au lieu de 0000-01-01 00:00:00.000 comme origine fixe). Par exemple,SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'));renvoie2023-01-01 14:44:30, soit un multiple d’intervalles d’une minute à partir de l’origine2023-01-01 14:35:30. #56738 (Yarik Briukhovetskyi). - Intégration MongoDB remaniée : migration vers le nouveau driver mongocxx depuis Poco::MongoDB obsolète, suppression de la prise en charge de l’ancien protocole obsolète, prise en charge de la connexion par URI, prise en charge de tous les types MongoDB, prise en charge des instructions WHERE et ORDER BY côté MongoDB, restriction des expressions non prises en charge par MongoDB. #63279 (Kirill Nikiforov).
- Une nouvelle option
--progress-tabledans clickhouse-client affiche une table avec des métriques évoluant pendant l’exécution de la requête ; une nouvelle option--enable-progress-table-toggleest associée à l’option--progress-tableet permet d’activer ou de désactiver l’affichage de la table de progression en appuyant sur la touche de contrôle (Espace). #63689 (Maria Khristenko). - Cela permet d’accorder l’accès aux préfixes génériques.
GRANT SELECT ON db.table_pefix_* TO user. #65311 (pufit). - Introduction du format JSONCompactWithProgress, dans lequel ClickHouse produit chaque ligne sous la forme d’un objet JSON délimité par des sauts de ligne, incluant les métadonnées, les données, la progression, les totaux et les statistiques. #66205 (Alexey Korepanov).
- Ajout de system.query_metric_log, qui contient l’historique de la mémoire et des valeurs de métriques de la table system.events pour des requêtes individuelles, périodiquement écrites sur disque. #66532 (Pablo Marcos).
- Ajout du paramètre
input_format_json_empty_as_defaultqui, lorsqu’il est activé, traite les champs vides dans les entrées JSON comme des valeurs par défaut. Clôture de #59339. #66782 (Alexis Arnaud). - Ajout des fonctions
overlayetoverlayUTF8, qui remplacent des parties d’une chaîne par une autre chaîne. Exemple :SELECT overlay('Hello New York', 'Jersey', 11)renvoieHello New Jersey. #66933 (李扬). - Ajout d’une nouvelle commande, Lightweight Delete In Partition
DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr;``` VM-114-29-tos :) select * from ads_app_poster_ip_source_channel_di_replicated_local;. #67805 (sunny). - Comparaison implémentée pour les valeurs du type de données
Interval, qui sont désormais converties vers le plus petit supertype commun. #68057 (Yarik Briukhovetskyi). - Ajout du paramètre create_if_not_exists pour adopter par défaut le comportement IF NOT EXISTS dans les instructions CREATE. #68164 (Peter Nguyen).
- Permet désormais de lire des tables Iceberg dans Azure et en local. #68210 (Daniil Ivanik).
- Ajout des fonctions d’agrégation distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes pour une meilleure introspection du contenu des colonnes de type JSON. #68463 (Pavel Kruglov).
- Les entrées du cache de requêtes peuvent désormais être supprimées par tag. Par exemple, l’entrée du cache de requêtes créée par
SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc'peut maintenant être supprimée avecSYSTEM DROP QUERY CACHE TAG 'abc'(ou, bien sûr, simplement avecSYSTEM DROP QUERY CACHE, ce qui videra l’intégralité du cache de requêtes). #68477 (Michał Tabaszewski). - Une simple requête SELECT peut être écrite avec un SELECT implicite afin de permettre des expressions de type calculatrice, par ex.
ch "1 + 2". Ce comportement est contrôlé par un nouveau paramètre,implicit_select. #68502 (Alexey Milovidov). - Prise en charge du mode —copy pour clickhouse local comme raccourci de conversion de format #68503. #68583 (Denis Hananein).
- Ajout de la fonction
ripeMD160, qui calcule le hachage cryptographique RIPEMD-160 d’une chaîne. Exemple :SELECT hex(ripeMD160('The quick brown fox jumps over the lazy dog'))renvoie37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #68639 (Dergousov Maxim). - Ajout de la colonne virtuelle _headers pour le moteur de table URL. Clôture #65026. #68867 (flynn).
- Ajout de la table
system.projectionspour suivre les projections disponibles. #68901 (Jordi Villar). - Ajout de la prise en charge de la fonction
arrayUnion. #68989 (Peter Nguyen). - Ajout de la nouvelle fonction
arrayZipUnalignedpour la compatibilité avec Spark (arrays_zip), permettant de gérer des tableaux non alignés sur la base dearrayZip. ``` sql SELECT arrayZipUnaligned([1], [1, 2, 3]). #69030 (李扬). - Prise en charge de la fonction d’agrégation
quantileExactWeightedInterpolated, qui est une version interpolée basée sur quantileExactWeighted. Certains pourraient se demander pourquoi une nouvelle fonctionquantileExactWeightedInterpolatedest nécessaire alors quequantileExactInterpolatedWeightedexiste déjà. La raison est que la nouvelle est plus précise que l’ancienne. Elle sert par ailleurs à la compatibilité avec Spark dans Apache Gluten. #69619 (李扬). - Prise en charge de la fonction arrayElementOrNull. Elle renvoie
nullsi l’index du tableau est hors limites ou si la clé de map est introuvable. #69646 (李扬). - Prise en charge du type Dynamic dans la plupart des fonctions, en les exécutant sur les types internes de Dynamic. #69691 (Pavel Kruglov).
- Ajoute l’argument
scale(par défaut :true) à la fonctionarrayAUC, ce qui permet d’ignorer l’étape de normalisation (ticket #69609). #69717 (gabrielmcg44). - La fonction
RIPEMD160a été réintroduite ; elle calcule le hachage cryptographique RIPEMD-160 d’une chaîne. Exemple :SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog'))renvoie37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #70087 (Dergousov Maxim). - Permet de mettre en cache les fichiers lus pour les table engines de stockage objet et les data lakes, en utilisant le hachage de ETag + chemin de fichier comme clé de cache. #70135 (Kseniia Sumarokova).
- Prise en charge de la lecture des tables Iceberg sur HDFS. #70268 (flynn).
- Permet de lire/écrire le type JSON sous forme de chaîne binaire au format RowBinary avec les paramètres
input_format_binary_read_json_as_string/output_format_binary_write_json_as_string. #70288 (Pavel Kruglov). - Permet de sérialiser/désérialiser une colonne JSON comme une seule colonne String au format Native. Pour la sortie, utilisez le paramètre
output_format_native_write_json_as_string. En entrée, utilisez la version de sérialisation1avant les données de la colonne. #70312 (Pavel Kruglov). - Prise en charge de la CTE standard
with insert, alors qu’auparavant seule la formeinsert ... with ...était prise en charge. #70593 (Shichao Jin).