Перейти к основному содержанию
Перейти к основному содержанию

Журнал изменений за 2025 год

Оглавление

Релиз ClickHouse v25.10, 2025-10-30
Релиз ClickHouse v25.9, 2025-09-25
Релиз ClickHouse v25.8 LTS, 2025-08-28
Релиз ClickHouse v25.7, 2025-07-24
Релиз ClickHouse v25.6, 2025-06-26
Релиз ClickHouse v25.5, 2025-05-22
Релиз ClickHouse v25.4, 2025-04-22
Релиз ClickHouse v25.3 LTS, 2025-03-20
Релиз ClickHouse v25.2, 2025-02-27
Релиз ClickHouse v25.1, 2025-01-28
Журнал изменений за 2024 год
Журнал изменений за 2023 год
Журнал изменений за 2022 год
Журнал изменений за 2021 год
Журнал изменений за 2020 год
Журнал изменений за 2019 год
Журнал изменений за 2018 год
Журнал изменений за 2017 год

Релиз ClickHouse 25.10, 2025-10-31

Обратно несовместимое изменение

  • Изменено значение настройки по умолчанию schema_inference_make_columns_nullable: теперь используется информация о том, являются ли столбцы Nullable, из метаданных Parquet/ORC/Arrow, вместо того чтобы делать все столбцы Nullable. Для текстовых форматов изменений нет. #71499 (Michael Kolupaev).
  • Кэш результатов запросов будет игнорировать настройку log_comment, чтобы изменение только log_comment в запросе больше не приводило к промаху кэша. Существует небольшая вероятность, что некоторые пользователи намеренно сегментировали свой кэш, варьируя log_comment. Это изменение изменяет такое поведение и, следовательно, является обратно несовместимым. Пожалуйста, используйте настройку query_cache_tag для этой цели. #79878 (filimonov).
  • В предыдущих версиях запросы с табличными функциями, названными так же, как функции-реализации операторов, форматировались непоследовательно. Закрывает #81601. Закрывает #81977. Закрывает #82834. Закрывает #82835. Запросы EXPLAIN SYNTAX больше не будут всегда форматировать операторы — новое поведение лучше отражает назначение объяснения синтаксиса. clickhouse-format, formatQuery и подобные больше не будут форматировать функции как операторы, если в запросе они использованы в функциональной форме. #82825 (Alexey Milovidov).
  • Запрещено использование типа Dynamic в ключах JOIN. Это может привести к непредсказуемым результатам при сравнении значения типа Dynamic со значением типа, отличным от Dynamic. Лучше предварительно привести столбец Dynamic к нужному типу. #86358 (Pavel Kruglov).
  • Опция сервера storage_metadata_write_full_object_key включена по умолчанию, сейчас её нельзя отключить. Это обратно совместимое изменение, просто примите его во внимание. Это изменение вперёд совместимо только с релизами 25.x. Это означает, что при необходимости отката нового релиза вы сможете откатиться только на релизы линейки 25.x. #87335 (Sema Checherinda).
  • Уменьшено значение replicated_deduplication_window_seconds с одной недели до одного часа, чтобы уменьшить количество znode, хранящихся в ZooKeeper, при низкой скорости вставки. #87414 (Sema Checherinda).
  • Переименована настройка query_plan_use_new_logical_join_step в query_plan_use_logical_join_step. #87679 (Vladimir Cherkasov).
  • Новый синтаксис позволяет более гибко задавать параметр tokenizer для текстового индекса. #87997 (Elmi Ahmadov).
  • Функции searchAny и searchAll переименованы в hasAnyTokens и hasAllTokens для большей согласованности с существующей функцией hasToken. #88109 (Robert Schulze).
  • Из файлового кэша удалён параметр cache_hits_threshold. Эта функциональность была добавлена внешним контрибьютором ещё до появления политики кэша SLRU, и теперь, когда она есть, нет смысла поддерживать оба механизма. #88344 (Kseniia Sumarokova).
  • Два небольших изменения в том, как работают настройки min_free_disk_ratio_to_perform_insert и min_free_disk_bytes_to_perform_insert: - используются незарезервированные, а не доступные байты для определения, следует ли отклонить вставку. Вероятно, это не критично, если резервы для фоновых слияний и мутаций малы по сравнению с настроенными порогами, но так более правильно. - Эти настройки не применяются к системным таблицам. Причина в том, что нам по-прежнему нужно, чтобы такие таблицы, как query_log, продолжали обновляться. Это сильно помогает при отладке. Объём данных, записываемых в системные таблицы, обычно невелик по сравнению с пользовательскими данными, поэтому они могут продолжать работать гораздо дольше при разумном пороге min_free_disk_ratio_to_perform_insert. #88468 (c-end).
  • Включён асинхронный режим для внутренней репликации Keeper. Keeper сохранит прежнее поведение с возможными улучшениями производительности. Если вы обновляетесь с версии старее 23.9, необходимо сначала обновиться до 23.9+ и затем — до 25.10+. Вы также можете установить keeper_server.coordination_settings.async_replication в значение 0 перед обновлением и включить его после завершения обновления. #88515 (Antonio Andelic).

Новая возможность

  • Добавлена поддержка отрицательных значений LIMIT и OFFSET. Закрывает #28913. #88411 (Nihal Z. Miaji).
  • Движок Alias создаёт прокси к другой таблице. Все операции чтения и записи перенаправляются в целевую таблицу, в то время как сам алиас не хранит данные и содержит только ссылку на целевую таблицу. #87965 (Kai Zhu).
  • Полная поддержка оператора IS NOT DISTINCT FROM (<=>). #88155 (simonmichal).
  • Добавлена возможность автоматически создавать статистику по всем подходящим столбцам в таблицах MergeTree. Добавлена настройка на уровне таблицы auto_statistics_types, в которой хранятся типы статистики, задаваемые через запятую (например, auto_statistics_types = 'minmax, uniq, countmin'). #87241 (Anton Popov).
  • Новый блум-фильтр-индекс для текстовых данных sparse_gram. #79985 (scanhex12).
  • Новая функция conv для преобразования чисел между системами счисления, в настоящее время поддерживает основания от 2 до 36. #83058 (hp).
  • Добавлена поддержка синтаксиса LIMIT BY ALL. Аналогично GROUP BY ALL и ORDER BY ALL, LIMIT BY ALL автоматически расширяется до использования всех неагрегатных выражений из предложения SELECT в качестве ключей LIMIT BY. Например, SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY ALL эквивалентен SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY id, name. Эта возможность упрощает запросы, когда требуется ограничить результат по всем выбранным неагрегатным столбцам без их явного перечисления. Закрывает #59152. #84079 (Surya Kant Ranjan).
  • Добавлена поддержка выполнения запросов к Apache Paimon из ClickHouse. Эта интеграция позволит пользователям ClickHouse напрямую работать с хранилищем озера данных Paimon. #84423 (JIaQi).
  • Добавлена агрегатная функция studentTTestOneSample. #85436 (Dylan).
  • Агрегатная функция quantilePrometheusHistogram, которая принимает в качестве аргументов верхние границы и кумулятивные значения бакетов гистограммы и выполняет линейную интерполяцию между верхней и нижней границами того бакета, в котором находится позиция квантиля. Ведёт себя аналогично функции PromQL histogram_quantile для классических гистограмм. #86294 (Stephen Chi).
  • Новая системная таблица для файлов метаданных Delta Lake. #87263 (scanhex12).
  • Добавлено ALTER TABLE REWRITE PARTS — выполняет полную перезапись частей таблицы с нуля с использованием всех новых настроек (поскольку некоторые, такие как use_const_adaptive_granularity, будут применяться только к новым частям). #87774 (Azat Khuzhin).
  • Добавлена команда SYSTEM RECONNECT ZOOKEEPER для принудительного разрыва соединения с ZooKeeper и повторного подключения (https://github.com/ClickHouse/ClickHouse/issues/87317). #87318 (Pradeep Chhetri).
  • Ограничьте количество именованных коллекций с помощью настроек max_named_collection_num_to_warn и max_named_collection_num_to_throw. Добавлены новая метрика NamedCollection и ошибка TOO_MANY_NAMED_COLLECTIONS. #87343 (Pablo Marcos).
  • Добавлены оптимизированные регистронезависимые варианты функций startsWith и endsWith: startsWithCaseInsensitive, endsWithCaseInsensitive, startsWithCaseInsensitiveUTF8 и endsWithCaseInsensitiveUTF8. #87374 (Guang Zhao).
  • Добавлена возможность задавать определения WORKLOAD и RESOURCE в SQL через секцию конфигурации сервера "resources_and_workloads". #87430 (Sergei Trifonov).
  • Добавлена новая настройка таблицы min_level_for_wide_part, которая позволяет указать минимальный уровень части, начиная с которого она создаётся как wide-часть. #88179 (Christoph Wurm).
  • В клиент Keeper добавлены рекурсивные варианты команд cp-cpr и mv-mvr. #88570 (Mikhail Artemenko).
  • Добавлена настройка сессии для исключения из материализации списка индексов пропуска при вставках (exclude_materialize_skip_indexes_on_insert). Добавлена настройка таблицы MergeTree для исключения из материализации списка индексов пропуска во время слияния (exclude_materialize_skip_indexes_on_merge). #87252 (George Larionov).

Экспериментальная функциональность

  • Реализован тип данных QBit, который хранит векторы в бит-слайсинговом формате, и функция L2DistanceTransposed, позволяющая выполнять приближённый векторный поиск с управляемым компромиссом между точностью и скоростью с помощью параметра. #87922 (Raufs Dunamalijevs).
  • Функции searchAll и searchAny теперь могут использоваться и в таблицах без текстовых столбцов. В таких случаях они применяют токенизатор по умолчанию. #87722 (Jimmy Aguilar Mena).

Повышение производительности

  • Реализована ленивая репликация столбцов в JOIN и ARRAY JOIN. Теперь не требуется преобразовывать специальное представление столбцов, такое как Sparse и Replicated, в полные столбцы в некоторых форматах вывода. Это позволяет избежать лишнего копирования данных в памяти. #88752 (Pavel Kruglov).
  • Добавлена опциональная сериализация подстолбца .size для строковых столбцов верхнего уровня в таблицах MergeTree для улучшения сжатия и обеспечения эффективного доступа к подстолбцам. Введены новые настройки MergeTree для управления версией сериализации и оптимизации выражений с пустыми строками. #82850 (Amos Bird).
  • Поддержка упорядоченного чтения для Iceberg. #88454 (scanhex12).
  • Ускорены некоторые запросы с JOIN за счёт построения во время выполнения фильтра Блума из правого поддерева и передачи этого фильтра операции сканирования в левом поддереве. Это может быть полезно для запросов вида SELECT avg(o_totalprice) FROM orders, customer, nation WHERE c_custkey = o_custkey AND c_nationkey=n_nationkey AND n_name = 'FRANCE'. #84772 (Alexander Gololobov).
  • Производительность выполнения запросов улучшена за счёт переработки порядка применения и интеграции Query Condition Cache (QCC) с анализом индексов. Фильтрация с помощью QCC теперь применяется до анализа первичного ключа и skip-индексов, что сокращает избыточные вычисления по индексам. Анализ индексов расширен для поддержки нескольких диапазонных фильтров, а его результаты фильтрации теперь сохраняются обратно в QCC. Это значительно ускоряет запросы, в которых анализ индексов доминирует во времени выполнения — особенно те, которые полагаются на skip-индексы (например, векторные или инвертированные индексы). #82380 (Amos Bird).
  • Набор микрооптимизаций для ускорения выполнения небольших запросов. #83096 (Raúl Marín).
  • Сжимать логи и события профилирования в нативном протоколе. На кластерах со 100+ репликами несжатые события профилирования генерируют трафик 1–10 МБ/с, и индикатор прогресса медленно обновляется при низкой скорости интернет-соединения. Это закрывает #82533. #83586 (Alexey Milovidov).
  • Улучшена производительность поиска строк с учетом регистра (операции, такие как фильтрация, например WHERE URL LIKE '%google%') с помощью библиотеки StringZilla, использующей SIMD‑инструкции процессора при их наличии. #84161 (Raúl Marín).
  • Снижено количество операций выделения и копирования памяти при выполнении запроса SELECT ... FINAL из таблицы движка AggregatingMergeTree, если в таблице есть столбцы типа SimpleAggregateFunction(anyLast). #84428 (Duc Canh Le).
  • Реализует логику проталкивания дизъюнктивных предикатов JOIN. Пример: в TPC-H Q7 для условия над двумя таблицами n1 и n2 вида (n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY') OR (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE') мы извлекаем отдельные частичные фильтры для каждой таблицы: n1.n_name = 'FRANCE' OR n1.n_name = 'GERMANY' для n1 и n2.n_name = 'GERMANY' OR n2.n_name = 'FRANCE' для n2. #84735 (Yarik Briukhovetskyi).
  • Улучшена производительность оператора LIKE с префиксом или суффиксом за счёт использования нового значения настройки по умолчанию optimize_rewrite_like_perfect_affix. #85920 (Guang Zhao).
  • Устранена деградация производительности, вызванная большим сериализованным ключом при группировке по нескольким строковым и числовым столбцам. Это продолжение #83884. #85924 (李扬).
  • Добавлена новая настройка joined_block_split_single_row для снижения потребления памяти при хеш-соединениях с большим количеством совпадений на один ключ. Она позволяет разбивать результаты хеш-соединения на блоки даже внутри совпадений для одной строки левой таблицы, что особенно полезно, когда одна строка из левой таблицы сопоставляется с тысячами или миллионами строк из правой таблицы. Ранее все совпадения должны были быть материализованы в памяти одновременно. Это снижает пиковое потребление памяти, но может увеличить нагрузку на CPU. #87913 (Vladimir Cherkasov).
  • Улучшения в реализации SharedMutex (повышена производительность при большом числе конкурентных запросов). #87491 (Raúl Marín).
  • Повышена производительность построения текстового индекса для документов, которые содержат в основном редко встречающиеся токены. #87546 (Anton Popov).
  • Ускорен типичный случай работы деструктора Field (улучшена производительность при большом количестве небольших запросов). #87631 (Raúl Marín).
  • Пропускается пересчёт статистики хеш-таблицы при оптимизации JOIN (это улучшает производительность всех запросов с JOIN). Добавлены новые профильные события JoinOptimizeMicroseconds и QueryPlanOptimizeMicroseconds. #87683 (Vladimir Cherkasov).
  • Включена возможность сохранять метки в кэше и избегать прямого ввода-вывода для ридера MergeTreeLazy. Это улучшает производительность запросов с ORDER BY и небольшим LIMIT. #87989 (Nikita Taranov).
  • Запрос SELECT с предложением FINAL для таблицы ReplacingMergeTree со столбцом is_deleted теперь выполняется быстрее благодаря улучшенной параллелизации на основе двух существующих оптимизаций: 1. оптимизация do_not_merge_across_partitions_select_final для разделов таблицы, которые содержат только один part; 2. разбиение других выбранных диапазонов таблицы на intersecting / non-intersecting, при этом только пересекающиеся диапазоны должны проходить через преобразование слияния FINAL. #88090 (Shankar Iyer).
  • Уменьшено влияние неиспользования fail points на путь выполнения по умолчанию (когда отладка не активна). #88196 (Raúl Marín).
  • Избегается полное сканирование system.tables при фильтрации по uuid (может быть полезно, если у вас есть только UUID из логов или пути в ZooKeeper). #88379 (Azat Khuzhin).
  • Улучшена производительность функций tokens, hasAllTokens и hasAnyTokens. #88416 (Anton Popov).
  • Сделан inline AddedColumns::appendFromBlock для небольшого улучшения производительности JOIN в некоторых случаях. #88455 (Nikita Taranov).
  • Автодополнение на стороне клиента становится быстрее и последовательнее при использовании system.completions вместо выполнения множества запросов к системным таблицам. #84694 (|2ustam).
  • Добавлен новый параметр текстового индекса dictionary_block_frontcoding_compression для управления сжатием словаря. По умолчанию он включён, и используется сжатие типа front-coding. #87175 (Elmi Ahmadov).
  • Данные со всех потоков сжимаются перед вставкой в материализованные представления в соответствии с настройками min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. Ранее, если parallel_view_processing был включен, каждый поток, выполняющий вставку в конкретное материализованное представление, выполнял сжатие вставки независимо, что могло приводить к увеличению числа создаваемых частей. #87280 (Antonio Andelic).
  • Добавлена настройка temporary_files_buffer_size для управления размером буфера при записи во временные файлы. * Оптимизировано потребление памяти операцией scatter (используется, например, в grace hash join) для столбцов LowCardinality. #88237 (Vladimir Cherkasov).
  • Добавлена поддержка прямого чтения текстовых индексов при использовании параллельных реплик. Улучшена производительность чтения текстовых индексов из объектного хранилища. #88262 (Anton Popov).
  • Запросы к таблицам из каталогов Data Lakes теперь используют параллельные реплики для распределённой обработки. #88273 (scanhex12).
  • Внутренняя эвристика для настройки алгоритма фоновых слияний с именем "to_remove_small_parts_at_right" будет выполняться до вычисления оценки диапазона слияния. Ранее селектор слияний выбирал широкое слияние, а затем отфильтровывал его суффикс. Исправления: #85374. #88736 (Mikhail Artemenko).

Улучшение

  • Теперь функция generateSerialID поддерживает неконстантный аргумент для имени серии. Закрывает #83750. #88270 (Alexey Milovidov).
  • Добавлен необязательный параметр start_value в функцию generateSerialID для задания пользовательских начальных значений для новых последовательностей. #88085 (Manuel).
  • Добавлена опция --semicolons_inline в clickhouse-format для форматирования запросов так, чтобы точки с запятой ставились в конце последней строки, а не на новой строке. #88018 (Jan Rada).
  • Разрешить настройку троттлинга на уровне сервера, даже когда конфигурация переопределена в Keeper. Закрывает #73964. #74066 (JIaQi).
  • mannWhitneyUTest больше не выбрасывает исключение, когда обе выборки содержат только одинаковые значения. Теперь возвращает корректный результат, соответствующий поведению SciPy. Закрывает: #79814. #80009 (DeanNeaht).
  • Транзакция перезаписи диска объектного хранилища удаляет предыдущие блобы в удалённом хранилище, если транзакция метаданных зафиксирована. #81787 (Sema Checherinda).
  • Исправлен оптимизационный проход для избыточного выражения равенства в случаях, когда LowCardinality результирующего типа отличается до и после оптимизации. #82651 (Yakov Olkhovskiy).
  • Когда HTTP-клиенты устанавливают заголовок X-ClickHouse-100-Continue: defer в дополнение к Expect: 100-continue, ClickHouse не отправляет клиенту ответ 100 Continue до тех пор, пока не пройдет проверка квоты, что предотвращает напрасную трату сетевой полосы пропускания при передаче тел запросов, которые в любом случае будут отброшены. Это актуально для запросов INSERT, когда сам запрос может быть передан в строке URL-запроса, а данные — в теле запроса. Прерывание запроса без отправки полного тела предотвращает повторное использование соединения с HTTP/1.1, но дополнительная задержка, связанная с открытием новых соединений, обычно несущественна по сравнению с общей длительностью выполнения INSERT при больших объемах данных. #84304 (c-end).
  • Скрывать учетные данные доступа к S3 в логах при использовании DATABASE ENGINE = Backup с хранилищем S3. #85336 (Kenny Sun).
  • Сделать оптимизации плана запроса видимыми для входного подплана коррелированного подзапроса за счет откладывания его материализации. Часть #79890. #85455 (Dmitry Novik).
  • Изменение для SYSTEM DROP DATABASE REPLICA: - When dropping with database or drop the whole replica: it also drops replica for each table of the database - If 'WITH TABLES' is provided, drop replica for each storage - Otherwise, the logic is unchanged, only drop replica on the databases - When dropping a database replica with the keeper path: - If 'WITH TABLES' is provided: - Restore the database as Atomic - Restore RMT tables from statement in Keeper - Drop the database (restored tables are also dropped) - Otherwise, only drop replica on the provided keeper path. #85637 (Tuan Pham Anh).
  • Исправлено некорректное форматирование TTL при использовании функции materialize. Закрывает #82828. #85749 (Alexey Milovidov).
  • Состояние таблицы Iceberg больше не хранится в объекте хранилища. Это должно обеспечить корректную работу Iceberg в ClickHouse при выполнении параллельных запросов. #86062 (Daniil Ivanik).
  • Сделать режим блокировки бакета в упорядоченном режиме S3Queue постоянным, аналогично узлам обработки при use_persistent_processing_nodes = 1. Добавить в тесты имитацию сбоев Keeper. #86628 (Kseniia Sumarokova).
  • Выводить подсказки, если пользователь допускает опечатку в имени формата. Закрывает #86761. #87092 (flynn).
  • Теперь удалённые реплики пропускают анализ индексов, если нет проекций. #87096 (zoomxi).
  • Добавлена возможность отключить кодировку UTF-8 для таблицы YTsaurus. #87150 (MikhailBurdukov).
  • По умолчанию отключена настройка s3_slow_all_threads_after_retryable_error. #87198 (Nikita Mikhaylov).
  • Переименована табличная функция arrowflight в arrowFlight. #87249 (Vitaly Baranov).
  • Обновлён clickhouse-benchmark, чтобы он поддерживал использование - вместо _ в флагах командной строки. #87251 (Ahmed Gouda).
  • Сброс в system.crash_log при обработке сигналов сделан синхронным. #87253 (Miсhael Stetsyuk).
  • Добавлена настройка inject_random_order_for_select_without_order_by, которая вставляет ORDER BY rand() в верхнеуровневые запросы SELECT без предложения ORDER BY. #87261 (Rui Zhang).
  • Улучшено сообщение об ошибке в joinGet, которое теперь корректно сообщает, что количество join_keys не совпадает с количеством right_table_keys. #87279 (Isak Ellmer).
  • Добавлена возможность проверять структуру stat произвольного узла Keeper при выполнении транзакции записи. Это может помочь при обнаружении проблемы ABA. #87282 (Mikhail Artemenko).
  • Перенаправлять тяжёлые запросы YTsaurus на тяжёлые прокси-серверы. #87342 (MikhailBurdukov).
  • Исправляет откаты операций unlink/rename/removeRecursive/removeDirectory/и т. д., а также счётчики жёстких ссылок при любых возможных нагрузках для метаданных из дисковых транзакций и упрощает интерфейсы, делая их более универсальными, чтобы их можно было повторно использовать в других хранилищах метаданных. #87358 (Mikhail Artemenko).
  • Добавлен параметр конфигурации keeper_server.tcp_nodelay, который позволяет отключить TCP_NODELAY для Keeper. #87363 (Copilot).
  • Добавлена поддержка --connection в clickhouse-benchmarks. Как и в clickhouse-client, вы можете указать предопределённые соединения в клиентском config.xml/config.yaml в секции connections_credentials, чтобы не указывать имя пользователя и пароль явным образом через аргументы командной строки. Добавлена поддержка --accept-invalid-certificate в clickhouse-benchmark. #87370 (Azat Khuzhin).
  • Теперь параметр max_insert_threads будет применяться к таблицам Iceberg. #87407 (alesapin).
  • Добавлены гистограммные и многомерные метрики в PrometheusMetricsWriter. Таким образом, обработчик PrometheusRequestHandler будет содержать все необходимые метрики и может использоваться для надежного сбора метрик с низкими накладными расходами в облачной среде. #87521 (Miсhael Stetsyuk).
  • Функция hasToken теперь возвращает ноль совпадений для пустого токена (а ранее в таком случае выбрасывалось исключение). #87564 (Jimmy Aguilar Mena).
  • Добавлена поддержка текстового индекса для значений типов Array и Map (mapKeys и mapValues). Поддерживаются функции mapContainsKey и has. #87602 (Elmi Ahmadov).
  • Добавлена новая метрика ZooKeeperSessionExpired, указывающая число истекших глобальных сессий ZooKeeper. #87613 (Miсhael Stetsyuk).
  • Используйте клиент хранилища S3 со специальными настройками для резервного копирования (например, backup_slow_all_threads_after_retryable_s3_error) для нативного копирования на стороне сервера в целевое хранилище бэкапа. Параметр s3_slow_all_threads_after_retryable_error объявлен устаревшим. #87660 (Julia Kartseva).
  • Исправлена некорректная обработка настроек max_joined_block_size_rows и max_joined_block_size_bytes при сериализации плана запроса с экспериментальной функцией make_distributed_plan. #87675 (Vladimir Cherkasov).
  • Настройка enable_http_compression теперь включена по умолчанию. Это означает, что если клиент поддерживает HTTP-сжатие, сервер будет его использовать. Однако это изменение имеет некоторые недостатки. Клиент может запросить тяжёлый метод сжатия, такой как bzip2, что неразумно и увеличит потребление ресурсов сервером (но это будет заметно только при передаче больших результатов). Клиент может запросить gzip, что не так уж плохо, но менее эффективно по сравнению с zstd. Исправление закрывает #71591. #87703 (Alexey Milovidov).
  • В system.server_settings добавлена новая запись keeper_hosts, в которой содержится список хостов [Zoo]Keeper, к которым ClickHouse может подключаться. #87718 (Nikita Mikhaylov).
  • Добавьте значения from и to в системные дашборды, чтобы упростить проведение ретроспективных расследований. #87823 (Mikhail f. Shiryaev).
  • Добавлена дополнительная информация для отслеживания производительности в запросах SELECT к Iceberg. #87903 (Daniil Ivanik).
  • Улучшение файлового кеша: совместное использование итератора приоритета кеша потоками, одновременно резервирующими место в кеше. #87914 (Kseniia Sumarokova).
  • Добавлена возможность ограничивать запросы для Keeper (настройка max_request_size, аналогичная jute.maxbuffer для ZooKeeper, по умолчанию — OFF для обратной совместимости; в следующих релизах значение будет изменено). #87952 (Azat Khuzhin).
  • Изменить clickhouse-benchmark, чтобы он по умолчанию не включал трассировки стека в сообщения об ошибках. #87954 (Ahmed Gouda).
  • Избегайте использования асинхронной загрузки меток с использованием пула потоков (load_marks_asynchronously=1), когда метки находятся в кэше (так как пул может быть перегружен, и запросы будут платить штраф по производительности, даже если метки уже находятся в кэше). #87967 (Azat Khuzhin).
  • Ytsaurus: разрешить создание таблиц, табличных функций и словарей с подмножеством столбцов. #87982 (MikhailBurdukov).
  • Теперь system.zookeeper_connection_log включён по умолчанию, и его можно использовать для получения информации о сеансах Keeper. #88011 (János Benjamin Antal).
  • Унифицировано поведение TCP и HTTP при передаче дублирующихся внешних таблиц. HTTP позволяет передавать временную таблицу несколько раз. #88032 (Sema Checherinda).
  • Удалены кастомные MemoryPools для чтения Arrow/ORC/Parquet. Этот компонент, по-видимому, больше не требуется после #84082, поскольку теперь мы в любом случае отслеживаем все выделения памяти. #88035 (Nikita Mikhaylov).
  • Разрешено создавать базу данных Replicated без аргументов. #88044 (Pervakov Grigorii).
  • clickhouse-keeper-client: Добавлена поддержка подключения к TLS-порту clickhouse-keeper, имена флагов сохранены такими же, как в clickhouse-client. #88065 (Pradeep Chhetri).
  • Добавлено новое событие профилирования для отслеживания числа отклонений фонового слияния из-за превышения лимитов памяти. #88084 (Grant Holly).
  • Включает анализатор для проверки выражений значений по умолчанию для столбцов в операторах CREATE/ALTER TABLE. #88087 (Max Justus Spransy).
  • Внутреннее улучшение планировщика запросов: использование JoinStepLogical для CROSS JOIN. #88151 (Vladimir Cherkasov).
  • Добавлены алиасы для функций hasAnyTokens (hasAnyToken) и hasAllTokens (hasAllToken). #88162 (George Larionov).
  • По умолчанию включён глобальный профилировщик сэмплирования (то есть даже для серверных потоков, не связанных с запросами): собирать стеки вызовов всех потоков каждые 10 секунд по процессорному и реальному времени. #88209 (Alexander Tokmakov).
  • Обновить Azure SDK, чтобы включить исправление для 'Content-Length', проявляющееся при операциях копирования и создания контейнеров. #88278 (Smita Kulkarni).
  • Функция lag сделана нечувствительной к регистру для совместимости с MySQL. #88322 (Lonny Kapelushnik).
  • Разрешен запуск clickhouse-local из каталога clickhouse-server. В предыдущих версиях это приводило к ошибке Cannot parse UUID: .. Теперь можно запускать clickhouse-local и работать с базами данных сервера без запуска самого сервера. #88383 (Alexey Milovidov).
  • Добавлен параметр конфигурации keeper_server.coordination_settings.check_node_acl_on_remove. Если он включен, перед каждым удалением узла будут проверяться ACL как самого узла, так и родительского. В противном случае будет проверяться только ACL родительского узла. #88513 (Antonio Andelic).
  • Столбцы JSON теперь красиво форматируются при использовании формата Vertical. Закрывает #81794. #88524 (Frank Rosner).
  • Файлы clickhouse-client (например, историю запросов) следует хранить в местах, описанных спецификацией XDG Base Directories, вместо корня домашнего каталога. ~/.clickhouse-client-history по-прежнему будет использоваться, если этот файл уже существует. #88538 (Konstantин Богданов).
  • Исправлена утечка памяти из-за GLOBAL IN (https://github.com/ClickHouse/ClickHouse/issues/88615). #88617 (pranavmehta94).
  • Добавлена перегрузка функций hasAny/hasAllTokens, принимающая строковый аргумент. #88679 (George Larionov).
  • Добавлен шаг в postinstall-скрипт для clickhouse-keeper, который включает его автозапуск при загрузке системы. #88746 (YenchangChan).
  • Учетные данные в веб-интерфейсе теперь проверяются только при вставке, а не при каждом нажатии клавиши. Это позволяет избежать проблемы с некорректно настроенными серверами LDAP. Закрывает #85777. #88769 (Alexey Milovidov).
  • Ограничена длина сообщения об исключении при нарушении ограничения. В предыдущих версиях вы могли получить очень длинное сообщение об исключении при вставке очень длинной строки, и это сообщение в итоге попадало в query_log. Закрывает #87032. #88801 (Alexey Milovidov).
  • Исправлено получение структуры набора данных с сервера ArrowFlight при создании таблицы. #87542 (Vitaly Baranov).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлена проблема с GeoParquet, приводившая к ошибкам клиентского протокола. #84020 (Michael Kolupaev).
  • Исправлено разрешение зависящих от хоста функций, таких как shardNum(), в подзапросах на узле-инициаторе. #84409 (Eduard Karacharov).
  • Исправлена некорректная обработка дат до эпохи с дробными секундами в различных функциях работы с датой и временем, таких как parseDateTime64BestEffort, change{Year,Month,Day} и makeDateTime64. Ранее дробная часть секунд вычиталась из целых секунд, вместо того чтобы прибавляться к ним. Например, parseDateTime64BestEffort('1969-01-01 00:00:00.468') возвращала 1968-12-31 23:59:59.532 вместо 1969-01-01 00:00:00.468. #85396 (xiaohuanlin).
  • Исправлена ошибка, из-за которой команды ALTER COLUMN IF EXISTS завершались сбоем, когда состояние столбца изменялось в пределах одного и того же запроса ALTER. Теперь команды DROP COLUMN IF EXISTS, MODIFY COLUMN IF EXISTS, COMMENT COLUMN IF EXISTS и RENAME COLUMN IF EXISTS корректно обрабатывают случаи, когда столбец был удалён предыдущей командой в том же запросе. #86046 (xiaohuanlin).
  • Исправлен вывод типов Date/DateTime/DateTime64 для дат, выходящих за поддерживаемый диапазон. #86184 (Pavel Kruglov).
  • Исправлена ошибка, из-за которой некоторые корректные пользовательские данные, отправленные в столбец AggregateFunction(quantileDD), могли приводить к бесконечной рекурсии при слиянии. #86560 (Raphaël Thériault).
  • Добавлена поддержка типов JSON/Dynamic в таблице, создаваемой с помощью табличной функции cluster. #86821 (Pavel Kruglov).
  • Исправлена недетерминированность результата функции, вычисляемой в CTE, в запросе. #86967 (Yakov Olkhovskiy).
  • Исправлена ошибка LOGICAL_ERROR в EXPLAIN при использовании функции pointInPolygon на столбцах первичного ключа. #86971 (Michael Kolupaev).
  • Исправлены таблицы озера данных, в имени которых содержится последовательность, закодированная в формате percent-encoding. Закрывает #86626. #87020 (Anton Ivashkin).
  • Исправлено некорректное поведение оператора IS NULL на nullable-столбцах в OUTER JOIN при включённом optimize_functions_to_subcolumns, закрыт #78625. #87058 (Vladimir Cherkasov).
  • Исправлен некорректный учет освобождения временных данных при отслеживании лимита max_temporary_data_on_disk_size, закрыт #87118. #87140 (JIaQi).
  • Функция checkHeaders теперь корректно проверяет переданные заголовки и отклоняет запрещённые. Изначальный автор: Michael Anastasakis (@michael-anastasakis). #87172 (Raúl Marín).
  • Унифицирует поведение toDate и toDate32 для всех числовых типов. Исправляет проверку на выход за нижнюю границу (underflow) для Date32 при приведении из int16. #87176 (Pervakov Grigorii).
  • Исправлена логическая ошибка при использовании параллельных реплик для запросов с несколькими операциями JOIN, в частности с RIGHT JOIN, следующим за LEFT/INNER JOIN. #87178 (Igor Nikonov).
  • Учитывать настройку input_format_try_infer_variants в кэше определения схемы. #87180 (Pavel Kruglov).
  • Сделать так, чтобы pathStartsWith сопоставлял только пути, начинающиеся с заданного префикса. #87181 (Raúl Marín).
  • Исправлены логические ошибки в виртуальном столбце _row_number и позиционированных удалениях в Iceberg. #87220 (Michael Kolupaev).
  • Исправлена логическая ошибка LOGICAL_ERROR «Too large size passed to allocator» в JOIN, возникавшая из-за смешения константных и неконстантных блоков. #87231 (Azat Khuzhin).
  • Исправлены легковесные обновления с подзапросами, которые читают из других таблиц MergeTree. #87285 (Anton Popov).
  • Исправлена оптимизация move-to-prewhere, которая не работала при наличии политик строк. Продолжение #85118. Закрывает #69777. Закрывает #83748. #87303 (Nikolai Kochetov).
  • Исправлено применение патчей к столбцам с выражением по умолчанию, отсутствующим в частях данных. #87347 (Anton Popov).
  • Исправлена ошибка сегментации при использовании повторяющихся имён столбцов секционирования в таблицах MergeTree. #87365 (xiaohuanlin).
  • Исправлена проблема с обновлением EmbeddedRocksDB. #87392 (Raúl Marín).
  • Исправлено прямое чтение из текстового индекса в объектном хранилище. #87399 (Anton Popov).
  • Запрещено создание привилегии, использующей несуществующий движок. #87419 (Jitendra).
  • Игнорировать только ошибки not found для s3_plain_rewritable (так как это может привести к самым разным проблемам). #87426 (Azat Khuzhin).
  • Исправлены словари, использующие источник YTSaurus и макеты *range_hashed. #87490 (MikhailBurdukov).
  • Исправлена ошибка при создании массива пустых кортежей. #87520 (Pavel Kruglov).
  • Проверка наличия недопустимых столбцов при создании временной таблицы. #87524 (Pavel Kruglov).
  • Никогда не указывайте столбцы партиций Hive в заголовке формата. Исправлена ошибка #87515. #87528 (Arthur Passos).
  • Исправлена подготовка чтения данных из формата в DeltaLake при использовании текстового формата. #87529 (Pavel Kruglov).
  • Исправлена проверка доступа при выполнении SELECT и INSERT для таблиц Buffer. #87545 (pufit).
  • Запрещено создание индекса пропуска данных для таблицы S3. #87554 (Bharat Nallan).
  • Предотвращена утечка отслеживаемой памяти при асинхронном логировании (могла приводить к значительному дрейфу: за 10 часов до ~100 GiB) и в text_log (мог наблюдаться почти такой же дрейф). #87584 (Azat Khuzhin).
  • Исправлена ошибка, которая могла приводить к перезаписи глобальных настроек сервера настройками SELECT для представления или материализованного представления, если это представление удалялось асинхронно, а сервер перезапускался до завершения фоновой очистки. #87603 (Alexander Tokmakov).
  • Исключать байты кэша страниц в пространстве пользователя (если возможно) при вычислении предупреждения о перегрузке по памяти. #87610 (Bharat Nallan).
  • Исправлена ошибка, из-за которой некорректный порядок типов во время десериализации CSV приводил к LOGICAL_ERROR. #87622 (Yarik Briukhovetskyi).
  • Исправлена ошибка некорректной обработки command_read_timeout для исполняемых словарей. #87627 (Azat Khuzhin).
  • Исправлено некорректное поведение SELECT * REPLACE в предложении WHERE при использовании нового анализатора при фильтрации по заменённым столбцам. #87630 (xiaohuanlin).
  • Исправлена двухуровневая агрегация при использовании Merge поверх Distributed. #87687 (c-end).
  • Исправлена генерация выходного блока в алгоритме HashJoin, когда список правых строк не используется. Исправляет #87401. #87699 (Dmitry Novik).
  • Режим чтения параллельных реплик мог быть выбран некорректно, если после анализа индекса не оставалось данных для чтения. Закрывает #87653. #87700 (zoomxi).
  • Исправлена обработка столбцов типов timestamp и timestamptz в Glue. #87733 (Andrey Zvonov).
  • Закрывает #86587. #87761 (scanhex12).
  • Исправлена запись булевых значений в интерфейсе PostgreSQL. #87762 (Artem Yurov).
  • Исправлена ошибка unknown table в запросе INSERT SELECT с CTE, #85368. #87789 (Guang Zhao).
  • Исправлено чтение подстолбца map, содержащего null, из Variant, который не может находиться внутри Nullable. #87798 (Pavel Kruglov).
  • Исправлена обработка ошибки при сбое полного удаления базы данных в кластере на вторичном узле. #87802 (Tuan Pham Anh).
  • Исправлено несколько ошибок в пропускающих индексах. #87817 (Raúl Marín).
  • В AzureBlobStorage обновлено поведение: сначала выполняется нативное копирование, а при ошибке 'Unauthroized' выполняется чтение и запись (в AzureBlobStorage, если учетные записи хранилища для источника и назначения различаются, возникает ошибка 'Unauthorized'). Также исправлено применение параметра "use_native_copy", когда в конфигурации определен endpoint. #87826 (Smita Kulkarni).
  • ClickHouse завершался с ошибкой, если файл ArrowStream содержал неуникальный словарь. #87863 (Ilya Golshtein).
  • Исправлена фатальная ошибка при использовании approx_top_k и finalizeAggregation. #87892 (Jitendra).
  • Исправлено слияние с проекциями при пустом последнем блоке. #87928 (Raúl Marín).
  • Не удалять инъективные функции из GROUP BY, если типы их аргументов не допускаются в GROUP BY. #87958 (Pavel Kruglov).
  • Исправление некорректного исключения гранул/разделов для ключей по дате/времени при использовании настройки session_timezone в запросах. #87987 (Eduard Karacharov).
  • Возвращает количество затронутых строк после выполнения запроса через интерфейс PostgreSQL. #87990 (Artem Yurov).
  • Ограничивает использование оптимизации проталкивания фильтров для PASTE JOIN, поскольку это может приводить к некорректным результатам. #88078 (Yarik Briukhovetskyi).
  • Применяет нормализацию URI перед выполнением проверки прав доступа, введённой в https://github.com/ClickHouse/ClickHouse/pull/84503. #88089 (pufit).
  • Исправлена логическая ошибка в новом анализаторе, возникавшая, если ARRAY JOIN COLUMNS() не находил ни одного столбца. #88091 (xiaohuanlin).
  • Исправлено предупреждение "High ClickHouse memory usage" (без учета page cache). #88092 (Azat Khuzhin).
  • Исправлена возможная порча данных в таблицах MergeTree с заданным для столбца TTL. #88095 (Anton Popov).
  • Исправлено потенциальное неперехваченное исключение при чтении system.tables при наличии некорректных таблиц во внешних подключённых базах данных (PostgreSQL/SQLite/...). #88105 (Azat Khuzhin).
  • Исправлено падение в функциях mortonEncode и hilbertEncode при вызове с пустым кортежем в качестве аргумента. #88110 (xiaohuanlin).
  • Теперь запросы ON CLUSTER будут выполняться быстрее при наличии неактивных реплик в кластере. #88153 (alesapin).
  • Теперь DDL worker очищает набор реплик от устаревших хостов. Это уменьшит объём хранимых метаданных в ZooKeeper. #88154 (alesapin).
  • Исправлена проблема с запуском ClickHouse без cgroups (случайно cgroups оказались обязательным требованием для асинхронных метрик). #88164 (Azat Khuzhin).
  • Корректно выполнять откат операции перемещения директории в случае ошибки. Необходимо перезаписывать все объекты prefix.path, изменённые во время выполнения, а не только корневой объект. #88198 (Mikhail Artemenko).
  • Исправлена передача флага is_shared в ColumnLowCardinality. Это могло приводить к неверному результату операции GROUP BY, если в столбец вставлялось новое значение после того, как значения хеша уже были предварительно вычислены и закэшированы в ReverseIndex. #88213 (Nikita Taranov).
  • Исправлен параметр рабочей нагрузки max_cpu_share. Теперь его можно использовать без задания параметра рабочей нагрузки max_cpus. #88217 (Neerav).
  • Исправлена ошибка, из-за которой очень тяжёлые мутации с подзапросами могли зависать на этапе подготовки. Теперь такие мутации можно остановить с помощью SYSTEM STOP MERGES. #88241 (alesapin).
  • Теперь коррелированные подзапросы работают с объектными хранилищами. #88290 (alesapin).
  • Не пытайтесь инициализировать базы данных DataLake во время доступа к system.projections и system.data_skipping_indices. #88330 (Azat Khuzhin).
  • Теперь каталоги даталейков будут отображаться в системных таблицах для интроспекции только в том случае, если параметр show_data_lake_catalogs_in_system_tables явно включён. #88341 (alesapin).
  • Исправлено поведение DatabaseReplicated, чтобы он учитывал параметр конфигурации interserver_http_host. #88378 (xiaohuanlin).
  • Позиционные аргументы теперь явно отключены в контексте определения проекций, так как они не имеют смысла на данном внутреннем этапе запроса. Это исправляет #48604. #88380 (Amos Bird).
  • Устранена квадратичная сложность в функции countMatches. Закрывает #88400. #88401 (Alexey Milovidov).
  • Команды ALTER COLUMN ... COMMENT для таблиц KeeperMap теперь реплицируются, чтобы фиксироваться в метаданных базы данных Replicated и распространяться на все реплики. Закрывает #88077. #88408 (Eduard Karacharov).
  • Исправлен случай ложного срабатывания проверки циклической зависимости с материализованными представлениями в базе типа Database Replicated, который препятствовал добавлению новых реплик в базу данных. #88423 (Nikolay Degterinsky).
  • Исправлена агрегация разрежённых столбцов при значении group_by_overflow_mode = any. #88440 (Eduard Karacharov).
  • Исправлена ошибка «column not found» при использовании query_plan_use_logical_join_step=0 с несколькими предложениями FULL JOIN USING. Закрывает #88103. #88473 (Vladimir Cherkasov).
  • Большие кластеры с числом узлов > 10 имеют высокую вероятность сбоя операции восстановления с ошибкой [941] 67c45db4-4df4-4879-87c5-25b8d1e0d414 <Trace>: RestoreCoordinationOnCluster The version of node /clickhouse/backups/restore-7c551a77-bd76-404c-bad0-3213618ac58e/stage/num_hosts changed (attempt #9), will try again. Узел num_hosts перезаписывается большим числом хостов одновременно. Исправление делает параметр, управляющий количеством попыток, динамическим. Закрывает #87721. #88484 (Mikhail f. Shiryaev).
  • Этот PR предназначен только для обеспечения совместимости с 23.8 и более ранними версиями. Проблема совместимости появилась из‑за этого PR: https://github.com/ClickHouse/ClickHouse/pull/54240 Этот SQL‑запрос завершится ошибкой при enable_analyzer=0 (до 23.8 он выполнялся нормально). #88491 (JIaQi).
  • Исправлена ошибка переполнения целого числа UBSAN в сообщении об ошибке accurateCast при преобразовании больших значений в DateTime. #88520 (xiaohuanlin).
  • Исправлен движок CoalescingMergeTree для кортежных типов. Это закрывает #88469. #88526 (scanhex12).
  • Запретить удаления для iceberg_format_version=1. Это закрывает #88444. #88532 (scanhex12).
  • Этот патч исправляет операцию перемещения на дисках plain-rewritable для каталогов произвольной глубины. #88586 (Mikhail Artemenko).
  • Исправлена поддержка SQL SECURITY DEFINER для функций *cluster. #88588 (Julian Maicher).
  • Исправлен потенциальный сбой, возникавший при конкурентном изменении базовых константных столбцов PREWHERE. #88605 (Azat Khuzhin).
  • Исправлено чтение из текстового индекса и включён кэш условий запроса (при включённых настройках use_skip_indexes_on_data_read и use_query_condition_cache). #88660 (Anton Popov).
  • Исключение Poco::TimeoutException, выброшенное из Poco::Net::HTTPChunkedStreamBuf::readFromDevice, приводит к аварийному завершению процесса с сигналом SIGABRT. #88668 (Miсhael Stetsyuk).
  • Бэкпортировано в #88910: после восстановления реплика базы данных Replicated могла надолго зависать, выводя сообщения вида Failed to marked query-0004647339 as finished (finished=No node, synced=No node), эта проблема исправлена. #88671 (Alexander Tokmakov).
  • Исправлено добавление записей в system.zookeeper_connection_log в случае, когда ClickHouse подключается впервые после перезагрузки конфигурации. #88728 (Antonio Andelic).
  • Исправлена ошибка, из-за которой преобразование DateTime64 в Date при date_time_overflow_behavior = 'saturate' могло приводить к некорректным результатам для значений вне диапазона при работе с часовыми поясами. #88737 (Manuel).
  • N-я попытка исправить ошибку «having zero bytes» в движке таблиц S3 с включённым кэшем. #88740 (Kseniia Sumarokova).
  • Исправлена проверка прав доступа при выполнении запроса SELECT для табличной функции loop. #88802 (pufit).
  • Перехватывайте исключения при сбоях асинхронного логирования, чтобы не допустить аварийного завершения программы. #88814 (Raúl Marín).
  • Бэкпортировано в #89060: исправлена функция top_k, чтобы учитывать пороговый параметр при вызове с одним аргументом. Закрывает #88757. #88867 (Manuel).
  • Перенесено в #88944: исправлена ошибка в функции reverseUTF8. В предыдущих версиях она ошибочно переворачивала байты кодовых точек UTF-8 длиной 4 байта. Это закрывает #88913. #88914 (Alexey Milovidov).
  • Бэкпортировано в #88980: не выполнять проверку прав доступа SET DEFINER <current_user>:definer при создании представления с SQL SECURITY DEFINER. #88968 (pufit).
  • Бэкпортировано в #89058: исправлена ошибка LOGICAL_ERROR в L2DistanceTransposed(vec1, vec2, p), при которой оптимизация частичного чтения QBit некорректно удаляла Nullable из возвращаемого типа, когда параметр p имел тип Nullable. #88974 (Raufs Dunamalijevs).
  • Бэкпортировано в #89167: исправлена ошибка, приводившая к сбою при неизвестном типе каталога. Исправляет #88819. #88987 (scanhex12).
  • Бэкпортировано в #89028: исправлена деградация производительности при анализе пропускающих индексов. #89004 (Anton Popov).

Улучшения сборки/тестирования/упаковки

  • Использовать библиотеку postgres версии 18.0. #87647 (Konstantin Bogdanov).
  • Включить ICU для FreeBSD. #87891 (Raúl Marín).
  • Использовать SSE 4.2, когда применяется динамическая диспетчеризация на SSE 4.2, а не SSE 4. #88029 (Raúl Marín).
  • Не требовать флаг NO_ARMV81_OR_HIGHER, если Speculative Store Bypass Safe недоступен. #88051 (Konstantin Bogdanov).
  • Если ClickHouse собирается с ENABLE_LIBFIU=OFF, функции, связанные с failpoint, превращаются в no-op и больше не могут влиять на производительность. Запросы SYSTEM ENABLE/DISABLE FAILPOINT в этом случае возвращают ошибку SUPPORT_IS_DISABLED. #88184 (c-end).

Релиз ClickHouse 25.9, 2025-09-25

Несовместимое изменение

  • Отключены бессмысленные бинарные операции с IPv4/IPv6: операции сложения/вычитания IPv4/IPv6 с типом, не являющимся целочисленным, теперь запрещены. Ранее они допускались с типами с плавающей запятой и приводили к логическим ошибкам с некоторыми другими типами (такими как DateTime). #86336 (Raúl Marín).
  • Настройка allow_dynamic_metadata_for_data_lakes объявлена устаревшей. Теперь все таблицы Iceberg перед выполнением каждого запроса пытаются получить актуальную схему таблицы из хранилища. #86366 (Daniil Ivanik).
  • Изменён способ определения коалесцированного столбца из предложения OUTER JOIN ... USING, чтобы сделать его более согласованным: ранее при выборе одновременно столбца из USING и квалифицированных столбцов (a, t1.a, t2.a) в OUTER JOIN столбец из USING ошибочно сопоставлялся с t1.a, показывая 0/NULL для строк из правой таблицы без соответствия слева. Теперь идентификаторы из предложения USING всегда сопоставляются с коалесцированным столбцом, а квалифицированные идентификаторы — с некоалесцированными столбцами, независимо от того, какие ещё идентификаторы присутствуют в запросе. Например: ```sql SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- До: a=0, t1.a=0, t2.a=2 (неправильно — 'a' сопоставлён с t1.a) -- После: a=2, t1.a=0, t2.a=2 (правильно — 'a' коалесцирован). #80848 (Vladimir Cherkasov).
  • Увеличено окно дедупликации в реплицируемых таблицах до 10 000. Это полностью совместимо, но можно представить сценарии, когда такое изменение может привести к высокому потреблению ресурсов при большом количестве таблиц. #86820 (Sema Checherinda).

Новая возможность

  • Теперь пользователи могут использовать NATS JetStream для потребления сообщений, задавая новые настройки nats_stream и nats_consumer для движка NATS. #84799 (Dmitry Novikov).
  • Добавлена поддержка аутентификации и SSL в табличной функции arrowFlight. #87120 (Vitaly Baranov).
  • Добавлен новый параметр для движка таблицы S3 и табличной функции s3 с именем storage_class_name, который позволяет указать режим Intelligent-Tiering, поддерживаемый AWS. Поддерживается как в формате ключ-значение, так и в позиционном (устаревшем) формате. #87122 (alesapin).
  • ALTER UPDATE для движка таблицы Iceberg. #86059 (scanhex12).
  • Добавлена системная таблица iceberg_metadata_log для получения файлов метаданных Iceberg во время выполнения запросов SELECT. #86152 (scanhex12).
  • Таблицы Iceberg и DeltaLake поддерживают пользовательскую конфигурацию дисков через настройку disk на уровне хранилища. #86778 (scanhex12).
  • Добавлена поддержка Azure для дисков для озер данных. #87173 (scanhex12).
  • Добавлена поддержка каталога Unity поверх хранилища Azure Blob Storage. #80013 (Smita Kulkarni).
  • Добавлена поддержка дополнительных форматов (ORC, Avro) при записи в Iceberg. Это закрывает #86179. #87277 (scanhex12).
  • Добавлена новая системная таблица database_replicas с информацией о репликах баз данных. #83408 (Konstantин Morозов).
  • Добавлена функция arrayExcept, которая вычитает из одного массива (как множества) элементы другого. #82368 (Joanna Hulboj).
  • Добавлена новая таблица system.aggregated_zookeeper_log. Таблица содержит статистику по операциям ZooKeeper (например, количество операций, средняя задержка, ошибки), сгруппированную по идентификатору сессии, родительскому пути и типу операции; данные периодически сбрасываются на диск. #85102 #87208 (Miсhael Stetsyuk).
  • Новая функция isValidASCII. Возвращает 1, если входная строка или значение типа FixedString содержит только байты ASCII (0x00–0x7F), в противном случае — 0. Закрывает #85377. ... #85786 (rajat mohan).
  • Логические настройки могут указываться без аргументов, например, SET use_query_cache;, что эквивалентно установке значения в true. #85800 (thraeka).
  • Новые параметры конфигурации: logger.startupLevel и logger.shutdownLevel позволяют переопределять уровень логирования при запуске и завершении работы ClickHouse соответственно. #85967 (Lennard Eijsackers).
  • Агрегатные функции timeSeriesChangesToGrid и timeSeriesResetsToGrid. Ведут себя аналогично timeSeriesRateToGrid, принимая параметры начальной и конечной меток времени, шага и окна look back, а также два аргумента для меток времени и значений, но при этом требуют как минимум одну выборку на окно вместо двух. Вычисляют PromQL changes/resets, подсчитывая количество изменений или уменьшений значения выборки в указанном окне для каждой метки времени во временной сетке, определённой параметрами. Тип возвращаемого значения — Array(Nullable(Float64)). #86010 (Stephen Chi).
  • Позволяет пользователям создавать временные представления с синтаксисом, аналогичным синтаксису временных таблиц (CREATE TEMPORARY VIEW). #86432 (Aly Kafoury).
  • В таблицу system.warnings добавлены предупреждения об использовании CPU и памяти. #86838 (Bharat Nallan).
  • Реализована поддержка индикатора oneof во входных данных Protobuf. Для указания наличия поля из oneof может использоваться специальный столбец. Если сообщение содержит oneof и установлен input_format_protobuf_oneof_presence, ClickHouse заполняет столбец, который указывает, какое поле oneof было найдено. #82885 (Ilya Golshtein).
  • Улучшено профилирование выделения памяти на основе внутреннего инструментария jemalloc. Глобальный профилировщик jemalloc теперь можно включить с помощью параметра конфигурации jemalloc_enable_global_profiler. Выборочно отбираемые глобальные операции выделения и освобождения памяти могут сохраняться в system.trace_log с типом JemallocSample при включении параметра конфигурации jemalloc_collect_global_profile_samples_in_trace_log. Профилирование jemalloc теперь можно включать для каждого запроса отдельно с помощью настройки jemalloc_enable_profiler. Сохранение выборок в system.trace_log можно управлять по каждому запросу с помощью настройки jemalloc_collect_profile_samples_in_trace_log. Обновлён jemalloc до более новой версии. #85438 (Antonio Andelic).
  • Новый параметр, который удаляет файлы при удалении таблиц Iceberg. Это закрывает #86211. #86501 (scanhex12).

Экспериментальные функции

  • Инвертированный текстовый индекс был переработан с нуля, чтобы масштабироваться для наборов данных, которые не помещаются в оперативную память. #86485 (Anton Popov).
  • Оптимизация порядка JOIN теперь использует статистику. Функцию можно включить, установив allow_statistics_optimize = 1 и query_plan_optimize_join_order_limit = 10. #86822 (Han Fei).
  • Добавлена поддержка alter table ... materialize statistics all, который материализует всю статистику таблицы. #87197 (Han Fei).

Повышение производительности

  • Добавлена поддержка фильтрации частей данных с использованием skip-индексов при чтении для сокращения ненужных чтений индексов. Управляется новой настройкой use_skip_indexes_on_data_read (по умолчанию выключена). Это решает проблему #75774. Также включает общую подготовительную работу, совместную с #81021. #81526 (Amos Bird).
  • Добавлена оптимизация порядка JOIN, которая может автоматически переупорядочивать JOIN для повышения производительности (управляется настройкой query_plan_optimize_join_order_limit). Обратите внимание, что оптимизация порядка JOIN в настоящее время имеет ограниченную поддержку статистики и в основном опирается на оценки количества строк от движков хранения — более продвинутый сбор статистики и оценка кардинальности будут добавлены в будущих релизах. Если после обновления вы сталкиваетесь с проблемами с запросами JOIN, вы можете временно отключить новую реализацию, установив SET query_plan_use_new_logical_join_step = 0, и сообщить о проблеме для дальнейшего расследования. Примечание о разрешении идентификаторов из предложения USING: Изменено разрешение объединённого столбца из предложения OUTER JOIN ... USING для большей согласованности: ранее при выборе и столбца из USING, и квалифицированных столбцов (a, t1.a, t2.a) в OUTER JOIN столбец из USING ошибочно разрешался в t1.a, показывая 0/NULL для строк из правой таблицы без соответствия в левой. Теперь идентификаторы из предложения USING всегда разрешаются в объединённый (coalesced) столбец, в то время как квалифицированные идентификаторы разрешаются в необъединённые столбцы, независимо от того, какие ещё идентификаторы присутствуют в запросе. Например: SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- Раньше: a=0, t1.a=0, t2.a=2 (некорректно — 'a' разрешён в t1.a) -- Теперь: a=2, t1.a=0, t2.a=2 (корректно — 'a' объединён). #80848 (Vladimir Cherkasov).
  • Распределённый INSERT SELECT для озёр данных. #86783 (scanhex12).
  • Улучшена оптимизация PREWHERE для условий вида func(primary_column) = 'xx' и column in (xxx). #85529 (李扬).
  • Реализовано преобразование JOIN: 1. Преобразовывать LEFT ANY JOIN и RIGHT ANY JOIN в SEMI/ANTI JOIN, если условие фильтра всегда ложно для совпавших или несовпавших строк. Эта оптимизация управляется новым параметром query_plan_convert_any_join_to_semi_or_anti_join. 2. Преобразовывать FULL ALL JOIN в LEFT ALL или RIGHT ALL JOIN, если условие фильтра всегда ложно для несовпавших строк с одной из сторон соединения. #86028 (Dmitry Novik).
  • Повышена производительность вертикальных слияний после выполнения операции lightweight delete. #86169 (Anton Popov).
  • Производительность HashJoin немного улучшена в случае LEFT/RIGHT JOIN с большим количеством несоответствующих строк. #86312 (Nikita Taranov).
  • Поразрядная сортировка (radix sort): помогает компилятору эффективнее использовать SIMD и выполнять более эффективную предвыборку данных (prefetching). Использует динамическую диспетчеризацию для программной предвыборки только на процессорах Intel. Продолжение работы @taiyang-li в https://github.com/ClickHouse/ClickHouse/pull/77029. #86378 (Raúl Marín).
  • Повышает производительность коротких запросов с большим количеством фрагментов в таблицах (за счет оптимизации MarkRanges с использованием devector вместо deque). #86933 (Azat Khuzhin).
  • Улучшена производительность применения патч-частей в режиме JOIN. #87094 (Anton Popov).
  • Добавлена настройка query_condition_cache_selectivity_threshold (значение по умолчанию: 1.0), которая не помещает в кэш условий запроса результаты сканирования предикатов с низкой селективностью. Это позволяет уменьшить потребление памяти кэшем условий запроса ценой более низкого коэффициента попаданий в кэш. #86076 (zhongyuankai).
  • Уменьшено потребление памяти при записи в Iceberg. #86544 (scanhex12).

Улучшение

  • Добавлена поддержка записи нескольких файлов данных в Iceberg в рамках одной операции вставки. Добавлены новые настройки iceberg_insert_max_rows_in_data_file и iceberg_insert_max_bytes_in_data_file для управления ограничениями. #86275 (scanhex12).
  • Добавлены ограничения на количество строк/байтов для создаваемых при вставке файлов данных в Delta Lake. Ограничения задаются настройками delta_lake_insert_max_rows_in_data_file и delta_lake_insert_max_bytes_in_data_file. #86357 (Kseniia Sumarokova).
  • Добавлена поддержка большего числа типов данных для партиционирования при записи в Iceberg. Тем самым закрывается #86206. #86298 (scanhex12).
  • Сделать стратегию повторных попыток для S3 настраиваемой и добавить возможность горячей перезагрузки настроек диска S3 при изменении XML-файла конфигурации. #82642 (RinChanNOW).
  • Улучшен табличный движок S3(Azure)Queue, чтобы он продолжал работать при потере соединения с ZooKeeper без риска появления дубликатов. Требуется включить настройку S3Queue use_persistent_processing_nodes (ее можно изменить с помощью ALTER TABLE MODIFY SETTING). #85995 (Kseniia Sumarokova).
  • Вы можете использовать параметры запроса после ключевого слова TO при создании материализованного представления, например: CREATE MATERIALIZED VIEW mv TO {to_table:Identifier} AS SELECT * FROM src_table. #84899 (Diskein).
  • Выводить более понятные инструкции пользователям при указании некорректных настроек для движка таблицы Kafka2. #83701 (János Benjamin Antal).
  • Теперь нельзя указывать часовые пояса для типа Time (в этом не было смысла). #84689 (Yarik Briukhovetskyi).
  • Упростили логику, связанную с разбором Time/Time64 в режиме best_effort, и устранили некоторые ошибки. #84730 (Yarik Briukhovetskyi).
  • Добавлена функция deltaLakeAzureCluster (аналогичная deltaLakeAzure для кластерного режима) и функция deltaLakeS3Cluster (псевдоним deltaLakeCluster). Устраняет проблему #85358. #85547 (Smita Kulkarni).
  • Применять настройку azure_max_single_part_copy_size для обычных операций копирования так же, как и для резервного копирования. #85767 (Ilya Golshtein).
  • Замедлена работа потоков клиента S3 при повторяемых ошибках в хранилище объектов S3. Теперь действие предыдущего параметра backup_slow_all_threads_after_retryable_s3_error распространено на диски S3, а сам параметр переименован в более общий s3_slow_all_threads_after_retryable_error. #85918 (Julia Kartseva).
  • Настройки allow_experimental_variant/dynamic/json и enable_variant/dynamic/json помечены как устаревшие. Теперь все три типа включены безусловно. #85934 (Pavel Kruglov).
  • Реализована поддержка фильтрации по полному URL-адресу (директива full_url) в http_handlers (включая схему и host:port). #86155 (Azat Khuzhin).
  • Добавлена новая настройка allow_experimental_delta_lake_writes. #86180 (Kseniia Sumarokova).
  • Исправлено обнаружение systemd в скрипте init.d (исправлена проверка «Install packages»). #86187 (Azat Khuzhin).
  • Добавлена новая размерная метрика startup_scripts_failure_reason. Эта метрика нужна, чтобы различать разные типы ошибок, приводящих к сбою скриптов запуска. В частности, для целей оповещения необходимо различать временные (например, MEMORY_LIMIT_EXCEEDED или KEEPER_EXCEPTION) и постоянные ошибки. #86202 (Miсhael Stetsyuk).
  • Добавлена возможность опускать функцию identity для раздела (partition) таблицы Iceberg. #86314 (scanhex12).
  • Добавлена возможность включать JSON-логирование только для конкретного канала: для этого установите параметр logger.formatting.channel в одно из следующих значений: syslog/console/errorlog/log. #86331 (Azat Khuzhin).
  • Теперь можно использовать нативные числа в WHERE. Они уже допускаются в качестве аргументов логических функций. Это упрощает оптимизации filter-push-down и move-to-prewhere. #86390 (Nikolai Kochetov).
  • Исправлена ошибка при выполнении SYSTEM DROP REPLICA для каталога с повреждёнными метаданными. #86391 (Nikita Mikhaylov).
  • Добавлены дополнительные попытки повторной проверки доступа к диску (skip_access_check = 0) в Azure, поскольку предоставление доступа может занимать довольно много времени. #86419 (Alexander Tokmakov).
  • Интервал устаревания в функциях timeSeries*() теперь левосторонне открыт и правосторонне закрыт. #86588 (Vitaly Baranov).
  • Добавлены события профилирования FailedInternal*Query. #86627 (Shane Andrade).
  • Исправлена обработка пользователей с точкой в имени пользователя при добавлении через конфигурационный файл. #86633 (Mikhail Koviazin).
  • Добавлена асинхронная метрика использования памяти в запросах (QueriesMemoryUsage и QueriesPeakMemoryUsage). #86669 (Azat Khuzhin).
  • Вы можете использовать флаг clickhouse-benchmark --precise для более точного измерения QPS и других метрик по интервалам. Это помогает получать стабильные значения QPS в случаях, когда длительность запросов сопоставима с интервалом отчетности --delay D. #86684 (Sergei Trifonov).
  • Сделать значения nice для потоков Linux настраиваемыми, чтобы можно было назначать отдельным потокам (слияние/мутация, запрос, материализованное представление, клиент ZooKeeper) более высокий или более низкий приоритет. #86703 (Miсhael Stetsyuk).
  • Исправлена вводящая в заблуждение ошибка «specified upload does not exist», возникающая, когда исходное исключение теряется в ходе многокомпонентной загрузки из‑за условия гонки. #86725 (Julia Kartseva).
  • Ограничено описание плана запроса в запросе EXPLAIN. Описание больше не вычисляется для других запросов, кроме EXPLAIN. Добавлена настройка query_plan_max_step_description_length. #86741 (Nikolai Kochetov).
  • Добавлена возможность настраивать очередь ожидающих сигналов, чтобы снизить вероятность ошибки CANNOT_CREATE_TIMER (для профилировщиков запросов, query_profiler_real_time_period_ns/query_profiler_cpu_time_period_ns). Также добавлен сбор SigQ из /proc/self/status для интроспекции (если ProcessSignalQueueSize близко к ProcessSignalQueueLimit, то, скорее всего, будут возникать ошибки CANNOT_CREATE_TIMER). #86760 (Azat Khuzhin).
  • Повышена производительность операции RemoveRecursive в Keeper. #86789 (Antonio Andelic).
  • Удалены лишние пробелы в PrettyJSONEachRow при выводе данных типа JSON. #86819 (Pavel Kruglov).
  • Теперь записываем размеры блобов для prefix.path при удалении директории на обычном перезаписываемом диске. #86908 (alesapin).
  • Добавлена поддержка тестов производительности для удалённых экземпляров ClickHouse, включая ClickHouse Cloud. Пример использования: tests/performance/scripts/perf.py tests/performance/math.xml --runs 10 --user &lt;username&gt; --password &lt;password&gt; --host &lt;hostname&gt; --port &lt;port&gt; --secure. #86995 (Raufs Dunamalijevs).
  • Соблюдать лимиты памяти в местах, где заведомо выделяется значительный (>16MiB) объем памяти (сортировка, асинхронные вставки, файловый лог). #87035 (Azat Khuzhin).
  • Выбрасывать исключение, если при установке параметра network_compression_method указан неподдерживаемый универсальный кодек. #87097 (Robert Schulze).
  • Системная таблица system.query_cache теперь возвращает все записи кэша результатов запросов, тогда как ранее она возвращала только общие записи или необщие записи того же пользователя и роли. Это корректно, поскольку необщие записи не должны раскрывать результаты запросов, тогда как system.query_cache возвращает строки запросов. Это делает поведение системной таблицы более похожим на system.query_log. #87104 (Robert Schulze).
  • Включено укороченное вычисление для функции parseDateTime. #87184 (Pavel Kruglov).
  • Добавлен новый столбец statistics в system.parts_columns. #87259 (Han Fei).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Результаты alter-запросов теперь проверяются только на узле-инициаторе для реплицируемых баз данных и таблиц с внутренней репликацией. Это устранит ситуации, когда уже зафиксированный alter-запрос мог зависать на других узлах. #83849 (János Benjamin Antal).
  • Ограничивает количество задач каждого типа в BackgroundSchedulePool. Позволяет избежать ситуаций, когда все слоты заняты задачами одного типа, а задачи других типов простаивают. Также предотвращает взаимоблокировки, когда задачи ожидают друг друга. Управляется серверной настройкой background_schedule_pool_max_parallel_tasks_per_type_ratio. #84008 (Alexander Tokmakov).
  • Корректно завершайте работу таблиц при восстановлении реплики базы данных. Некорректное завершение приведёт к ошибке LOGICAL_ERROR для некоторых движков таблиц. #84744 (Antonio Andelic).
  • Проверять права доступа при генерации подсказок по исправлению опечаток в имени базы данных. #85371 (Dmitry Novik).
    1. LowCardinality для столбцов hive 2. Заполнять столбцы hive перед виртуальными столбцами (требуется для https://github.com/ClickHouse/ClickHouse/pull/81040) 3. LOGICAL_ERROR при пустом формате для hive #85528 4. Проверять, что столбцы партиционирования hive являются единственными столбцами 5. Проверять, что все столбцы hive указаны в схеме 6. Частично исправить работу parallel_replicas_cluster с hive 7. Использовать упорядоченный контейнер в extractkeyValuePairs для hive utils (требуется для https://github.com/ClickHouse/ClickHouse/pull/81040). #85538 (Arthur Passos).
  • Предотвращена ненужная оптимизация первого аргумента в функциях IN, иногда приводившая к ошибкам при использовании отображения массивов (array mapping). #85546 (Yakov Olkhovskiy).
  • Отображение между идентификаторами источника Iceberg и именами Parquet не было скорректировано в соответствии со схемой при записи файла Parquet. В этом PR схема обрабатывается отдельно для каждого файла данных Iceberg, а не используется текущая. #85829 (Daniil Ivanik).
  • Исправлено раздельное определение размера файла и его открытие. Связано с https://github.com/ClickHouse/ClickHouse/pull/33372, который был внесён в ответ на ошибку в ядрах Linux версий до 5.10. #85837 (Konstantin Bogdanov).
  • ClickHouse Keeper больше не завершается с ошибкой при запуске на системах, где IPv6 отключён на уровне ядра (например, RHEL с ipv6.disable=1). Теперь он пытается перейти на IPv4-слушатель, если не удалось запустить исходный IPv6-слушатель. #85901 (jskong1124).
  • Этот PR закрывает #77990. Добавлена поддержка TableFunctionRemote для параллельных реплик в globalJoin. #85929 (zoomxi).
  • Исправлено разыменование нулевого указателя в orcschemareader::initializeifneeded(). Этот PR устраняет следующую проблему: #85292 ### запись в документации об изменениях, заметных пользователю. #85951 (yanglongwei).
  • Добавлена проверка, разрешающая использовать коррелированные подзапросы в предложении FROM только если они используют столбцы из внешнего запроса. Исправляет #85469. Исправляет #85402. #85966 (Dmitry Novik).
  • Исправлена работа ALTER UPDATE для столбца с подстолбцом, используемым в материализованном выражении другого столбца. Ранее такой материализованный столбец с подстолбцом в выражении обновлялся некорректно. #85985 (Pavel Kruglov).
  • Запрещено изменять столбцы, если их подстолбцы используются в PK или выражении партиционирования. #86005 (Pavel Kruglov).
  • Исправлена ошибка чтения подстолбцов при использовании нестандартного режима сопоставления столбцов в хранилище DeltaLake. #86064 (Kseniia Sumarokova).
  • Исправлено использование некорректных значений по умолчанию для пути при подсказке Enum в JSON. #86065 (Pavel Kruglov).
  • Разбор URL каталога Hive в DataLake с санитизацией входных данных. Закрывает #86018. #86092 (rajat mohan).
  • Исправлена логическая ошибка при динамическом изменении размера кэша файловой системы. Закрывает #86122. Закрывает https://github.com/ClickHouse/clickhouse-core-incidents/issues/473. #86130 (Kseniia Sumarokova).
  • Используйте NonZeroUInt64 для параметра logs_to_keep в DatabaseReplicatedSettings. #86142 (Tuan Pham Anh).
  • Исключение возникало при выполнении запроса FINAL с пропускающим индексом (skip index), если таблица (например, ReplacingMergeTree) была создана с настройкой index_granularity_bytes = 0. Теперь эта проблема устранена. #86147 (Shankar Iyer).
  • Устраняет неопределённое поведение (UB) и исправляет проблемы с разбором выражения секционирования в Iceberg. #86166 (Daniil Ivanik).
  • Исправлено падение при одновременном использовании константных и неконстантных блоков в одном INSERT. #86230 (Azat Khuzhin).
  • По умолчанию при создании дисков из SQL обрабатываются директивы include из /etc/metrika.xml. #86232 (alekar).
  • Исправлена работа accurateCastOrNull/accurateCastOrDefault при приведении значений типа String к JSON. #86240 (Pavel Kruglov).
  • Добавлена поддержка каталогов без '/' в движке Iceberg. #86249 (scanhex12).
  • Исправлена ошибка, приводившая к сбою при использовании replaceRegex с haystack типа FixedString и пустой needle. #86270 (Raúl Marín).
  • Исправлено аварийное завершение при ALTER UPDATE Nullable(JSON). #86281 (Pavel Kruglov).
  • Исправлено отсутствие определения столбца в system.tables. #86295 (Raúl Marín).
  • Исправлено приведение типов из LowCardinality(Nullable(T)) к Dynamic. #86365 (Pavel Kruglov).
  • Исправлена логическая ошибка при записи в Delta Lake. Закрывает #86175. #86367 (Kseniia Sumarokova).
  • Исправлена ошибка 416 The range specified is invalid for the current size of the resource. The range specified is invalid for the current size of the resource при чтении пустых blob-объектов из Azure Blob Storage для диска plain_rewritable. #86400 (Julia Kartseva).
  • Исправлена работа GROUP BY с Nullable(JSON). #86410 (Pavel Kruglov).
  • Исправлена ошибка в материализованных представлениях: материализованное представление могло не работать, если его создать, удалить, а затем снова создать с тем же именем. #86413 (Alexander Tokmakov).
  • Выдавать ошибку, если при чтении из функций *cluster все реплики недоступны. #86414 (Julian Maicher).
  • Устранена утечка MergesMutationsMemoryTracking, возникавшая из-за таблиц Buffer, и исправлен query_views_log для потоковой загрузки из Kafka (и других источников). #86422 (Azat Khuzhin).
  • Исправлена работа SHOW TABLES после удаления таблицы-справочника хранилища Alias. #86433 (RinChanNOW).
  • Исправлено отсутствие заголовка чанка при включённом параметре send_chunk_header и вызове UDF по протоколу HTTP. #86469 (Vladimir Cherkasov).
  • Исправлена потенциальная взаимная блокировка при включённом сбросе профиля jemalloc. #86473 (Azat Khuzhin).
  • Исправлено чтение подстолбцов в движке таблицы DeltaLake. Закрывает #86204. #86477 (Kseniia Sumarokova).
  • Корректная обработка идентификатора loopback-хоста для предотвращения коллизий при обработке DDL-задач: #86479 (Tuan Pham Anh).
  • Исправлена работа операций detach/attach для таблиц движка базы данных PostgreSQL с числовыми и десятичными столбцами. #86480 (Julian Maicher).
  • Исправлено использование неинициализированной памяти в функции getSubcolumnType. #86498 (Raúl Marín).
  • Функции searchAny и searchAll при вызове с пустыми образцами теперь возвращают true (то есть «совпадает со всем»). Ранее они возвращали false. (issue #86300). #86500 (Elmi Ahmadov).
  • Исправлена работа функции timeSeriesResampleToGridWithStaleness() в случае отсутствия значения в первом бакете. #86507 (Vitaly Baranov).
  • Исправлен сбой, возникавший при значении merge_tree_min_read_task_size, равном 0. #86527 (yanglongwei).
  • При чтении формат для каждого файла данных теперь берётся из метаданных Iceberg (раньше — из аргументов таблицы). #86529 (Daniil Ivanik).
  • Игнорировать исключения при сбросе логов во время завершения работы и сделать завершение более безопасным (чтобы избежать SIGSEGV). #86546 (Azat Khuzhin).
  • Исправлена ошибка в движке базы данных Backup, приводившая к возникновению исключения при запросе с файловыми частями нулевого размера. #86563 (Max Justus Spransy).
  • Исправлено отсутствие заголовка чанка при включённом send_chunk_header и вызове UDF по протоколу HTTP. #86606 (Vladimir Cherkasov).
  • Исправлена логическая ошибка S3Queue "Expected current processor to be equal to ", возникавшая из-за истечения сессии Keeper. #86615 (Kseniia Sumarokova).
  • Ошибки, связанные с Nullable, при вставке данных и отсечении. Закрывает #86407. #86630 (scanhex12).
  • Не отключайте кэш файловой системы, если отключён кэш метаданных Iceberg. #86635 (Daniil Ivanik).
  • Исправлена ошибка «Deadlock in Parquet::ReadManager (single-threaded)» в Parquet reader v3. #86644 (Michael Kolupaev).
  • Исправлена поддержка IPv6 в listen_host для ArrowFlight. #86664 (Vitaly Baranov).
  • Исправлено завершение работы обработчика ArrowFlight. Этот PR исправляет #86596. #86665 (Vitaly Baranov).
  • Исправлены распределённые запросы с describe_compact_output=1. #86676 (Azat Khuzhin).
  • Исправлены разбор определения окон и применение параметров запроса. #86720 (Azat Khuzhin).
  • Исправлено исключение Partition strategy wildcard can not be used without a '_partition_id' wildcard. при создании таблицы с PARTITION BY, но без подстановочного символа для партиционирования, что раньше работало в версиях до 25.8. Закрывает https://github.com/ClickHouse/clickhouse-private/issues/37567. #86748 (Kseniia Sumarokova).
  • Исправлена ошибка LogicalError, возникающая, если параллельные запросы пытаются получить одну и ту же блокировку. #86751 (Pervakov Grigorii).
  • Исправлена запись значения NULL в общие JSON-данные во входном формате RowBinary и добавлены дополнительные проверки в ColumnObject. #86812 (Pavel Kruglov).
  • Исправлена проблема с перестановкой пустого Tuple с LIMIT. #86828 (Pavel Kruglov).
  • Не используйте отдельный узел Keeper для persistent-узлов обработки. Исправление для https://github.com/ClickHouse/ClickHouse/pull/85995. Закрывает #86406. #86841 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой таблица с движком TimeSeries нарушала создание новой реплики в реплицируемой базе данных. #86845 (Nikolay Degterinsky).
  • Исправлена обработка запросов к system.distributed_ddl_queue в случаях, когда в задачах отсутствуют некоторые узлы Keeper. #86848 (Antonio Andelic).
  • Исправлено позиционирование в конце декомпрессированного блока. #86906 (Pavel Kruglov).
  • Обработка исключения, выбрасываемого при асинхронном выполнении итератора Iceberg. #86932 (Daniil Ivanik).
  • Исправлено сохранение крупных предварительно обработанных XML-конфигураций. #86934 (c-end).
  • Исправлено заполнение поля date в таблице system.iceberg_metadata_log. #86961 (Daniil Ivanik).
  • Исправлен бесконечный пересчёт TTL с WHERE. #86965 (Anton Popov).
  • Исправлен потенциально некорректный результат функции uniqExact с модификаторами ROLLUP и CUBE. #87014 (Nikita Taranov).
  • Исправлено определение схемы таблицы с помощью табличной функции url() при значении настройки parallel_replicas_for_cluster_functions, установленном в 1. #87029 (Konstantin Bogdanov).
  • Корректно выполняется приведение типа результата PREWHERE после разбиения на несколько шагов. #87040 (Antonio Andelic).
  • Исправлена работа легковесных обновлений с клаузой ON CLUSTER. #87043 (Anton Popov).
  • Исправлена совместимость некоторых состояний агрегатных функций с аргументом типа String. #87049 (Pavel Kruglov).
  • Исправляет ошибку, из-за которой имя модели OpenAI не передавалось дальше. #87100 (Kaushik Iska).
  • EmbeddedRocksDB: Путь должен указывать на расположение внутри user_files. #87109 (Raúl Marín).
  • Исправлена проблема с таблицами KeeperMap, созданными до версии 25.1, которые оставляли данные в ZooKeeper после выполнения запроса DROP. #87112 (Nikolay Degterinsky).
  • Исправлена обработка идентификаторов полей карт и массивов при чтении Parquet. #87136 (scanhex12).
  • Исправлено чтение массива с подколонкой размеров массива при ленивой материализации. #87139 (Pavel Kruglov).
  • Исправлена работа функции CASE с аргументами типа Dynamic. #87177 (Pavel Kruglov).
  • Исправлена обработка пустого массива при чтении из пустой строки в CSV. #87182 (Pavel Kruglov).
  • Исправлена потенциальная ошибка, из-за которой некоррелированный EXISTS мог возвращать некорректный результат. Ошибка появилась с параметром execute_exists_as_scalar_subquery=1, который был добавлен в https://github.com/ClickHouse/ClickHouse/pull/85481 и влияет на версию 25.8. Исправляет #86415. #87207 (Nikolai Kochetov).
  • Выбрасывает ошибку, если iceberg_metadata_log не настроен, но пользователь пытается получить отладочную информацию о метаданных Iceberg. Исправляет обращение к nullptr. #87250 (Daniil Ivanik).

Улучшения сборки/тестирования/упаковки

Релиз ClickHouse 25.8 LTS, 2025-08-28

Обратно несовместимые изменения

  • Выводить Array(Dynamic) вместо безымянного Tuple для массивов значений с разными типами в JSON. Чтобы использовать предыдущее поведение, отключите настройку input_format_json_infer_array_of_dynamic_from_array_of_different_types. #80859 (Pavel Kruglov).
  • Перевести метрики задержек S3 в гистограммы для однородности и упрощения. #82305 (Miсhael Stetsyuk).
  • Требовать обратные кавычки вокруг идентификаторов с точками в выражениях по умолчанию (DEFAULT), чтобы предотвратить их разбор как составных идентификаторов. #83162 (Pervakov Grigorii).
  • Ленивую материализацию включать только при использовании analyzer (это поведение по умолчанию), чтобы избежать необходимости поддерживать режим без analyzer, который, по нашему опыту, имеет некоторые проблемы (например, при использовании indexHint() в условиях). #83791 (Igor Nikonov).
  • По умолчанию записывать значения типа Enum как BYTE_ARRAY с логическим типом ENUM в формате вывода Parquet. #84169 (Pavel Kruglov).
  • Включить настройку MergeTree write_marks_for_substreams_in_compact_parts по умолчанию. Она существенно улучшает производительность чтения подстолбцов из вновь создаваемых Compact‑частей. Серверы версии ниже 25.5 не смогут читать новые Compact‑части. #84171 (Pavel Kruglov).
  • Предыдущее значение по умолчанию для concurrent_threads_scheduler было round_robin, которое оказалось несправедливым при большом количестве однопоточных запросов (например, INSERT). Это изменение устанавливает более безопасный планировщик fair_round_robin значением по умолчанию. #84747 (Sergei Trifonov).
  • ClickHouse поддерживает синтаксис heredoc в стиле PostgreSQL: $tag$ string contents... $tag$, также известный как строковые литералы с долларовым квотированием (dollar-quoted string literals). В предыдущих версиях было меньше ограничений на теги: они могли содержать произвольные символы, включая знаки пунктуации и пробелы. Это приводит к неоднозначности разбора с идентификаторами, которые также могут начинаться с символа доллара. При этом PostgreSQL разрешает использовать в тегах только символьные (word) символы. Для решения проблемы мы теперь ограничиваем теги heredoc только символьными (word) символами. Закрывает #84731. #84846 (Alexey Milovidov).
  • Функции azureBlobStorage, deltaLakeAzure и icebergAzure были обновлены для корректной проверки привилегий AZURE. Все кластерные варианты функций (функции -Cluster) теперь проверяют привилегии относительно соответствующих некластерных версий. Дополнительно функции icebergLocal и deltaLakeLocal теперь применяют проверки привилегий FILE. #84938 (Nikita Mikhaylov).
  • Включить настройку allow_dynamic_metadata_for_data_lakes (настройка на уровне движка таблиц) по умолчанию. #85044 (Daniil Ivanik).
  • По умолчанию отключить заключение в кавычки 64‑битных целых чисел в форматах JSON. #74079 (Pavel Kruglov)

Новая возможность

  • Добавлена базовая поддержка диалекта PromQL. Чтобы использовать его, задайте dialect='promql' в clickhouse-client, укажите таблицу TimeSeries с помощью настройки promql_table_name='X' и выполняйте запросы вида rate(ClickHouseProfileEvents_ReadCompressedBytes[1m])[5m:1m]. Также можно обернуть запрос PromQL в SQL: SELECT * FROM prometheusQuery('up', ...);. На данный момент поддерживаются только функции rate, delta и increase. Унарные и бинарные операторы пока не поддерживаются. HTTP API пока нет. #75036 (Vitaly Baranov).
  • Генерация SQL с помощью ИИ теперь, при их наличии, может автоматически определять из окружения переменные ANTHROPIC_API_KEY и OPENAI_API_KEY, чтобы обеспечить возможность использования этой функции в режиме «нулевой конфигурации». #83787 (Kaushik Iska).
  • Реализована поддержка протокола ArrowFlight RPC за счет добавления новой табличной функции arrowflight. #74184 (zakr600).
  • Теперь все таблицы поддерживают виртуальный столбец _table (не только таблицы с движком Merge), что особенно полезно для запросов с операцией UNION ALL. #63665 (Xiaozhe Yu).
  • Разрешено использование любой политики хранения (например, объектного хранилища, такого как S3) для внешней агрегации/сортировки. #84734 (Azat Khuzhin).
  • Реализована поддержка аутентификации в AWS S3 с явным указанием роли IAM. Реализована поддержка OAuth для GCS. До недавнего времени эти возможности были доступны только в ClickHouse Cloud, теперь они открыты в виде open source. Синхронизированы некоторые интерфейсы, такие как сериализация параметров подключения для объектных хранилищ. #84011 (Alexey Milovidov).
  • Добавлена поддержка удалений по позициям (position deletes) для Iceberg TableEngine. #83094 (Daniil Ivanik).
  • Реализована поддержка операций Iceberg Equality Deletes. #85843 (Han Fei).
  • Запись в Iceberg при выполнении CREATE. Закрывает #83927. #83983 (Konstantин Vedernikov).
  • Каталоги Glue для записи. #84136 (Konstantin Vedernikov).
  • Каталоги REST Iceberg для записи. #84684 (Konstantin Vedernikov).
  • Объединить все файлы позиционных удалений (position delete) формата Iceberg в файлы с данными. Это сократит количество и размер файлов Parquet в хранилище Iceberg. Синтаксис: OPTIMIZE TABLE table_name. #85250 (Konstantin Vedernikov).
  • Реализована поддержка оператора DROP TABLE для Iceberg (удаление из каталогов REST/Glue и связанных с таблицей метаданных). #85395 (Konstantin Vedernikov).
  • Поддержка мутаций ALTER DELETE для Iceberg в формате merge-on-read. #85549 (Konstantин Vedernikov).
  • Добавлена поддержка записи в Delta Lake. Закрывает #79603. #85564 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_snapshot_version для чтения определённой версии снимка в движке таблиц DeltaLake. #85295 (Kseniia Sumarokova).
  • Сохранять больше статистики Iceberg (размеры столбцов, нижние и верхние границы) в метаданные (записи манифеста) для min-max-прунинга. #85746 (Konstantин Vedernikov).
  • Добавлена поддержка добавления, удаления и изменения столбцов в Iceberg для простых типов. #85769 (Konstantин Ведерников).
  • Iceberg: добавлена поддержка записи файла version-hint. Это закрывает #85097. #85130 (Konstantin Vedernikov).
  • Представления, созданные временными пользователями, теперь будут хранить копию реального пользователя и больше не будут инвалидироваться после удаления временного пользователя. #84763 (pufit).
  • Индекс похожести векторов теперь поддерживает бинарное квантование. Бинарное квантование значительно снижает потребление памяти и ускоряет процесс построения векторного индекса (за счёт более быстрого вычисления расстояний). Также существующая настройка vector_search_postfilter_multiplier была помечена как устаревшая и заменена более общей настройкой: vector_search_index_fetch_multiplier. #85024 (Shankar Iyer).
  • Разрешить использование аргументов вида ключ–значение в табличном движке/функции s3 или s3Cluster, например s3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova).
  • Новая системная таблица для хранения ошибочных входящих сообщений от движков, таких как Kafka ("очередь мёртвых писем", dead letter queue). #68873 (Ilya Golshtein).
  • Новая команда SYSTEM RESTORE DATABASE REPLICA для реплицируемых баз данных, аналогичная имеющейся функциональности восстановления в ReplicatedMergeTree. #73100 (Konstantин Morozов).
  • Теперь в протоколе PostgreSQL поддерживается команда COPY. #74344 (Konstantin Vedernikov).
  • Добавлена поддержка C#-клиента для протокола MySQL. Это закрывает #83992. #84397 (Konstantin Vedernikov).
  • Добавлена поддержка чтения и записи в формате секционирования Hive. #76802 (Arthur Passos).
  • Добавлена системная таблица zookeeper_connection_log для хранения истории подключений к ZooKeeper. #79494 (János Benjamin Antal).
  • Серверная настройка cpu_slot_preemption включает вытесняющее планирование CPU для рабочих нагрузок и обеспечивает справедливое по принципу max-min распределение процессорного времени между ними. Добавлены новые настройки рабочих нагрузок для ограничения потребления CPU: max_cpus, max_cpu_share и max_burst_cpu_seconds. Подробнее: https://clickhouse.com/docs/operations/workload-scheduling#cpu_scheduling. #80879 (Sergei Trifonov).
  • Разрывать TCP-соединение после заданного количества запросов или по достижении заданного порога времени. Это полезно для более равномерного распределения соединений между узлами кластера за балансировщиком нагрузки. Устраняет #68000. #81472 (Kenny Sun).
  • Параллельные реплики теперь поддерживают использование проекций при выполнении запросов. #82659. #82807 (zoomxi).
  • Добавлена поддержка DESCRIBE SELECT в дополнение к DESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi).
  • Принудительное использование защищённого соединения для mysql_port и postgresql_port. #82962 (tiandiwonder).
  • Теперь пользователи могут выполнять поиск по ключам JSON без учета регистра с помощью JSONExtractCaseInsensitive (и других вариантов JSONExtract). #83770 (Alistair Evans).
  • Добавлена системная таблица system.completions. Закрывает #81889. #83833 (|2ustam).
  • Добавлена новая функция nowInBlock64. Пример использования: SELECT nowInBlock64(6) возвращает 2025-07-29 17:09:37.775725. #84178 (Halersson Paris).
  • Добавлена поддержка extra_credentials в AzureBlobStorage для аутентификации по client_id и tenant_id. #84235 (Pablo Marcos).
  • Добавлена функция dateTimeToUUIDv7 для преобразования значения типа DateTime в UUIDv7. Пример использования: SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56')) возвращает 0198af18-8320-7a7d-abd3-358db23b9d5c. #84319 (samradovich).
  • Агрегатные функции timeSeriesDerivToGrid и timeSeriesPredictLinearToGrid для повторного дискретизирования данных на временную сетку, заданную указанными метками времени начала и конца, а также шагом; соответственно вычисляют значения, аналогичные PromQL-функциям deriv и predict_linear. #84328 (Stephen Chi).
  • Добавлены две новые функции TimeSeries: - timeSeriesRange(start_timestamp, end_timestamp, step), - timeSeriesFromGrid(start_timestamp, end_timestamp, step, values). #85435 (Vitaly Baranov).
  • Добавлен новый синтаксис: GRANT READ ON S3('s3://foo/.*') TO user. #84503 (pufit).
  • Добавлен новый формат вывода Hash. Он вычисляет одно хеш-значение для всех столбцов и строк результата. Это полезно для вычисления «отпечатка» результата, например, в сценариях, когда передача данных является узким местом. Пример: SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash возвращает e5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze).
  • Добавлена возможность устанавливать произвольные наблюдатели в запросах Keeper Multi. #84964 (Mikhail Artemenko).
  • Добавлена опция --max-concurrency в инструменте clickhouse-benchmark, включающая режим с постепенным увеличением числа параллельных запросов. #85623 (Sergei Trifonov).
  • Добавлена поддержка частично агрегированных метрик. #85328 (Mikhail Artemenko).

Экспериментальная функциональность

  • Включена поддержка коррелированных подзапросов по умолчанию, они больше не считаются экспериментальными. #85107 (Dmitry Novik).
  • Каталоги озера данных Unity, Glue, Rest и Hive Metastore переведены из экспериментального режима в бета-стадию. #85848 (Melvyn Peignon).
  • Облегчённые операции обновления (UPDATE) и удаления (DELETE) переведены из экспериментального режима в бета-стадию.
  • Приблизительный векторный поиск с индексами векторного сходства теперь имеет статус GA. #85888 (Robert Schulze).
  • Движок таблиц Ytsaurus и табличная функция. #77606 (MikhailBurdukov).
  • Ранее данные текстового индекса разделялись на несколько сегментов (размер каждого сегмента по умолчанию составлял 256 MiB). Это могло уменьшить потребление памяти при построении текстового индекса, но увеличивало требования к дисковому пространству и время ответа на запрос. #84590 (Elmi Ahmadov).

Повышение производительности

  • Новая реализация ридера Parquet. В целом работает быстрее, поддерживает проталкивание фильтров на уровне страниц (page-level filter pushdown) и PREWHERE. Пока является экспериментальной. Используйте настройку input_format_parquet_use_native_reader_v3, чтобы её включить. #82789 (Michael Kolupaev).
  • Официальный HTTP-транспорт в библиотеке Azure был заменён нашей собственной реализацией HTTP‑клиента для Azure Blob Storage. Добавлены многочисленные настройки для этого клиента, которые соответствуют настройкам для S3. Введены агрессивные тайм-ауты установления соединения как для Azure, так и для S3. Улучшена возможность инспектирования событий и метрик профиля Azure. Новый клиент включён по умолчанию и обеспечивает значительно меньшую задержку для холодных запросов при работе с Azure Blob Storage. Старый клиент на базе Curl можно вернуть, установив параметр azure_sdk_use_native_client=false. #83294 (alesapin). Предыдущая официальная реализация клиента Azure была непригодна для эксплуатации в продакшене из-за ужасных всплесков задержки — от пяти секунд до минут. Мы избавились от этой ужасной реализации и очень этим гордимся.
  • Обрабатывает индексы в порядке возрастания размера файла. Конечный порядок индексов отдаёт приоритет индексам minmax и векторным индексам (из-за простоты и селективности соответственно), а затем — небольшим индексам. Внутри групп minmax/векторных индексов также предпочитаются индексы меньшего размера. #84094 (Maruth Goyal).
  • По умолчанию включена настройка MergeTree write_marks_for_substreams_in_compact_parts. Это существенно повышает производительность чтения подколонок из вновь создаваемых Compact‑частей. Серверы с версией ниже 25.5 не смогут читать новые Compact‑части. #84171 (Pavel Kruglov).
  • Движок таблицы azureBlobStorage: кэшировать и по возможности повторно использовать токены проверки подлинности управляемого удостоверения, чтобы избежать ограничения частоты запросов. #79860 (Nick Blakely).
  • Операции ALL LEFT/INNER JOIN будут автоматически преобразованы в RightAny, если правая сторона соединения функционально определяется столбцами ключа соединения (во всех строках уникальные значения ключа соединения). #84010 (Nikita Taranov).
  • Добавлен параметр max_joined_block_size_bytes в дополнение к max_joined_block_size_rows для ограничения потребления памяти при выполнении операций JOIN с «тяжёлыми» столбцами. #83869 (Nikolai Kochetov).
  • Добавлена новая логика (управляется настройкой enable_producing_buckets_out_of_order_in_aggregation, по умолчанию включена), которая позволяет отправлять некоторые бакеты не по порядку при агрегации с экономным использованием памяти. Когда слияние некоторых бакетов агрегации занимает значительно больше времени, чем слияние других, это улучшает производительность, позволяя инициатору тем временем сливать бакеты с более высокими идентификаторами. Недостаток — потенциально более высокое потребление памяти (не должно быть значительным). #80179 (Nikita Taranov).
  • Добавлена настройка optimize_rewrite_regexp_functions (включена по умолчанию), которая позволяет оптимизатору переписывать некоторые вызовы функций replaceRegexpAll, replaceRegexpOne и extract в более простые и эффективные формы при обнаружении определённых шаблонов регулярных выражений. (issue #81981). #81992 (Amos Bird).
  • Обрабатывать max_joined_block_rows вне основного цикла хешированного JOIN. Незначительно улучшена производительность ALL JOIN. #83216 (Nikolai Kochetov).
  • Сначала обрабатывать min-max-индексы с более высокой детализацией. Закрывает #75381. #83798 (Maruth Goyal).
  • Обеспечить выполнение оконных агрегатных функций с DISTINCT за линейное время и исправить ошибку в sumDistinct. Закрывает #79792. Закрывает #52253. #79859 (Nihal Z. Miaji).
  • Векторные поисковые запросы с использованием индекса векторного сходства выполняются с меньшими задержками за счет уменьшения количества чтений из хранилища и снижения загрузки процессора. #83803 (Shankar Iyer).
  • Rendezvous-хеширование для улучшения локальности кэша при распределении нагрузки по параллельным репликам. #82511 (Anton Ivashkin).
  • Реализована функция addManyDefaults для комбинаторов If, благодаря чему агрегатные функции с комбинаторами If теперь работают быстрее. #83870 (Raúl Marín).
  • Вычислять сериализованный ключ по столбцам при группировке по нескольким строковым или числовым столбцам. #83884 (李扬).
  • Исключено полное сканирование таблицы в случаях, когда анализ индекса приводит к пустым диапазонам при чтении с параллельных реплик. #84971 (Eduard Karacharov).
  • Попробуйте -falign-functions=64 для более стабильных тестов производительности. #83920 (Azat Khuzhin).
  • Индекс блум-фильтра теперь используется для условий вида has([c1, c2, ...], column), где column не относится к типу Array. Это повышает производительность таких запросов, делая их столь же эффективными, как оператор IN. #83945 (Doron David).
  • Снижено число избыточных вызовов memcpy в CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).
  • Оптимизировать largestTriangleThreeBuckets путём удаления временных данных. #84479 (Alexey Milovidov).
  • Оптимизирована десериализация строк за счет упрощения кода. Закрывает #38564. #84561 (Alexey Milovidov).
  • Исправлен расчет минимального размера задачи для параллельных реплик. #84752 (Nikita Taranov).
  • Повышена производительность применения частей патча в режиме Join. #85040 (Anton Popov).
  • Исправлена обработка нулевого байта. Закрывает #85062. Исправлено несколько незначительных ошибок. Функции structureToProtobufSchema, structureToCapnProtoSchema некорректно ставили нуль-терминирующий байт и использовали символ новой строки вместо него. Это приводило к отсутствию новой строки в выводе и могло приводить к переполнению буфера при использовании других функций, зависящих от нулевого байта (таких, как logTrace, demangle, extractURLParameter, toStringCutToZero и encrypt/decrypt). Макет словаря regexp_tree не поддерживал обработку строк с нулевыми байтами. Функция formatRowNoNewline, вызываемая с форматом Values или с любым другим форматом без новой строки в конце строк, ошибочно обрезала последний символ вывода. Функция stem содержала ошибку безопасной обработки исключений, которая в очень редком сценарии могла привести к утечке памяти. Функция initcap работала неправильно для аргументов типа FixedString: она не распознавала начало слова в начале строки, если предыдущая строка в блоке заканчивалась символом слова. Исправлена уязвимость формата Apache ORC, которая могла привести к раскрытию неинициализированной памяти. Изменено поведение функции replaceRegexpAll и соответствующего алиаса REGEXP_REPLACE: теперь она может выполнять пустое совпадение в конце строки, даже если предыдущее совпадение охватило всю строку, как в случае ^a*|a*$ или ^|.* — это соответствует семантике JavaScript, Perl, Python, PHP, Ruby, но отличается от семантики PostgreSQL. Реализация многих функций была упрощена и оптимизирована. Документация для нескольких функций была некорректной и теперь исправлена. Имейте в виду, что вывод byteSize для столбцов типа String и сложных типов, состоящих из столбцов типа String, изменился (с 9 байт на пустую строку на 8 байт на пустую строку), и это нормально. #85063 (Alexey Milovidov).
  • Оптимизировать материализацию констант в случаях, когда она выполняется только для возврата одной строки. #85071 (Alexey Milovidov).
  • Улучшена параллельная обработка файлов с помощью бэкенда delta-kernel-rs. #85642 (Azat Khuzhin).
  • Добавлена новая настройка enable_add_distinct_to_in_subqueries. При её включении ClickHouse будет автоматически добавлять DISTINCT в подзапросы в выражениях IN для распределённых запросов. Это может значительно уменьшить размер временных таблиц, передаваемых между шардами, и повысить эффективность использования сетевых ресурсов. Примечание: это компромисс — хотя объём передаваемых по сети данных сокращается, на каждом узле требуется дополнительная работа по слиянию (удалению дубликатов). Включайте эту настройку, когда узким местом является сетевой трафик и стоимость слияния приемлема. #81908 (fhw12345).
  • Снижены накладные расходы при отслеживании использования памяти запросов для исполняемых пользовательских функций. #83929 (Eduard Karacharov).
  • Реализована внутренняя фильтрация delta-kernel-rs (по статистике и отсечению партиций) в хранилище DeltaLake. #84006 (Kseniia Sumarokova).
  • Более тонко регулируется отключение пропускающих индексов, которые зависят от столбцов, обновляемых «на лету» или через patch parts. Теперь пропускающие индексы не используются только в частях, затронутых мутациями «на лету» или patch parts; ранее такие индексы отключались для всех частей. #84241 (Anton Popov).
  • Выделяйте минимальный объём памяти, необходимый под encrypted_buffer для зашифрованных именованных коллекций. #84432 (Pablo Marcos).
  • Улучшена поддержка индексов блум‑фильтра (обычных, ngram и token), которые теперь могут использоваться, когда первый аргумент — константный массив (множество), а второй — индексированный столбец (подмножество), что обеспечивает более эффективное выполнение запросов. #84700 (Doron David).
  • Снижена конкуренция за блокировку хранилища в Keeper. #84732 (Antonio Andelic).
  • Добавлена поддержка read_in_order_use_virtual_row для WHERE. Это позволяет пропускать чтение дополнительных частей для запросов с фильтрами, которые не удалось полностью протолкнуть в PREWHERE. #84835 (Nikolai Kochetov).
  • Позволяет асинхронно перебирать объекты из таблицы Iceberg без явного хранения объектов для каждого файла данных. #85369 (Daniil Ivanik).
  • Выполняет некоррелированный EXISTS в виде скалярного подзапроса. Это позволяет использовать кэш скалярных подзапросов и выполнять константное свёртывание результата, что полезно для индексов. Для совместимости добавлена новая настройка execute_exists_as_scalar_subquery=1. #85481 (Nikolai Kochetov).

Улучшение

  • Добавлены настройки database_replicated, задающие значения по умолчанию для DatabaseReplicatedSettings. Если настройка отсутствует в запросе создания реплицируемой базы данных, используется значение из database_replicated. #85127 (Tuan Pham Anh).
  • В веб-интерфейсе (play) добавлена возможность изменять ширину столбцов таблицы. #84012 (Doron David).
  • Добавлена поддержка сжатого файла .metadata.json через настройку iceberg_metadata_compression_method. Поддерживаются все методы сжатия ClickHouse. Тем самым закрывается #84895. #85196 (Konstantin Vedernikov).
  • Теперь в выводе EXPLAIN indexes = 1 отображается количество диапазонов, которые будут прочитаны. #79938 (Christoph Wurm).
  • Добавлены настройки для задания размера блока сжатия ORC и обновлено значение по умолчанию с 64 KB до 256 KB, чтобы привести его в соответствие с Spark и Hive. #80602 (李扬).
  • Добавлен файл columns_substreams.txt в Wide-часть для отслеживания всех подстримов, хранящихся в части. Это помогает отслеживать динамические стримы в типах JSON и Dynamic и таким образом позволяет избежать необходимости чтения выборки этих столбцов для получения списка динамических стримов (например, для вычисления размеров столбцов). Также теперь все динамические стримы отображаются в system.parts_columns. #81091 (Pavel Kruglov).
  • Добавлен флаг командной строки --show_secrets для clickhouse format, который по умолчанию скрывает конфиденциальные данные. #81524 (Nikolai Ryzhov).
  • Запросы на чтение и запись в S3 дросселируются на уровне HTTP-сокета (вместо всего запроса к S3), чтобы избежать проблем с дросселированием max_remote_read_network_bandwidth_for_server и max_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov).
  • Разрешено смешивать разные правила сопоставления (collation) для одного и того же столбца в разных окнах (для оконных функций). #82877 (Yakov Olkhovskiy).
  • Добавлен инструмент, который позволяет моделировать, визуализировать и сравнивать селекторы слияния. #71496 (Sergei Trifonov).
  • Добавлена поддержка табличных функций remote* с параллельными репликами, если в аргументе address_expression указан кластер. Также исправлена #73295. #82904 (Igor Nikonov).
  • Все сообщения журнала, связанные с записью файлов резервных копий, переведены на уровень TRACE. #82907 (Hans Krutzer).
  • Пользовательские функции с необычными именами и кодеками могут некорректно форматироваться SQL-форматтером. Это закрывает #83092. #83644 (Alexey Milovidov).
  • Теперь можно использовать типы Time и Time64 внутри типа JSON. #83784 (Yarik Briukhovetskyi).
  • Соединения с параллельными репликами теперь используют логический шаг JOIN. Если возникают какие-либо проблемы с запросами JOIN, использующими параллельные реплики, попробуйте SET query_plan_use_new_logical_join_step=0 и сообщите о проблеме. #83801 (Vladimir Cherkasov).
  • Исправлена совместимость cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
  • Добавлена поддержка изменения настроек вставки в материализованные представления на уровне таблицы S3Queue. Добавлены новые настройки уровня S3Queue: min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. По умолчанию будут использоваться настройки на уровне профиля, а настройки уровня S3Queue будут их переопределять. #83971 (Kseniia Sumarokova).
  • Добавлено событие профилирования MutationAffectedRowsUpperBound, которое показывает количество строк, затронутых мутацией (например, общее количество строк, удовлетворяющих условию в запросе ALTER UPDATE или ALTER DELETE). #83978 (Anton Popov).
  • Использовать информацию из cgroup (если применимо, то есть когда включён memory_worker_use_cgroup и доступны cgroups) для корректировки трекера памяти (memory_worker_correct_memory_tracker). #83981 (Azat Khuzhin).
  • MongoDB: неявное преобразование строк в числовые типы. Ранее если из источника MongoDB для числового столбца в таблице ClickHouse поступало строковое значение, выбрасывалось исключение. Теперь движок пытается автоматически преобразовать строку в числовое значение. Закрывает #81167. #84069 (Kirill Nikiforov).
  • Подсветка групп цифр в форматах Pretty для чисел типа Nullable. #84070 (Alexey Milovidov).
  • Dashboard: всплывающая подсказка больше не будет выходить за верхнюю границу контейнера. #84072 (Alexey Milovidov).
  • Немного улучшен внешний вид точек на дашборде. #84074 (Alexey Milovidov).
  • У Dashboard теперь немного более удачный favicon. #84076 (Alexey Milovidov).
  • Web UI: Разрешить браузерам сохранять пароль, а также значения URL. #84087 (Alexey Milovidov).
  • Добавлена поддержка применения дополнительного ACL на конкретных узлах Keeper с использованием конфигурации apply_to_children. #84137 (Antonio Andelic).
  • Исправлено использование компактной сериализации дискриминаторов типа Variant в MergeTree. Ранее в некоторых случаях она не применялась, хотя могла бы. #84141 (Pavel Kruglov).
  • Добавлена серверная настройка logs_to_keep для реплицируемых баз данных, которая позволяет изменять значение параметра logs_to_keep по умолчанию для таких баз. Меньшие значения уменьшают число ZNode-ов (особенно при большом количестве баз данных), тогда как большие значения позволяют отставшей реплике догнать состояние спустя более длительный период времени. #84183 (Alexey Khatskevich).
  • Добавлена настройка json_type_escape_dots_in_keys для экранирования точек в ключах JSON при разборе типа JSON. По умолчанию настройка отключена. #84207 (Pavel Kruglov).
  • Проверьте, было ли соединение отменено, прежде чем проверять EOF, чтобы предотвратить чтение из закрытого соединения. Исправляет #83893. #84227 (Raufs Dunamalijevs).
  • Немного улучшены цвета выделения текста в веб‑интерфейсе. Разница заметна только для выделенных ячеек таблицы в тёмной теме. В предыдущих версиях контраст между текстом и фоном выделения был недостаточным. #84258 (Alexey Milovidov).
  • Улучшена обработка завершения работы сервера при наличии клиентских подключений за счет упрощения внутренних проверок. #84312 (Raufs Dunamalijevs).
  • Добавлена настройка delta_lake_enable_expression_visitor_logging для отключения логирования обходчика выражений, поскольку такие логи могут быть слишком подробными даже на тестовом уровне логирования при отладке. #84315 (Kseniia Sumarokova).
  • Метрики на уровне cgroup и на уровне всей системы теперь выводятся вместе. Метрики на уровне cgroup имеют имена CGroup<Metric>, а метрики уровня ОС (собираемые из procfs) имеют имена OS<Metric>. #84317 (Nikita Taranov).
  • Чуть получше графики в веб-интерфейсе. Не намного, но лучше. #84326 (Alexey Milovidov).
  • Изменено значение по умолчанию настройки реплицируемой базы данных max_retries_before_automatic_recovery на 10, чтобы в некоторых случаях ускорить восстановление. #84369 (Alexander Tokmakov).
  • Исправлено форматирование оператора CREATE USER с параметрами запроса (например, CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin).
  • Добавлены настройки backup_restore_s3_retry_initial_backoff_ms, backup_restore_s3_retry_max_backoff_ms, backup_restore_s3_retry_jitter_factor для управления стратегией backoff при повторных попытках обращения к S3, используемой во время операций резервного копирования и восстановления. #84421 (Julia Kartseva).
  • Исправление упорядоченного режима (ordered) в S3Queue: раньше завершать работу при вызове shutdown. #84463 (Kseniia Sumarokova).
  • Добавлена поддержка записей Iceberg, совместимых с чтением через pyiceberg. #84466 (Konstantin Vedernikov).
  • Разрешено приведение типов значений множеств при проталкивании фильтров IN и GLOBAL IN по первичным ключам хранилищ KeyValue (например, EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • Обновлён chdig до версии 25.7.1. #84521 (Azat Khuzhin).
  • Ошибки низкого уровня при выполнении UDF теперь приводят к завершению с кодом ошибки UDF_EXECUTION_FAILED, тогда как ранее могли возвращаться различные коды ошибок. #84547 (Xu Jia).
  • Добавлена команда get_acl в KeeperClient. #84641 (Antonio Andelic).
  • Добавлена версия snapshot для движков таблиц data lake. #84659 (Pete Hampton).
  • Добавлена метрика с измерениями для размера ConcurrentBoundedQueue с метками по типу очереди (т.е. для чего предназначена очередь) и идентификатору очереди (т.е. случайно сгенерированный идентификатор для текущего экземпляра очереди). #84675 (Miсhael Stetsyuk).
  • Таблица system.columns теперь содержит столбец column, являющийся псевдонимом существующего столбца name. #84695 (Yunchi Pang).
  • Новая настройка MergeTree search_orphaned_parts_drives для ограничения области поиска частей, например по дискам с локальными метаданными. #84710 (Ilya Golshtein).
  • Добавлена 4LW-команда в Keeper, lgrq, для переключения логирования входящих запросов. #84719 (Antonio Andelic).
  • Сопоставлять заголовки внешней аутентификации forward_headers без учета регистра. #84737 (ingodwerust).
  • Инструмент encrypt_decrypt теперь поддерживает шифрованные соединения с ZooKeeper. #84764 (Roman Vasin).
  • Добавлен столбец с форматной строкой в system.errors. Этот столбец нужен для группировки ошибок одного типа в правилах оповещений. #84776 (Miсhael Stetsyuk).
  • Обновлён clickhouse-format, чтобы он принимал --highlight как алиас для --hilite. - Обновлён clickhouse-client, чтобы он принимал --hilite как алиас для --highlight. - Обновлена документация clickhouse-format, чтобы отразить это изменение. #84806 (Rishabh Bhardwaj).
  • Исправлено чтение таблиц Iceberg по идентификаторам полей для сложных типов. #84821 (Konstantin Vedernikov).
  • Добавлена новая настройка backup_slow_all_threads_after_retryable_s3_error для снижения нагрузки на S3 во время массовых повторных попыток, вызванных ошибками вроде SlowDown, за счёт замедления всех потоков, как только обнаружена одна повторяемая ошибка. #84854 (Julia Kartseva).
  • Пропускать создание и переименование старой временной таблицы для non-append RMV DDL в реплицируемых базах данных. #84858 (Tuan Pham Anh).
  • Размер кэша записей журнала Keeper теперь ограничен по количеству записей с помощью параметров keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold и keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic).
  • Теперь можно использовать simdjson на неподдерживаемых архитектурах (раньше это приводило к ошибкам CANNOT_ALLOCATE_MEMORY). #84966 (Azat Khuzhin).
  • Асинхронное логирование: сделать лимиты настраиваемыми и добавить средства интроспекции. #85105 (Raúl Marín).
  • Собирать все удаляемые объекты для выполнения одной операции удаления в объектном хранилище. #85316 (Mikhail Artemenko).
  • Текущая реализация файлов позиционного удаления в Iceberg хранит все данные в оперативной памяти (RAM). Это может быть довольно дорого, если файлы позиционного удаления большие, что нередко бывает. Моя реализация хранит в оперативной памяти только последнюю row-group файлов удаления в формате Parquet, что значительно дешевле. #85329 (Konstantin Vedernikov).
  • chdig: исправлены артефакты на экране, исправлен сбой после редактирования запроса в редакторе, поиск editor в PATH, обновление до версии 25.8.1. #85341 (Azat Khuzhin).
  • Добавлен отсутствующий параметр partition_columns_in_data_file в конфигурацию Azure. #85373 (Arthur Passos).
  • Разрешён нулевой шаг в функциях timeSeries*ToGrid. Это часть #75036. #85390 (Vitaly Baranov).
  • Добавлен флаг show_data_lake_catalogs_in_system_tables для управления добавлением таблиц data lake в system.tables. Исправляет #85384. #85411 (Smita Kulkarni).
  • Добавлена поддержка подстановки макросов в remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).
  • ИИ в clickhouse-client теперь выглядит немного лучше. #85447 (Alexey Milovidov).
  • Включить trace_log.symbolize по умолчанию для старых развертываний. #85456 (Azat Khuzhin).
  • Расширена поддержка большего числа случаев разрешения составных идентификаторов. В частности, улучшена совместимость ARRAY JOIN со старым анализатором. Добавлена новая настройка analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested для сохранения старого поведения. #85492 (Nikolai Kochetov).
  • Игнорировать UNKNOWN_DATABASE при получении размеров столбцов таблиц из system.columns. #85632 (Azat Khuzhin).
  • Добавлено ограничение (настройка таблицы max_uncompressed_bytes_in_patches) на общий объём несжатых байт в патч-частях. Это предотвращает значительные замедления запросов SELECT после легковесных обновлений и исключает возможное злоупотребление легковесными обновлениями. #85641 (Anton Popov).
  • Добавлен столбец parameter в таблицу system.grants для определения типа источника для GRANT READ/WRITE и движка таблицы для GRANT TABLE ENGINE. #85643 (MikhailBurdukov).
  • Исправлена обработка завершающей запятой в списке столбцов запроса CREATE DICTIONARY после столбца с параметрами, например, Decimal(8). Закрывает #85586. #85653 (Nikolay Degterinsky).
  • Добавлена поддержка вложенных массивов для функции nested. #85719 (Nikolai Kochetov).
  • Все выделения памяти, выполняемые внешними библиотеками, теперь видны трекеру памяти ClickHouse и корректно учитываются. Это может привести к «повышенному» отчётному использованию памяти для некоторых запросов или сбоям с ошибкой MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Этот pull request исправляет обработку метаданных при выполнении запросов к таблицам Iceberg через REST‑каталог. ... #80562 (Saurabh Kumar Ojha).
  • Исправлена логика markReplicasActive в DDLWorker и DatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh).
  • Исправлен откат столбца типа Dynamic при ошибке парсинга. #82169 (Pavel Kruglov).
  • Функция trim при вызове только с константными аргументами теперь возвращает константную результирующую строку. (Ошибка #78796). #82900 (Robert Schulze).
  • Исправлена логическая ошибка, приводившая к дублированию подзапросов при включённом optimize_syntax_fuse_functions, закрыт тикет #75511. #83300 (Vladimir Cherkasov).
  • Исправлен некорректный результат запросов с условием WHERE ... IN (&lt;subquery&gt;) и включённым кэшем условий запроса (настройка use_query_condition_cache). #83445 (LB7666).
  • Ранее функция gcs не требовала каких‑либо прав доступа для использования. Теперь для её использования проверяется наличие привилегии GRANT READ ON S3. Закрывает #70567. #83503 (pufit).
  • Пропускать недоступные узлы при выполнении INSERT SELECT из s3Cluster() в реплицированную таблицу MergeTree. #83676 (Igor Nikonov).
  • Исправлена обработка операций записи с добавлением (в MergeTree, используемом для экспериментальных транзакций) для типов метаданных plain_rewritable/plain, которые ранее просто игнорировались. #83695 (Tuan Pham Anh).
  • Скрывать данные аутентификации в реестре схем Avro, чтобы они не отображались пользователю и не попадали в журналы. #83713 (János Benjamin Antal).
  • Исправлена проблема, при которой при создании таблицы MergeTree с add_minmax_index_for_numeric_columns=1 или add_minmax_index_for_string_columns=1 индекс впоследствии материализуется во время операции ALTER, что мешает корректной инициализации базы данных Replicated на новой реплике. #83751 (Nikolay Degterinsky).
  • Исправлен модуль записи Parquet, записывавший некорректные значения статистики min/max для типов Decimal. #83754 (Michael Kolupaev).
  • Исправлена сортировка значений NaN для типа LowCardinality(Float32|Float64|BFloat16). #83786 (Pervakov Grigorii).
  • При восстановлении из резервной копии пользователь-определитель (definer) может не быть сохранён в бэкапе, что приведёт к повреждению всей резервной копии. Чтобы это исправить, проверка прав при создании целевой таблицы во время восстановления откладывается и выполняется только во время выполнения запроса. #83818 (pufit).
  • Исправлено падение клиента из-за соединения, оставшегося в отключённом состоянии после неудачного INSERT. #83842 (Azat Khuzhin).
  • Теперь можно ссылаться на любую таблицу в аргументе view(...) табличной функции remote при включённом анализаторе запросов. Исправляет #78717. Исправляет #79377. #83844 (Dmitry Novik).
  • Вызов onprogress в jsoneachrowwithprogress теперь синхронизирован с финализацией. #83879 (Sema Checherinda).
  • Закрывает #81303. #83892 (Konstantin Vedernikov).
  • Исправлены функции colorSRGBToOKLCH/colorOKLCHToSRGB при одновременном использовании константных и неконстантных аргументов. #83906 (Azat Khuzhin).
  • Исправлена запись JSON-путей со значениями NULL в формате RowBinary. #83923 (Pavel Kruglov).
  • Исправлена проблема переполнения больших значений (>2106-02-07) при приведении типа Date к DateTime64. #83982 (Yarik Briukhovetskyi).
  • Всегда применять параметр filesystem_prefetches_limit (а не только из MergeTreePrefetchedReadPool). #83999 (Azat Khuzhin).
  • Исправлена редкая ошибка, из-за которой запрос MATERIALIZE COLUMN мог приводить к появлению неожиданных файлов в checksums.txt и в результате — к отсоединённым частям данных. #84007 (alesapin).
  • Исправлена логическая ошибка Expected single dictionary argument for function при выполнении JOIN по условию неравенства, когда один из столбцов имеет тип LowCardinality, а другой является константой. Закрывает #81779. #84019 (Alexey Milovidov).
  • Исправлена ошибка, приводившая к падению clickhouse client при использовании в интерактивном режиме с подсветкой синтаксиса. #84025 (Bharat Nallan).
  • Исправлены ошибки, приводившие к некорректным результатам при совместном использовании кэша условий запроса и рекурсивных CTE (issue #81506). #84026 (zhongyuankai).
  • Исправлена обработка исключений при периодическом обновлении партиций. #84083 (Azat Khuzhin).
  • Исправлено объединение фильтра с условием JOIN в случаях, когда операнды сравнения на равенство имеют разные типы или ссылаются на константы. Устраняет #83432. #84145 (Dmitry Novik).
  • Исправлен редкий сбой ClickHouse, возникавший в случае, когда в таблице есть projection, установлено lightweight_mutation_projection_mode = 'rebuild', и пользователь выполняет операцию легковесного удаления, которая удаляет ВСЕ строки из любого блока таблицы. #84158 (alesapin).
  • Устранена взаимоблокировка, вызванная фоновым потоком проверки отмены. #84203 (Antonio Andelic).
  • Исправлен бесконечный рекурсивный разбор некорректных определений WINDOW. Устраняет #83131. #84242 (Dmitry Novik).
  • Исправлена ошибка, приводившая к некорректному кодированию и декодированию Bech32. Изначально ошибка не была обнаружена, поскольку онлайн-реализация алгоритма, использовавшаяся для тестирования, имела ту же проблему. #84257 (George Larionov).
  • Исправлено некорректное построение пустых кортежей в функции array(). Это устраняет #84202. #84297 (Amos Bird).
  • Устранена ошибка LOGICAL_ERROR для запросов с параллельными репликами и несколькими соединениями INNER JOIN, за которыми следует RIGHT JOIN. Не используйте параллельные реплики для таких запросов. #84299 (Vladimir Cherkasov).
  • Ранее индексы set не учитывали столбцы Nullable при проверке того, проходят ли гранулы фильтр (issue #75485). #84305 (Elmi Ahmadov).
  • Теперь ClickHouse читает таблицы из каталога Glue, где тип таблицы указан строчными буквами. #84316 (alesapin).
  • Не пытайтесь заменять табличные функции их кластерными аналогами при использовании JOIN или подзапросов. #84335 (Konstantin Bogdanov).
  • Исправлено использование логгера в IAccessStorage. #84365 (Konstantin Bogdanov).
  • Исправлена логическая ошибка в легковесных обновлениях, изменяющих все столбцы таблицы. #84380 (Anton Popov).
  • Кодек DoubleDelta теперь может применяться только к столбцам числового типа. В частности, столбцы типа FixedString больше нельзя сжимать с помощью DoubleDelta. (исправляет #80220). #84383 (Jimmy Aguilar Mena).
  • Сравнение со значением NaN выполнялось с использованием некорректных диапазонов при оценке индекса MinMax. #84386 (Elmi Ahmadov).
  • Исправлено чтение столбца типа Variant при ленивой материализации. #84400 (Pavel Kruglov).
  • Рассматривать zoutofmemory как аппаратную ошибку, иначе будет выброшено логическое исключение. См. https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei).
  • Исправлен сбой сервера, возникавший, когда пользователь, созданный с no_password, пытался выполнить вход после изменения настройки сервера allow_no_password на 0. #84426 (Shankar Iyer).
  • Исправлены записи в журнале изменений Keeper, выполнявшиеся в неверном порядке. Ранее могли существовать незавершённые операции записи в журнал, но операция отката могла приводить к конкурентному изменению целевого файла. Это приводило к неконсистентным логам и возможной потере данных. #84434 (Antonio Andelic).
  • Теперь, если все TTL удалены из таблицы, MergeTree не будет выполнять никаких операций, связанных с TTL. #84441 (alesapin).
  • Параллельный распределённый INSERT SELECT с LIMIT был разрешён, что некорректно, так как это приводило к дублированию данных в целевой таблице. #84477 (Igor Nikonov).
  • Исправлено отсечение файлов по виртуальному столбцу в дата-лейках. #84520 (Kseniia Sumarokova).
  • Исправлены утечки памяти в Keeper при использовании хранилища на RocksDB (итераторы не уничтожались). #84523 (Azat Khuzhin).
  • Исправлена проблема, из-за которой ALTER MODIFY ORDER BY не проверял столбцы TTL в ключах сортировки. Столбцы TTL теперь корректно отклоняются при использовании в выражении ORDER BY во время операций ALTER, что предотвращает возможное повреждение таблиц. #84536 (xiaohuanlin).
  • Измените значение allow_experimental_delta_kernel_rs для версий до 25.5 на false для обеспечения совместимости. #84587 (Kseniia Sumarokova).
  • Перестаёт считывать схему из manifest-файлов и вместо этого хранит соответствующие схемы для каждого snapshot независимо. Определяет соответствующую схему для каждого файла данных из его snapshot. Предыдущее поведение нарушало спецификацию Iceberg для записей manifest-файлов со статусом existing. #84588 (Daniil Ivanik).
  • Исправлена проблема, при которой настройка Keeper rotate_log_storage_interval = 0 приводила к аварийному завершению работы ClickHouse. (issue #83975). #84637 (George Larionov).
  • Исправлена логическая ошибка S3Queue «Table is already registered». Закрывает #84433. Ошибка появилась после https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
  • Блокировать 'mutex' при получении zookeeper из 'view' в RefreshTask. #84699 (Tuan Pham Anh).
  • Исправлена ошибка CORRUPTED_DATA, возникающая при использовании ленивых столбцов с внешней сортировкой. #84738 (János Benjamin Antal).
  • Исправлено отсечение столбцов (column pruning) с использованием delta-kernel в хранилище DeltaLake. Закрывает #84543. #84745 (Kseniia Sumarokova).
  • Реализовано обновление учетных данных в delta-kernel хранилища DeltaLake. #84751 (Kseniia Sumarokova).
  • Исправлен избыточный запуск внутренних резервных копий после проблем с подключением. #84755 (Vitaly Baranov).
  • Исправлена проблема, из-за которой запрос к удалённому источнику с задержкой мог приводить к выходу за пределы вектора. #84820 (George Larionov).
  • Токенизаторы ngram и no_op больше не приводят к сбою работы экспериментального текстового индекса для пустых входных токенов. #84849 (Robert Schulze).
  • Исправлены легковесные обновления для таблиц с движками ReplacingMergeTree и CollapsingMergeTree. #84851 (Anton Popov).
  • Корректно сохранять все настройки в метаданных таблицы для таблиц с движком object queue. #84860 (Antonio Andelic).
  • Исправлено общее число watches, возвращаемое Keeper. #84890 (Antonio Andelic).
  • Исправлены облегчённые обновления для таблиц с движком ReplicatedMergeTree, созданных на серверах с версией ниже 25.7. #84933 (Anton Popov).
  • Исправлена работа облегчённых обновлений для таблиц с нереплицированным движком MergeTree после выполнения запроса ALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov).
  • Исправлена генерация имен столбцов для логических литералов: теперь используются "true"/"false" вместо "1"/"0", что предотвращает конфликты имен столбцов между логическими и целочисленными литералами в запросах. #84945 (xiaohuanlin).
  • Исправлена рассинхронизация учёта памяти в background schedule pool и executor. #84946 (Azat Khuzhin).
  • Исправлены возможные проблемы с некорректной сортировкой в табличном движке Merge. #85025 (Xiaozhe Yu).
  • Реализованы недостающие API для DiskEncrypted. #85028 (Azat Khuzhin).
  • Добавлена проверка при использовании коррелированного подзапроса в распределённом контексте, чтобы избежать сбоя. Исправляет #82205. #85030 (Dmitry Novik).
  • Теперь Iceberg не пытается кэшировать соответствующую версию снимка (snapshot) между запросами SELECT и всегда пытается честно определять актуальный снимок. Предыдущая попытка кэшировать снимок Iceberg приводила к проблемам при использовании таблицы Iceberg с функцией путешествия во времени. #85038 (Daniil Ivanik).
  • Исправлен двойной вызов free в AzureIteratorAsync. #85064 (Nikita Taranov).
  • Улучшено сообщение об ошибке при попытке создать пользователя, идентифицируемого с помощью JWT. #85072 (Konstantin Bogdanov).
  • Исправлена очистка патч-частей в ReplicatedMergeTree. Ранее результат легковесного обновления мог временно не отображаться на реплике до тех пор, пока слитая или мутировавшая часть, материализующая патч-части, не будет загружена с другой реплики. #85121 (Anton Popov).
  • Исправлена ошибка illegal_type_of_argument в mv, когда типы различаются. #85135 (Sema Checherinda).
  • Исправлен сбой сегментации в реализации delta-kernel. #85160 (Kseniia Sumarokova).
  • Исправлена проблема с восстановлением реплицируемых баз данных в случаях, когда перемещение файла метаданных занимает много времени. #85177 (Tuan Pham Anh).
  • Исправлена ошибка Not-ready Set для IN (subquery) в настройке additional_table_filters expression. #85210 (Nikolai Kochetov).
  • Убраны лишние вызовы getStatus() при выполнении запросов SYSTEM DROP REPLICA. Исправлена ситуация, когда таблица удаляется в фоновом режиме и выбрасывается исключение Shutdown for storage is called. #85220 (Nikolay Degterinsky).
  • Исправлена гонка в реализации delta-kernel для движка DeltaLake. #85221 (Kseniia Sumarokova).
  • Исправлено чтение партиционированных данных с отключённым delta-kernel в движке DeltaLake. Ошибка появилась в версии 25.7 (https://github.com/ClickHouse/ClickHouse/pull/81136). #85223 (Kseniia Sumarokova).
  • Добавлены отсутствовавшие проверки длины имён таблиц в запросах CREATE OR REPLACE и RENAME. #85326 (Michael Kolupaev).
  • Исправлено создание RMV на новой реплике реплицированной базы данных, если DEFINER был удалён. #85327 (Nikolay Degterinsky).
  • Исправлена запись в Iceberg для сложных типов данных. #85330 (Konstantin Vedernikov).
  • Для сложных типов запись нижних и верхних границ не поддерживается. #85332 (Konstantin Vedernikov).
  • Исправлена логическая ошибка при чтении с помощью функций объектного хранилища через таблицу Distributed или функцию remote. Исправления: #84658, #85173, #52022. #85359 (alesapin).
  • Исправлена проблема с резервным копированием частей с повреждёнными проекциями. #85362 (Antonio Andelic).
  • Запрещено использовать столбец _part_offset в проекциях в релизах до его стабилизации. #85372 (Sema Checherinda).
  • Исправлено падение и повреждение данных при выполнении ALTER UPDATE для JSON. #85383 (Pavel Kruglov).
  • Запросы с параллельными репликами, которые используют оптимизацию чтения в обратном порядке, могут выдавать некорректные результаты. #85406 (Igor Nikonov).
  • Исправлено возможное неопределённое поведение (аварийное завершение) в случае MEMORY_LIMIT_EXCEEDED во время десериализации String. #85440 (Azat Khuzhin).
  • Исправлены некорректные метрики KafkaAssignedPartitions и KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
  • Исправлено занижение значения метрики processed_bytes при использовании PREWHERE (явного или автоматического). #85495 (Michael Kolupaev).
  • Исправлено условие раннего выхода для замедления скорости запросов к S3: теперь для включения механизма замедления, когда все потоки приостановлены из‑за повторимой ошибки, достаточно, чтобы был истинным либо s3_slow_all_threads_after_network_error, либо backup_slow_all_threads_after_retryable_s3_error, вместо необходимости одновременной истинности обоих. #85505 (Julia Kartseva).
  • Этот PR исправляет получение метаданных при выполнении запросов к таблицам Iceberg через REST‑каталог. ... #85531 (Saurabh Kumar Ojha).
  • Исправлен редкий сбой при асинхронных вставках, изменяющих настройки log_comment или insert_deduplication_token. #85540 (Anton Popov).
  • Параметры, такие как date_time_input_format, не учитывались при использовании HTTP с multipart/form-data. #85570 (Sema Checherinda).
  • Исправлена проблема с маскированием секретов в табличных функциях icebergS3Cluster и icebergAzureCluster. #85658 (MikhailBurdukov).
  • Исправлена потеря точности в JSONExtract при преобразовании числовых значений JSON в типы Decimal. Теперь числовые значения JSON сохраняют своё точное десятичное представление, во избежание ошибок округления чисел с плавающей запятой. #85665 (ssive7b).
  • Исправлена ошибка LOGICAL_ERROR при использовании COMMENT COLUMN IF EXISTS в том же запросе ALTER после DROP COLUMN. Теперь предложение IF EXISTS корректно пропускает операцию добавления комментария, если столбец был удалён в рамках того же запроса. #85688 (xiaohuanlin).
  • Исправлено чтение значения счётчика из кэша для Delta Lake. #85704 (Kseniia Sumarokova).
  • Исправлена ошибка сегментации в CoalescingMergeTree при работе с большими строками. Это закрывает #84582. #85709 (Konstantин Vedernikov).
  • Обновлена временная метка метаданных при записях в Iceberg. #85711 (Konstantin Vedernikov).
  • Использование distributed_depth в качестве индикатора функции *cluster было некорректным и могло приводить к дублированию данных; вместо него используйте client_info.collaborate_with_initiator. #85734 (Konstantin Bogdanov).
  • Spark не может читать файлы position delete. #85762 (Konstantin Vedernikov).
  • Исправлен параметр send_logs_source_regexp (после рефакторинга асинхронного логирования в #85105). #85797 (Azat Khuzhin).
  • Исправлено возможное некорректное поведение словарей с update_field при ошибке MEMORY_LIMIT_EXCEEDED. #85807 (Azat Khuzhin).
  • Добавлена поддержка глобальных констант из выражения WITH для параллельной распределённой операции INSERT SELECT с целевой таблицей Distributed. Ранее запрос мог приводить к ошибке Unknown expression identifier. #85811 (Nikolai Kochetov).
  • Скрывать учетные данные для deltaLakeAzure, deltaLakeCluster, icebergS3Cluster и icebergAzureCluster. #85889 (Julian Maicher).
  • Исправлена логическая ошибка при попытке CREATE ... AS (SELECT * FROM s3Cluster(...)) при использовании DatabaseReplicated. #85904 (Konstantin Bogdanov).
  • Исправляет HTTP-запросы, выполняемые табличной функцией url(), чтобы они корректно включали номер порта в заголовок Host при доступе к нестандартным портам. Это устраняет ошибки аутентификации при использовании предварительно подписанных URL с S3-совместимыми сервисами, такими как MinIO, работающими на нестандартных портах, что распространено в средах разработки. (Исправляет #85898). #85921 (Tom Quist).
  • Теперь Unity Catalog будет игнорировать схемы с нестандартными типами данных для таблиц, которые не являются Delta-таблицами. Исправляет #85699. #85950 (alesapin).
  • Исправлена поддержка nullable-полей в iceberg. #85977 (Konstantin Vedernikov).
  • Исправлена ошибка в восстановлении базы данных Replicated: если имя таблицы содержало символ %, во время восстановления таблица могла быть повторно создана под другим именем. #85987 (Alexander Tokmakov).
  • Исправлена проблема с восстановлением из резервной копии, приводившая к ошибке BACKUP_ENTRY_NOT_FOUND при восстановлении пустой таблицы Memory. #86012 (Julia Kartseva).
  • Добавлены проверки для sharding_key при выполнении ALTER для распределённой таблицы. Ранее ошибочный ALTER мог приводить к нарушению определения таблицы и необходимости перезапуска сервера. #86015 (Nikolay Degterinsky).
  • Не создавать пустой файл удалений Iceberg. #86061 (Konstantin Vedernikov).
  • Исправлена проблема, из-за которой слишком большие значения параметров приводили к сбоям в работе таблиц S3Queue и мешали перезапуску реплик. #86074 (Nikolay Degterinsky).

Улучшения сборки/тестирования/упаковки

  • По умолчанию используются зашифрованные диски для тестов с S3. #59898 (Nikita Mikhaylov).
  • Использовать исполняемый файл clickhouse в интеграционных тестах, чтобы получать полные отладочные символы. #83779 (Mikhail f. Shiryaev).
  • Обновлена внутренняя libxml2 с 2.14.4 до 2.14.5. #84230 (Robert Schulze).
  • Обновлён внутренний curl с 8.14.0 до 8.15.0. #84231 (Robert Schulze).
  • Теперь мы используем меньше памяти для кэшей в CI и имеем более качественные тесты вытеснения данных из кэша. #84676 (alesapin).

Релиз ClickHouse 25.7, 2025-07-24

Обратные несовместимые изменения

  • Изменения в функции extractKeyValuePairs: введён новый аргумент unexpected_quoting_character_strategy, который управляет тем, что происходит, когда quoting_character неожиданно встречается при чтении ключа или значения без кавычек. Значение может быть одним из: invalid, accept или promote. invalid отбросит ключ и вернёт парсер в состояние ожидания ключа. accept будет трактовать символ как часть ключа. promote отбросит предыдущий символ и начнёт разбор как ключа в кавычках. Дополнительно, после разбора значения в кавычках следующий ключ разбирается только в том случае, если найден разделитель пары. #80657 (Arthur Passos).
  • Поддержка совпадения нулевого байта в функции countMatches. Пользователи, которые хотят сохранить старое поведение, могут включить настройку count_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).
  • Использование глобальных серверных ограничителей пропускной способности для локальных (max_local_read_bandwidth_for_server и max_local_write_bandwidth_for_server) и удалённых (max_remote_read_network_bandwidth_for_server и max_remote_write_network_bandwidth_for_server) операций при создании резервных копий (BACKUP) в дополнение к их специализированным серверным настройкам (max_backup_bandwidth_for_server, max_mutations_bandwidth_for_server и max_merges_bandwidth_for_server). #81753 (Sergei Trifonov).
  • Запрещено создание таблицы без столбцов, в которые можно вставлять данные. #81835 (Pervakov Grigorii).
  • Параллелизация кластерных функций по файлам внутри архивов. В предыдущих версиях единицей работы был целый архив (например, zip, tar или 7z). Добавлена новая настройка cluster_function_process_archive_on_multiple_nodes, по умолчанию равная true. Если установлена в true, повышает производительность обработки архивов в кластерных функциях. Должна быть установлена в false для совместимости и чтобы избежать ошибок при обновлении до 25.7+ при использовании кластерных функций с архивами на более ранних версиях. #82355 (Kseniia Sumarokova).
  • Запрос SYSTEM RESTART REPLICAS приводил к пробуждению таблиц в базе данных Lazy даже без доступа к этой базе, и это происходило в то время, когда эти таблицы одновременно удалялись. Примечание: теперь SYSTEM RESTART REPLICAS будет перезапускать реплики только в тех базах данных, в которых у вас есть право на SHOW TABLES, что является естественным поведением. #83321 (Alexey Milovidov).

Новая возможность

  • Добавлена поддержка легковесных обновлений для таблиц семейства MergeTree. Легковесные обновления можно использовать с новым синтаксисом: UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. Добавлена реализация легковесных удалений через легковесные обновления. Это можно включить, установив lightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov).
  • Поддержка сложных типов при эволюции схем Iceberg. #73714 (Konstantин Vedernikov).
  • Добавлена поддержка операций INSERT в таблицы Iceberg. #82692 (Konstantин Vedernikov).
  • Чтение файлов данных Iceberg по идентификаторам полей. Это улучшает совместимость с Iceberg: поля могут переименовываться в метаданных при одновременном сопоставлении с другими именами в базовых файлах Parquet. Это решает задачу #83065. #83653 (Konstantin Vedernikov).
  • Теперь в ClickHouse поддерживаются сжатые файлы metadata.json для Iceberg. Исправляет #70874. #81451 (alesapin).
  • Добавлена поддержка TimestampTZ в каталоге Glue. Это закрывает #81654. #83132 (Konstantin Vedernikov).
  • Добавлена возможность генерации SQL-запросов с использованием ИИ в клиенте ClickHouse. Теперь пользователи могут генерировать SQL-запросы из описаний на естественном языке, добавляя к своему запросу префикс ??. Поддерживаются провайдеры OpenAI и Anthropic с автоматическим обнаружением схемы. #83314 (Kaushik Iska).
  • Добавлена функция для записи Geo-типов в формат WKB. #82935 (Konstantin Vedernikov).
  • Добавлены два новых типа доступа к источникам: READ и WRITE, а все предыдущие типы доступа для источников объявлены устаревшими. Раньше: GRANT S3 ON *.* TO user, теперь: GRANT READ, WRITE ON S3 TO user. Это также позволяет раздельно выдавать права READ и WRITE для источников, например: GRANT READ ON * TO user, GRANT WRITE ON S3 TO user. Функция управляется настройкой access_control_improvements.enable_read_write_grants и по умолчанию отключена. #73659 (pufit).
  • NumericIndexedVector: новая структура векторных данных на основе бит-слайсинга и сжатия Roaring-bitmap, с более чем 20 функциями для построения, анализа и поэлементной арифметики. Может сократить объем хранимых данных и ускорить соединения (JOIN), фильтры и агрегации на разреженных данных. Реализует #70582 и идеи статьи “Large-Scale Metric Computation in Online Controlled Experiment Platform” Т. Xiong и Y. Wang из VLDB 2024. #74193 (FriendLey).
  • Теперь поддерживается настройка профиля нагрузки max_waiting_queries. Ее можно использовать для ограничения размера очереди запросов. Если предел достигнут, все последующие запросы будут завершаться с ошибкой SERVER_OVERLOADED. #81250 (Oleg Doronin).
  • Добавлены финансовые функции: financialInternalRateOfReturnExtended (XIRR), financialInternalRateOfReturn (IRR), financialNetPresentValueExtended (XNPV), financialNetPresentValue (NPV). #81599 (Joanna Hulboj).
  • Добавлены геопространственные функции polygonsIntersectCartesian и polygonsIntersectSpherical для проверки, пересекаются ли два полигона. #81882 (Paul Lamb).
  • Добавлена поддержка виртуального столбца _part_granule_offset в таблицах семейства MergeTree. Этот столбец указывает индекс (с нуля) гранулы/метки, к которой относится каждая строка внутри своей части данных. Это решает проблему #79572. #82341 (Amos Bird). #82341 (Amos Bird)
  • Добавлены SQL-функции colorSRGBToOkLCH и colorOkLCHToSRGB для преобразования цветов между цветовыми пространствами sRGB и OkLCH. #83679 (Fgrtue).
  • Разрешить использование параметров в запросах CREATE USER в качестве имён пользователей. #81387 (Diskein).
  • Таблица system.formats теперь содержит расширенную информацию о форматах, например тип содержимого HTTP (Content-Type), возможности автоматического определения схемы и т. д. #81505 (Alexey Milovidov).

Экспериментальная функциональность

  • Добавлены функции searchAny и searchAll, которые являются универсальными инструментами для поиска по текстовым индексам. #80641 (Elmi Ahmadov).
  • Текстовый индекс теперь поддерживает новый токенизатор split. #81752 (Elmi Ahmadov).
  • Изменено значение индексной гранулярности по умолчанию для индексов text на 64. Это улучшает ожидаемую производительность среднего тестового запроса во внутренних бенчмарках. #82162 (Jimmy Aguilar Mena).
  • 256-битовая битовая карта хранит исходящие метки состояния в упорядоченном виде, но исходящие состояния записываются на диск в том порядке, в котором они появляются в хеш-таблице. Поэтому при чтении с диска метка может указывать на неправильное следующее состояние. #82783 (Elmi Ahmadov).
  • Включена zstd-компрессия для BLOB-данных дерева FST в текстовых индексах. #83093 (Elmi Ahmadov).
  • Переведен индекс векторного сходства в статус бета. Добавлен параметр-алиас enable_vector_similarity_index, который должен быть включен для использования индекса векторного сходства. #83459 (Robert Schulze).
  • Удалена экспериментальная логика send_metadata, связанная с экспериментальной репликацией с нулевым копированием. Она никогда не использовалась, и никто не поддерживает этот код. Поскольку не было даже тестов, связанных с ней, велика вероятность, что она уже давно сломана. #82508 (alesapin).
  • Интегрирован StorageKafka2 в system.kafka_consumers. #82652 (János Benjamin Antal).
  • Реализована оценка сложных CNF/DNF-выражений, например, (a < 1 and a > 0) or b = 3, на основе статистики. #82663 (Han Fei).

Повышение производительности

  • Введено асинхронное логирование. При выводе логов на медленное устройство это больше не замедляет выполнение запросов. #82516 (Raúl Marín). Ограничено максимальное число записей, которые могут находиться в очереди. #83214 (Raúl Marín).
  • Параллельный распределённый INSERT SELECT по умолчанию включён в режиме, когда INSERT SELECT выполняется независимо на каждом шарде, см. настройку parallel_distributed_insert_select. #83040 (Igor Nikonov).
  • Когда агрегирующий запрос содержит только одну функцию count() по столбцу, который не является Nullable, логика агрегации полностью встраивается непосредственно в процесс зондирования хеш-таблицы. Это позволяет избежать выделения и ведения какого-либо состояния агрегации, что значительно снижает потребление памяти и накладные расходы на CPU. Это частично решает #81982. #82104 (Amos Bird).
  • Производительность HashJoin улучшена за счёт удаления дополнительного цикла по хэш-таблицам в типичном случае с единственным ключевым столбцом; также устранены проверки null_map и join_mask, когда они всегда принимают значения true/false. #82308 (Nikita Taranov).
  • Простая оптимизация комбинатора -If. #78454 (李扬).
  • Запросы векторного поиска с использованием индекса векторного сходства выполняются с меньшей задержкой благодаря сокращению числа операций чтения из хранилища и снижению нагрузки на CPU. #79103 (Shankar Iyer).
  • Учитывать merge_tree_min_{rows,bytes}_for_seek в filterPartsByQueryConditionCache, чтобы привести его в соответствие с другими методами, выполняющими фильтрацию по индексам. #80312 (李扬).
  • Конвейер после шага TOTALS стал многопоточным. #80331 (UnamedRus).
  • Исправлена фильтрация по ключу для хранилищ Redis и KeeperMap. #81833 (Pervakov Grigorii).
  • Добавлена новая настройка min_joined_block_size_rows (аналогична min_joined_block_size_bytes; значение по умолчанию — 65409) для управления минимальным размером блока (в строках) для входных и выходных блоков операции JOIN (если алгоритм JOIN это поддерживает). Маленькие блоки будут сливаться в более крупные. #81886 (Nikita Taranov).
  • ATTACH PARTITION больше не приводит к сбросу всех кэшей. #82377 (Alexey Milovidov).
  • Оптимизирован сгенерированный план для коррелированных подзапросов за счёт удаления избыточных операций JOIN с использованием классов эквивалентности. Если существуют эквивалентные выражения для всех коррелированных столбцов, операция CROSS JOIN не выполняется при включённой настройке query_plan_correlated_subqueries_use_substitution. #82435 (Dmitry Novik).
  • Считывать только требуемые столбцы в коррелированном подзапросе, если он является аргументом функции EXISTS. #82443 (Dmitry Novik).
  • Незначительно ускорено сравнение деревьев запросов при анализе запроса. #82617 (Nikolai Kochetov).
  • Добавлено выравнивание в счётчике Counter из ProfileEvents для уменьшения эффекта false sharing. #82697 (Jiebin Sun).
  • Оптимизации для null_map и JoinMask из #82308 были применены к операции JOIN с несколькими дизъюнктами. Также была оптимизирована структура данных KnownRowsHolder. #83041 (Nikita Taranov).
  • Простой std::vector<std::atomic_bool> используется для флагов соединения, чтобы избежать вычисления хэша при каждом обращении к флагам. #83043 (Nikita Taranov).
  • Не выделяйте память для результирующих столбцов заранее, когда HashJoin использует режим вывода lazy. Это неэффективно, особенно когда количество совпадений невелико. Кроме того, после завершения операции соединения нам известно точное количество совпадений, поэтому мы можем заранее выделить память с нужной точностью. #83304 (Nikita Taranov).
  • Минимизировать объём копирования памяти в заголовках портов при построении конвейера. Исходный PR от heymind. #83381 (Raúl Marín).
  • Улучшен процесс запуска clickhouse-keeper при использовании хранилища rocksdb. #83390 (Antonio Andelic).
  • Избегайте удержания блокировки при создании данных снимка хранилища, чтобы снизить конкуренцию за блокировку при высокой параллельной нагрузке. #83510 (Duc Canh Le).
  • Повышена производительность формата ввода ProtobufSingle за счёт повторного использования сериализатора при отсутствии ошибок разбора. #83613 (Eduard Karacharov).
  • Улучшена производительность построения конвейера, что ускоряет выполнение коротких запросов. #83631 (Raúl Marín).
  • Оптимизирован MergeTreeReadersChain::getSampleBlock, ускоряющий выполнение коротких запросов. #83875 (Raúl Marín).
  • Ускорен вывод списка таблиц в каталогах данных за счет асинхронных запросов. #81084 (alesapin).
  • Добавить джиттер в механизм повторных попыток обращений к S3, когда включена конфигурация s3_slow_all_threads_after_network_error. #81849 (zoomxi).

Улучшение

  • Подсветить круглые скобки несколькими цветами для лучшей читаемости. #82538 (Konstantin Bogdanov).
  • Подсветка метасимволов в шаблонах LIKE/REGEXP теперь работает по мере ввода. Она уже была доступна в clickhouse-format и в выводе clickhouse-client, но теперь реализована и в командной строке. #82871 (Alexey Milovidov).
  • Подсветка синтаксиса в clickhouse-format и в echo-выводе клиента будет работать так же, как подсветка в приглашении командной строки. #82874 (Alexey Milovidov).
  • Теперь диски plain_rewritable можно использовать для хранения метаданных базы данных. Реализованы методы moveFile и replaceFile в plain_rewritable, чтобы поддерживать его в качестве диска базы данных. #79424 (Tuan Pham Anh).
  • Разрешено создание резервных копий баз данных PostgreSQL, MySQL и DataLake. Резервная копия такой базы данных будет сохранять только определение, а не содержащиеся в ней данные. #79982 (Nikolay Degterinsky).
  • Параметр allow_experimental_join_condition помечен как устаревший, так как теперь он всегда разрешён. #80566 (Vladimir Cherkasov).
  • Добавлены метрики pressure в асинхронные метрики ClickHouse. #80779 (Xander Garbett).
  • Добавлены метрики MarkCacheEvictedBytes, MarkCacheEvictedMarks, MarkCacheEvictedFiles для отслеживания вытеснений из кэша меток (issue #60989). #80799 (Shivji Kumar Jha).
  • Добавлена поддержка записи перечислений Parquet (enum) в виде массива байт, как предписывает спецификация. #81090 (Arthur Passos).
  • Улучшение для движка таблицы DeltaLake: в delta-kernel-rs появился API ExpressionVisitor, который реализован в этом PR и используется для преобразования выражений над партиционными столбцами (он заменит старый устаревший механизм в delta-kernel-rs, который ранее применялся в нашем коде). В будущем этот ExpressionVisitor также позволит реализовать отсечение на основе статистики (statistics-based pruning) и некоторые проприетарные возможности delta-lake. Дополнительно цель этого изменения — поддержка partition pruning в движке таблицы DeltaLakeCluster (результат разобранного выражения — ActionsDAG — будет сериализован и отправлен с инициатора вместе с путем к данным, поскольку информация, необходимая для pruning, доступна только как метаинформация при получении списка файлов данных, которое выполняется только инициатором, но при этом должна применяться к данным на каждом сервере чтения). #81136 (Kseniia Sumarokova).
  • Сохранять имена элементов при выводе супертипов для именованных кортежей. #81345 (lgbo).
  • Считать потреблённые сообщения вручную, чтобы не зависеть от ранее зафиксированного смещения в StorageKafka2. #81662 (János Benjamin Antal).
  • Добавлен clickhouse-keeper-utils — новый инструмент командной строки для управления и анализа данных ClickHouse Keeper. Инструмент поддерживает дамп состояния из снимков и журналов изменений, анализ файлов журналов изменений и извлечение заданных диапазонов логов. #81677 (Antonio Andelic).
  • Общие и помпользовательские ограничители сетевой пропускной способности никогда не сбрасываются, что гарантирует, что лимиты max_network_bandwidth_for_all_users и max_network_bandwidth_for_all_users никогда не будут превышены. #81729 (Sergei Trifonov).
  • Добавлена поддержка записи в формат GeoParquet. #81784 (Konstantin Vedernikov).
  • Запрещен запуск мутации ALTER RENAME COLUMN, если она будет переименовывать столбец, который в данный момент затронут незавершённой мутацией данных. #81823 (Mikhail Artemenko).
  • Заголовок Connection отправляется в конце всех заголовков, когда уже известно, следует ли сохранять соединение. #81951 (Sema Checherinda).
  • Настройте размер очереди TCP-серверов (по умолчанию 64) в соответствии с параметром listen_backlog (по умолчанию 4096). #82045 (Azat Khuzhin).
  • Добавлена возможность перезагружать параметры max_local_read_bandwidth_for_server и max_local_write_bandwidth_for_server на лету без перезапуска сервера. #82083 (Kai Zhu).
  • Добавлена возможность очистки всех предупреждений из таблицы system.warnings с помощью TRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov).
  • Исправлено отсечение партиций при использовании кластерных функций для озера данных. #82131 (Kseniia Sumarokova).
  • Исправлено чтение секционированных данных в табличной функции DeltaLakeCluster. В этом PR повышена версия протокола кластерных функций, что позволяет передавать дополнительную информацию от инициатора к репликам. Эта дополнительная информация содержит выражение преобразования delta-kernel, которое необходимо для разбора секционирующих столбцов (а в будущем и для других возможностей, таких как сгенерированные столбцы и т. п.). #82132 (Kseniia Sumarokova).
  • Функция reinterpret теперь поддерживает преобразование к типу Array(T), где T — тип данных фиксированного размера (issue #82621). #83399 (Shankar Iyer).
  • Теперь база данных Datalake выдаёт более информативное исключение. Исправляет #81211. #82304 (alesapin).
  • Улучшен CROSS JOIN путём возврата false из HashJoin::needUsedFlagsForPerRightTableRow. #82379 (lgbo).
  • Разрешена запись и чтение столбцов Map в виде Array(Tuple). #82408 (MikhailBurdukov).
  • Вывод списка лицензий крейтов Rust в system.licenses. #82440 (Raúl Marín).
  • Макросы вроде {uuid} теперь можно использовать в параметре keeper_path движка таблицы S3Queue. #82463 (Nikolay Degterinsky).
  • Улучшение Keeper: перемещение файлов changelog между дисками в фоновом потоке. Ранее перенос changelog на другой диск полностью блокировал Keeper до завершения операции. Это приводило к деградации производительности, когда перенос занимал много времени (например, на диск S3). #82485 (Antonio Andelic).
  • Улучшение Keeper: добавлен новый параметр конфигурации keeper_server.cleanup_old_and_ignore_new_acl. Если он включён, ACL всех узлов будут очищены, а ACL для новых запросов — игнорироваться. Если цель — полностью удалить ACL на узлах, важно оставить параметр включённым до тех пор, пока не будет создан новый снапшот. #82496 (Antonio Andelic).
  • Добавлена новая серверная настройка s3queue_disable_streaming, которая отключает стриминг в таблицах с движком S3Queue. Эту настройку можно изменять без перезапуска сервера. #82515 (Kseniia Sumarokova).
  • Рефакторинг механизма динамического изменения размера кэша файловой системы. Добавлено больше логов для диагностики. #82556 (Kseniia Sumarokova).
  • clickhouse-server без файла конфигурации также будет слушать порт PostgreSQL 9005 — аналогично конфигурации по умолчанию. #82633 (Alexey Milovidov).
  • В ReplicatedMergeTree::executeMetadataAlter мы получаем StorageID и, не захватывая DDLGuard, пытаемся вызвать IDatabase::alterTable. За это время мы технически могли заменить рассматриваемую таблицу на другую, поэтому при получении определения таблицы мы могли бы получить неверное. Чтобы избежать этого, мы добавляем отдельную проверку на совпадение UUID при попытке вызвать IDatabase::alterTable. #82666 (Nikolay Degterinsky).
  • При подключении базы данных, использующей удалённый диск только для чтения, необходимо вручную добавить UUID таблиц в DatabaseCatalog. #82670 (Tuan Pham Anh).
  • Запрещено использование пользователями значений nan и inf с NumericIndexedVector. Исправлены #82239 и некоторые сопутствующие проблемы. #82681 (Raufs Dunamalijevs).
  • Не пропускайте нулевые значения в форматах заголовков X-ClickHouse-Progress и X-ClickHouse-Summary. #82727 (Nikita Mikhaylov).
  • Улучшение в Keeper: поддержка конкретных прав для ACL world:anyone. #82755 (Antonio Andelic).
  • Запретить выполнение RENAME COLUMN или DROP COLUMN, затрагивающих явно указанные столбцы суммирования в SummingMergeTree. Закрывает #81836. #82821 (Alexey Milovidov).
  • Улучшена точность преобразования из Decimal в Float32. Реализовано преобразование из Decimal в BFloat16. Закрывает #82660. #82823 (Alexey Milovidov).
  • Полосы прокрутки в веб-интерфейсе станут выглядеть немного лучше. #82869 (Alexey Milovidov).
  • clickhouse-server со встроенной конфигурацией позволит использовать Web UI путём отправки HTTP-ответа OPTIONS. #82870 (Alexey Milovidov).
  • Добавлена поддержка задания дополнительных ACL Keeper для путей в конфигурации. Если вы хотите добавить дополнительные ACL для конкретного пути, задайте их в конфигурации в разделе zookeeper.path_acls. #82898 (Antonio Andelic).
  • Теперь снимок мутаций будет формироваться на основе снимка видимых частей. Также счетчики мутаций, используемые в этом снимке, будут пересчитаны исходя из включенных мутаций. #82945 (Mikhail Artemenko).
  • Добавлен ProfileEvent, срабатывающий, когда Keeper отклоняет операцию записи из‑за мягкого ограничения по памяти. #82963 (Xander Garbett).
  • Добавлены столбцы commit_time, commit_id в таблицу system.s3queue_log. #83016 (Kseniia Sumarokova).
  • В некоторых случаях нам требуется несколько размерностей для наших метрик. Например, подсчитывать неуспешные слияния или мутации по кодам ошибок, а не вести один общий счетчик. Представлен system.dimensional_metrics, который как раз это и обеспечивает и добавляет первую размерную метрику failed_merges. #83030 (Miсhael Stetsyuk).
  • Объединить предупреждения о неизвестных настройках в clickhouse client и логировать их в виде сводного сообщения. #83042 (Bharat Nallan).
  • Клиент ClickHouse теперь сообщает локальный порт при возникновении ошибки подключения. #83050 (Jianfei Hu).
  • Незначительно улучшена обработка ошибок в AsynchronousMetrics. Если каталог /sys/block существует, но недоступен, сервер запустится без мониторинга блочных устройств. Исправляет #79229. #83115 (Alexey Milovidov).
  • Отключение SystemLogs после обычных таблиц (и перед системными таблицами, а не перед обычными). #83134 (Kseniia Sumarokova).
  • Добавлен вывод логов процесса остановки S3Queue. #83163 (Kseniia Sumarokova).
  • Добавлена возможность интерпретировать значения типов Time и Time64 как MM:SS, M:SS, SS или S. #83299 (Yarik Briukhovetskyi).
  • Когда distributed_ddl_output_mode='*_only_active', не ожидайте новые или восстановленные реплики, у которых лаг репликации больше max_replication_lag_to_enqueue. Это должно помочь избежать ошибки DDL task is not finished on some hosts, когда новая реплика становится активной после завершения инициализации или восстановления, но при инициализации накопила огромный журнал репликации. Также реализован запрос SYSTEM SYNC DATABASE REPLICA STRICT, который ожидает, пока журнал репликации не станет меньше max_replication_lag_to_enqueue. #83302 (Alexander Tokmakov).
  • Не выводить слишком длинные описания действий выражения в сообщениях об исключениях. Закрывает #83164. #83350 (Alexey Milovidov).
  • Добавлена возможность парсить префикс и суффикс части, а также проверять покрытие для неконстантных столбцов. #83377 (Mikhail Artemenko).
  • Унифицировать имена параметров в ODBC и JDBC при использовании именованных коллекций. #83410 (Andrey Zvonov).
  • Когда хранилище останавливается, getStatus выбрасывает исключение ErrorCodes::ABORTED. Ранее это приводило к ошибке выполнения запроса SELECT. Теперь мы перехватываем исключения ErrorCodes::ABORTED и намеренно их игнорируем. #83435 (Miсhael Stetsyuk).
  • Добавлены метрики ресурсов процесса (такие как UserTimeMicroseconds, SystemTimeMicroseconds, RealTimeMicroseconds) в события профиля part_log для записей MergeParts. #83460 (Vladimir Cherkasov).
  • Теперь в Keeper по умолчанию включены флаги create_if_not_exists, check_not_exists, remove_recursive, которые позволяют использовать новые типы запросов. #83488 (Antonio Andelic).
  • Останавливать стриминг S3(Azure/etc)Queue перед остановкой любых таблиц при завершении работы сервера. #83530 (Kseniia Sumarokova).
  • Включена поддержка типов Date/Date32 как целых чисел во входных форматах JSON. #83597 (MikhailBurdukov).
  • Сделаны более понятными сообщения об исключениях в ряде ситуаций при загрузке и добавлении проекций. #83728 (Robert Schulze).
  • Добавлена конфигурационная опция, позволяющая пропускать проверку целостности бинарного файла clickhouse-server по контрольной сумме. Решает #83637. #83749 (Rafael Roquetto).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлено некорректное значение по умолчанию параметра --reconnect в clickhouse-benchmark. Оно было изменено по ошибке в #79465. #82677 (Alexey Milovidov).
  • Исправлено непоследовательное форматирование оператора CREATE DICTIONARY. Закрывает #82105. #82829 (Alexey Milovidov).
  • Исправлено непоследовательное форматирование выражений TTL, содержащих функцию materialize. Закрывает #82828. #82831 (Alexey Milovidov).
  • Исправлено несогласованное форматирование EXPLAIN AST во вложенном запросе, когда он содержит опции вывода, такие как INTO OUTFILE. Закрывает #82826. #82840 (Alexey Milovidov).
  • Исправлено несогласованное форматирование выражений в скобках с псевдонимами в контексте, когда использование псевдонимов не допускается. Закрывает #82836. Закрывает #82837. #82867 (Alexey Milovidov).
  • Используется корректный код ошибки при умножении состояния агрегатной функции на IPv4. Исправляет #82817. #82818 (Alexey Milovidov).
  • Исправлена логическая ошибка в файловом кэше: «Having zero bytes but range is not finished». #81868 (Kseniia Sumarokova).
  • Пересчитывайте индекс min-max, когда TTL уменьшает число строк, чтобы обеспечить корректность алгоритмов, которые зависят от него, таких как minmax_count_projection. Это исправляет ошибку #77091. #77166 (Amos Bird).
  • Для запросов с комбинацией ORDER BY ... LIMIT BY ... LIMIT N, когда ORDER BY выполняется как PartialSorting, счётчик rows_before_limit_at_least теперь отражает количество строк, обработанных предложением LIMIT, вместо количества строк, обработанных преобразованием сортировки. #78999 (Eduard Karacharov).
  • Исправлен чрезмерный пропуск гранул при фильтрации по token/ngram-индексам с регулярным выражением, которое содержит чередование, первая альтернатива которого не является литералом. #79373 (Eduard Karacharov).
  • Исправлена логическая ошибка при использовании оператора <=> с хранилищем Join, теперь запрос возвращает корректный код ошибки. #80165 (Vladimir Cherkasov).
  • Исправлено аварийное завершение работы функции loop при использовании с семейством функций remote. Теперь в loop(remote(...)) корректно соблюдается предложение LIMIT. #80299 (Julia Kartseva).
  • Исправлено некорректное поведение функций to_utc_timestamp и from_utc_timestamp при обработке дат до эпохи Unix (1970-01-01) и после максимальной даты (2106-02-07 06:28:15). Теперь эти функции корректно ограничивают значения началом эпохи Unix и максимальной датой соответственно. #80498 (Surya Kant Ranjan).
  • Для некоторых запросов, выполняемых с параллельными репликами, оптимизация чтения в заданном порядке могла применяться на инициаторе, но не на удалённых узлах. Это приводило к тому, что координатор параллельных реплик (на инициаторе) и удалённые узлы использовали разные режимы чтения, что является логической ошибкой. #80652 (Igor Nikonov).
  • Исправлена логическая ошибка при материализации проекции, возникавшая, если тип столбца был изменён на Nullable. #80741 (Pavel Kruglov).
  • Исправлен некорректный пересчёт TTL в TTL GROUP BY при обновлении TTL. #81222 (Evgeniy Ulasik).
  • Исправлена ошибка в bloom-фильтре Parquet, из-за которой условие вида WHERE function(key) IN (...) применялось так, как если бы это было WHERE key IN (...). #81255 (Michael Kolupaev).
  • Исправлено возможное падение в Aggregator в случае возникновения исключения во время слияния. #81450 (Nikita Taranov).
  • Исправлен InterpreterInsertQuery::extendQueryLogElemImpl, чтобы при необходимости добавлять обратные кавычки вокруг имён баз данных и таблиц (например, когда имена содержат специальные символы, такие как -). #81528 (Ilia Shvyrialkin).
  • Исправлено выполнение IN при transform_null_in=1 с NULL в левом аргументе и результатом подзапроса, не допускающим NULL. #81584 (Pavel Kruglov).
  • Не выполнять проверку экспериментальных и подозрительных типов при вычислении выражений DEFAULT/MATERIALIZE при чтении из существующей таблицы. #81618 (Pavel Kruglov).
  • Исправлена ошибка "Context has expired" при слияниях, когда dict используется в выражении TTL. #81690 (Azat Khuzhin).
  • Исправлена монотонность функции cast. #81722 (zoomxi).
  • Исправлена проблема, из-за которой необходимые столбцы не считывались при обработке скалярного коррелированного подзапроса. Исправляет #81716. #81805 (Dmitry Novik).
  • В предыдущих версиях сервер возвращал избыточное содержимое для запросов к /js. Это закрывает #61890. #81895 (Alexey Milovidov).
  • Ранее определения движка таблиц MongoDB могли включать компонент пути в параметре host:port, который при этом тихо игнорировался. Интеграция с MongoDB отказывалась загружать такие таблицы. С этим исправлением разрешена загрузка таких таблиц при игнорировании компонента пути, если у движка MongoDB указано пять аргументов; в этом случае используется имя базы данных из аргументов. Примечание: Исправление не применяется к вновь создаваемым таблицам или запросам с использованием табличной функции mongo, а также к источникам словарей и именованным коллекциям. #81942 (Vladimir Cherkasov).
  • Исправлено возможное падение Aggregator при возникновении исключения во время слияния. #82022 (Nikita Taranov).
  • Исправлен анализ фильтра, когда в запросе используется только константный столбец‑псевдоним. Исправляет #79448. #82037 (Dmitry Novik).
  • Исправлены LOGICAL_ERROR и последующий сбой при использовании одного и того же столбца в TTL для GROUP BY и SET. #82054 (Pablo Marcos).
  • Исправлена проверка аргументов табличной функции S3 при маскировании секретов, предотвращающая возможную ошибку LOGICAL_ERROR; закрыт #80620. #82056 (Vladimir Cherkasov).
  • Устранены гонки данных в Iceberg. #82088 (Azat Khuzhin).
  • Исправлен метод DatabaseReplicated::getClusterImpl. Если первый элемент (или несколько первых элементов) в hosts имеет id == DROPPED_MARK и нет других элементов для того же шарда, первый элемент в shards окажется пустым вектором, что приводит к исключению std::out_of_range. #82093 (Miсhael Stetsyuk).
  • Исправлена ошибка копирования и вставки в arraySimilarity, запрещено использование весов с типами UInt32 и Int32. Обновлены тесты и документация. #82103 (Mikhail f. Shiryaev).
  • Исправлена ошибка Not found column при выполнении запросов с arrayJoin в условии WHERE при использовании IndexSet. #82113 (Nikolai Kochetov).
  • Исправлена ошибка в интеграции с каталогом Glue. Теперь ClickHouse может считывать таблицы с вложенными типами данных, в которых некоторые из подколонок имеют тип Decimal, например: map<string, decimal(9, 2)>. Исправляет #81301. #82114 (alesapin).
  • Исправлено ухудшение производительности в SummingMergeTree, которое появилось в версии 25.5 в https://github.com/ClickHouse/ClickHouse/pull/79051. #82130 (Pavel Kruglov).
  • При передаче настроек через URI берётся последнее значение. #82137 (Sema Checherinda).
  • Исправлена ошибка «Context has expired» в Iceberg. #82146 (Azat Khuzhin).
  • Исправлена возможная взаимоблокировка для удалённых запросов, когда сервер испытывает дефицит памяти. #82160 (Kirill).
  • Исправлено переполнение в функциях numericIndexedVectorPointwiseAdd, numericIndexedVectorPointwiseSubtract, numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, которое происходило при применении к большим числам. #82165 (Raufs Dunamalijevs).
  • Исправлена ошибка в зависимостях таблиц, из-за которой материализованные представления пропускали операции INSERT. #82222 (Nikolay Degterinsky).
  • Исправлена возможная гонка данных между потоком подсказок и основным клиентским потоком. #82233 (Azat Khuzhin).
  • Теперь ClickHouse может читать таблицы Iceberg из каталога Glue после изменений схемы. Исправлена проблема #81272. #82301 (alesapin).
  • Исправлена проверка настроек асинхронных метрик asynchronous_metrics_update_period_s и asynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan).
  • Исправлена логическая ошибка при разрешении сопоставления в запросе с несколькими операторами JOIN, закрыт #81969. #82421 (Vladimir Cherkasov).
  • Добавлен срок действия токена AWS ECS, чтобы его можно было обновлять. #82422 (Konstantин Богданов).
  • Исправлена ошибка обработки аргументов NULL в функции CASE. #82436 (Yarik Briukhovetskyi).
  • Исправлены гонки данных в клиенте (за счёт отказа от использования глобального контекста) и переопределения session_timezone (ранее если session_timezone был задан, например, в users.xml/опциях клиента непустым значением, а в контексте запроса — пустым, то использовалось значение из users.xml, что неверно; теперь контекст запроса всегда имеет приоритет над глобальным контекстом). #82444 (Azat Khuzhin).
  • Исправлено отключение выравнивания по границе для кэшированного буфера в движках внешних таблиц. Оно было сломано в https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
  • Исправлен сбой, возникавший при соединении key-value хранилища с ключом с приведённым типом. #82497 (Pervakov Grigorii).
  • Исправлена проблема сокрытия значений именованных коллекций в logs/query_log. Закрывает #82405. #82510 (Kseniia Sumarokova).
  • Исправлено возможное аварийное завершение при логировании во время завершения сессии, так как user_id иногда может быть пустым. #82513 (Bharat Nallan).
  • Исправляет случаи, когда разбор Time мог приводить к проблемам MSan. Исправляет: #82477. #82514 (Yarik Briukhovetskyi).
  • Запрещена установка параметра threadpool_writer_pool_size в значение 0, чтобы избежать зависания операций сервера. #82532 (Bharat Nallan).
  • Исправлена ошибка LOGICAL_ERROR при анализе выражения политики строк для коррелируемых столбцов. #82618 (Dmitry Novik).
  • Исправлена некорректная работа с родительскими метаданными в табличной функции mergeTreeProjection при enable_shared_storage_snapshot_in_query = 1. Относится к #82634. #82638 (Amos Bird).
  • Функции trim{Left,Right,Both} теперь поддерживают входные строки типа «FixedString(N)». Например, SELECT trimBoth(toFixedString('abc', 3), 'ac') теперь работает. #82691 (Robert Schulze).
  • В AzureBlobStorage для нативного копирования мы сравниваем методы аутентификации, и если при этом возникает исключение, мы обновили код, чтобы выполнять резервное переключение на режим чтения и копирования (т.е. ненативное копирование). #82693 (Smita Kulkarni).
  • Исправлена десериализация groupArraySample/groupArrayLast в случае пустых значений (при пустом вводе десериализация могла пропустить часть бинарных данных, что могло приводить к повреждению данных при чтении и ошибке UNKNOWN_PACKET_FROM_SERVER в протоколе TCP). Это не затрагивает числовые типы и типы даты/времени. #82763 (Pedro Ferreira).
  • Исправлена проблема с созданием бэкапа пустой таблицы Memory, из‑за которой восстановление из бэкапа завершалось с ошибкой BACKUP_ENTRY_NOT_FOUND. #82791 (Julia Kartseva).
  • Исправлена безопасность при обработке исключений в переписывании union/intersect/except_default_mode. Закрывает #82664. #82820 (Alexey Milovidov).
  • Отслеживайте число заданий по загрузке асинхронных таблиц. Если есть запущенные задания, не обновляйте tail_ptr в TransactionLog::removeOldEntries. #82824 (Tuan Pham Anh).
  • Исправлены гонки данных в Iceberg. #82841 (Azat Khuzhin).
  • Настройка оптимизации use_skip_indexes_if_final_exact_mode (введённой в 25.6) могла приводить к тому, что не выбирался подходящий диапазон-кандидат в зависимости от настроек движка таблицы MergeTree и распределения данных. Теперь проблема устранена. #82879 (Shankar Iyer).
  • Теперь задаётся соль для данных аутентификации при разборе AST с типом SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
  • При использовании реализации Database без кэширования метаданные соответствующей таблицы удаляются после возврата столбцов и аннулирования ссылки. #82939 (buyval01).
  • Исправлена модификация фильтра в запросах с выражением JOIN к таблице с движком Merge. Исправлена ошибка #82092. #82950 (Dmitry Novik).
  • Исправлена ошибка LOGICAL_ERROR в QueryMetricLog: mutex не может быть NULL. #82979 (Pablo Marcos).
  • Исправлен некорректный вывод функции formatDateTime при использовании спецификатора формата %f совместно со спецификаторами формата переменной длины (например, %M). #83020 (Robert Schulze).
  • Исправлено ухудшение производительности при включённом анализаторе, когда вторичные запросы всегда читают все столбцы из представлений (VIEW). Исправляет #81718. #83036 (Dmitry Novik).
  • Исправлено вводящее в заблуждение сообщение об ошибке при восстановлении резервной копии на диске, доступном только для чтения. #83051 (Julia Kartseva).
  • Не проверять наличие циклических зависимостей при создании таблиц без зависимостей. Это исправляет деградацию производительности в сценариях с созданием тысяч таблиц, которая появилась в результате https://github.com/ClickHouse/ClickHouse/pull/65405. #83077 (Pavel Kruglov).
  • Исправляет ошибку с неявным чтением отрицательных значений Time в таблицу и устраняет неоднозначности в документации. #83091 (Yarik Briukhovetskyi).
  • Не используйте несвязанные части общего словаря в функции lowCardinalityKeys. #83118 (Alexey Milovidov).
  • Исправлена регрессия при использовании подстолбцов в материализованных представлениях. Это исправляет: #82784. #83221 (Nikita Mikhaylov).
  • Исправлен сбой в клиенте из-за соединения, оставшегося в состоянии отключения после неудачного INSERT. #83253 (Azat Khuzhin).
  • Исправлен сбой при вычислении размера блока, содержащего пустые столбцы. #83271 (Raúl Marín).
  • Исправлено возможное падение типа Variant при использовании UNION. #83295 (Pavel Kruglov).
  • Исправлена ошибка LOGICAL_ERROR в clickhouse-local при выполнении неподдерживаемых запросов SYSTEM. #83333 (Surya Kant Ranjan).
  • Исправлен параметр no_sign_request для клиента S3. Его можно использовать, чтобы явно отключить подпись запросов к S3. Его также можно задать для конкретных endpoint’ов с помощью настроек, основанных на endpoint’ах. #83379 (Antonio Andelic).
  • Исправлена ошибка, приводившая к аварийному завершению запроса с настройкой 'max_threads=1' при выполнении под нагрузкой и включённом планировании по CPU. #83387 (Fan Ziqi).
  • Исправлена ошибка, приводившая к возникновению исключения TOO_DEEP_SUBQUERIES, когда определение CTE ссылалось на другое табличное выражение с тем же именем. #83413 (Dmitry Novik).
  • Исправлено некорректное поведение, при котором выполнение REVOKE S3 ON system.* приводило к отзыву S3‑разрешений для *.*. Это исправляет #83417. #83420 (pufit).
  • Не используйте общие async_read_counters для разных запросов. #83423 (Azat Khuzhin).
  • Отключать параллельные реплики, если подзапрос содержит FINAL. #83455 (zoomxi).
  • Устранено незначительное целочисленное переполнение при конфигурировании настройки role_cache_expiration_time_seconds (issue #83374). #83461 (wushap).
  • Исправлена ошибка, появившаяся в https://github.com/ClickHouse/ClickHouse/pull/79963. При вставке в MV с определяющим пользователем (definer) проверка прав должна выполняться на основе грантов этого пользователя. Это исправляет #79951. #83502 (pufit).
  • Отключено отсечение файлов на основе границ для элементов массивов Iceberg и значений карт Iceberg, включая все их вложенные подполя. #83520 (Daniil Ivanik).
  • Исправлены возможные ошибки «file cache not initialized» при использовании файлового кэша в качестве временного хранилища данных. #83539 (Bharat Nallan).
  • Исправление в Keeper: корректное обновление общего числа наблюдений при удалении эфемерных узлов при закрытии сессии. #83583 (Antonio Andelic).
  • Исправлена некорректная работа с памятью, связанная с max_untracked_memory. #83607 (Azat Khuzhin).
  • INSERT SELECT с UNION ALL мог привести к разыменованию нулевого указателя в редком граничном случае. Это закрывает #83618. #83643 (Alexey Milovidov).
  • Запрещено использование нулевого значения для max_insert_block_size, так как оно может приводить к логической ошибке. #83688 (Bharat Nallan).
  • Исправлен бесконечный цикл в estimateCompressionRatio() при block_size_bytes=0. #83704 (Azat Khuzhin).
  • Исправлены метрики IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles (ранее они учитывались в метрике без префикса Cache). #83730 (Azat Khuzhin).
  • Исправлено возможное аварийное завершение процесса (из-за ожидания завершения потоков задачи) и, вероятно, зависания (в модульных тестах) при остановке BackgroundSchedulePool. #83769 (Azat Khuzhin).
  • Добавлена настройка обратной совместимости, позволяющая новому анализатору ссылаться на внешний псевдоним в предложении WITH в случае конфликта имён. Исправляет #82700. #83797 (Dmitry Novik).
  • Исправлена взаимоблокировка при остановке из-за рекурсивной блокировки контекста во время очистки library bridge. #83824 (Azat Khuzhin).

Улучшения сборки/тестирования/упаковки

  • Создана минимальная C-библиотека (10 КБ) для лексера ClickHouse. Это требуется для #80977. #81347 (Alexey Milovidov). Добавлен тест для автономного лексера, добавлен тестовый тег fasttest-only. #82472 (Yakov Olkhovskiy).
  • Добавлена проверка входных параметров подмодулей Nix. #81691 (Konstantin Bogdanov).
  • Исправлён ряд проблем, которые могут возникать при попытке запустить интеграционные тесты на локальной машине (localhost). #82135 (Oleg Doronin).
  • Скомпилирован SymbolIndex на Mac и FreeBSD. (Но он будет работать только в системах с ELF, Linux и FreeBSD). #82347 (Alexey Milovidov).
  • Обновлён Azure SDK до v1.15.0. #82747 (Smita Kulkarni).
  • Добавлен модуль хранения из google-cloud-cpp в систему сборки. #82881 (Pablo Marcos).
  • Изменён Dockerfile.ubuntu для clickhouse-server для соответствия требованиям Docker Official Library. #83039 (Mikhail f. Shiryaev).
  • Продолжение #83158 для исправления загрузки сборок через curl clickhouse.com. #83463 (Mikhail f. Shiryaev).
  • Добавлены бинарник busybox и инструменты установки в образы clickhouse/clickhouse-server и официальный образ clickhouse. #83735 (Mikhail f. Shiryaev).
  • Добавлена поддержка переменной окружения CLICKHOUSE_HOST для указания хоста сервера ClickHouse, в соответствии с уже существующими переменными окружения CLICKHOUSE_USER и CLICKHOUSE_PASSWORD. Это упрощает конфигурацию без прямого изменения клиента или конфигурационных файлов. #83659 (Doron David).

Релиз ClickHouse 25.6, 2025-06-26

Обратное несовместимое изменение

  • Ранее функция countMatches прекращала подсчёт на первом пустом совпадении, даже если шаблон его допускал. Чтобы устранить эту проблему, countMatches теперь продолжает выполнение, продвигаясь на один символ вперёд при возникновении пустого совпадения. Пользователи, желающие сохранить старое поведение, могут включить настройку count_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).
  • Минорное изменение: принудительно задать параметрам сервера backup_threads и restore_threads ненулевые значения. #80224 (Raúl Marín).
  • Минорное изменение: исправлено поведение bitNot для String, чтобы во внутреннем представлении в памяти возвращалась строка с нулевым терминатором. Это не должно повлиять на какое-либо поведение, видимое пользователю, однако автор посчитал нужным выделить это изменение. #80791 (Azat Khuzhin).

Новая возможность

  • Новые типы данных: Time ([H]HH:MM:SS) и Time64 ([H]HH:MM
    .fractional
    ), а также некоторые базовые функции приведения типов и функции для работы с другими типами данных. Добавлены настройки для совместимости с существующей функцией toTime. Параметр use_legacy_to_time пока установлен для сохранения старого поведения. #81217 (Yarik Briukhovetskyi). Добавлена поддержка сравнения между Time/Time64. #80327 (Yarik Briukhovetskyi).
  • Новый CLI-инструмент chdig — TUI-интерфейс для ClickHouse (аналог top), входящий в состав ClickHouse. #79666 (Azat Khuzhin).
  • Добавлена поддержка параметра disk для движков баз данных Atomic и Ordinary, который задаёт диск для хранения файлов метаданных таблиц. #80546 (Tuan Pham Anh). Это позволяет подключать базы данных из внешних источников.
  • Новый тип MergeTree, CoalescingMergeTree — движок, который берёт первое значение, отличное от NULL, во время фоновых слияний. Это закрывает #78869. #79344 (scanhex12).
  • Добавлены функции для чтения WKB ("Well-Known Binary" — формат двоичного представления различных типов геометрий, используемый в ГИС-приложениях). См. #43941. #80139 (scanhex12).
  • Добавлено планирование слотов запросов для рабочих нагрузок; подробности см. в разделе Workload scheduling. #78415 (Sergei Trifonov).
  • Вспомогательные функции timeSeries* для ускорения работы в некоторых сценариях при работе с временными рядами данных: - ресемплирование данных на временную сетку с заданными начальной меткой времени, конечной меткой времени и шагом - вычисление PromQL-подобных delta, rate, idelta и irate. #80590 (Alexander Gololobov).
  • Добавлены функции mapContainsValuesLike/mapContainsValues/mapExtractValuesLike для фильтрации по значениям в map и их поддержка в индексах, основанных на фильтре Блума. #78171 (UnamedRus).
  • Теперь ограничения настроек могут задавать набор недопустимых значений. #78499 (Bharat Nallan).
  • Добавлена настройка enable_shared_storage_snapshot_in_query для использования общего снимка хранилища всеми подзапросами одного запроса. Это обеспечивает согласованное чтение из одной и той же таблицы, даже если таблица упоминается несколько раз внутри запроса. #79471 (Amos Bird).
  • Добавлена поддержка записи столбцов типа JSON в Parquet и прямого чтения столбцов типа JSON из Parquet. #79649 (Nihal Z. Miaji).
  • Добавлена поддержка типа MultiPolygon для pointInPolygon. #79773 (Nihal Z. Miaji).
  • Добавлена поддержка запросов к таблицам Delta, смонтированным в локальную файловую систему, с помощью табличной функции deltaLakeLocal. #79781 (roykim98).
  • Добавлена новая настройка cast_string_to_date_time_mode, которая позволяет выбрать режим разбора значения DateTime при приведении из String. #80210 (Pavel Kruglov). Например, вы можете установить её в режим best effort.
  • Добавлены функции bech32Encode и bech32Decode для работы с алгоритмом Bech32 в Bitcoin (issue #40381). #80239 (George Larionov).
  • Добавлены SQL-функции для анализа имён частей MergeTree. #80573 (Mikhail Artemenko).
  • Разрешена фильтрация частей, выбранных для запроса, по диску, на котором они находятся, с помощью нового виртуального столбца _disk_name. #80650 (tanner-bruce).
  • Добавлена стартовая страница со списком встроенных веб-инструментов. Она будет открываться при обращении из браузероподобного пользовательского агента. #81129 (Alexey Milovidov).
  • Функции arrayFirst, arrayFirstIndex, arrayLast и arrayLastIndex теперь отбрасывают значения NULL, возвращаемые выражением фильтра. В предыдущих версиях результаты фильтра с типом Nullable не поддерживались. Исправляет #81113. #81197 (Lennard Eijsackers).
  • Теперь можно писать USE DATABASE name вместо USE name. #81307 (Yarik Briukhovetskyi).
  • Добавлена новая системная таблица system.codecs для получения сведений о доступных кодеках. (issue #81525). #81600 (Jimmy Aguilar Mena).
  • Добавлена поддержка оконных функций lag и lead. Закрывает #9887. #82108 (Dmitry Novik).
  • Функция tokens теперь поддерживает новый токенизатор под названием split, который хорошо подходит для логов. #80195 (Robert Schulze).
  • Добавлена поддержка аргумента --database в clickhouse-local. Теперь можно переключаться на уже созданную базу данных. Это закрывает #44115. #81465 (Alexey Milovidov).

Экспериментальная возможность

  • Реализована логика, аналогичная перераспределению (rebalance) в Kafka для Kafka2 с использованием ClickHouse Keeper. Для каждой реплики поддерживаются два типа блокировок партиций: постоянные и временные. Реплика старается удерживать постоянные блокировки как можно дольше; при этом в любой момент времени на реплике не более чем all_topic_partitions / active_replicas_count постоянных блокировок (где all_topic_partitions — количество всех партиций, а active_replicas_count — количество активных реплик). Если блокировок больше, реплика освобождает часть партиций. Некоторые партиции временно удерживаются репликой. Максимальное количество временных блокировок на реплике динамически изменяется, чтобы дать другим репликам возможность взять часть партиций в постоянные блокировки. При обновлении временных блокировок реплика освобождает их все и затем снова пытается захватить некоторые другие. #78726 (Daria Fomina).
  • Улучшение для экспериментального текстового индекса: явные параметры поддерживаются через пары ключ–значение. В настоящий момент поддерживаются параметры: обязательный tokenizer и два необязательных — max_rows_per_postings_list и ngram_size. #80262 (Elmi Ahmadov).
  • Ранее хранилище формата packed не поддерживалось для полнотекстового индекса, поскольку идентификатор сегмента обновлялся «на лету» посредством чтения и записи файла (.gin_sid) на диск. В случае хранилища packed чтение значения из незакоммиченного файла не поддерживается, что приводило к проблеме. Теперь это исправлено. #80852 (Elmi Ahmadov).
  • Экспериментальные индексы типа gin (которые мне не нравятся, потому что это внутренняя шутка разработчиков PostgreSQL) были переименованы в text. Существующие индексы типа gin по-прежнему можно загрузить, но при попытке использовать их в поисковых запросах они будут выбрасывать исключение (предлагая вместо них индексы text). #80855 (Robert Schulze).

Повышение производительности

  • Включена поддержка фильтрации по нескольким проекциям, что позволяет задействовать более одной проекции для фильтрации на уровне частей. Это решает задачу #55525. Это второй шаг к реализации индекса проекций, следующий за #78429. #80343 (Amos Bird).
  • По умолчанию в файловом кеше используется политика кеширования SLRU. #75072 (Kseniia Sumarokova).
  • Устранено соперничество за ресурсы на шаге Resize в конвейере запросов. #77562 (Zhiguo Zhou).
  • Добавлена опция, позволяющая вынести (де)сжатие и (де)сериализацию блоков в потоки конвейера (pipeline threads) вместо одного потока, связанного с сетевым подключением. Управляется настройкой enable_parallel_blocks_marshalling. Это должно ускорить распределённые запросы, передающие значительные объёмы данных между инициатором и удалёнными узлами. #78694 (Nikita Taranov).
  • Улучшена производительность всех типов bloom-фильтров. Видео с конференции OpenHouse #79800 (Delyan Kratunov).
  • Добавлен быстрый путь в UniqExactSet::merge, когда один из наборов пуст. Кроме того, теперь если левый набор (LHS) двухуровневый, а правый (RHS) одноуровневый, мы больше не выполняем преобразование правого набора в двухуровневый. #79971 (Nikita Taranov).
  • Повышена эффективность повторного использования памяти и уменьшено количество отказов страниц при использовании двухуровневых хеш-таблиц, что должно ускорить выполнение GROUP BY. #80245 (Jiebin Sun).
  • Исключены лишние обновления и снижена конкуренция за блокировки в кэше условий запросов. #80247 (Jiebin Sun).
  • Незначительная оптимизация для concatenateBlocks. Скорее всего, она пойдёт на пользу parallel hash join. #80328 (李扬).
  • При выборе диапазонов меток из диапазона первичного ключа двоичный поиск нельзя использовать, если первичный ключ обёрнут функциями. Этот pull request снимает это ограничение: двоичный поиск всё равно может применяться, когда первичный ключ обёрнут всегда монотонной цепочкой функций или когда RPN содержит элемент, который всегда является истинным. Закрывает #45536. #80597 (zoomxi).
  • Ускорено завершение работы движка Kafka (удалена дополнительная 3‑секундная задержка при наличии нескольких таблиц Kafka). #80796 (Azat Khuzhin).
  • Асинхронные вставки: уменьшают потребление памяти и повышают производительность запросов INSERT. #80972 (Raúl Marín).
  • Профилирование процессоров не выполняется, если таблица логов отключена. #81256 (Raúl Marín). Это ускоряет выполнение очень коротких запросов.
  • Ускорена работа toFixedString, если исходное значение уже в точности соответствует запрошенному формату. #81257 (Raúl Marín).
  • Не обрабатывать значения квоты, если для пользователя не задано ограничение. #81549 (Raúl Marín). Это ускоряет очень короткие запросы.
  • Исправлен регресс производительности в механизме отслеживания памяти. #81694 (Michael Kolupaev).
  • Улучшена оптимизация шардирующего ключа для распределённых запросов. #78452 (fhw12345).
  • Параллельные реплики: избегайте ожидания медленных, неиспользуемых реплик, если все задачи на чтение уже распределены по другим репликам. #80199 (Igor Nikonov).
  • Для parallel replicas теперь используется отдельный таймаут подключения, см. настройку parallel_replicas_connect_timeout_ms. Ранее в качестве таймаута подключения для запросов parallel replicas использовались настройки connect_timeout_with_failover_ms/connect_timeout_with_failover_secure_ms (по умолчанию 1 секунда). #80421 (Igor Nikonov).
  • В файловой системе с журналированием операция mkdir записывается в журнал файловой системы, который затем сбрасывается на диск. В случае медленного диска это может занять много времени. Вынесите создание каталога из области действия резервной блокировки. #81371 (Kseniia Sumarokova).
  • Отложено чтение файлов манифестов Iceberg до выполнения первого запроса на чтение. #81619 (Daniil Ivanik).
  • Разрешить перенос предиката GLOBAL [NOT] IN в предложение PREWHERE, если это возможно. #79996 (Eduard Karacharov).

Улучшение

  • EXPLAIN SYNTAX теперь использует новый анализатор. Он возвращает AST, которое строится на основе дерева запроса. Добавлена опция query_tree_passes для управления числом проходов, выполняемых перед преобразованием дерева запроса в AST. #74536 (Vladimir Cherkasov).
  • Реализована «плоская» сериализация для Dynamic и JSON в формате Native, которая позволяет сериализовать и десериализовать данные Dynamic и JSON без специальных структур, таких как shared variant для Dynamic и shared data для JSON. Эту сериализацию можно включить, установив настройку output_format_native_use_flattened_dynamic_and_json_serialization. Она может использоваться для упрощения поддержки Dynamic и JSON в протоколе TCP в клиентах на разных языках программирования. #80499 (Pavel Kruglov).
  • Обновлять учетные данные S3 после ошибки AuthenticationRequired. #77353 (Vitaly Baranov).
  • Добавлены метрики словарей в system.asynchronous_metrics - DictionaryMaxUpdateDelay — максимальная задержка (в секундах) обновления словаря. - DictionaryTotalFailedUpdates — количество ошибок с момента последней успешной загрузки во всех словарях. #78175 (Vlad).
  • Добавлено предупреждение о базах данных, которые могли быть созданы для сохранения повреждённых таблиц. #78841 (János Benjamin Antal).
  • Добавлен виртуальный столбец _time в движках S3Queue и AzureQueue. #78926 (Anton Ivashkin).
  • Сделать настройки, управляющие разрывом соединения при перегрузке CPU, поддерживающими «горячую» перезагрузку. #79052 (Alexey Katsman).
  • Добавлен префикс контейнера к путям данных, отображаемым в system.tables для обычных дисков в Azure Blob Storage, чтобы сделать их отображение согласованным с S3 и GCP. #79241 (Julia Kartseva).
  • Теперь clickhouse-client и local также могут принимать параметры запроса в виде param-<name> (дефис) наряду с param_<name> (подчёркивание). Это закрывает #63093. #79429 (Engel Danila).
  • Подробное предупреждающее сообщение о скидке на трафик при копировании данных из локального хранилища в удалённый S3 с включённой проверкой контрольной суммы. #79464 (VicoWu).
  • Ранее при input_format_parquet_max_block_size = 0 (недопустимом значении) ClickHouse зависал. Теперь это поведение исправлено. Это закрывает #79394. #79601 (abashkeev).
  • Добавлена настройка throw_on_error для startup_scripts: когда параметр throw_on_error имеет значение true, сервер не запустится, пока все запросы не завершатся успешно. По умолчанию throw_on_error имеет значение false, что сохраняет прежнее поведение. #79732 (Aleksandr Musorin).
  • Добавлена возможность добавлять http_response_headers в http_handlers любого типа. #79975 (Andrey Zvonov).
  • Функция reverse теперь поддерживает тип Tuple. Закрывает #80053. #80083 (flynn).
  • Решена задача #75817: теперь можно получать данные auxiliary_zookeepers из таблицы system.zookeeper. #80146 (Nikolay Govorov).
  • Добавлены асинхронные метрики по TCP-сокетам сервера. Это повышает наблюдаемость. Закрывает #80187. #80188 (Alexey Milovidov).
  • Добавлена поддержка anyLast_respect_nulls и any_respect_nulls как SimpleAggregateFunction. #80219 (Diskein).
  • Удалён лишний вызов adjustCreateQueryForBackup для реплицируемых баз данных. #80282 (Vitaly Baranov).
  • Разрешена передача дополнительных опций (которые идут после --, например -- --config.value='abc') в clickhouse-local без знака равенства. Закрывает #80292. #80293 (Alexey Milovidov).
  • Подсветка метасимволов в запросах SHOW ... LIKE. Исправляет #80275. #80297 (Alexey Milovidov).
  • Сделать SQL UDF в clickhouse-local постоянной: ранее созданная функция теперь будет загружаться при запуске. Это закрывает #80085. #80300 (Alexey Milovidov).
  • Исправлено описание в плане выполнения запроса для предварительного шага DISTINCT. #80330 (UnamedRus).
  • Добавлена возможность использования именованных коллекций в ODBC/JDBC. #80334 (Andrey Zvonov).
  • Метрики числа дисков в режиме только для чтения и повреждённых дисков. Индикатор записывает сообщение в журнал при запуске DiskLocalCheckThread. #80391 (VicoWu).
  • Реализована поддержка хранилища s3_plain_rewritable с проекциями. В предыдущих версиях объекты метаданных в S3, ссылающиеся на проекции, не обновлялись при их перемещении. Закрывает #70258. #80393 (Sav).
  • Команда SYSTEM UNFREEZE больше не будет пытаться искать части на дисках только для чтения и с однократной записью. Исправляет #80430. #80432 (Alexey Milovidov).
  • Понижен уровень логирования сообщений о слиянии частей. #80476 (Hans Krutzer).
  • Изменено поведение по умолчанию механизма отсечения партиций (partition pruning) для таблиц Iceberg. #80583 (Melvyn Peignon).
  • Добавлены два новых события ProfileEvents для наблюдаемости алгоритмов поиска по индексу: IndexBinarySearchAlgorithm и IndexGenericExclusionSearchAlgorithm. #80679 (Pablo Marcos).
  • Не выводить в логи предупреждение об отсутствии поддержки MADV_POPULATE_WRITE в старых версиях ядра (чтобы не засорять логи). #80704 (Robert Schulze).
  • Добавлена поддержка Date32 и DateTime64 в выражениях TTL. #80710 (Andrey Zvonov).
  • Скорректированы значения совместимости для max_merge_delayed_streams_for_parallel_write. #80760 (Azat Khuzhin).
  • Исправлен сбой: если при попытке удалить временный файл (они используются для выгрузки временных данных на диск) в деструкторе выбрасывается исключение, программа может аварийно завершиться. #80776 (Alexey Milovidov).
  • Добавлен модификатор IF EXISTS для команды SYSTEM SYNC REPLICA. #80810 (Raúl Marín).
  • Расширено сообщение об исключении «Having zero bytes, but read range is not finished...», добавлен столбец finished_download_time в таблицу system.filesystem_cache. #80849 (Kseniia Sumarokova).
  • Добавлен раздел об алгоритме поиска в вывод EXPLAIN при использовании его с indexes = 1. В нём отображается либо "binary search", либо "generic exclusion search". #80881 (Pablo Marcos).
  • В начале 2024 года значение prefer_column_name_to_alias было жёстко зашито как true для обработчика MySQL, поскольку новый анализатор по умолчанию не был включён. Теперь это можно убрать. #80916 (Yarik Briukhovetskyi).
  • Теперь system.iceberg_history показывает историю для баз данных-каталогов, таких как Glue или Iceberg REST. Также столбцы table_name и database_name переименованы в table и database в system.iceberg_history для единообразия. #80975 (alesapin).
  • Включён режим только чтения для табличной функции merge, поэтому для её использования больше не требуется привилегия CREATE TEMPORARY TABLE. #80981 (Miсhael Stetsyuk).
  • Улучшена интроспекция кэшей в памяти (теперь информация о кэшах предоставляется в system.metrics вместо неполного system.asynchronouse_metrics). В dashboard.html добавлен размер кэшей в памяти (в байтах). VectorSimilarityIndexCacheSize/IcebergMetadataFilesCacheSize были переименованы в VectorSimilarityIndexCacheBytes/IcebergMetadataFilesCacheBytes. #81023 (Azat Khuzhin).
  • Пропускать базы данных с движками, которые не могут содержать таблицы RocksDB, при чтении из system.rocksdb. #81083 (Pervakov Grigorii).
  • Разрешить filesystem_caches и named_collections в конфигурационном файле clickhouse-local. #81105 (Alexey Milovidov).
  • Исправлена подсветка PARTITION BY в операторах INSERT. В предыдущих версиях PARTITION BY не подсвечивался как ключевое слово. #81106 (Alexey Milovidov).
  • Два небольших улучшения в веб-интерфейсе: — корректная обработка запросов без вывода, таких как CREATE, INSERT (до недавнего времени эти запросы приводили к бесконечной анимации загрузки); — при двойном щелчке по таблице выполняется прокрутка к началу. #81131 (Alexey Milovidov).
  • Метрика MemoryResidentWithoutPageCache показывает объём физической памяти, используемой серверным процессом в байтах, за вычетом кэша страниц в пользовательском пространстве (userspace page cache). Это даёт более точное представление о фактическом использовании памяти при задействованном кэше страниц в пользовательском пространстве. Когда кэш страниц в пользовательском пространстве отключён, это значение равно MemoryResident. #81233 (Jayme Bird).
  • Пометить исключения, вручную записанные в журнал в client, local server, keeper client и приложении disks, как уже записанные, чтобы они не попадали в журнал дважды. #81271 (Miсhael Stetsyuk).
  • Параметры use_skip_indexes_if_final и use_skip_indexes_if_final_exact_mode теперь по умолчанию установлены в значение True. Запросы с модификатором FINAL теперь будут использовать skip-индексы (если применимо) для предварительного отбора гранул, а также читать любые дополнительные гранулы, попадающие в соответствующие диапазоны первичного ключа. Пользователи, которым требуется прежнее поведение с приблизительными/неточными результатами, могут установить use_skip_indexes_if_final_exact_mode в FALSE после тщательной оценки последствий. #81331 (Shankar Iyer).
  • Если в веб-интерфейсе у вас открыто несколько запросов, выполняется тот, под которым находится курсор. Продолжение #80977. #81354 (Alexey Milovidov).
  • Этот pull request исправляет проблемы с реализацией is_strict в проверках монотонности функций преобразования. В настоящее время некоторые функции преобразования, такие как toFloat64(UInt32) и toDate(UInt8), некорректно возвращают is_strict со значением false, когда должны возвращать true. #81359 (zoomxi).
  • При проверке того, соответствует ли KeyCondition непрерывному диапазону, когда ключ обёрнут цепочкой нестрогих функций, Constraint::POINT может потребовать преобразования в Constraint::RANGE. Например: toDate(event_time) = '2025-06-03' подразумевает диапазон для event_time: ['2025-06-03 00:00:00', '2025-06-04 00:00:00'). Этот PR исправляет данное поведение. #81400 (zoomxi).
  • Алиасы clickhouse/ch будут вызывать clickhouse-client вместо clickhouse-local, если заданы параметры --host или --port. Продолжение #79422. Закрывает #65252. #81509 (Alexey Milovidov).
  • Теперь, когда у нас есть данные о распределении времени ответа Keeper, мы можем настроить интервалы гистограммы метрик. #81516 (Miсhael Stetsyuk).
  • Добавлено событие профилирования PageCacheReadBytes. #81742 (Kseniia Sumarokova).
  • Исправлена логическая ошибка в кэше файловой системы: «Having zero bytes but range is not finished». #81868 (Kseniia Sumarokova).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлено параметризованное представление с запросом SELECT EXCEPT. Закрывает #49447. #57380 (Nikolay Degterinsky).
  • Analyzer: исправлено имя проекции столбца после повышения типа столбца при JOIN. Закрывает #63345. #63519 (Dmitry Novik).
  • Исправлена логическая ошибка при конфликте имён столбцов, когда включён analyzer_compatibility_join_using_top_level_identifier. #75676 (Vladimir Cherkasov).
  • Исправлено использование CTE в проталкиваемых предикатах при включённом allow_push_predicate_ast_for_distributed_subqueries. Устранена проблема #75647. Устранена проблема #79672. #77316 (Dmitry Novik).
  • Исправлена проблема, из-за которой SYSTEM SYNC REPLICA LIGHTWEIGHT 'foo' сообщала об успешном завершении, даже когда указанная реплика не существовала. Теперь команда корректно проверяет наличие реплики в Keeper, прежде чем пытаться выполнить синхронизацию. #78405 (Jayme Bird).
  • Исправлен сбой в очень специфическом случае, когда функция currentDatabase использовалась в разделе CONSTRAINT запросов ON CLUSTER. Закрывает #78100. #79070 (pufit).
  • Исправлена передача внешних ролей в межсерверных запросах. #79099 (Andrey Zvonov).
  • Попробуйте использовать IColumn вместо Field в SingleValueDataGeneric. Это позволит исправить некорректные возвращаемые значения для некоторых агрегатных функций, таких как argMax для типов Dynamic/Variant/JSON. #79166 (Pavel Kruglov).
  • Исправлено применение настроек use_native_copy и allow_azure_native_copy для Azure Blob Storage; поведение обновлено так, чтобы native copy использовалась только при совпадении учётных данных, что устраняет #78964. #79561 (Smita Kulkarni).
  • Исправлены логические ошибки, связанные с неизвестной областью происхождения столбца, возникавшие при проверке, коррелирован ли этот столбец. Исправлены #78183. Исправлены #79451. #79727 (Dmitry Novik).
  • Исправлены некорректные результаты при использовании GROUPING SETS с ColumnConst и Analyzer. #79743 (Andrey Zvonov).
  • Исправлено дублирование результатов локального шарда при чтении из распределённой таблицы, когда локальная реплика устарела. #79761 (Eduard Karacharov).
  • Исправлен порядок сортировки NaN с отрицательным знаковым битом. #79847 (Pervakov Grigorii).
  • Теперь GROUP BY ALL не учитывает секцию GROUPING. #79915 (Yarik Briukhovetskyi).
  • Исправлено некорректное объединение состояний для функций TopK / TopKWeighted, которое приводило к слишком большим значениям погрешности, даже когда ёмкость не была исчерпана. #79939 (Joel Höner).
  • Учитывать параметр readonly в объектном хранилище azure_blob_storage. #79954 (Julia Kartseva).
  • Исправлены некорректные результаты запросов и аварийные завершения по нехватке памяти при использовании match(column, '^…') с символами, экранированными обратной косой чертой. #79969 (filimonov).
  • Отключение разбиения Hive для озёр данных Частично решает https://github.com/issues/assigned?issue=ClickHouse%7CClickHouse%7C79937. #80005 (Daniil Ivanik).
  • Пропускающие индексы с лямбда-выражениями не применялись. Исправлен случай, когда высокоуровневые функции в определении индекса в точности совпадают с функциями в запросе. #80025 (Nikolai Kochetov).
  • Исправлена версия метаданных при присоединении парта на реплике, выполняющей команду ATTACH_PART из журнала репликации. #80038 (Aleksei Filatov).
  • Имена исполняемых пользовательских функций (eUDF) не добавляются в столбец used_functions таблицы system.query_log, в отличие от других функций. В этом PR реализовано добавление имени eUDF в случае её использования в запросе. #80073 (Kyamran).
  • Исправлена логическая ошибка в формате Arrow с LowCardinality(FixedString). #80156 (Pavel Kruglov).
  • Исправлено чтение подстолбцов в движке Merge. #80158 (Pavel Kruglov).
  • Исправлена ошибка при сравнении числовых типов в KeyCondition. #80207 (Yarik Briukhovetskyi).
  • Исправлено возникновение AMBIGUOUS_COLUMN_NAME при применении ленивой материализации к таблице с проекциями. #80251 (Igor Nikonov).
  • Исправлена некорректная оптимизация подсчёта для строковых фильтров по префиксу, таких как LIKE 'ab_c%', при использовании неявных проекций. Это исправляет #80250. #80261 (Amos Bird).
  • Исправлена некорректная сериализация вложенных числовых полей в виде строк в документах MongoDB. Удалено ограничение максимальной глубины для документов MongoDB. #80289 (Kirill Nikiforov).
  • Теперь выполняются менее строгие проверки метаданных для RMT в реплицируемой базе данных. Закрывает #80296. #80298 (Nikolay Degterinsky).
  • Исправлено текстовое представление типов DateTime и DateTime64 для хранилища PostgreSQL. #80301 (Yakov Olkhovskiy).
  • Добавлена возможность использования DateTime с часовым поясом в таблицах StripeLog. Это закрывает #44120. #80304 (Alexey Milovidov).
  • Отключено проталкивание фильтра вниз (filter-push-down) для предиката с недетерминированной функцией, если шаг плана запроса изменяет количество строк. Исправляет #40273. #80329 (Nikolai Kochetov).
  • Исправлены возможные логические ошибки и сбои в проекциях с подстолбцами. #80333 (Pavel Kruglov).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK, вызванная оптимизацией проталкивания фильтра (filter-push-down) на логическом шаге JOIN в случае, когда выражение ON не является простым равенством. Исправлены #79647 и #77848. #80360 (Nikolai Kochetov).
  • Исправлен некорректный результат при чтении ключей в обратном порядке в секционированных таблицах. Это исправляет #79987. #80448 (Amos Bird).
  • Исправлена некорректная сортировка в таблицах с ключом типа Nullable и включённым параметром optimize_read_in_order. #80515 (Pervakov Grigorii).
  • Исправлена проблема, из-за которой операция DROP для обновляемого материализованного представления зависала, если представление было приостановлено с помощью SYSTEM STOP REPLICATED VIEW. #80543 (Michael Kolupaev).
  • Исправлена ошибка 'Cannot find column' при использовании константного кортежа в распределённом запросе. #80596 (Yakov Olkhovskiy).
  • Исправлена функция shardNum в таблицах Distributed с join_use_nulls. #80612 (János Benjamin Antal).
  • Исправлен некорректный результат при чтении столбца, который присутствует только в части таблиц в движке Merge. #80643 (Pavel Kruglov).
  • Исправлена возможная проблема с протоколом SSH (из-за зависания в replxx). #80688 (Azat Khuzhin).
  • Метка времени в таблице iceberg_history теперь должна быть правильной. #80711 (Melvyn Peignon).
  • Исправлен возможный сбой при неудачной регистрации словаря (когда CREATE DICTIONARY завершалась ошибкой CANNOT_SCHEDULE_TASK, в реестре словарей мог оставаться висячий указатель, что впоследствии приводило к падению). #80714 (Azat Khuzhin).
  • Исправлена обработка glob-шаблонов enum с единственным элементом в табличных функциях объектного хранилища. #80716 (Konstantin Bogdanov).
  • Исправлен неверный тип результата функций сравнения с Tuple(Dynamic) и String, приводивший к логической ошибке. #80728 (Pavel Kruglov).
  • Добавлена недостающая поддержка типа данных timestamp_ntz в Unity Catalog. Исправляет #79535 и #79875. #80740 (alesapin).
  • Исправлена ошибка THERE_IS_NO_COLUMN для распределённых запросов с IN cte. Устраняет #75032. #80757 (Nikolai Kochetov).
  • Исправлена проблема чрезмерного количества файлов (приводила к чрезмерному использованию памяти) для внешнего ORDER BY. #80777 (Azat Khuzhin).
  • Этот PR может закрыть #80742. #80783 (zoomxi).
  • Исправлен сбой в Kafka из‑за того, что get_member_id() пыталась создать std::string из NULL (вероятно, проблема проявлялась только при неуспешном подключении к брокеру). #80793 (Azat Khuzhin).
  • Корректное ожидание завершения работы потребителей перед остановкой движка Kafka (активные потребители после остановки могут приводить к срабатыванию различных отладочных assert-ов, а также продолжать считывать данные у брокеров в фоновом режиме после удаления/открепления таблицы). #80795 (Azat Khuzhin).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK, возникавшая из-за оптимизации predicate-push-down. Исправляет #80443. #80834 (Nikolai Kochetov).
  • Исправлена логическая ошибка при обработке шаблона со звездочкой (*) в табличной функции при выполнении JOIN с USING. #80894 (Vladimir Cherkasov).
  • Исправлен учет использования памяти в кэше файлов метаданных Iceberg. #80904 (Azat Khuzhin).
  • Исправлено неверное секционирование с nullable-ключом партиционирования. #80913 (Pervakov Grigorii).
  • Исправлена ошибка Table does not exist для распределённых запросов с проталкиванием предиката (allow_push_predicate_ast_for_distributed_subqueries=1), когда исходная таблица отсутствует на сервере-инициаторе запроса. Исправляет #77281. #80915 (Nikolai Kochetov).
  • Исправлена логическая ошибка во вложенных функциях с именованными окнами. #80926 (Pervakov Grigorii).
  • Исправлена обработка экстремальных значений для столбцов с типом Nullable и столбцов с плавающей точкой. #80970 (Pervakov Grigorii).
  • Исправлено возможное аварийное завершение при выполнении запроса к system.tables (вероятно при дефиците памяти). #80976 (Azat Khuzhin).
  • Исправлено атомарное переименование с усечением для файлов, у которых тип сжатия определяется по расширению файла. #80979 (Pablo Marcos).
  • Исправлена функция ErrorCodes::getName. #81032 (RinChanNOW).
  • Исправлена ошибка, из-за которой пользователь не мог получить список таблиц в Unity Catalog без прав на каждую из них. Теперь все таблицы корректно перечисляются, а попытка чтения из таблицы с ограниченным доступом приведёт к исключению. #81044 (alesapin).
  • Теперь ClickHouse игнорирует ошибки и неожиданные ответы от каталогов озера данных в запросе SHOW TABLES. Исправляет #79725. #81046 (alesapin).
  • Исправлен разбор значения DateTime64 из целых чисел в JSONExtract и при разборе типа данных JSON. #81050 (Pavel Kruglov).
  • Учитывать настройку date_time_input_format в кэше автоматического определения схемы. #81052 (Pavel Kruglov).
  • Исправлен сбой при операции INSERT, если таблица была удалена (DROP) после запуска запроса, но до отправки данных. #81053 (Azat Khuzhin).
  • Исправлена ошибка использования неинициализированного значения в quantileDeterministic. #81062 (Azat Khuzhin).
  • Исправить управление счётчиком жёстких ссылок для транзакций диска metadatastoragefromdisk. Добавить тесты. #81066 (Sema Checherinda).
  • Имена пользовательских функций (UDF) не записываются в таблицу system.query_log в отличие от имён других функций. Этот PR добавляет запись имени UDF в один из двух столбцов used_executable_user_defined_functions или used_sql_user_defined_functions, если UDF была использована в запросе. #81101 (Kyamran).
  • Исправлены ошибки Too large size ... passed to allocator и возможные сбои при вставках через HTTP-протокол с текстовыми форматами (JSON, Values и др.) при пропуске полей типа Enum. #81145 (Anton Popov).
  • Исправлена ошибка LOGICAL_ERROR при наличии разреженного столбца (Sparse column) в блоке INSERT, направляемом в не-MT материализованное представление. #81161 (Azat Khuzhin).
  • Исправлена ошибка Unknown table expression identifier для distributed_product_mode_local=local в режиме кросс-репликации. #81162 (Nikolai Kochetov).
  • Исправлено некорректное кэширование количества строк в файлах Parquet после фильтрации. #81184 (Michael Kolupaev).
  • Исправлен параметр fs cache max_size_to_total_space при использовании с относительным путем к каталогу кэша. #81237 (Kseniia Sumarokova).
  • Исправлена ошибка, из-за которой clickhouse-local завершался с ошибкой при выводе константных кортежей или значений типа Map в формате Parquet. #81249 (Michael Kolupaev).
  • Проверять смещения массивов, получаемых по сети. #81269 (Azat Khuzhin).
  • Исправлен крайний случай в запросе, который выполняет JOIN пустых таблиц и использует оконные функции. Ошибка приводила к взрывному росту количества параллельных потоков, что вызывало переполнение памяти (OOM). #81299 (Alexander Gololobov).
  • Исправления для кластерных функций data lake (deltaLakeCluster, icebergCluster и т.д.): (1) исправлена потенциальная ошибка сегментации в DataLakeConfiguration при использовании функции Cluster со старым анализатором; (2) убраны дублирующиеся обновления метаданных data lake (лишние запросы к объектному хранилищу); (3) исправлен избыточный листинг в объектном хранилище, когда формат явно не указан (что уже было сделано для некластерных движков data lake). #81300 (Kseniia Sumarokova).
  • Флаг force_restore_data теперь восстанавливает потерянные метаданные Keeper. #81324 (Raúl Marín).
  • Исправлена ошибка региона в delta-kernel. Исправляет #79914. #81353 (Kseniia Sumarokova).
  • Отключен некорректный JIT для divideOrNull. #81370 (Raúl Marín).
  • Исправлена ошибка вставки данных, возникавшая, когда у таблицы MergeTree было слишком длинное имя столбца секции. #81390 (hy123q).
  • Бэкпортировано в #81957: исправлена возможная аварийная остановка в Aggregator при возникновении исключения во время слияния. #81450 (Nikita Taranov).
  • Не сохраняем содержимое нескольких файлов манифестов в памяти. #81470 (Daniil Ivanik).
  • Исправлено возможное аварийное завершение во время остановки фоновых пулов (background_.*pool_size). #81473 (Azat Khuzhin).
  • Исправлен выход за границы буфера при чтении в формате Npy, происходивший при записи в таблицу с движком URL. Это закрывает #81356. #81502 (Alexey Milovidov).
  • Возможно, что веб-интерфейс отобразит NaN% (типичные проблемы JavaScript). #81507 (Alexey Milovidov).
  • Исправлен DatabaseReplicated при database_replicated_enforce_synchronous_settings=1. #81564 (Azat Khuzhin).
  • Исправлен порядок сортировки типов LowCardinality(Nullable(...)). #81583 (Pervakov Grigorii).
  • Сервер не должен поддерживать HTTP‑соединение, если запрос не был полностью прочитан из сокета. #81595 (Sema Checherinda).
  • Теперь скалярные коррелированные подзапросы возвращают результат выражения проекции, допускающий NULL. Исправлен случай, когда коррелированный подзапрос возвращает пустой набор результатов. #81632 (Dmitry Novik).
  • Исправлена ошибка Unexpected relative path for a deduplicated part во время операции ATTACH к ReplicatedMergeTree. #81647 (Azat Khuzhin).
  • Параметр запроса use_iceberg_partition_pruning не будет применяться к хранилищу Iceberg, так как для него используется глобальный контекст, а не контекст запроса. Это не критично, так как его значение по умолчанию — true. Этот PR исправляет это. #81673 (Han Fei).
  • Бэкпортировано в #82128: исправлена ошибка "Context has expired" при слияниях, когда словарь использовался в выражении TTL. #81690 (Azat Khuzhin).
  • Добавлена проверка настройки MergeTree merge_max_block_size, чтобы гарантировать, что значение не равно нулю. #81693 (Bharat Nallan).
  • Исправлены проблемы в clickhouse-local, связанные с зависающими запросами DROP VIEW. #81705 (Bharat Nallan).
  • Исправлен join в StorageRedis в некоторых случаях. #81736 (Pervakov Grigorii).
  • Исправлено падение в ConcurrentHashJoin при использовании пустого USING () и включённом старом анализаторе. #81754 (Nikita Taranov).
  • Исправление в Keeper: блокировать фиксацию новых логов при наличии некорректной записи в логах. Ранее, если лидер некорректно применял часть логов, он продолжал фиксировать новые, хотя фолловер обнаруживал несоответствие дайджеста и прерывал работу. #81780 (Antonio Andelic).
  • Исправлена проблема, из-за которой требуемые столбцы не считывались при обработке скалярных коррелированных подзапросов. Исправляет #81716. #81805 (Dmitry Novik).
  • Кто-то засорил наш код Kusto. Я всё подчистил. Это закрывает #81643. #81885 (Alexey Milovidov).
  • В предыдущих версиях сервер возвращал чрезмерный объём данных в ответ на запросы к /js. Это закрывает #61890. #81895 (Alexey Milovidov).
  • Ранее определения движка таблиц MongoDB могли включать компонент пути в аргументе host:port, который просто игнорировался. Интеграция с MongoDB отказывалась загружать такие таблицы. С этим исправлением теперь допускается загрузка таких таблиц, при этом компонент пути игнорируется, если движок MongoDB указан с пятью аргументами, а имя базы данных берётся из аргументов. Примечание: исправление не применяется к вновь создаваемым таблицам или запросам с табличной функцией mongo, а также к источникам словарей и именованным коллекциям. #81942 (Vladimir Cherkasov).
  • Исправлено возможное падение Aggregator при возникновении исключения во время слияния. #82022 (Nikita Taranov).
  • Исправлена ошибка copy-paste в arraySimilarity, запрещено использование весов типов UInt32 и Int32. Обновлены тесты и документация. #82103 (Mikhail f. Shiryaev).
  • Исправлена возможная гонка данных между потоком подсказок и основным потоком клиента. #82233 (Azat Khuzhin).

Улучшение сборки/тестирования/упаковки

Релиз ClickHouse 25.5, 2025-05-22

Обратные несовместимые изменения

  • Функция geoToH3 теперь принимает аргументы в порядке (lat, lon, res) (что соответствует другим геометрическим функциям). Пользователи, которые хотят сохранить прежний порядок аргументов (lon, lat, res), могут установить настройку geotoh3_argument_order = 'lon_lat'. #78852 (Pratima Patel).
  • Добавлена настройка файлового кэша allow_dynamic_cache_resize, по умолчанию false, позволяющая динамически изменять размер файлового кэша. Причина: в некоторых средах (ClickHouse Cloud) все события масштабирования происходят через перезапуск процесса, и мы хотим, чтобы эта возможность была явно отключена, чтобы иметь больший контроль над поведением, а также в качестве меры безопасности. Этот PR помечен как обратно несовместимое изменение, потому что в старых версиях динамическое изменение размера кэша работало по умолчанию без специальной настройки. #79148 (Kseniia Sumarokova).
  • Удалена поддержка устаревших типов индексов annoy и usearch. Оба уже долгое время были заглушками, то есть любая попытка использовать эти устаревшие индексы всё равно возвращала ошибку. Если у вас всё ещё есть индексы annoy и usearch, пожалуйста, удалите их. #79802 (Robert Schulze).
  • Удалена серверная настройка format_alter_commands_with_parentheses. Эта настройка была добавлена и по умолчанию отключена в версии 24.2. В версии 25.2 она была включена по умолчанию. Поскольку сейчас нет LTS-версий, которые не поддерживают новый формат, мы можем удалить эту настройку. #79970 (János Benjamin Antal).
  • Реализация delta-kernel-rs для хранилища DeltaLake теперь включена по умолчанию. #79541 (Kseniia Sumarokova).
  • Если чтение из URL включает несколько перенаправлений, настройка enable_url_encoding теперь корректно применяется ко всем перенаправлениям в цепочке. #79563 (Shankar Iyer). Значение по умолчанию настройки enble_url_encoding теперь равно false. #80088 (Shankar Iyer).

Новая возможность

  • Поддержка скалярных коррелированных подзапросов в предложении WHERE. Закрывает #6697. #79600 (Dmitry Novik). Поддержка коррелированных подзапросов в списке проекций в простых случаях. #79925 (Dmitry Novik). #76078 (Dmitry Novik). Теперь покрывает 100% набора тестов TPC-H.
  • Векторный поиск с использованием индекса векторного сходства получил статус бета-версии (ранее был экспериментальной функцией). #80164 (Robert Schulze).
  • Добавлена поддержка типов геоданных в формате Parquet. Это закрывает #75317. #79777 (scanhex12).
  • Новые функции sparseGrams, sparseGramsHashes, sparseGramsHashesUTF8, sparseGramsUTF8 для вычисления «разреженных n-грамм» — надёжного алгоритма извлечения подстрок для индексирования и поиска. #79517 (scanhex12).
  • clickhouse-local (и его сокращённый псевдоним ch) теперь неявно добавляют FROM table, когда есть входные данные для обработки. Это закрывает #65023. Также в clickhouse-local включено автоматическое определение формата, если не указан --input-format и обрабатывается обычный файл. #79085 (Alexey Milovidov).
  • Добавлены функции stringBytesUniq и stringBytesEntropy для обнаружения потенциально случайных или зашифрованных данных. #79350 (Sachin Kumar Singh).
  • Добавлены функции кодирования и декодирования base32. #79809 (Joanna Hulboj).
  • Добавлены функции getServerSetting и getMergeTreeSetting. Закрывает #78318. #78439 (NamNguyenHoai).
  • Добавлена новая настройка iceberg_enable_version_hint для использования файла version-hint.text. #78594 (Arnaud Briche).
  • Позволяет очищать (TRUNCATE) отдельные таблицы в базе данных, отфильтрованные с помощью ключевого слова LIKE. #78597 (Yarik Briukhovetskyi).
  • Добавлена поддержка виртуального столбца _part_starting_offset в таблицах семейства MergeTree. Этот столбец представляет собой накопительный счетчик строк по всем предшествующим частям, вычисляемый во время выполнения запроса на основе текущего списка частей. Накопительные значения сохраняются на протяжении выполнения запроса и остаются актуальными даже после отсечения частей. Связанная внутренняя логика была переработана для поддержки такого поведения. #79417 (Amos Bird).
  • Добавлены функции divideOrNull,moduloOrNull, intDivOrNull,positiveModuloOrNull, которые возвращают NULL, если правый аргумент равен нулю. #78276 (kevinyhzou).
  • Векторный поиск в ClickHouse теперь поддерживает как предварительную, так и последующую фильтрацию и предоставляет соответствующие настройки для более тонкого управления. (issue #78161). #79854 (Shankar Iyer).
  • Добавлены функции icebergHash и icebergBucket. Добавлена поддержка отсечения файлов с данными в таблицах Iceberg, партиционированных с использованием bucket transfom. #79262 (Daniil Ivanik).

Экспериментальная функциональность

  • Новые типы данных Time/Time64: Time (HHH:MM:SS) и Time64 (HHH:MM:SS.<fractional>) и некоторые базовые функции приведения типов, а также функции для взаимодействия с другими типами данных. Кроме того, существующая функция toTime была переименована в toTimeWithFixedDate, так как функция toTime требуется для функции приведения типа. #75735 (Yarik Briukhovetskyi).
  • Каталог Hive Metastore для озера данных Iceberg. #77677 (scanhex12).
  • Индексы типа full_text были переименованы в gin. Это соответствует более привычной терминологии PostgreSQL и других баз данных. Существующие индексы типа full_text по‑прежнему можно загружать, но при попытке использовать их в поиске они будут выбрасывать исключение (с предложением использовать индексы gin). #79024 (Robert Schulze).

Повышение производительности

  • Изменён формат Compact-частей, чтобы сохранять метки для каждого подпотока и тем самым обеспечить чтение отдельных подстолбцов. Старый формат Compact по-прежнему поддерживается для чтения и может быть включён для записи с помощью настройки MergeTree write_marks_for_substreams_in_compact_parts. По умолчанию она отключена для более безопасного обновления, так как она изменяет способ хранения Compact-частей. В одном из следующих релизов она будет включена по умолчанию. #77940 (Pavel Kruglov).
  • Добавлена поддержка переноса условий с подстолбцами в PREWHERE. #79489 (Pavel Kruglov).
  • Ускорена работа вторичных индексов за счет вычисления их выражений одновременно на нескольких гранулах. #64109 (Alexey Milovidov).
  • Параметр compile_expressions (JIT-компилятор для фрагментов обычных выражений) теперь включён по умолчанию. Это закрывает #51264, #56386 и #66486. #79907 (Alexey Milovidov).
  • Добавлена новая настройка: use_skip_indexes_in_final_exact_mode. Если запрос к таблице ReplacingMergeTree содержит клаузу FINAL, чтение только диапазонов таблицы на основе пропускающих индексов может привести к некорректному результату. Эта настройка позволяет гарантировать корректные результаты за счет сканирования более новых частей таблицы, которые пересекаются с диапазонами первичного ключа, возвращаемыми пропускающим индексом. Установите значение 0, чтобы отключить, и 1 — чтобы включить. #78350 (Shankar Iyer).
  • Функции кластерных таблиц объектного хранилища (например, s3Cluster) теперь распределяют файлы по репликам для чтения на основе консистентного хеша, чтобы улучшить локальность кэша. #77326 (Andrej Hoos).
  • Улучшена производительность S3Queue/AzureQueue за счёт возможности параллельной вставки данных (INSERT), которую можно включить с помощью настройки очереди parallel_inserts=true. Ранее S3Queue/AzureQueue могли выполнять в несколько потоков только первую часть конвейера (загрузка, парсинг), а INSERT выполнялся в одном потоке. При этом именно INSERT почти всегда является узким местом. Теперь производительность масштабируется почти линейно с числом потоков processing_threads_num. #77671 (Azat Khuzhin). Более справедливое ограничение max_processed_files_before_commit в S3Queue/AzureQueue. #79363 (Azat Khuzhin).
  • Введён порог (настраивается с помощью parallel_hash_join_threshold), при котором выполняется откат к алгоритму hash, если размер правой таблицы меньше порогового значения. #76185 (Nikita Taranov).
  • Теперь для определения размера задачи при чтении с включёнными параллельными репликами мы используем число реплик. Это обеспечивает более равномерное распределение нагрузки между репликами, когда объём данных для чтения не слишком велик. #78695 (Nikita Taranov).
  • Включена поддержка параллельного слияния состояний uniqExact на финальной стадии распределённой агрегации. #78703 (Nikita Taranov).
  • Исправлена возможная деградация производительности при параллельном слиянии состояний uniqExact для агрегации с ключом. #78724 (Nikita Taranov).
  • Снижено количество вызовов API List Blobs к хранилищу Azure. #78860 (Julia Kartseva).
  • Исправлена проблема с производительностью распределённого INSERT SELECT при использовании параллельных реплик. #79441 (Azat Khuzhin).
  • Предотвращено выполнение очистки в LogSeriesLimiter при каждом создании экземпляра, чтобы избежать конфликтов блокировок и деградации производительности в высококонкурентных сценариях. #79864 (filimonov).
  • Ускорены запросы за счет тривиальной оптимизации count. #79945 (Raúl Marín).
  • Улучшен инлайнинг некоторых операций с Decimal. #79999 (Konstantin Bogdanov).
  • По умолчанию включить параметр input_format_parquet_bloom_filter_push_down (значение true). Также исправить ошибку в истории изменений настроек. #80058 (Alexey Milovidov).
  • Оптимизированы мутации ALTER ... DELETE для кусков, в которых подлежат удалению все строки. Теперь в таких случаях вместо исходного куска сразу создаётся пустой кусок, и мутация не выполняется. #79307 (Anton Popov).
  • Избегать лишнего копирования блока при вставке в Compact-часть по возможности. #79536 (Pavel Kruglov).
  • Добавлена настройка input_format_max_block_size_bytes, позволяющая ограничить размер блоков, создаваемых во входных форматах, в байтах. Это помогает избежать избыточного потребления памяти при импорте данных, когда строки содержат большие значения. #79495 (Pavel Kruglov).
  • Удалены guard-страницы для потоков и async_socket_for_remote/use_hedge_requests. Изменён метод выделения памяти в FiberStack с mmap на aligned_alloc. Поскольку это дробит VMA, при высокой нагрузке может быть достигнут предел vm.max_map_count. #79147 (Sema Checherinda).
  • Ленивая материализация с параллельными репликами. #79401 (Igor Nikonov).

Улучшение

  • Добавлена возможность применять операции лёгкого удаления «на лету» (при настройках lightweight_deletes_sync = 0, apply_mutations_on_fly = 1). #79281 (Anton Popov).
  • Если данные в формате pretty выводятся в терминале и следующий блок имеет те же ширины столбцов, он может быть продолжением предыдущего блока, «склеивая» его с предыдущим за счет перемещения курсора вверх. Это закрывает #79333. Возможность управляется новой настройкой output_format_pretty_glue_chunks. #79339 (Alexey Milovidov).
  • Функция isIPAddressInRange расширена и теперь поддерживает типы данных String, IPv4, IPv6, Nullable(String), Nullable(IPv4) и Nullable(IPv6). #78364 (YjyJeff).
  • Добавлена возможность динамически изменять настройки пула подключений движка PostgreSQL. #78414 (Samay Sharma).
  • Добавлена возможность указывать _part_offset в обычной проекции. Это первый шаг к построению индекса проекции. Эту возможность можно использовать вместе с #58224, и она может помочь в решении #63207. #78429 (Amos Bird).
  • Добавлены новые столбцы (create_query и source) в таблицу system.named_collections. Закрывает #78179. #78582 (MikhailBurdukov).
  • В системной таблице system.query_condition_cache добавлено новое поле condition. Оно хранит условие в виде открытого текста, хэш которого используется в качестве ключа в кэше условий запроса. #78671 (Robert Schulze).
  • Индексы векторного сходства теперь можно создавать для столбцов типа BFloat16. #78850 (Robert Schulze).
  • Добавлена поддержка Unix-меток времени с дробной частью при разборе DateTime64 в режиме best-effort. #78908 (Pavel Kruglov).
  • В реализации delta-kernel хранилища DeltaLake исправлен режим сопоставления столбцов и добавлены тесты эволюции схемы. #78921 (Kseniia Sumarokova).
  • Улучшена вставка в столбец Variant в формате VALUES за счёт более корректного преобразования значений. #78923 (Pavel Kruglov).
  • Функция tokens была расширена и теперь принимает дополнительный аргумент «tokenizer», а также дополнительные аргументы, специфичные для выбранного токенизатора. #79001 (Elmi Ahmadov).
  • Оператор SHOW CLUSTER теперь разворачивает макросы (если они есть) в своём аргументе. #79006 (arf42).
  • Функции хеширования теперь поддерживают значения NULL внутри массивов, кортежей и отображений (map). (задачи #48365 и #48623). #79008 (Michael Kolupaev).
  • Обновить cctz до версии 2025a. #79043 (Raúl Marín).
  • Изменена обработка stderr по умолчанию для UDF на "log_last". Это повышает удобство использования. #79066 (Alexey Milovidov).
  • Сделать вкладки в веб-интерфейсе поддерживающими отмену действий. Это закрывает задачу #71284. #79084 (Alexey Milovidov).
  • Удалены настройки в ходе recoverLostReplica аналогично тому, как это было сделано в https://github.com/ClickHouse/ClickHouse/pull/78637. #79113 (Nikita Mikhaylov).
  • Добавлены события профилирования: ParquetReadRowGroups и ParquetPrunedRowGroups для профилирования отсечения по индексу Parquet. #79180 (flynn).
  • Поддержка выполнения команды ALTER для базы данных в кластере. #79242 (Tuan Pham Anh).
  • Явно пропускайте пропуски запусков сбора статистики для QueryMetricLog, иначе журналу потребуется много времени, чтобы догнать текущее время. #79257 (Mikhail Artemenko).
  • Небольшие оптимизации чтения форматов на основе Arrow. #79308 (Bharat Nallan).
  • Настройка allow_archive_path_syntax по ошибке была помечена как экспериментальная. Добавлен тест, чтобы предотвратить включение экспериментальных настроек по умолчанию. #79320 (Alexey Milovidov).
  • Параметры кэша страниц сделали настраиваемыми на уровне отдельного запроса. Это необходимо для более быстрого проведения экспериментов и возможности тонкой настройки запросов с высокой пропускной способностью и низкой задержкой. #79337 (Alexey Milovidov).
  • Не выводить числовые подсказки в «красивом» формате для чисел, которые выглядят как типичные 64-битные хэши. Это закрывает #79334. #79338 (Alexey Milovidov).
  • Цвета графиков на расширенных дашбордах будут рассчитываться на основе хеша соответствующего запроса. Это упрощает запоминание и поиск графика при прокрутке дашборда. #79341 (Alexey Milovidov).
  • Добавлена асинхронная метрика FilesystemCacheCapacity — общая ёмкость виртуальной файловой системы cache. Полезно для глобального мониторинга инфраструктуры. #79348 (Alexey Milovidov).
  • Оптимизирован доступ к system.parts (размеры столбцов и индексов читаются только при явном запросе). #79352 (Azat Khuzhin).
  • Вычислять только необходимые поля для запроса 'SHOW CLUSTER <name>' вместо всех полей. #79368 (Tuan Pham Anh).
  • Добавлена возможность указывать настройки хранилища для DatabaseCatalog. #79407 (Kseniia Sumarokova).
  • Добавлена поддержка локального хранилища в DeltaLake. #79416 (Kseniia Sumarokova).
  • Добавлена настройка уровня запроса для включения delta-kernel-rs: allow_experimental_delta_kernel_rs. #79418 (Kseniia Sumarokova).
  • Исправлена возможная ситуация с бесконечным циклом при перечислении блобов в хранилищах блобов Azure/S3. #79425 (Alexander Gololobov).
  • Добавлена настройка кеша файловой системы max_size_ratio_to_total_space. #79460 (Kseniia Sumarokova).
  • Для clickhouse-benchmark перенастроена опция reconnect, чтобы принимать значения 0, 1 или N, определяющие число переподключений. #79465 (Sachin Kumar Singh).
  • Разрешить ALTER TABLE ... MOVE|REPLACE PARTITION для таблиц, расположенных на разных дисках plain_rewritable. #79566 (Julia Kartseva).
  • Индекс векторного сходства теперь также используется, если опорный вектор имеет тип Array(BFloat16). #79745 (Shankar Iyer).
  • Добавлены столбцы last_error_message, last_error_trace и query_id в таблицу system.error_log. Связанный тикет #75816. #79836 (Andrei Tinikov).
  • По умолчанию включена отправка отчётов о сбоях. Это можно отключить в файле конфигурации сервера. #79838 (Alexey Milovidov).
  • Системная таблица system.functions теперь показывает, в какой версии ClickHouse функции впервые появились. #79839 (Robert Schulze).
  • Добавлена настройка access_control_improvements.enable_user_name_access_type. Эта настройка позволяет включать или отключать детализированные привилегии GRANT для пользователей и ролей, добавленные в https://github.com/ClickHouse/ClickHouse/pull/72246. Имеет смысл отключить эту настройку, если в кластере есть реплики версии ниже 25.1. #79842 (pufit).
  • Корректная реализация метода ASTSelectWithUnionQuery::clone() теперь также учитывает поле is_normalized. Это может помочь с #77569. #79909 (Nikita Mikhaylov).
  • Исправлено несогласованное форматирование некоторых запросов с оператором EXCEPT. Если левая часть оператора EXCEPT заканчивается на *, отформатированный запрос теряет круглые скобки и затем интерпретируется как * с модификатором EXCEPT. Эти запросы обнаруживаются фаззером и маловероятно, что они встретятся на практике. Это закрывает #79950. #79952 (Alexey Milovidov).
  • Небольшое улучшение разбора типа JSON за счёт использования кэша порядка десериализации вариантов. #79984 (Pavel Kruglov).
  • Добавлена настройка s3_slow_all_threads_after_network_error. #80035 (Vitaly Baranov).
  • Уровень логирования сообщений о выбранных для слияния частях был некорректным (Information). Закрывает #80061. #80062 (Alexey Milovidov).
  • trace-visualizer: добавить runtime/share во всплывающие подсказки и сообщения о статусе. #79040 (Sergei Trifonov).
  • trace-visualizer: загружать данные с сервера ClickHouse. #79042 (Sergei Trifonov).
  • Добавлены метрики для отслеживания неуспешных слияний. #79228 (Miсhael Stetsyuk).
  • clickhouse-benchmark будет отображать процент выполнения, исходя из максимального числа итераций, если оно задано. #79346 (Alexey Milovidov).
  • Добавлен визуализатор таблицы system.parts. #79437 (Sergei Trifonov).
  • Добавлен инструмент для анализа задержек запросов. #79978 (Sergei Trifonov).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлено переименование столбцов, отсутствующих в части. #76346 (Anton Popov).
  • Материализованное представление может начать работать слишком поздно, например после таблицы Kafka, которая передаёт в него данные. #72123 (Ilya Golshtein).
  • Исправлена перезапись запроса SELECT при создании VIEW с включённым анализатором. Закрывает #75956. #76356 (Dmitry Novik).
  • Исправлено применение настройки async_insert, получаемой с сервера (через apply_settings_from_server), которое ранее приводило к ошибкам Unknown packet 11 from server на клиенте. #77578 (Azat Khuzhin).
  • Исправлена проблема, из-за которой обновляемое материализованное представление в реплицируемой базе данных не работало на недавно добавленных репликах. #77774 (Michael Kolupaev).
  • Исправлена проблема, из-за которой обновляемые материализованные представления приводили к повреждению резервных копий. #77893 (Michael Kolupaev).
  • Устранена давняя логическая ошибка в функции transform. #78247 (Yarik Briukhovetskyi).
  • Исправлены некоторые случаи, когда вторичный индекс не применялся анализатором. Исправлены #65607, #69373. #78485 (Nikolai Kochetov).
  • Исправлена выгрузка событий профилирования (NetworkSendElapsedMicroseconds/NetworkSendBytes) для протокола HTTP с включённым сжатием (погрешность не должна превышать размер буфера, обычно около 1MiB). #78516 (Azat Khuzhin).
  • Исправлен анализатор, вызывавший LOGICAL_ERROR при JOIN ... USING с участием столбца ALIAS — теперь вместо этого выдаётся корректная ошибка. #78618 (Yakov Olkhovskiy).
  • Исправлен анализатор: CREATE VIEW ... ON CLUSTER завершался с ошибкой, если SELECT содержал позиционные параметры. #78663 (Yakov Olkhovskiy).
  • Исправлена ошибка Block structure mismatch при выполнении INSERT SELECT в табличную функцию с автоопределением схемы, если SELECT содержит скалярные подзапросы. #78677 (Pervakov Grigorii).
  • Исправлен анализатор запросов: при prefer_global_in_and_join = 1 для распределённой таблицы в запросе SELECT функция in должна быть заменена на globalIn. #78749 (Yakov Olkhovskiy).
  • Исправлено несколько типов запросов SELECT, читающих из таблиц с движком MongoDB или табличной функцией mongodb: запросы с неявным преобразованием константного значения в секции WHERE (например, WHERE datetime = '2025-03-10 00:00:00'); запросы с LIMIT и GROUP BY. Ранее они могли возвращать некорректный результат. #78777 (Anton Popov).
  • Исправлено преобразование между разными типами JSON. Теперь оно выполняется простым приведением типов через преобразование к/от String. Это менее эффективно, но на 100% корректно. #78807 (Pavel Kruglov).
  • Исправлена логическая ошибка при преобразовании типа Dynamic в Interval. #78813 (Pavel Kruglov).
  • Исправлен откат столбца при ошибке парсинга JSON. #78836 (Pavel Kruglov).
  • Исправлена ошибка «bad cast» при выполнении join с использованием константного столбца-псевдонима. #78848 (Vladimir Cherkasov).
  • Не разрешать использование PREWHERE в материализованных представлениях для столбцов, у которых в представлении и целевой таблице разные типы. #78889 (Pavel Kruglov).
  • Исправлена логическая ошибка при разборе некорректных бинарных данных столбца типа Variant. #78982 (Pavel Kruglov).
  • Выбрасывать исключение, если размер пакета Parquet установлен в 0. Ранее при output_format_parquet_batch_size = 0 ClickHouse зависал. Теперь это поведение исправлено. #78991 (daryawessely).
  • Исправлена десериализация дискриминаторов типа Variant в базовом формате в компактных партах. Ошибка была внесена в https://github.com/ClickHouse/ClickHouse/pull/55518. #79000 (Pavel Kruglov).
  • Словари типа complex_key_ssd_cache теперь отклоняют нулевые или отрицательные значения параметров block_size и write_buffer_size (issue #78314). #79028 (Elmi Ahmadov).
  • Избегайте использования Field для неагрегированных столбцов в SummingMergeTree. Это может привести к неожиданным ошибкам при работе с типами Dynamic/Variant, которые используются в SummingMergeTree. #79051 (Pavel Kruglov).
  • Исправлено чтение из материализованного представления с распределённой целевой таблицей и отличающимся заголовком в анализаторе. #79059 (Pavel Kruglov).
  • Исправляет ошибку, из-за которой arrayUnion() возвращал лишние (некорректные) значения в таблицах при пакетных вставках. Исправляет #75057. #79079 (Peter Nguyen).
  • Исправлена ошибка сегментации в OpenSSLInitializer. Закрывает #79092. #79097 (Konstantин Bogdanov).
  • Всегда задавайте префикс для операции ListObject в S3. #79114 (Azat Khuzhin).
  • Исправляет ошибку, из-за которой arrayUnion() возвращала лишние (некорректные) значения в таблицах, в которые выполнялись пакетные вставки. Исправляет #79157. #79158 (Peter Nguyen).
  • Исправлена логическая ошибка после проталкивания фильтра. #79164 (Pervakov Grigorii).
  • Исправлена работа движка таблиц DeltaLake с реализацией delta-kernel при использовании через HTTP-эндпоинты, а также исправлен NOSIGN. Закрывает #78124. #79203 (Kseniia Sumarokova).
  • Исправление в Keeper: предотвращено срабатывание watch-уведомлений при неуспешных multi-запросах. #79247 (Antonio Andelic).
  • Запретить использование типов Dynamic и JSON в выражении IN. При текущей реализации IN это может приводить к некорректным результатам. Корректная поддержка этих типов в IN сложна и может быть реализована в будущем. #79282 (Pavel Kruglov).
  • Исправлена проверка на дублирующиеся пути при разборе типа JSON. #79317 (Pavel Kruglov).
  • Исправлены проблемы с подключением SecureStreamSocket. #79383 (Konstantin Bogdanov).
  • Исправлена проблема с загрузкой дисков plain_rewritable, содержащих данные. #79439 (Julia Kartseva).
  • Исправлен сбой при динамическом обнаружении подстолбцов в Wide‑частях таблиц MergeTree. #79466 (Pavel Kruglov).
  • Проверяйте длину имени таблицы только для первичных запросов CREATE. Не выполняйте эту проверку для последующих запросов CREATE, чтобы избежать проблем с обратной совместимостью. #79488 (Miсhael Stetsyuk).
  • Исправлена ошибка Block structure mismatch в ряде случаев при работе с таблицами с разрежёнными столбцами. #79491 (Anton Popov).
  • Исправлены два случая, приводившие к ошибке "Logical Error: Can't set alias of * of Asterisk on alias". #79505 (Raúl Marín).
  • Исправлено использование некорректных путей при переименовании базы данных Atomic. #79569 (Tuan Pham Anh).
  • Исправлена работа ORDER BY по JSON-столбцу совместно с другими столбцами. #79591 (Pavel Kruglov).
  • Исправлено дублирование результатов при чтении с удалённого сервера при отключённых use_hedged_requests и allow_experimental_parallel_reading_from_replicas. #79599 (Eduard Karacharov).
  • Исправлено аварийное завершение работы реализации delta-kernel при использовании Unity Catalog. #79677 (Kseniia Sumarokova).
  • Реализовано разрешение макросов для кластеров автообнаружения. #79696 (Anton Ivashkin).
  • Корректно обрабатываются случаи некорректной настройки параметра page_cache_limits. #79805 (Bharat Nallan).
  • Исправляет результат работы SQL‑функции formatDateTime, если спецификатор формата переменной длины (например, %W, он же день недели — Monday, Tuesday и т. д.) следует за составным спецификатором формата (который выводит сразу несколько компонентов, например, %D, он же американский формат даты 05/04/25). #79835 (Robert Schulze).
  • IcebergS3 поддерживает оптимизацию подсчёта, а IcebergS3Cluster — нет. В результате значение count(), возвращаемое в кластерном режиме, может быть кратно количеству реплик. #79844 (wxybear).
  • Исправляет ошибку AMBIGUOUS_COLUMN_NAME при отложенной материализации, если до применения проекции ни один столбец не используется при выполнении запроса. Например, SELECT * FROM t ORDER BY rand() LIMIT 5. #79926 (Igor Nikonov).
  • Пароль в запросе CREATE DATABASE datalake ENGINE = DataLakeCatalog(\'http://catalog:8181\', \'admin\', \'password\') теперь скрывается. #79941 (Han Fei).
  • Добавлена возможность указывать псевдоним в JOIN USING. Указывайте этот псевдоним, если столбец был переименован (например, из‑за ARRAY JOIN). Это исправляет #73707. #79942 (Nikolai Kochetov).
  • Обеспечена корректная работа материализованных представлений с UNION на новых репликах. #80037 (Samay Sharma).
  • Спецификатор формата %e в SQL‑функции parseDateTime теперь распознаёт однозначные значения дня месяца (например, 3), тогда как ранее требовался ведущий пробел (например, 3). Это делает его поведение совместимым с MySQL. Чтобы сохранить прежнее поведение, установите настройку parsedatetime_e_requires_space_padding = 1. (issue #78243). #80057 (Robert Schulze).
  • Исправлено появление предупреждений Cannot find 'kernel' in '[...]/memory.stat' в логах ClickHouse (issue #77410). #80129 (Robert Schulze).
  • Проверяется размер стека в FunctionComparison, чтобы избежать аварийного завершения работы из-за переполнения стека. #78208 (Julia Kartseva).
  • Исправлено состояние гонки при выполнении запроса SELECT из system.workloads. #78743 (Sergei Trifonov).
  • Исправление: ленивая материализация в распределённых запросах. #78815 (Igor Nikonov).
  • Исправлено преобразование из Array(Bool) в Array(FixedString). #78863 (Nikita Taranov).
  • Выбор версии Parquet сделан менее запутанным. #78818 (Michael Kolupaev).
  • Исправлено слияние ReservoirSampler с самим собой. #79031 (Nikita Taranov).
  • Исправлено хранение таблицы вставки в клиентском контексте. #79046 (Pervakov Grigorii).
  • Исправлен порядок уничтожения членов данных классов AggregatingSortedAlgorithm и SummingSortedAlgorithm. #79056 (Nikita Taranov).
  • enable_user_name_access_type не должен влиять на тип доступа DEFINER. #80026 (pufit).
  • Запрос к системной базе данных может зависать, если метаданные системной базы данных хранятся в Keeper. #79304 (Mikhail Artemenko).

Улучшения сборки/тестирования/упаковки

  • Реализована возможность повторного использования уже собранного бинарного файла chcache вместо его пересборки при каждом запуске. #78851 (János Benjamin Antal).
  • Добавлено ожидание паузы в NATS. #78987 (Dmitry Novikov).
  • Исправлена некорректная публикация ARM-сборки как amd64compat. #79122 (Alexander Gololobov).
  • Используется заранее сгенерированный ассемблерный код для OpenSSL. #79386 (Konstantin Bogdanov).
  • Исправления, позволяющие собирать с clang20. #79588 (Konstantin Bogdanov).
  • chcache: поддержка кэширования на Rust. #78691 (Konstantin Bogdanov).
  • Добавлена информация для раскрутки стека (unwind information) для ассемблерных файлов zstd. #79288 (Michael Kolupaev).

Релиз ClickHouse 25.4, 2025-04-22

Обратные несовместимые изменения

  • Проверяется, что все столбцы в материализованном представлении соответствуют целевой таблице, если allow_materialized_view_with_bad_select равен false. #74481 (Christoph Wurm).
  • Исправлены случаи, когда dateTrunc используется с отрицательными аргументами Date/DateTime. #77622 (Yarik Briukhovetskyi).
  • Устаревшая интеграция с MongoDB была удалена. Настройка сервера use_legacy_mongodb_integration устарела и теперь не оказывает никакого эффекта. #77895 (Robert Schulze).
  • Улучшена проверка SummingMergeTree, чтобы пропускать агрегацию для столбцов, используемых в ключах партиционирования или сортировки. #78022 (Pervakov Grigorii).

Новая возможность

  • Добавлено планирование слотов CPU для рабочих нагрузок, подробнее см. в документации. #77595 (Sergei Trifonov).
  • clickhouse-local будет сохранять базы данных после перезапуска, если указать аргумент командной строки --path. Тем самым закрывается #50647. Тем самым закрывается #49947. #71722 (Alexey Milovidov).
  • Отклонять запросы, когда сервер перегружен. Решение принимается на основе отношения времени ожидания (OSCPUWaitMicroseconds) к времени занятости (OSCPUVirtualTimeMicroseconds). Запрос с некоторой вероятностью отклоняется, если это отношение находится в диапазоне между min_os_cpu_wait_time_ratio_to_throw и max_os_cpu_wait_time_ratio_to_throw (это настройки на уровне запроса). #63206 (Alexey Katsman).
  • Путешествие во времени в Iceberg: добавлена настройка для выполнения запросов к таблицам Iceberg по состоянию на указанный момент времени. #71072 (Brett Hoerner). #77439 (Daniil Ivanik).
  • Кэш метаданных Iceberg в памяти, который хранит файлы манифестов и их список, а также metadata.json, чтобы ускорить выполнение запросов. #77156 (Han Fei).
  • Добавлена поддержка движка таблицы DeltaLake для Azure Blob Storage. Исправлено #68043. #74541 (Smita Kulkarni).
  • Добавлен кэш в оперативной памяти для десериализованных индексов поиска по сходству векторов. Это должно ускорить повторные запросы приблизительного поиска ближайших соседей (ANN). Размер нового кэша управляется настройками сервера vector_similarity_index_cache_size и vector_similarity_index_cache_max_entries. Эта функция заменяет механизм кэширования пропускающих индексов, использовавшийся в более ранних версиях. #77905 (Shankar Iyer).
  • Реализована поддержка отсечения партиций (partition pruning) в DeltaLake. #78486 (Kseniia Sumarokova).
  • Поддержка фонового обновления в таблицах MergeTree только для чтения, что позволяет выполнять запросы к обновляемым таблицам с неограниченным количеством распределённых читателей (нативное дата-озеро ClickHouse). #76467 (Alexey Milovidov).
  • Поддержка использования кастомных дисков для хранения файлов метаданных баз данных. Сейчас это можно настроить только на уровне всего сервера. #77365 (Tuan Pham Anh).
  • Добавлена поддержка ALTER TABLE ... ATTACH|DETACH|MOVE|REPLACE PARTITION для диска plain_rewritable. #77406 (Julia Kartseva).
  • Добавлены параметры таблицы для настройки SASL и учетных данных в движок таблиц Kafka. Это позволяет настраивать аутентификацию на основе SASL для Kafka и совместимых с Kafka систем непосредственно в инструкции CREATE TABLE, вместо использования файлов конфигурации или именованных коллекций. #78810 (Christoph Wurm).
  • Добавлена возможность задавать default_compression_codec для таблиц MergeTree: он используется, когда в CREATE-запросе явно не задан кодек для указанных столбцов. Это закрывает #42005. #66394 (gvoelfin).
  • Добавьте параметр bind_host в конфигурацию кластеров, чтобы ClickHouse мог использовать конкретную сеть для распределённых подключений. #74741 (Todd Yocum).
  • В таблицу system.tables добавлен новый столбец parametrized_view_parameters. Закрывает https://github.com/clickhouse/clickhouse/issues/66756. #75112 (NamNguyenHoai).
  • Разрешить изменение комментария базы данных. Закрывает #73351 ### Запись в документации об изменениях, видимых пользователям. #75622 (NamNguyenHoai).
  • Реализована поддержка аутентификации SCRAM-SHA-256 в протоколе совместимости PostgreSQL. #76839 (scanhex12).
  • Добавлены функции arrayLevenshteinDistance, arrayLevenshteinDistanceWeighted и arraySimilarity. #77187 (Mikhail f. Shiryaev).
  • Настройка parallel_distributed_insert_select теперь применяется к INSERT SELECT в ReplicatedMergeTree (ранее для этого требовались таблицы движка Distributed). #78041 (Igor Nikonov).
  • Добавлена функция toInterval. Функция принимает два аргумента (значение и единицу измерения) и преобразует значение в соответствующий тип Interval. #78723 (Andrew Davis).
  • Добавлено несколько удобных способов задания корневого файла metadata.json в табличной функции и движке Iceberg. Закрывает #78455. #78475 (Daniil Ivanik).
  • Добавлена поддержка аутентификации по паролю в протоколе SSH в ClickHouse. #78586 (Nikita Mikhaylov).

Экспериментальная функциональность

  • Поддержка коррелированных подзапросов в качестве аргумента выражения EXISTS в предложении WHERE. Закрывает #72459. #76078 (Dmitry Novik).
  • Добавлены функции sparseGrams и sparseGramsHashes с вариантами для ASCII и UTF-8. Автор: scanhex12. #78176 (Pervakov Grigorii). Не используйте эти функции: реализация будет изменена в последующих версиях.

Повышение производительности

  • Оптимизируйте производительность с помощью «ленивых» столбцов, которые читают данные после применения ORDER BY и LIMIT. #55518 (Xiaozhe Yu).
  • Включено кеширование условий запроса по умолчанию. #79080 (Alexey Milovidov).
  • Ускорено построение результата JOIN за счёт девиртуализации вызовов col->insertFrom(). #77350 (Alexander Gololobov).
  • Объединять условия равенства из шага плана запроса filter с условием JOIN, если возможно, чтобы их можно было использовать как ключи хеш-таблицы. #78877 (Dmitry Novik).
  • Используйте динамический шардинг для JOIN, если ключ JOIN является префиксом первичного ключа (PK) для обеих таблиц. Эта оптимизация включается настройкой query_plan_join_shard_by_pk_ranges (по умолчанию отключена). #74733 (Nikolai Kochetov).
  • Добавлена поддержка отсечения данных в Iceberg на основе нижних и верхних граничных значений столбцов. Исправлена проблема #77638. #78242 (alesapin).
  • Реализована простая оптимизация подсчёта для Iceberg. Теперь запросы с count() и без каких‑либо фильтров должны выполняться быстрее. Закрывает #77639. #78090 (alesapin).
  • Добавлена возможность настроить количество столбцов, которые при слияниях могут сбрасываться параллельно, с помощью max_merge_delayed_streams_for_parallel_write (это должно примерно в 25 раз снизить потребление памяти для вертикальных слияний в S3). #77922 (Azat Khuzhin).
  • Отключайте filesystem_cache_prefer_bigger_buffer_size, когда кэш используется пассивно, например для слияний. Это снижает потребление памяти при выполнении слияний. #77898 (Kseniia Sumarokova).
  • Теперь мы используем количество реплик для определения размера задачи чтения при включённых параллельных репликах. Это обеспечивает более равномерное распределение работы между репликами, когда объём читаемых данных не слишком велик. #78695 (Nikita Taranov).
  • Добавлена поддержка асинхронной предварительной выборки (prefetch) операций ввода-вывода для формата ORC, что повышает общую производительность за счет скрытия задержок удаленного ввода-вывода. #70534 (李扬).
  • Предварительно выделять память для асинхронных вставок, чтобы повысить производительность. #74945 (Ilya Golshtein).
  • Уменьшено количество запросов к Keeper за счет замены одиночных запросов get на multiRead там, где он доступен, поскольку при увеличении числа реплик такие запросы могли создавать значительную нагрузку на Keeper. #56862 (Nikolay Degterinsky).
  • Незначительная оптимизация для выполнения функций с аргументами типа Nullable. #76489 (李扬).
  • Оптимизирован arraySort. #76850 (李扬).
  • Объединяйте метки одной и той же части и за один раз записывайте их в кэш условий запроса, чтобы сократить использование блокировок. #77377 (zhongyuankai).
  • Оптимизирована производительность s3Cluster для запросов с одним раскрытием скобок. #77686 (Tomáš Hromada).
  • Оптимизирован ORDER BY по одиночным столбцам типа Nullable или LowCardinality. #77789 (李扬).
  • Оптимизировано использование памяти форматом Native. #78442 (Azat Khuzhin).
  • Тривиальная оптимизация: не переписывать count(if(...)) в countIf, если требуется приведение типов. Закрывает #78564. #78565 (李扬).
  • Функция hasAll теперь может использовать полнотекстовые пропускающие индексы tokenbf_v1, ngrambf_v1. #77662 (UnamedRus).
  • Индекс векторного сходства мог выделять в оперативной памяти до двух раз больше ресурсов, чем требовалось. Это исправление изменяет стратегию выделения памяти, снижая ее потребление и повышая эффективность кэша индекса векторного сходства (issue #78056). #78394 (Shankar Iyer).
  • Добавлен параметр schema_type для таблицы system.metric_log, определяющий тип схемы. Допустимы три схемы: wide — текущая схема, каждая метрика/каждое событие в отдельном столбце (наиболее эффективна для чтения отдельных столбцов), transposed — аналогично system.asynchronous_metric_log, метрики/события хранятся по строкам, и самая интересная — transposed_with_wide_view: создаётся подлежащая таблица со схемой transposed, но также добавляется представление со схемой wide, которое транслирует запросы в подлежащую таблицу. В transposed_with_wide_view субсекундное разрешение для представления не поддерживается, event_time_microseconds является лишь псевдонимом для сохранения обратной совместимости. #78412 (alesapin).

Улучшение

  • Сериализация плана запроса для запросов к Distributed. Добавлена новая настройка serialize_query_plan. При ее включении запросы к таблице Distributed будут использовать сериализованный план запроса для удаленного выполнения. Это добавляет новый тип пакета в протокол TCP; для разрешения обработки этого пакета в конфигурацию сервера необходимо добавить <process_query_plan_packet>true</process_query_plan_packet>. #69652 (Nikolai Kochetov).
  • Добавлена поддержка чтения типа JSON и его подстолбцов из представлений. #76903 (Pavel Kruglov).
  • Добавлена поддержка ALTER DATABASE ... ON CLUSTER. #79242 (Tuan Pham Anh).
  • Операции обновления обновляемых материализованных представлений теперь отображаются в таблице system.query_log. #71333 (Michael Kolupaev).
  • Пользовательские функции (UDF) теперь можно помечать как детерминированные с помощью нового параметра в их конфигурации. Кроме того, кэш запросов теперь проверяет, являются ли вызываемые в запросе UDF детерминированными. В этом случае результат запроса кэшируется. (Issue #59988). #77769 (Jimmy Aguilar Mena).
  • Включена логика backoff для всех типов задач репликации. Это позволит снизить нагрузку на CPU, потребление памяти и размеры файлов логов. Добавлены новые настройки max_postpone_time_for_failed_replicated_fetches_ms, max_postpone_time_for_failed_replicated_merges_ms и max_postpone_time_for_failed_replicated_tasks_ms, аналогичные max_postpone_time_for_failed_mutations_ms. #74576 (MikhailBurdukov).
  • Добавлен query_id в таблицу system.errors. Закрывает #75815. #76581 (Vladimir Baikov).
  • Добавлена поддержка преобразования UInt128 в IPv6. Это позволяет выполнять операцию bitAnd и арифметические операции для IPv6, а также преобразовывать результат обратно в IPv6. Закрывает #76752. См. также #57707. #76928 (Muzammil Abdul Rehman).
  • По умолчанию специальные значения Bool в текстовых форматах внутри типа Variant не разбираются. Это поведение можно включить с помощью настройки allow_special_bool_values_inside_variant. #76974 (Pavel Kruglov).
  • Добавлена поддержка настраиваемого времени ожидания для задач низкоприоритетных запросов на уровне сессии и сервера. #77013 (VicoWu).
  • Реализовано сравнение значений типа данных JSON. Теперь объекты JSON можно сравнивать так же, как Map. #77397 (Pavel Kruglov).
  • Улучшена поддержка прав доступа в system.kafka_consumers. Пробрасываются внутренние ошибки librdkafka (стоит отметить, что эта библиотека оставляет желать лучшего). #77700 (Ilya Golshtein).
  • Добавлена проверка настроек движка таблицы Buffer. #77840 (Pervakov Grigorii).
  • Добавлен параметр конфигурации enable_hdfs_pread для включения или отключения pread в HDFS. #77885 (kevinyhzou).
  • Добавлены события профилирования для количества multi-запросов чтения и записи в ZooKeeper. #77888 (JackyWoo).
  • Разрешить создание и вставку данных во временные таблицы, когда включён disable_insertion_and_mutation. #77901 (Xu Jia).
  • Уменьшено значение параметра max_insert_delayed_streams_for_parallel_write (до 100). #77919 (Azat Khuzhin).
  • Исправлен разбор года в синтаксисе Joda (это из мира Java, если вам интересно), например для шаблона yyy. #77973 (李扬).
  • Присоединение частей таблиц MergeTree будет выполняться в порядке следования блоков, что важно для специальных алгоритмов слияния, например ReplacingMergeTree. Это закрывает #71009. #77976 (Alexey Milovidov).
  • Правила маскировки запросов теперь могут генерировать LOGICAL_ERROR в случае, если произошло совпадение. Это поможет проверить, не утекает ли заранее заданный пароль куда-либо в логах. #78094 (Nikita Mikhaylov).
  • Добавлен столбец index_length_column в information_schema.tables для повышения совместимости с MySQL. #78119 (Paweł Zakrzewski).
  • Добавлены две новые метрики: TotalMergeFailures и NonAbortedMergeFailures. Эти метрики нужны для выявления случаев, когда слишком много слияний завершается с ошибкой в течение короткого промежутка времени. #78150 (Miсhael Stetsyuk).
  • Исправлен некорректный разбор URL‑адресов S3, когда ключ не задан в URL в стиле path. #78185 (Arthur Passos).
  • Исправлены некорректные значения асинхронных метрик BlockActiveTime, BlockDiscardTime, BlockWriteTime, BlockQueueTime и BlockReadTime (до изменения 1 секунда ошибочно сообщалась как 0.001). #78211 (filimonov).
  • Учитывается лимит loading_retries при возникновении ошибок во время отправки данных в материализованное представление для StorageS3(Azure)Queue. Ранее такие ошибки повторялись неограниченное количество раз. #78313 (Kseniia Sumarokova).
  • В Delta Lake с реализацией delta-kernel-rs улучшена производительность и исправлен индикатор прогресса. #78368 (Kseniia Sumarokova).
  • Добавлена поддержка директив include, from_env и from_zk для runtime-дисков. Закрывает #78177. #78470 (Kseniia Sumarokova).
  • Добавлено динамическое предупреждение в таблицу system.warnings для долго выполняющихся мутаций. #78658 (Bharat Nallan).
  • Добавлено поле condition в системную таблицу system.query_condition_cache. В нём хранится условие в открытом виде, хэш которого используется как ключ в кэше условий запросов. #78671 (Robert Schulze).
  • Разрешено использование пустого значения для секционирования Hive. #78816 (Arthur Passos).
  • Исправлено приведение типов в операторе IN для BFloat16 (то есть теперь SELECT toBFloat16(1) IN [1, 2, 3]; возвращает 1). Закрывает #78754. #78839 (Raufs Dunamalijevs).
  • Не проверять части на других дисках в MergeTree при указании disk = .... #78855 (Azat Khuzhin).
  • Сделать так, чтобы типы данных в used_data_type_families в system.query_log записывались в виде канонических имён. #78972 (Kseniia Sumarokova).
  • Очистка настроек при recoverLostReplica выполнена так же, как и в #78637. #79113 (Nikita Mikhaylov).
  • Использовать столбцы вставляемых данных для вывода схемы INFILE. #78490 (Pervakov Grigorii).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлен некорректный анализ проекций при использовании count(Nullable) в агрегатных проекциях, что устраняет проблему #74495. В этот PR также добавлены дополнительные логи в процессе анализа проекций, чтобы прояснить, почему проекция используется или не используется. #74498 (Amos Bird).
  • Исправлена проблема Part <...> does not contain in snapshot of previous virtual parts. (PART_IS_TEMPORARILY_LOCKED) при выполнении DETACH PART. #76039 (Aleksei Filatov).
  • Исправлена некорректная работа пропускающих индексов с выражением, содержащим литералы, в анализаторе, а также удалены тривиальные приведения типов при анализе индексов. #77229 (Pavel Kruglov).
  • Исправлена ошибка, из-за которой параметр запроса close_session не имел эффекта, вследствие чего именованные сессии закрывались только после session_timeout. #77336 (Alexey Katsman).
  • Исправлено получение сообщений с сервера NATS без присоединённых материализованных представлений. #77392 (Dmitry Novikov).
  • Исправлена логическая ошибка при чтении из пустого FileLog с помощью табличной функции merge, закрыта #75575. #77441 (Vladimir Cherkasov).
  • Использовать настройки формата по умолчанию при сериализации Dynamic из общего варианта. #77572 (Pavel Kruglov).
  • Исправлена проверка наличия пути к данным таблицы на локальном диске. #77608 (Tuan Pham Anh).
  • Исправлена отправка константных значений на удалённый сервер для некоторых типов данных. #77634 (Pavel Kruglov).
  • Исправлен сбой из‑за истёкшего контекста в S3/AzureQueue. #77720 (Kseniia Sumarokova).
  • Скрывать учетные данные в табличных движках RabbitMQ, Nats, Redis и AzureQueue. #77755 (Kseniia Sumarokova).
  • Исправлено неопределённое поведение при сравнении значений NaN в argMin/argMax. #77756 (Raúl Marín).
  • Регулярно проверяйте, были ли слияния и мутации отменены, даже если операция не порождает блоков для записи. #77766 (János Benjamin Antal).
  • Исправлена проблема, когда обновляемое материализованное представление в реплицируемой базе данных не работало на новых репликах. #77774 (Michael Kolupaev).
  • Исправлено возможное падение при возникновении ошибки NOT_FOUND_COLUMN_IN_BLOCK. #77854 (Vladimir Cherkasov).
  • Исправлен сбой в S3/AzureQueue при заполнении данных. #77878 (Bharat Nallan).
  • Отключён нечеткий поиск по истории в SSH-сервере (так как для него требуется библиотека skim). #78002 (Azat Khuzhin).
  • Исправляет ошибку, при которой запрос векторного поиска по неиндексированному столбцу возвращал некорректные результаты, если в таблице был другой векторный столбец с заданным индексом векторного сходства. (Issue #77978). #78069 (Shankar Iyer).
  • Исправлена незначительная ошибка в сообщении запроса "The requested output format is binary... Do you want to output it anyway? [y/N]". #78095 (Azat Khuzhin).
  • Исправление ошибки в случае использования toStartOfInterval с аргументом origin, равным нулю. #78096 (Yarik Briukhovetskyi).
  • Запрещено задавать пустой параметр запроса session_id в HTTP-интерфейсе. #78098 (Alexey Katsman).
  • Исправлена перезапись метаданных в базе данных Replicated, которая могла произойти из-за выполнения запроса RENAME сразу после запроса ALTER. #78107 (Nikolay Degterinsky).
  • Устранён сбой в движке NATS. #78108 (Dmitry Novikov).
  • Больше не выполняется попытка создать history_file во встроенном SSH-клиенте (в предыдущих версиях создание всегда завершалось неудачей, хотя попытка предпринималась). #78112 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой system.detached_tables отображала некорректную информацию после запросов RENAME DATABASE или DROP TABLE. #78126 (Nikolay Degterinsky).
  • Исправлены проверки на слишком большое количество таблиц в базе данных Replicated после #77274. Также проверка теперь выполняется до создания хранилища, чтобы избежать создания неучтённых узлов в Keeper в случае ReplicatedMergeTree или KeeperMap. #78127 (Nikolay Degterinsky).
  • Исправлено возможное аварийное завершение из-за конкурентной инициализации метаданных S3Queue. #78131 (Azat Khuzhin).
  • Функции groupArray* теперь выдают ошибку BAD_ARGUMENTS для значения 0 типа Int в аргументе max_size (как уже делается для значения типа UInt), вместо попытки выполнить их с этим значением. #78140 (Eduard Karacharov).
  • Предотвращено падение при восстановлении потерянной реплики, если локальная таблица была удалена до её отсоединения. #78173 (Raúl Marín).
  • Исправлена ошибка, из-за которой столбец "alterable" в system.s3_queue_settings всегда возвращал false. #78187 (Kseniia Sumarokova).
  • Скрывать подпись доступа Azure, чтобы она не отображалась пользователю и не попадала в логи. #78189 (Kseniia Sumarokova).
  • Исправлена предвыборка подпотоков с префиксами в частях Wide. #78205 (Pavel Kruglov).
  • Исправлены падения и некорректные результаты для mapFromArrays в случае, когда массив ключей имеет тип LowCardinality(Nullable). #78240 (Eduard Karacharov).
  • Исправлены параметры аутентификации для delta-kernel-rs. #78255 (Kseniia Sumarokova).
  • Не планировать задачу Refreshable Materialized Views, если у реплики параметр disable_insertion_and_mutation имеет значение true. Задача выполняет вставку, и она завершится с ошибкой, если disable_insertion_and_mutation равно true. #78277 (Xu Jia).
  • Проверка доступа к исходным таблицам для движка Merge. #78339 (Pervakov Grigorii).
  • Модификатор FINAL можно опускать при выполнении запросов к таблице Distributed. #78428 (Yakov Olkhovskiy).
  • bitmapMin возвращает uint32_max, когда битовая карта пуста (и uint64_max, когда тип входных данных шире), что соответствует поведению минимального значения пустого roaring_bitmap. #78444 (wxybear).
  • Отключена параллелизация обработки запроса сразу после чтения FROM при включённом режиме distributed_aggregation_memory_efficient, так как это может приводить к логической ошибке. Закрывает #76934. #78500 (flynn).
  • Устанавливается как минимум один поток чтения на случай, если после применения настройки max_streams_to_max_threads_ratio не останется ни одного запланированного потока. #78505 (Eduard Karacharov).
  • В хранилище S3Queue исправлена логическая ошибка «Cannot unregister: table uuid is not registered». Закрывает #78285. #78541 (Kseniia Sumarokova).
  • ClickHouse теперь умеет определять свой cgroup v2 на системах, где одновременно используются cgroups v1 и v2. #78566 (Grigory Korolev).
  • Табличные функции -Cluster завершались с ошибкой при использовании настроек на уровне таблицы. #78587 (Daniil Ivanik).
  • Улучшены проверки в случаях, когда движок ReplicatedMergeTree не поддерживает транзакции при выполнении операций INSERT. #78633 (Azat Khuzhin).
  • Очистка настроек запроса при выполнении ATTACH. #78637 (Raúl Marín).
  • Исправлено аварийное завершение при указании недопустимого пути в iceberg_metadata_file_path. #78688 (alesapin).
  • В движке таблицы DeltaLake с реализацией delta-kernel-s исправлена ситуация, когда схема чтения отличается от схемы таблицы и при этом присутствуют столбцы партиционирования, что приводило к ошибке «not found column». #78690 (Kseniia Sumarokova).
  • Исправлена проблема, при которой после планирования закрытия именованной сессии (но до истечения тайм-аута) создание новой именованной сессии с тем же именем приводило к её закрытию в момент, на который было запланировано закрытие первой сессии. #78698 (Alexey Katsman).
  • Исправлено несколько типов запросов SELECT, которые читают из таблиц с движком MongoDB или табличной функцией mongodb: запросы с неявным преобразованием константного значения в предложении WHERE (например, WHERE datetime = '2025-03-10 00:00:00'); запросы с LIMIT и GROUP BY. Ранее они могли возвращать неверный результат. #78777 (Anton Popov).
  • Не блокировать остановку таблицы во время выполнения команды CHECK TABLE. #78782 (Raúl Marín).
  • Keeper: скорректирован подсчёт эфемерных узлов во всех случаях. #78799 (Antonio Andelic).
  • Исправлено некорректное приведение типов в StorageDistributed при использовании табличных функций, отличных от view. Закрывает #78464. #78828 (Konstantin Bogdanov).
  • Унифицировано форматирование для tupleElement(*, 1). Закрывает #78639. #78832 (Konstantin Bogdanov).
  • Словари типа ssd_cache теперь отклоняют нулевые или отрицательные значения параметров block_size и write_buffer_size (#78314). #78854 (Elmi Ahmadov).
  • Исправлено падение обновляемого материализованного представления в случае выполнения ALTER после некорректного завершения работы. #78858 (Azat Khuzhin).
  • Исправлен разбор некорректных значений DateTime в формате CSV. #78919 (Pavel Kruglov).
  • Исправление в Keeper: исключено срабатывание наблюдателей при неуспешных multi-запросах. #79247 (Antonio Andelic).
  • Исправлена ошибка чтения таблицы Iceberg, возникавшая, когда значение min-max указывалось явно, но было равно NULL. Отмечено, что библиотека Go Iceberg генерировала настолько некорректные файлы. Закрывает #78740. #78764 (flynn).

Улучшения сборки/тестирования/упаковки

  • Учитываются целевые возможности CPU в Rust и LTO включён во всех крейтах. #78590 (Raúl Marín).

Релиз ClickHouse 25.3 LTS, 2025-03-20

Обратно несовместимое изменение

Новая возможность

  • Тип данных JSON готов к промышленной эксплуатации. См. https://jsonbench.com/. Типы данных Dynamic и Variant готовы к промышленной эксплуатации. #77785 (Alexey Milovidov).
  • Добавлена поддержка протокола SSH для clickhouse-server. Теперь к ClickHouse можно подключаться с помощью любого SSH-клиента. Тем самым закрывается задача: #74340. #74989 (George Gamezardashvili).
  • Заменяет табличные функции их вариантами -Cluster, если задействованы параллельные реплики. Исправляет #65024. #70659 (Konstantin Bogdanov).
  • Новая реализация Userspace Page Cache, которая позволяет кэшировать данные в памяти процесса вместо использования кэша страниц ОС, что полезно, когда данные хранятся на удалённой виртуальной файловой системе без локального файлового кэша. #70509 (Michael Kolupaev).
  • Добавлен серверный параметр concurrent_threads_scheduler, управляющий распределением слотов CPU между одновременными запросами. Может принимать значения round_robin (предыдущее поведение) или fair_round_robin, чтобы устранить проблему несправедливого распределения CPU между запросами INSERT и SELECT. #75949 (Sergei Trifonov).
  • Добавлена агрегатная функция estimateCompressionRatio #70801. #76661 (Tariq Almawash).
  • Добавлена функция arraySymmetricDifference. Она возвращает все элементы из нескольких массивов-аргументов, которые не содержатся во всех массивах одновременно. Пример: SELECT arraySymmetricDifference([1, 2], [2, 3]) возвращает [1, 3]. (issue #61673). #76231 (Filipp Abapolov).
  • Добавлена возможность явно указывать файл метаданных для чтения Iceberg с помощью настройки функции хранилища/таблицы iceberg_metadata_file_path. Исправляет #47412. #77318 (alesapin).
  • Добавлена хеш-функция keccak256, широко используемая в блокчейн-реализациях, особенно в системах на базе EVM. #76669 (Arnaud Briche).
  • Добавлены три новые функции: icebergTruncate в соответствии со спецификацией (https://iceberg.apache.org/spec/#truncate-transform-details), toYearNumSinceEpoch и toMonthNumSinceEpoch. Добавлена поддержка трансформации truncate при отсечении партиций для движка Iceberg. #77403 (alesapin).
  • Добавлена поддержка типов данных LowCardinality(Decimal) #72256. #72833 (zhanglistar).
  • События профилирования FilterTransformPassedRows и FilterTransformPassedBytes отображают количество строк и байт, отфильтрованных во время выполнения запроса. #76662 (Onkar Deshpande).
  • Поддержка типа метрик histogram. Интерфейс во многом повторяет клиент Prometheus: вы просто вызываете observe(value), чтобы увеличить счётчик в бакете, соответствующем значению. Метрики типа histogram доступны через system.histogram_metrics. #75736 (Miсhael Stetsyuk).
  • Поддержка неконстантного CASE для переключения по заданным значениям. #77399 (Yarik Briukhovetskyi).

Экспериментальная функциональность

  • Добавлена поддержка Unity Catalog для таблиц Delta Lake поверх AWS S3 и локальной файловой системы. #76988 (alesapin).
  • Представлена экспериментальная интеграция с каталогом данных службы AWS Glue для таблиц Iceberg. #77257 (alesapin).
  • Добавлена поддержка динамического автообнаружения кластеров. Это расширяет существующую функцию автообнаружения узлов. ClickHouse теперь может автоматически обнаруживать и регистрировать новые кластеры по общему пути в ZooKeeper с использованием <multicluster_root_path>. #76001 (Anton Ivashkin).
  • Добавлена возможность автоматической очистки слияний (merge) целых партиций по истечении настраиваемого тайм-аута с помощью новой настройки enable_replacing_merge_with_cleanup_for_min_age_to_force_merge. #76440 (Christoph Wurm).

Повышение производительности

  • Реализован кэш условий запроса для повышения производительности запросов с повторяющимися условиями. Диапазон участка данных, не удовлетворяющего условию, запоминается как временный индекс в памяти. Последующие запросы используют этот индекс. Закрыты #67768 #69236 (zhongyuankai).
  • Данные теперь активно удаляются из кэша при удалении частей. Кэш больше не растёт до максимального размера, если объём данных меньше. #76641 (Alexey Milovidov).
  • Int256 и UInt256 в арифметических вычислениях заменены на встроенный в clang тип i256, что даёт прирост производительности #70502. #73658 (李扬).
  • В некоторых случаях (например, пустой столбец-массив) части данных могут содержать пустые файлы. Теперь можно пропускать запись пустых блобов в ObjectStorage и хранить только метаданные для таких файлов, когда таблица размещена на диске с раздельным хранением метаданных и объектов. #75860 (Alexander Gololobov).
  • Улучшена производительность min/max для Decimal32/Decimal64/DateTime64. #76570 (李扬).
  • Компиляция запросов (настройка compile_expressions) теперь учитывает тип машины, что значительно ускоряет такие запросы. #76753 (ZhangLiStar).
  • Оптимизирован arraySort. #76850 (李扬).
  • Настройка filesystem_cache_prefer_bigger_buffer_size отключена, когда кэш используется пассивно, например при слияниях. #77898 (Kseniia Sumarokova).
  • Атрибут preserve_most применён в ряде мест кода, что позволяет немного улучшить генерацию кода. #67778 (Nikita Taranov).
  • Ускорено завершение работы серверов ClickHouse (убрана задержка 2,5 секунды). #76550 (Azat Khuzhin).
  • Избегаются лишние аллокации в ReadBufferFromS3 и других буферах для удалённого чтения, их потребление памяти снижено вдвое. #76692 (Sema Checherinda).
  • Обновлён zstd с 1.5.5 до 1.5.7, что может привести к некоторым улучшениям производительности. #77137 (Pradeep Chhetri).
  • Снижено потребление памяти при предзагрузке столбца JSON в частях формата Wide. Это актуально, когда ClickHouse используется поверх разделяемого хранилища, например в ClickHouse Cloud. #77640 (Pavel Kruglov).

Улучшение

  • Добавлена поддержка атомарного переименования при использовании TRUNCATE с INTO OUTFILE. Решает #70323. #77181 (Onkar Deshpande).
  • Больше нельзя использовать NaN или inf в качестве значений типа float для настроек. Да и раньше в этом не было особого смысла. #77546 (Yarik Briukhovetskyi).
  • Теперь параллельные реплики по умолчанию отключены, когда analyzer выключен, независимо от настройки compatibility. При необходимости это поведение можно изменить, явно установив parallel_replicas_only_with_analyzer в значение false. #77115 (Igor Nikonov).
  • Добавлена возможность определять список заголовков, которые будут пересылаться из заголовков клиентского запроса во внешний HTTP-аутентификатор. #77054 (inv2004).
  • Учитывать регистронезависимое сопоставление столбцов для полей в столбцах-кортежах. Закрыта задача https://github.com/apache/incubator-gluten/issues/8324. #73780 (李扬).
  • Параметры кодека Gorilla теперь всегда будут сохраняться в метаданных таблицы в .sql-файле. Это закрывает: #70072. #74814 (Nikita Mikhaylov).
  • Реализованы улучшения парсинга для некоторых озёр данных (парсинг Sequence ID: добавлена возможность разбора идентификаторов последовательностей в manifest-файлах и парсинг метаданных Avro: переработан парсер метаданных Avro, чтобы его было легко расширять для будущих улучшений). #75010 (Daniil Ivanik).
  • Из ORDER BY по умолчанию для system.opentelemetry_span_log удалён столбец trace_id. #75907 (Azat Khuzhin).
  • Шифрование (атрибут encrypted_by) теперь может применяться к любому конфигурационному файлу (config.xml, users.xml, вложенные файлы конфигурации). Ранее оно работало только для корневого файла config.xml. #75911 (Mikhail Gorshkov).
  • Улучшена таблица system.warnings и добавлены динамические сообщения о предупреждениях, которые можно добавлять, обновлять или удалять. #76029 (Bharat Nallan).
  • Этот PR предотвращает выполнение запроса ALTER USER user1 ADD PROFILES a, DROP ALL PROFILES, потому что все операции DROP должны идти первыми по порядку. #76242 (pufit).
  • Различные доработки для SYNC REPLICA (более информативные сообщения об ошибках, улучшенные тесты, проверки корректности). #76307 (Azat Khuzhin).
  • Использовать корректный резервный вариант, когда multipart‑копирование в S3 завершается с ошибкой Access Denied во время резервного копирования. Многокомпонентное (multipart) копирование может приводить к ошибке Access Denied, когда резервное копирование выполняется между бакетами с разными учетными данными доступа. #76515 (Antonio Andelic).
  • Обновлена librdkafka (которая представляет собой кучу дерьма) до версии 2.8.0 (этот хлам лучше от этого не становится) и улучшена процедура завершения работы для таблиц Kafka, что сократило задержки при удалении таблиц и перезапусках сервера. engine=Kafka больше не выходит из consumer group явно при удалении таблицы. Вместо этого consumer остаётся в группе, пока не будет автоматически удалён после session_timeout_ms (по умолчанию: 45 секунд) бездействия. #76621 (filimonov).
  • Исправлена проверка параметров запросов к S3. #76658 (Vitaly Baranov).
  • Системные таблицы, такие как server_settings или settings, имеют столбец default, что удобно. В merge_tree_settings и replicated_merge_tree_settings также добавлен такой столбец. #76942 (Diego Nieto).
  • Добавлен ProfileEvents::QueryPreempted, логика которого аналогична CurrentMetrics::QueryPreempted. #77015 (VicoWu).
  • Ранее реплицируемая база данных могла записывать в логи учетные данные, указанные в запросе. Это поведение исправлено. Исправлено в: #77123. #77133 (Nikita Mikhaylov).
  • Разрешён ALTER TABLE DROP PARTITION для диска plain_rewritable. #77138 (Julia Kartseva).
  • Настройка резервного копирования/восстановления allow_s3_native_copy теперь поддерживает три возможных значения: - False — S3 native copy не будет использоваться; - True (старое значение по умолчанию) — ClickHouse сначала попытается использовать S3 native copy, а в случае ошибки переключится на подход с чтением и записью; - 'auto' (новое значение по умолчанию) — ClickHouse сначала сравнит учетные данные источника и назначения. Если они совпадают, ClickHouse попробует S3 native copy и затем при необходимости может переключиться на подход с чтением и записью. Если они различаются, ClickHouse сразу перейдет к подходу с чтением и записью. #77401 (Vitaly Baranov).
  • Добавлена поддержка использования сеансового токена AWS и учётных данных из переменных окружения в ядре Delta для движка таблиц DeltaLake. #77661 (Kseniia Sumarokova).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлено зависание при обработке отложенного пакета для асинхронного распределённого INSERT (например, из‑за No such file or directory). #72939 (Azat Khuzhin).
  • Улучшено преобразование DateTime во время анализа индексов за счет принудительного поведения с насыщением для неявных преобразований Date в DateTime. Это устраняет возможные неточности анализа индексов, вызванные ограничениями диапазона значений DateTime. Исправлена проблема #73307. Также исправлено явное преобразование toDateTime, когда date_time_overflow_behavior = 'ignore', что является значением по умолчанию. #73326 (Amos Bird).
  • Исправлены различные ошибки, возникающие из‑за гонки между UUID и именами таблиц (например, устраняется гонка между RENAME и RESTART REPLICA: в случае одновременного выполнения RENAME с SYSTEM RESTART REPLICA в итоге можно перезапустить не ту реплику и/или оставить одну из таблиц в состоянии Table X is being restarted). #76308 (Azat Khuzhin).
  • Исправлена потеря данных при включённом async insert и выполнении insert into ... from file ... с неравным размером блоков: если размер первого блока < async_max_size, а второго блока > async_max_size, второй блок не вставлялся. В результате эти данные оставались в состоянии squashing. #76343 (Han Fei).
  • Поле 'marks' переименовано в 'marks_bytes' в system.data_skipping_indices. #76374 (Robert Schulze).
  • Исправлена обработка динамического изменения размера кэша файловой системы при неожиданных ошибках во время вытеснения данных из кэша. #76466 (Kseniia Sumarokova).
  • Исправлена инициализация used_flag в параллельной хеш-таблице. Это могло приводить к сбою сервера. #76580 (Nikita Taranov).
  • Исправлена логическая ошибка при вызове функции defaultProfiles внутри проекции. #76627 (pufit).
  • Не запрашивать интерактивную базовую аутентификацию в браузере при работе с Web UI. Закрывает #76319. #76637 (Alexey Milovidov).
  • Исправлено исключение THERE_IS_NO_COLUMN при выборке булевого литерала из распределённых таблиц. #76656 (Yakov Olkhovskiy).
  • Подкаталог внутри каталога таблицы теперь выбирается более продуманным образом. #76681 (Daniil Ivanik).
  • Исправлена ошибка Not found column in block после изменения таблицы с подколонкой в первичном ключе. После https://github.com/ClickHouse/ClickHouse/pull/72644 требуется https://github.com/ClickHouse/ClickHouse/pull/74403. #76686 (Nikolai Kochetov).
  • Добавить тесты производительности для обработки NULL по принципу короткого замыкания и исправить ошибки. #76708 (李扬).
  • Сбрасывать выходные буферы записи перед их финализацией. Исправлен LOGICAL_ERROR, возникавший при финализации некоторых форматов вывода, например JSONEachRowWithProgressRowOutputFormat. #76726 (Antonio Andelic).
  • Добавлена поддержка бинарного UUID MongoDB (#74452) - Исправлено проталкивание условия WHERE в MongoDB при использовании табличной функции (#72210) - Изменено сопоставление типов MongoDB → ClickHouse таким образом, что бинарный UUID MongoDB может интерпретироваться только как UUID ClickHouse. Это должно избежать двусмысленностей и неожиданных ситуаций в будущем. - Исправлено сопоставление OID с сохранением обратной совместимости. #76762 (Kirill Nikiforov).
  • Исправлена обработка исключений при параллельной десериализации префиксов JSON-подстолбцов. #76809 (Pavel Kruglov).
  • Исправлено поведение функции lgamma для отрицательных целых чисел. #76840 (Ilya Kataev).
  • Исправлен анализ обратного ключа для явно заданных первичных ключей. Аналогично #76654. #76846 (Amos Bird).
  • Исправлено красивое форматирование значений Bool в формате JSON. #76905 (Pavel Kruglov).
  • Исправлено возможное аварийное завершение работы из-за некорректного отката JSON-столбца при ошибке во время асинхронной вставки данных. #76908 (Pavel Kruglov).
  • Ранее multiIf мог возвращать разные типы столбцов на этапе планирования и во время основного выполнения. Это приводило к неопределённому поведению кода с точки зрения C++. #76914 (Nikita Taranov).
  • Исправлена некорректная сериализация константных ключей Nullable в MergeTree. Тем самым исправлена #76939. #76985 (Amos Bird).
  • Исправлена сортировка значений BFloat16. Это исправление закрывает #75487. Также закрывает #75669. #77000 (Alexey Milovidov).
  • Исправлена ошибка в JSON с подколонкой Variant за счёт добавления проверки, пропускающей эфемерные подколонки при проверке целостности парта. #72187. #77034 (Smita Kulkarni).
  • Исправлена ошибка, приводившая к сбою при разборе шаблона формата Values в случае несовпадения типов. #77071 (Pavel Kruglov).
  • Запрещено создавать таблицу EmbeddedRocksDB с подколонкой в первичном ключе. Ранее такую таблицу можно было создать, но запросы SELECT завершались с ошибкой. #77074 (Pavel Kruglov).
  • Исправлено некорректное сравнение в распределённых запросах, поскольку при проталкивании предикатов на удалённые узлы не учитываются типы литералов. #77093 (Duc Canh Le).
  • Исправлено падение при создании таблицы Kafka из-за исключения. #77121 (Pavel Kruglov).
  • Поддержка JSON и подстолбцов в движках Kafka и RabbitMQ. #77122 (Pavel Kruglov).
  • Исправлена раскрутка стека исключений в macOS. #77126 (Eduard Karacharov).
  • Исправлено чтение подстолбца 'null' функцией getSubcolumn. #77163 (Pavel Kruglov).
  • Исправлена работа индекса фильтра Блума с Array и неподдерживаемыми функциями. #77271 (Pavel Kruglov).
  • Проверять ограничение на число таблиц следует только при выполнении начального запроса CREATE. #77274 (Nikolay Degterinsky).
  • Это не ошибка: SELECT toBFloat16(-0.0) == toBFloat16(0.0) теперь корректно возвращает true (ранее — false). Это делает поведение согласованным с Float32 и Float64. #77290 (Shankar Iyer).
  • Исправлена возможная некорректная ссылка на неинициализированную переменную key_index, которая может приводить к сбою в отладочных (debug) сборках (эта неинициализированная ссылка не вызывает проблем в релизных (release) сборках, потому что последующий код, скорее всего, приведёт к ошибке). ### запись в документации о пользовательских изменениях. #77305 (wxybear).
  • Исправлено имя партиции с логическим значением (Bool). Ошибка была внесена в https://github.com/ClickHouse/ClickHouse/pull/74533. #77319 (Pavel Kruglov).
  • Исправлено сравнение между кортежами с элементами типа Nullable и строками. Например, до этого изменения сравнение кортежа (1, null) и строки '(1,null)' приводило к ошибке. Другой пример — сравнение кортежа (1, a), где a — столбец типа Nullable, и строки '(1, 2)'. Это изменение устраняет эти проблемы. #77323 (Alexey Katsman).
  • Исправлено падение в ObjectStorageQueueSource, возникшее в https://github.com/ClickHouse/ClickHouse/pull/76358. #77325 (Pavel Kruglov).
  • Исправлена проблема при использовании async_insert с input. #77340 (Azat Khuzhin).
  • Исправление: WITH FILL может завершаться с ошибкой NOT_FOUND_COLUMN_IN_BLOCK, когда сортируемый столбец удаляется планировщиком запросов. Аналогичная проблема была связана с неконсистентным DAG, рассчитанным для выражения INTERPOLATE. #77343 (Yakov Olkhovskiy).
  • Исправлены несколько LOGICAL_ERROR'ов при назначении псевдонимов некорректным узлам AST. #77445 (Raúl Marín).
  • В реализации кэша файловой системы исправлена обработка ошибок при записи сегмента файла. #77471 (Kseniia Sumarokova).
  • DatabaseIceberg теперь использует корректный файл метаданных, предоставляемый каталогом. Закрывает #75187. #77486 (Kseniia Sumarokova).
  • Кэш запросов теперь предполагает, что UDF являются недетерминированными. Поэтому результаты запросов с UDF больше не кэшируются. Ранее пользователи могли определять недетерминированные UDF, результаты которых по ошибке кэшировались (issue #77553). #77633 (Jimmy Aguilar Mena).
  • Исправлена проблема, из-за которой system.filesystem_cache_log работал только при включённой настройке enable_filesystem_cache_log. #77650 (Kseniia Sumarokova).
  • Исправлена логическая ошибка при вызове функции defaultRoles внутри проекции. Доработка по задаче #76627. #77667 (pufit).
  • Использование второго аргумента типа Nullable для функции arrayResize теперь запрещено. Ранее при передаче Nullable в качестве второго аргумента могли возникать как ошибки, так и некорректные результаты (issue #48398). #77724 (Manish Gill).
  • Регулярно проверяйте, были ли слияния и мутации отменены, даже в случае, когда операция не создает блоков для записи. #77766 (János Benjamin Antal).

Улучшения сборки/тестирования/пакетирования

Релиз ClickHouse 25.2, 2025-02-27

Обратное несовместимое изменение

  • Полностью включён async_load_databases по умолчанию (даже для тех установок, для которых не был обновлён config.xml). #74772 (Azat Khuzhin).
  • Добавлены форматы JSONCompactEachRowWithProgress и JSONCompactStringsEachRowWithProgress. Продолжение #69989. JSONCompactWithNames и JSONCompactWithNamesAndTypes больше не выводят "totals" — по-видимому, это была ошибка в реализации. #75037 (Alexey Milovidov).
  • Значение по умолчанию для format_alter_operations_with_parentheses изменено на true, чтобы устранить неоднозначность списка команд ALTER (см. https://github.com/ClickHouse/ClickHouse/pull/59532). Это нарушает репликацию с кластерами версий до 24.3. Если вы обновляете кластер со старыми релизами, выключите этот параметр в конфигурации сервера или сначала обновитесь до 24.3. #75302 (Raúl Marín).
  • Удалена возможность фильтровать сообщения лога с использованием регулярных выражений. Реализация приводила к гонке данных, поэтому её пришлось удалить. #75577 (János Benjamin Antal).
  • Настройка min_chunk_bytes_for_parallel_parsing больше не может быть нулевой. Это исправляет #71110. #75239 (Nikita Mikhaylov).
  • Добавлена проверка настроек в конфигурации кэша. Ранее несуществующие настройки игнорировались, теперь будет генерироваться ошибка, и такие настройки необходимо удалить. #75452 (Kseniia Sumarokova).

Новые возможности

  • Поддержка типа Nullable(JSON). #73556 (Pavel Kruglov).
  • Поддержка подстолбцов в выражениях DEFAULT и MATERIALIZED. #74403 (Pavel Kruglov).
  • Поддержка записи bloom-фильтров Parquet с использованием настройки output_format_parquet_write_bloom_filter (включена по умолчанию). #71681 (Michael Kolupaev).
  • В Web UI теперь есть интерактивная навигация по базам данных. #75777 (Alexey Milovidov).
  • Разрешено комбинировать диски только для чтения и диски для чтения и записи в политике хранения (как несколько томов или несколько дисков). Это позволяет читать данные со всего тома, в то время как вставки будут выполняться в первую очередь на диск с возможностью записи (то есть политика хранения Copy-on-Write). #75862 (Azat Khuzhin).
  • Добавлен новый движок базы данных DatabaseBackup, который позволяет мгновенно подключать таблицу/базу данных из бэкапа. #75725 (Maksim Kita).
  • Добавлена поддержка подготовленных запросов (prepared statements) в протоколе Postgres wire. #75035 (scanhex12).
  • Добавлена возможность ATTACH таблиц без уровня базы данных, что полезно для таблиц MergeTree, расположенных в Web, S3 и подобных внешних виртуальных файловых системах. #75788 (Azat Khuzhin).
  • Добавлена новая функция сравнения строк compareSubstrings для сравнения частей двух строк. Пример: SELECT compareSubstrings('Saxony', 'Anglo-Saxon', 0, 6, 5) AS result означает «лексикографически сравнить 6 байт строк 'Saxon' и 'Anglo-Saxon', начиная со смещения 0 в первой строке и смещения 5 во второй строке». #74070 (lgbo).
  • Добавлена новая функция initialQueryStartTime. Она возвращает время начала текущего запроса. Это значение одинаково на всех шардах при распределённом запросе. #75087 (Roman Lomonosov).
  • Добавлена поддержка SSL-аутентификации с использованием именованных коллекций для MySQL. Закрывает #59111. #59452 (Nikolay Degterinsky).

Экспериментальные возможности

  • Добавлена новая настройка enable_adaptive_memory_spill_scheduler, которая позволяет нескольким операциям Grace JOIN в одном запросе отслеживать их суммарное потребление памяти и адаптивно инициировать сброс (spilling) во внешнее хранилище, чтобы предотвратить MEMORY_LIMIT_EXCEEDED. #72728 (lgbo).
  • Новый экспериментальный движок таблиц Kafka теперь полностью учитывает feature flags Keeper. #76004 (János Benjamin Antal).
  • Восстановлен кодек (Intel) QPL, который был удалён в v24.10 из-за лицензионных ограничений. #76021 (Konstantin Bogdanov).
  • Для интеграции с HDFS добавлена поддержка конфигурационной опции dfs.client.use.datanode.hostname. #74635 (Mikhail Tiukavkin).

Улучшение производительности

  • Улучшена производительность чтения всего JSON-столбца в Wide-частях из S3. Это сделано за счёт добавления предварительной выборки для десериализации префиксов подстолбцов, кэша десериализованных префиксов и параллельной десериализации префиксов подстолбцов. В результате чтение JSON-столбца из S3 ускоряется в 4 раза для запросов вида SELECT data FROM table и примерно в 10 раз для запросов вида SELECT data FROM table LIMIT 10. #74827 (Pavel Kruglov).
  • Исправлена ненужная конкуренция потоков (contention) в parallel_hash, когда max_rows_in_join = max_bytes_in_join = 0. #75155 (Nikita Taranov).
  • Исправлено двойное предварительное выделение памяти в ConcurrentHashJoin в случае, когда стороны JOIN меняются местами оптимизатором. #75149 (Nikita Taranov).
  • Незначительное улучшение в некоторых сценариях JOIN: предварительный расчёт количества выходных строк и резервирование под них памяти. #75376 (Alexander Gololobov).
  • Для запросов вида WHERE a < b AND b < c AND c < 5 теперь можно выводить новые условия сравнения (a < 5 AND b < 5) для повышения эффективности фильтрации. #73164 (Shichao Jin).
  • Улучшение Keeper: отключён расчёт дайджеста при фиксации в хранилище в памяти для повышения производительности. Его можно включить с помощью настройки keeper_server.digest_enabled_on_commit. Дайджест по‑прежнему рассчитывается при предварительной обработке запросов. #75490 (Antonio Andelic).
  • По возможности выполняется проталкивание (push down) выражения фильтра из JOIN ON. #75536 (Vladimir Cherkasov).
  • Ленивый расчёт размеров столбцов и индексов в MergeTree. #75938 (Pavel Kruglov).
  • Повторно учтена настройка ttl_only_drop_parts при выполнении MATERIALIZE TTL; читаются только необходимые столбцы для перерасчёта TTL, а части удаляются путём замены их пустыми. #72751 (Andrey Zvonov).
  • Уменьшён размер буфера записи для файлов метаданных plain_rewritable. #75758 (Julia Kartseva).
  • Снижено потребление памяти для некоторых оконных функций. #65647 (lgbo).
  • Оценка Parquet bloom-фильтров и min/max-индексов теперь выполняется совместно. Это необходимо для корректной поддержки выражений вида: x = 3 or x > 5, где data = [1, 2, 4, 5]. #71383 (Arthur Passos).
  • Запросы, передаваемые в хранилище Executable, больше не ограничены однопоточным выполнением. #70084 (yawnt).
  • Части в ALTER TABLE FETCH PARTITION загружаются (fetch) параллельно (размер пула потоков контролируется настройкой max_fetch_partition_thread_pool_size). #74978 (Azat Khuzhin).
  • Разрешено перемещать предикаты с функцией indexHint в PREWHERE. #74987 (Anton Popov).

Улучшение

  • Исправлен расчет размера, занимаемого в памяти, для столбцов LowCardinality. #74688 (Nikita Taranov).
  • Теперь для таблицы processors_profile_log задана конфигурация по умолчанию с TTL 30 дней. #66139 (Ilya Yatsishin).
  • Добавлена возможность задавать имена шардов в конфигурации кластера. #72276 (MikhailBurdukov).
  • Изменён код статуса успешного ответа Prometheus remote write с 200/OK на 204/NoContent. #74170 (Michael Dempsey).
  • Добавлена возможность перезагружать max_remote_read_network_bandwidth_for_serve и max_remote_write_network_bandwidth_for_server на лету без перезапуска сервера. #74206 (Kai Zhu).
  • Добавлена возможность использовать пути к blob-объектам для вычисления контрольных сумм при создании резервной копии. #74729 (Vitaly Baranov).
  • Добавлен столбец ID запроса в system.query_cache (закрывает #68205). #74982 (NamHoaiNguyen).
  • Теперь разрешено отменять запросы ALTER TABLE ... FREEZE ... с помощью KILL QUERY, а также автоматически по истечении ограничения времени выполнения (max_execution_time). #75016 (Kirill).
  • Добавлена поддержка groupUniqArrayArrayMap в качестве SimpleAggregateFunction. #75034 (Miel Donkers).
  • Скрыты параметры учётных данных каталога в движке базы данных Iceberg. Закрывает #74559. #75080 (Kseniia Sumarokova).
  • intExp2 / intExp10: Определено поведение ранее неопределённых случаев: возвращать 0 для слишком малого аргумента, 18446744073709551615 для слишком большого аргумента, выбрасывать исключение, если nan. #75312 (Vitaly Baranov).
  • Добавлена нативная поддержка s3.endpoint из конфигурации каталога в DatabaseIceberg. Закрывает #74558. #75375 (Kseniia Sumarokova).
  • Не завершать операцию молча, если у пользователя, выполняющего SYSTEM DROP REPLICA, недостаточно прав. #75377 (Bharat Nallan).
  • Добавлен ProfileEvent, фиксирующий количество неудачных попыток сброса любым из системных журналов. #75466 (Alexey Milovidov).
  • Добавлена проверка и дополнительное логирование при расшифровке и декомпрессии. #75471 (Vitaly Baranov).
  • Добавлена поддержка символа «микро» (U+00B5) в функции parseTimeDelta. Теперь и символ «микро» (U+00B5), и греческая буква мю (U+03BC) распознаются как корректные обозначения микросекунд, что приводит поведение ClickHouse в соответствие с реализацией Go (см. time.go и time/format.go). #75472 (Vitaly Orlov).
  • Заменена серверная настройка (send_settings_to_client) на клиентскую (apply_settings_from_server), которая управляет тем, должен ли клиентский код (например, разбор данных INSERT и форматирование вывода запроса) использовать настройки из серверного users.xml и профиля пользователя. В противном случае используются только настройки из командной строки клиента, сессии и самого запроса. Обратите внимание, что это относится только к нативному клиенту (а не, например, к HTTP) и не применяется к большей части обработки запроса (которая выполняется на сервере). #75478 (Michael Kolupaev).
  • Улучшены сообщения об ошибках синтаксиса. Ранее, если запрос был слишком большим, а токен, длина которого превышала ограничение, представлял собой очень длинный строковый литерал, сообщение о причине терялось посреди двух примеров этого очень длинного токена. Исправлена проблема, когда запрос в кодировке UTF-8 некорректно обрезался в сообщении об ошибке. Исправлено избыточное заключение фрагментов запроса в кавычки. Закрывает #75473. #75561 (Alexey Milovidov).
  • Добавлены события профилирования в хранилище S3(Azure)Queue. #75618 (Kseniia Sumarokova).
  • Отключена отправка настроек с сервера на клиент (send_settings_to_client=false) для обеспечения совместимости (эта функциональность позже будет реализована заново как клиентская настройка для повышения удобства использования). #75648 (Michael Kolupaev).
  • Добавлен конфиг memory_worker_correct_memory_tracker для включения корректировки внутреннего трекера памяти на основе информации из различных источников, периодически читаемой в фоновом потоке. #75714 (Antonio Andelic).
  • Добавлен столбец normalized_query_hash в system.processes. Примечание: хотя его можно легко вычислить на лету с помощью функции normalizedQueryHash, это нужно для подготовки к последующим изменениям. #75756 (Alexey Milovidov).
  • Запрос к system.tables не будет вызывать исключение, даже если существует таблица типа Merge, созданная поверх базы данных, которая больше не существует. Из таблиц Hive удалён метод getTotalRows, поскольку мы не допускаем, чтобы он выполнял сложные операции. #75772 (Alexey Milovidov).
  • Хранить значения start_time/end_time для резервных копий с точностью до микросекунд. #75929 (Aleksandr Musorin).
  • Добавлена метрика MemoryTrackingUncorrected, показывающая значение внутреннего глобального трекера памяти, не скорректированное по RSS. #75935 (Antonio Andelic).
  • Разрешить разбор конечных точек вида localhost:1234/handle в табличных функциях PostgreSQL и MySQL. Исправляет регрессию, внесённую в https://github.com/ClickHouse/ClickHouse/pull/52503. #75944 (Nikita Mikhaylov).
  • Добавлена настройка сервера throw_on_unknown_workload, которая позволяет выбрать поведение при выполнении запроса с настройкой workload с неизвестным значением: либо разрешать неограниченный доступ (по умолчанию), либо выдавать ошибку RESOURCE_ACCESS_DENIED. Это полезно, чтобы принудительно использовать планирование рабочих нагрузок для всех запросов. #75999 (Sergei Trifonov).
  • Не переписывайте подколонки в getSubcolumn в ARRAY JOIN, если в этом нет необходимости. #76018 (Pavel Kruglov).
  • Ошибки координации повторных попыток при загрузке таблиц. #76020 (Alexander Tokmakov).
  • Добавлена поддержка сброса отдельных логов в SYSTEM FLUSH LOGS. #76132 (Raúl Marín).
  • Улучшена страница сервера /binary. Вместо кривой Мортон используется кривая Гильберта. В квадрате отображается 512 МБ адресного пространства, что заполняет квадрат лучше (в предыдущих версиях адреса занимали только половину квадрата). Адреса окрашиваются в зависимости от близости к имени библиотеки, а не имени функции. Разрешена более широкая прокрутка за пределы области. #76192 (Alexey Milovidov).
  • Повтор выполнения запросов ON CLUSTER при ошибке TOO_MANY_SIMULTANEOUS_QUERIES. #76352 (Patrick Galbraith).
  • Добавлена асинхронная метрика CPUOverload, которая вычисляет относительный дефицит CPU сервера. #76404 (Alexey Milovidov).
  • Изменено значение по умолчанию параметра output_format_pretty_max_rows с 10000 на 1000. Считаю, что так удобнее в использовании. #76407 (Alexey Milovidov).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Исправлено форматирование исключений: теперь используется пользовательский формат, если они возникают во время интерпретации запроса. В предыдущих версиях исключения форматировались с использованием формата по умолчанию, а не формата, указанного в запросе. Закрывает #55422. #74994 (Alexey Milovidov).
  • Исправлено сопоставление типов данных для SQLite (целочисленные типы в int64, числа с плавающей запятой в float64). #73853 (Joanna Hulboj).
  • Исправлено разрешение идентификаторов из родительских областей видимости. Разрешено использование псевдонимов для выражений в предложении WITH. Исправлено #58994. Исправлено #62946. Исправлено #63239. Исправлено #65233. Исправлено #71659. Исправлено #71828. Исправлено #68749. #66143 (Dmitry Novik).
  • Исправлена монотонность функции negate. В предыдущих версиях запрос select * from a where -x = -42;, где x — первичный ключ, мог возвращать неверный результат. #71440 (Michael Kolupaev).
  • Исправлена обработка пустых кортежей в arrayIntersect. Это исправляет проблему #72578. #72581 (Amos Bird).
  • Исправлено чтение подкoлонок подобъектов JSON с некорректным префиксом. #73182 (Pavel Kruglov).
  • Корректно передавать настройки формата Native при взаимодействии клиент–сервер. #73924 (Pavel Kruglov).
  • Добавлена проверка на неподдерживаемые типы для некоторых хранилищ. #74218 (Pavel Kruglov).
  • Исправлено падение при выполнении запроса INSERT INTO SELECT через интерфейс PostgreSQL на macOS (issue #72938). #74231 (Artem Yurov).
  • Исправлено неинициализированное значение max_log_ptr в реплицируемой базе данных. #74336 (Konstantин Морозов).
  • Исправлен сбой при вставке интервала (issue #74299). #74478 (NamHoaiNguyen).
  • Исправлено форматирование константных JSON-литералов. Ранее это могло приводить к синтаксическим ошибкам при отправке запроса на другой сервер. #74533 (Pavel Kruglov).
  • Исправлен некорректный CREATE‑запрос при использовании константных выражений в секции PARTITION с включёнными неявными проекциями. Исправлена проблема #74596. #74634 (Amos Bird).
  • Не оставляем соединение в некорректном состоянии после завершения INSERT с исключением. #74740 (Azat Khuzhin).
  • Не переиспользуйте соединения, оставленные в промежуточном состоянии. #74749 (Azat Khuzhin).
  • Исправлено падение при разборе объявления типа JSON, если имя типа указано не прописными буквами. #74784 (Pavel Kruglov).
  • Keeper: исправлена logical_error, возникавшая при разрыве соединения до его установления. #74844 (Michael Kolupaev).
  • Исправлена проблема, из-за которой сервер не мог запуститься, если была таблица, использующая AzureBlobStorage. Таблицы загружаются без каких-либо запросов к Azure. #74880 (Alexey Katsman).
  • Исправлено отсутствие полей used_privileges и missing_privileges в query_log для операций BACKUP и RESTORE. #74887 (Alexey Katsman).
  • В HDFS теперь обновляется krb-билет при ошибке SASL во время запроса HDFS SELECT. #74930 (inv2004).
  • Исправлены запросы к реплицируемой базе данных в startup_scripts. #74942 (Azat Khuzhin).
  • Исправлены ошибки в выражениях с псевдонимами типов в предложении JOIN ON при использовании null-безопасного сравнения. #74970 (Vladimir Cherkasov).
  • Возвращать состояние парта из deleting обратно в outdated, если операция удаления завершилась неуспешно. #74985 (Sema Checherinda).
  • В предыдущих версиях при наличии скалярного подзапроса мы начинали записывать прогресс (накопленный при обработке подзапроса) во время инициализации формата данных, то есть до записи HTTP-заголовков. Это приводило к потере HTTP-заголовков, таких как X-ClickHouse-QueryId и X-ClickHouse-Format, а также Content-Type. #74991 (Alexey Milovidov).
  • Исправлены запросы вида CREATE TABLE AS... для database_replicated_allow_replicated_engine_arguments=0. #75000 (Bharat Nallan).
  • Исправлена проблема, из-за которой после исключений при INSERT соединение клиента оставалось в некорректном состоянии. #75030 (Azat Khuzhin).
  • Исправлен сбой, возникавший из‑за неперехваченного исключения при репликации PSQL. #75062 (Azat Khuzhin).
  • SASL может завершиться с ошибкой при любом RPC‑вызове; это исправление позволяет повторить вызов, если истёк срок действия krb5‑тикета. #75063 (inv2004).
  • Исправлено использование индексов (первичных и вторичных) для столбцов Array, Map и Nullable(..) при включённой настройке optimize_function_to_subcolumns. Ранее индексы для этих столбцов могли быть проигнорированы. #75081 (Anton Popov).
  • Отключайте flatten_nested при создании материализованных представлений на внутренних таблицах, поскольку использовать преобразованные таким образом столбцы будет невозможно. #75085 (Christoph Wurm).
  • Исправлена некорректная интерпретация некоторых IPv6-адресов (например, ::ffff:1.1.1.1) в поле forwarded_for, приводившая к отключению клиента с исключением. #75133 (Yakov Olkhovskiy).
  • Исправлена обработка nullsafe JOIN для нуллируемого типа данных LowCardinality. Ранее условия JOIN ON с nullsafe-сравнением, таким как IS NOT DISTINCT FROM, <=> , a IS NULL AND b IS NULL OR a == b, работали некорректно со столбцами LowCardinality. #75143 (Vladimir Cherkasov).
  • Проверяет, что при подсчёте total_number_of_rows для NumRowsCache не указывается key_condition. #75164 (Daniil Ivanik).
  • Исправлены запросы с неиспользуемой интерполяцией с помощью нового анализатора. #75173 (János Benjamin Antal).
  • Исправлена ошибка, приводившая к падению при использовании CTE с INSERT. #75188 (Shichao Jin).
  • Исправление в Keeper: не записывать в повреждённые журналы изменений при откате логов. #75197 (Antonio Andelic).
  • Используйте BFloat16 в качестве супертипа там, где это уместно. Это закрывает задачу #74404. #75236 (Nikita Mikhaylov).
  • Исправлены неожиданные значения по умолчанию в результате JOIN при использовании any_join_distinct_right_table_keys и OR в JOIN ON. #75262 (Vladimir Cherkasov).
  • Маскировать учетные данные движка таблицы azureblobstorage. #75319 (Garrett Thomas).
  • Исправлено поведение, при котором ClickHouse мог ошибочно выполнять проталкивание фильтра (filter pushdown) во внешнюю СУБД, такую как PostgreSQL, MySQL или SQLite. Это исправляет: #71423. #75320 (Nikita Mikhaylov).
  • Исправлен сбой в кэше схем Protobuf, который мог происходить во время вывода в формате Protobuf при параллельном выполнении запроса SYSTEM DROP FORMAT SCHEMA CACHE. #75357 (Pavel Kruglov).
  • Исправлена возможная логическая ошибка или проблема с неинициализированной памятью при проталкивании фильтра из секции HAVING в режиме параллельных реплик. #75363 (Vladimir Cherkasov).
  • Скрытие конфиденциальной информации в табличных функциях и табличных движках icebergS3 и icebergAzure. #75378 (Kseniia Sumarokova).
  • Функция TRIM с вычисляемым пустым набором символов для обрезки теперь корректно обрабатывается. Пример: SELECT TRIM(LEADING concat('') FROM 'foo') (issue #69922). #75399 (Manish Gill).
  • Исправлена гонка данных в IOutputFormat. #75448 (Pavel Kruglov).
  • Исправлена возможная ошибка Elements ... and ... of Nested data structure ... (Array columns) have different array sizes при использовании в JOIN по распределённым таблицам JSON-подстолбцов типа Array. #75512 (Pavel Kruglov).
  • Исправлена порча данных при использовании CODEC(ZSTD, DoubleDelta). Закрывает #70031. #75548 (Konstantin Bogdanov).
  • Исправлено взаимодействие между allow_feature_tier и настройкой совместимости движка MergeTree. #75635 (Raúl Marín).
  • Исправлено некорректное значение processed_rows в system.s3queue_log при повторной попытке обработки файла. #75666 (Kseniia Sumarokova).
  • Учитывать materialized_views_ignore_errors, когда материализованное представление записывает в движок URL при возникновении проблем с подключением. #75679 (Christoph Wurm).
  • Исправлены редкие сбои при чтении из таблицы MergeTree после нескольких асинхронных запросов RENAMEalter_sync = 0) между столбцами разных типов. #75693 (Anton Popov).
  • Исправлена ошибка Block structure mismatch in QueryPipeline stream в некоторых запросах с UNION ALL. #75715 (Nikolai Kochetov).
  • Перестраивать проекцию при ALTER MODIFY столбца, входящего в её первичный ключ. Ранее это могло приводить к ошибкам CANNOT_READ_ALL_DATA при выполнении запросов SELECT после ALTER MODIFY столбца, использованного в первичном ключе проекции. #75720 (Pavel Kruglov).
  • Исправлен некорректный результат ARRAY JOIN для скалярных подзапросов (с анализатором). #75732 (Nikolai Kochetov).
  • Исправлено разыменование нулевого указателя в DistinctSortedStreamTransform. #75734 (Nikita Taranov).
  • Исправить поведение параметра allow_suspicious_ttl_expressions. #75771 (Aleksei Filatov).
  • Исправлено чтение из неинициализированной памяти в функции translate. Это закрывает #75592. #75794 (Alexey Milovidov).
  • Передавать настройки формата в JSON как строковое форматирование в формате Native. #75832 (Pavel Kruglov).
  • В истории изменений настроек зафиксировано включение по умолчанию параллельного хеш-алгоритма соединения в версии v24.12. Это означает, что ClickHouse будет и далее выполнять соединения, используя непараллельный хеш-алгоритм, если настроен уровень совместимости старше v24.12. #75870 (Robert Schulze).
  • Исправлена ошибка, из-за которой таблицы с неявно добавленными индексами min-max невозможно было скопировать в новую таблицу (issue #75677). #75877 (Smita Kulkarni).
  • clickhouse-library-bridge позволяет открывать произвольные библиотеки из файловой системы, поэтому безопасно запускать его только в изолированной среде. Чтобы предотвратить уязвимость при запуске в одной среде с clickhouse-server, мы ограничим допустимые пути к библиотекам каталогом, указанным в конфигурации. Эта уязвимость была обнаружена в рамках программы ClickHouse Bug Bounty Program Арсением Дугиным. #75954 (Alexey Milovidov).
  • Мы по ошибке использовали JSON-сериализацию для некоторых метаданных, потому что JSON не поддерживает двоичные данные внутри строковых литералов, включая нулевые байты. SQL-запросы могут содержать двоичные данные и некорректный UTF-8, поэтому мы должны поддерживать это и в наших файлах метаданных. В то же время форматы ClickHouse JSONEachRow и подобные обходят это ограничение, отходя от стандарта JSON ради идеального преобразования данных туда-обратно (roundtrip) для двоичных данных. См. обоснование здесь: https://github.com/ClickHouse/ClickHouse/pull/73668#issuecomment-2560501790. Решение состоит в том, чтобы согласовать библиотеку Poco::JSON с форматами сериализации JSON в ClickHouse. Это закрывает #73668. #75963 (Alexey Milovidov).
  • Исправлена проверка ограничений на коммиты в хранилище S3Queue. #76104 (Kseniia Sumarokova).
  • Исправлено подключение таблиц MergeTree с автоматическими индексами (add_minmax_index_for_numeric_columns/add_minmax_index_for_string_columns). #76139 (Azat Khuzhin).
  • Исправлена проблема, при которой стеки вызовов из родительских потоков задания (настройка enable_job_stack_trace) не выводились. Исправлена проблема, при которой настройка enable_job_stack_trace некорректно распространялась на потоки, из-за чего содержимое стека вызовов могло не соответствовать этой настройке. #76191 (Yakov Olkhovskiy).
  • Исправлена некорректная проверка прав, из-за которой для ALTER RENAME требовался грант CREATE USER. Закрывает #74372. #76241 (pufit).
  • Исправлена работа функции reinterpretAs с типом FixedString на архитектуре big-endian. #76253 (Azat Khuzhin).
  • Исправлена логическая ошибка в S3Queue: «Expected current processor to be equal to for bucket ». #76358 (Kseniia Sumarokova).
  • Исправлена взаимоблокировка при операции ALTER в базе данных Memory. #76359 (Azat Khuzhin).
  • Исправлена логическая ошибка при анализе индекса, если в условии WHERE используется функция pointInPolygon. #76360 (Anton Popov).
  • Исправлен потенциально небезопасный вызов в обработчике сигналов. #76549 (Yakov Olkhovskiy).
  • Исправлена поддержка обратного ключа в PartsSplitter. Исправляет #73400. #73418 (Amos Bird).

Улучшения в сборке/тестировании/упаковке

  • Поддержка сборки HDFS на Mac с ARM и Intel. #74244 (Yan Xin).
  • Включена поддержка ICU и GRPC при кросс-компиляции для Darwin. #75922 (Raúl Marín).
  • Обновление встроенного LLVM до версии 19. #75148 (Konstantin Bogdanов).
  • Отключён сетевой доступ для пользователя default в docker-образе. #75259 (Mikhail f. Shiryaev). Все действия, связанные с clickhouse-server, вынесены в функцию и выполняются только при запуске бинарника по умолчанию в entrypoint.sh. Давнее улучшение было предложено в #50724. Добавлен флаг --users к clickhouse-extract-from-config для получения значений из users.xml. #75643 (Mikhail f. Shiryaev).
  • Удалено около 20 МБ мёртвого кода из бинарника. #76226 (Alexey Milovidov).

Релиз ClickHouse 25.1, 2025-01-28

Обратимо несовместимые изменения

  • JSONEachRowWithProgress будет записывать прогресс при каждом его обновлении. В предыдущих версиях прогресс показывался только после каждого блока результата, из-за чего он был бесполезен. Изменён способ отображения прогресса: нулевые значения показываться не будут. Это закрывает #70800. #73834 (Alexey Milovidov).
  • Таблицы Merge будут унифицировать структуру подчинённых таблиц, используя объединение их столбцов и выводя общие типы. Это закрывает #64864. В некоторых случаях это изменение может быть несовместимым с предыдущими версиями. Один из примеров — когда между таблицами нет общего типа, но преобразование к типу первой таблицы всё ещё возможно, как в случае UInt64 и Int64 или любого числового типа и String. Если вы хотите вернуться к старому поведению, установите merge_table_max_tables_to_look_for_schema_inference равным 1 или установите compatibility в 24.12 или более раннее значение. #73956 (Alexey Milovidov).
  • Формат вывода Parquet преобразует столбцы Date и DateTime в типы даты/времени, поддерживаемые Parquet, вместо записи их как «сырых» чисел. DateTime становится DateTime64(3) (было: UInt32); установка output_format_parquet_datetime_as_uint32 возвращает старое поведение. Date становится Date32 (было: UInt16). #70950 (Michael Kolupaev).
  • По умолчанию не допускаются несравнимые типы (такие как JSON/Object/AggregateFunction) в ORDER BY и в функциях сравнения less/greater/equal/etc. #73276 (Pavel Kruglov).
  • Устаревший движок базы данных MaterializedMySQL удалён и больше недоступен. #73879 (Alexey Milovidov).
  • Источник словаря mysql больше не выполняет запрос SHOW TABLE STATUS, так как он не даёт никакой полезной информации для таблиц InnoDB, а также для любых современных версий MySQL в целом. Это закрывает #72636. Это изменение обратно совместимо, но помещено в эту категорию, чтобы у вас была возможность его заметить. #73914 (Alexey Milovidov).
  • Запросы CHECK TABLE теперь требуют отдельного права CHECK. В предыдущих версиях для выполнения этих запросов было достаточно права SHOW TABLES. Но запрос CHECK TABLE может быть тяжёлым, и обычные лимиты сложности запроса для запросов SELECT к нему не применяются. Это создавало потенциальную возможность для DoS-атаки. #74471 (Alexey Milovidov).
  • Функция h3ToGeo() теперь возвращает результаты в порядке (lat, lon) (который является стандартным порядком для геометрических функций). Пользователи, которые хотят сохранить устаревший порядок результата (lon, lat), могут установить настройку h3togeo_lon_lat_result_order = true. #74719 (Manish Gill).
  • Новый драйвер MongoDB теперь используется по умолчанию. Пользователи, которые хотят продолжить использование устаревшего драйвера, могут установить серверную настройку use_legacy_mongodb_integration в значение true. #73359 (Robert Schulze).

Новая возможность

  • Добавлена возможность применять незавершённые мутации (ещё не материализованные фоновым процессом) во время выполнения запросов SELECT сразу после отправки. Эту возможность можно включить, установив apply_mutations_on_fly. #74877 (Anton Popov).
  • Реализовано отсечение партиций (partition pruning) для таблиц Iceberg при операциях партиционирования с временными преобразованиями. #72044 (Daniil Ivanik).
  • Добавлена поддержка подстолбцов в ключе сортировки движка MergeTree и пропускающих индексах. #72644 (Pavel Kruglov).
  • Добавлена поддержка чтения значений HALF_FLOAT из Apache Arrow/Parquet/ORC (они считываются как Float32). Это закрывает #72960. Имейте в виду, что формат IEEE-754 с половинной точностью — это не то же самое, что BFloat16. Закрывает #73835. #73836 (Alexey Milovidov).
  • Таблица system.trace_log будет содержать два новых столбца — symbols и lines, в которых хранится символизированный стек вызовов. Это позволяет легко собирать и экспортировать информацию для профилирования. Работа механизма управляется параметром конфигурации сервера symbolize в секции trace_log и по умолчанию он включён. #73896 (Alexey Milovidov).
  • Добавлена новая функция generateSerialID, которую можно использовать для генерации автоинкрементных идентификаторов в таблицах. Продолжение #64310 от kazalika. Закрывает #62485. #73950 (Alexey Milovidov).
  • Добавлен синтаксис query1 PARALLEL WITH query2 PARALLEL WITH query3 ... PARALLEL WITH queryN для DDL-запросов. Это означает, что подзапросы {query1, query2, ... queryN} могут выполняться параллельно между собой (и это предпочтительно). #73983 (Vitaly Baranov).
  • Добавлен кэш в оперативной памяти для десериализованных гранул пропускающих индексов. Это должно ускорить повторные запросы, использующие пропускающие индексы. Размер нового кэша управляется настройками сервера skipping_index_cache_size и skipping_index_cache_max_entries. Основной мотивацией для добавления кэша были индексы векторного сходства, которые теперь работают значительно быстрее. #70102 (Robert Schulze).
  • Теперь во встроенном веб-интерфейсе во время выполнения запроса отображается индикатор прогресса. Он позволяет отменять запросы. Отображается общее количество записей и расширенная информация о скорости. Таблица может отображаться по мере поступления данных. Включено HTTP-сжатие. Отрисовка таблицы стала быстрее. Заголовок таблицы стал фиксированным. Интерфейс позволяет выделять ячейки и перемещаться по ним с помощью клавиш со стрелками. Исправлена проблема, при которой контур выделенной ячейки делал её меньше. Ячейки больше не расширяются при наведении мыши, а только при выделении. Момент прекращения отрисовки поступающих данных теперь определяется на стороне клиента, а не сервера. Добавлена подсветка разрядных групп у чисел. Общий дизайн обновлён и стал более выразительным. Интерфейс проверяет доступность сервера и корректность учётных данных, а также отображает версию сервера и время его работы. Значок облака корректно отображается в виде контура во всех шрифтах, включая Safari. Большие целые числа внутри вложенных типов данных отображаются корректнее. Значения inf/nan отображаются корректно. Типы данных отображаются при наведении указателя мыши на заголовок столбца. #74204 (Alexey Milovidov).
  • Добавлена возможность по умолчанию создавать min-max (пропускающие, skipping) индексы для столбцов в таблицах MergeTree с помощью настроек add_minmax_index_for_numeric_columns (для числовых столбцов) и add_minmax_index_for_string_columns (для строковых столбцов). Пока обе настройки отключены, поэтому поведение системы пока не изменилось. #74266 (Smita Kulkarni).
  • Добавлены поля script_query_number и script_line_number в system.query_log, в ClientInfo в нативном протоколе и в журналы сервера. Это закрывает задачу #67542. Благодарим pinsvin00 за запуск этой функциональности ранее в #68133. #74477 (Alexey Milovidov).
  • Добавлена агрегатная функция sequenceMatchEvents, которая возвращает временные метки соответствующих событий для самой длинной цепочки событий по шаблону. #72349 (UnamedRus).
  • Добавлена функция arrayNormalizedGini. #72823 (flynn).
  • Добавлена поддержка оператора вычитания для DateTime64, что позволяет выполнять вычитание между значениями DateTime64, а также DateTime. #74482 (Li Yin).

Экспериментальные возможности

  • Тип данных BFloat16 готов к использованию в продуктивной среде. #73840 (Alexey Milovidov).

Повышение производительности

  • Оптимизирована функция indexHint. Теперь столбцы, которые используются только как аргументы функции indexHint, не читаются из таблицы. #74314 (Anton Popov). Если функция indexHint — ключевой элемент вашей корпоративной архитектуры данных, эта оптимизация спасёт вам жизнь.
  • Более точный учет настройки max_joined_block_size_rows для JOIN-алгоритма parallel_hash. Помогает избежать повышенного потребления памяти по сравнению с алгоритмом hash. #74630 (Nikita Taranov).
  • Поддерживается оптимизация проталкивания предикатов (predicate push down) на уровне плана запроса для шага MergingAggregated. Это повышает производительность некоторых запросов при использовании анализатора. #74073 (Nikolai Kochetov).
  • Разбиение блоков левой таблицы по хэшу было исключено из фазы probe алгоритма parallel_hash JOIN. #73089 (Nikita Taranov).
  • Оптимизирован формат ввода RowBinary. Закрывает #63805. #65059 (Pavel Kruglov).
  • Записывайте части с уровнем 1, если включен optimize_on_insert. Это позволяет использовать несколько оптимизаций запросов с FINAL для только что записанных частей. #73132 (Anton Popov).
  • Ускорена десериализация строк за счёт некоторых низкоуровневых оптимизаций. #65948 (Nikita Taranov).
  • При выполнении сравнения на равенство между записями, например при слияниях, начинайте сравнивать строки с тех столбцов, значения в которых с наибольшей вероятностью отличаются. #63780 (UnamedRus).
  • Повышена производительность операции grace hash join за счет повторного упорядочения правой таблицы соединения по ключам. #72237 (kevinyhzou).
  • Разрешить arrayROCAUC и arrayAUCPR вычислять частичную площадь под всей кривой, чтобы их расчёт можно было распараллелить на огромных наборах данных. #72904 (Emmanuel).
  • Избегайте создания слишком большого количества простаивающих потоков. #72920 (Guo Wangyang).
  • Не перечислять ключи в blob-хранилище, если в табличной функции используется только раскрытие фигурных скобок. Закрывает #73333. #73518 (Konstantin Bogdanov).
  • Оптимизация вычислений по принципу короткого замыкания для функций, выполняемых над аргументами Nullable. #73820 (李扬).
  • Не применять maskedExecute к столбцам, не являющимся функциями; улучшена производительность выполнения по принципу короткого замыкания. #73965 (lgbo).
  • Отключите автоматическое определение заголовков во входных форматах для Kafka/NATS/RabbitMQ/FileLog для повышения производительности. #74006 (Azat Khuzhin).
  • Выполнять конвейер с более высокой степенью параллелизма после агрегации с использованием GROUPING SETS. #74082 (Nikita Taranov).
  • Сокращена критическая секция в MergeTreeReadPool. #74202 (Guo Wangyang).
  • Повышена производительность параллельных реплик. Десериализация пакетов на инициаторе запроса для пакетов, не относящихся к протоколу параллельных реплик, теперь всегда выполняется в потоке обработки конвейера. Ранее это могло происходить в потоке, отвечающем за диспетчеризацию конвейера, что могло снижать отзывчивость инициатора и задерживать выполнение конвейера. #74398 (Igor Nikonov).
  • Улучшена производительность крупных многокомандных запросов в Keeper. #74849 (Antonio Andelic).
  • Используйте обёртки для логирования по значению и не размещайте их в куче. #74034 (Mikhail Artemenko).
  • Повторно устанавливать соединения с репликами словарей MySQL и Postgres в фоновом режиме, чтобы это не приводило к задержкам запросов к соответствующим словарям. #71101 (Yakov Olkhovskiy).
  • Параллельные реплики использовали историческую информацию о доступности реплик для улучшения выбора реплики, но не обновляли счётчик ошибок реплики, когда подключение было недоступно. Этот PR обновляет счётчик ошибок реплики при её недоступности. #72666 (zoomxi).
  • Добавлена настройка MergeTree materialize_skip_indexes_on_merge, которая подавляет создание skip-индексов во время слияний. Это позволяет пользователям явно управлять тем, когда создаются skip-индексы (через ALTER TABLE [..] MATERIALIZE INDEX [...]). Это может быть полезно, если построение skip-индексов дорого обходится (например, индексов векторного сходства). #74401 (Robert Schulze).
  • Оптимизированы запросы к Keeper в Storage(S3/Azure)Queue. #74410 (Kseniia Sumarokova). #74538 (Kseniia Sumarokova).
  • Теперь по умолчанию используется до 1000 параллельных реплик. #74504 (Konstantin Bogdanov).
  • Улучшено повторное использование HTTP-сессий при чтении с диска S3 (#72401). #74548 (Julian Maicher).

Улучшение

  • Добавлена поддержка секции SETTINGS в запросе CREATE TABLE с неявно заданным ENGINE, а также возможность совместного использования настроек движка и настроек запроса. #73120 (Raúl Marín).
  • Включить use_hive_partitioning по умолчанию. #71636 (Yarik Briukhovetskyi).
  • Реализована поддержка CAST и ALTER между типами JSON с разными параметрами. #72303 (Pavel Kruglov).
  • Добавлена поддержка сравнения значений столбца JSON на равенство. #72991 (Pavel Kruglov).
  • Улучшено форматирование идентификаторов с JSON-подстолбцами для избежания лишних обратных кавычек. #73085 (Pavel Kruglov).
  • Улучшения интерактивных метрик. Исправлена проблема, из-за которой метрики из параллельных реплик отображались не полностью. Метрики отображаются сначала по времени последнего обновления, затем в лексикографическом порядке по имени. Устаревшие метрики не отображаются. #71631 (Julia Kartseva).
  • Формат вывода JSON по умолчанию сделан красиво отформатированным. Добавлена новая настройка output_format_json_pretty_print для управления этим поведением, она включена по умолчанию. #72148 (Pavel Kruglov).
  • Разрешить LowCardinality(UUID) по умолчанию. На практике это оказалось удобным для клиентов ClickHouse Cloud. #73826 (Alexey Milovidov).
  • Улучшено сообщение при установке. #73827 (Alexey Milovidov).
  • Улучшено сообщение о сбросе пароля в ClickHouse Cloud. #73831 (Alexey Milovidov).
  • Улучшено сообщение об ошибке для таблицы File, которая не поддерживает добавление данных в файл. #73832 (Alexey Milovidov).
  • Запрашивать подтверждение, когда пользователь по ошибке пытается вывести бинарный формат (такой как Native, Parquet, Avro) в терминал. Это закрывает #59524. #73833 (Alexey Milovidov).
  • Подсвечивать пробелы в конце строк в форматах Pretty и Vertical в терминале для лучшей наглядности. Эта функция управляется настройкой output_format_pretty_highlight_trailing_spaces. Первоначальная реализация — Braden Burns из задачи #72996. Закрывает задачу #71590. #73847 (Alexey Milovidov).
  • clickhouse-client и clickhouse-local теперь автоматически определяют сжатие стандартного ввода (stdin) при его перенаправлении из файла. Это закрывает #70865. #73848 (Alexey Milovidov).
  • По умолчанию в форматах вывода pretty слишком длинные имена столбцов обрезаются. Это поведение управляется настройками output_format_pretty_max_column_name_width_cut_to и output_format_pretty_max_column_name_width_min_chars_to_cut. Это продолжение работы tanmaydatta в #66502. Тем самым закрывается #65968. #73851 (Alexey Milovidov).
  • Сделать форматы Pretty более удобочитаемыми: объединять блоки, если с момента вывода предыдущего блока прошло немного времени. Поведение управляется новыми настройками output_format_pretty_squash_consecutive_ms (по умолчанию 50 мс) и output_format_pretty_squash_max_wait_ms (по умолчанию 1000 мс). Продолжение #49537. Закрывает #49153. #73852 (Alexey Milovidov).
  • Добавлена метрика числа исходных частей, которые в данный момент сливаются. Это закрывает #70809. #73868 (Alexey Milovidov).
  • Подсвечивать столбцы в формате Vertical при выводе в терминал. Это можно отключить с помощью настройки output_format_pretty_color. #73898 (Alexey Milovidov).
  • Улучшена совместимость с MySQL до уровня, при котором mysqlsh (функциональная CLI-консоль MySQL от Oracle) может подключаться к ClickHouse. Это необходимо для упрощения тестирования. #73912 (Alexey Milovidov).
  • Форматы pretty могут отображать многострочные значения в ячейке таблицы, что улучшает читаемость. Это поведение включено по умолчанию и управляется настройкой output_format_pretty_multiline_fields. Продолжение работы Volodyachan в #64094. Это закрывает #56912. #74032 (Alexey Milovidov).
  • HTTP-заголовки X-ClickHouse теперь доступны JavaScript в браузере. Это упрощает разработку приложений. #74180 (Alexey Milovidov).
  • Формат JSONEachRowWithProgress включает события с метаданными, а также totals и extremes. Он также включает rows_before_limit_at_least и rows_before_aggregation. Формат корректно выводит исключение, если оно возникает после частичных результатов. Теперь прогресс включает прошедшие наносекунды. В конце генерируется одно финальное событие прогресса. Прогресс во время выполнения запроса будет выводиться не чаще, чем задано параметром interactive_delay. #74181 (Alexey Milovidov).
  • Песочные часы в интерфейсе Play UI теперь будут плавно вращаться. #74182 (Alexey Milovidov).
  • Даже если HTTP-ответ сжат, отправляйте пакеты сразу, как только они приходят. Это позволяет браузеру получать пакеты прогресса и сжатые данные. #74201 (Alexey Milovidov).
  • Если число выходных записей больше N = output_format_pretty_max_rows, то вместо отображения только первых N строк таблица будет обрезана посередине: будут показаны N/2 первых строк и N/2 последних строк. Продолжение #64200. Закрывает #59502. #73929 (Alexey Milovidov).
  • Добавлена поддержка более общего алгоритма планирования соединений при включённом алгоритме хеш-соединения. #71926 (János Benjamin Antal).
  • Добавлена возможность создавать индекс bloom_filter для столбцов с типом данных DateTime64. #66416 (Yutong Xiao).
  • Когда одновременно включены параметры min_age_to_force_merge_seconds и min_age_to_force_merge_on_partition_only, слияние частей будет игнорировать ограничение по максимальному размеру в байтах. #73656 (Kai Zhu).
  • Добавлены HTTP-заголовки в таблицу логов спанов OpenTelemetry для повышения трассируемости. #70516 (jonymohajanGmail).
  • Поддержка записи файлов формата orc с использованием произвольного часового пояса, а не только часового пояса GMT. #70615 (kevinyhzou).
  • Учитывать настройки планировщика ввода-вывода при создании резервных копий между облаками. #71093 (János Benjamin Antal).
  • Добавлен псевдоним столбца metricname — в system.asynchronous_metrics. #71164 (megao).
  • По историческим причинам запрос ALTER TABLE MOVE PARTITION TO TABLE проверял права SELECT и ALTER DELETE вместо отдельного типа доступа ALTER_MOVE_PARTITION. Этот PR начинает использовать этот тип доступа. Для совместимости это разрешение также будет неявно предоставляться, если выданы SELECT и ALTER DELETE, но такое поведение будет удалено в будущих релизах. Закрывает #16403. #71632 (pufit).
  • Выбрасывать исключение при попытке материализовать столбец, входящий в ключ сортировки, вместо того чтобы допускать нарушение порядка сортировки. #71891 (Peter Nguyen).
  • Скрывать секреты в выводе EXPLAIN QUERY TREE. #72025 (Yakov Olkhovskiy).
  • Реализована поддержка логических целочисленных типов Parquet в «native» reader. #72105 (Arthur Passos).
  • Интерактивно запрашивать учетные данные через браузер, если для пользователя по умолчанию требуется пароль. В предыдущих версиях сервер возвращал HTTP 403; теперь он возвращает HTTP 401. #72198 (Alexey Milovidov).
  • Типы доступа CREATE_USER, ALTER_USER, DROP_USER, CREATE_ROLE, ALTER_ROLE, DROP_ROLE преобразованы из глобальных в параметризованные. Это означает, что пользователи теперь могут более точно выдавать привилегии на управление доступом. #72246 (pufit).
  • Добавлен столбец latest_fail_error_code_name в таблицу system.mutations. Этот столбец нужен для введения новой метрики по застрявшим мутациям и его использования для построения графиков ошибок, возникающих в облаке, а также, при необходимости, для добавления нового, менее шумного оповещения. #72398 (Miсhael Stetsyuk).
  • Уменьшено количество операций выделения памяти в запросе ATTACH PARTITION. #72583 (Константин Морозов).
  • Лимит max_bytes_before_external_sort теперь зависит от общего потребления памяти запросом (ранее он соответствовал количеству байт в сортируемом блоке для одного потока сортировки, теперь он имеет тот же смысл, что и max_bytes_before_external_group_by — это общий лимит памяти для всего запроса для всех потоков). Также добавлена ещё одна настройка для контроля размера блоков на диске — min_external_sort_block_bytes. #72598 (Azat Khuzhin).
  • Игнорировать ограничения по памяти со стороны сборщика трассировок. #72606 (Azat Khuzhin).
  • Добавлены параметры сервера dictionaries_lazy_load и wait_dictionaries_load_at_startup в system.server_settings. #72664 (Christoph Wurm).
  • Добавляет настройку max_backup_bandwidth в список настроек, которые можно задавать в запросах BACKUP/RESTORE. #72665 (Christoph Wurm).
  • Понижен уровень логирования для сообщений о появляющихся реплицированных частях в движке ReplicatedMergeTree, чтобы сократить объём логов, генерируемых в реплицированном кластере. #72876 (mor-akamai).
  • Улучшено выделение общих выражений в дизъюнкциях. Добавлена возможность упрощать результирующее фильтрующее выражение, даже если нет общего подвыражения для всех дизъюнктов. Продолжение #71537. #73271 (Dmitry Novik).
  • В хранилищах S3Queue/AzureQueue теперь можно добавлять настройки для таблиц, которые были созданы без них. #73283 (Kseniia Sumarokova).
  • Добавлена настройка least_greatest_legacy_null_behavior (по умолчанию: false), которая определяет, должны ли функции least и greatest при наличии аргументов NULL безусловно возвращать NULL (если true) или игнорировать такие аргументы (если false). #73344 (Robert Schulze).
  • Теперь в потоке очистки ObjectStorageQueueMetadata используются мультизапросы Keeper. #73357 (Antonio Andelic).
  • Когда ClickHouse работает в cgroup, мы по-прежнему собираем системные асинхронные метрики, связанные с нагрузкой на систему, планированием процессов, использованием памяти и т. д. Они могут давать полезные сигналы, когда ClickHouse — единственный процесс на хосте с высоким потреблением ресурсов. #73369 (Nikita Taranov).
  • В хранилище S3Queue появилась возможность переноса старых упорядоченных таблиц, созданных до версии 24.6, в новую структуру с бакетами. #73467 (Kseniia Sumarokova).
  • Добавлена таблица system.azure_queue, аналогичная существующей system.s3queue. #73477 (Kseniia Sumarokova).
  • Функция parseDateTime64 (и её варианты) теперь выдаёт корректные результаты для дат, относящихся к периодам до 1970 года и после 2106 года. Пример: SELECT parseDateTime64InJodaSyntax('2200-01-01 00:00:00.000', 'yyyy-MM-dd HH:mm:ss.SSS'). #73594 (zhanglistar).
  • Устранены некоторые проблемы удобства использования clickhouse-disks, сообщённые пользователями. Закрывает #67136. #73616 (Daniil Ivanik).
  • Добавлена возможность изменять настройки коммита в хранилище S3(Azure)Queue. (Настройки коммита: max_processed_files_before_commit, max_processed_rows_before_commit, max_processed_bytes_before_commit, max_processing_time_sec_before_commit). #73635 (Kseniia Sumarokova).
  • В хранилище S3(Azure)Queue агрегируется прогресс по источникам для сравнения с настройками лимита коммита (commit limit). #73641 (Kseniia Sumarokova).
  • Добавлена поддержка базовых настроек в запросах BACKUP и RESTORE. #73650 (Vitaly Baranov).
  • Учитывайте output_format_compression_level при выводе в формате Parquet. #73651 (Arthur Passos).
  • Добавлена поддержка чтения fixed_size_list из Apache Arrow как Array вместо того, чтобы считать его неподдерживаемым типом. #73654 (Julian Meyers).
  • Добавлены два движка резервного копирования: Memory (хранит резервные копии в рамках текущей пользовательской сессии) и Null (не сохраняет резервные копии), предназначенных для тестирования. #73690 (Vitaly Baranov).
  • concurrent_threads_soft_limit_num и concurrent_threads_soft_limit_num_ratio_to_cores можно изменять без перезапуска сервера. #73713 (Sergei Trifonov).
  • Добавлена поддержка расширенных числовых типов (Decimal, большие целые числа) в функциях formatReadable. #73765 (Raúl Marín).
  • Добавлена поддержка TLS для совместимости с сетевым протоколом PostgreSQL. #73812 (scanhex12).
  • Функция isIPv4String возвращала true, если за корректным IPv4-адресом следовал нулевой байт, тогда как в этом случае она должна возвращать false. Продолжение #65387. #73946 (Alexey Milovidov).
  • Сделать код ошибки в сетевом протоколе MySQL совместимым с MySQL. Продолжение #56831. Закрывает #50957. #73948 (Alexey Milovidov).
  • Добавлена настройка validate_enum_literals_in_opearators для проверки литералов перечислений в операторах IN, NOT IN на соответствие типу перечисления и выброса исключения, если литерал не является допустимым значением этого перечисления. #73985 (Vladimir Cherkasov).
  • В хранилище S3(Azure)Queue коммитить все файлы (в одном батче, задаваемом настройками коммита) в одной транзакции Keeper. #73991 (Kseniia Sumarokova).
  • Отключено определение заголовков для исполняемых UDF и словарей (это могло приводить к ошибке Function 'X': wrong result, expected Y row(s), actual Y-1). #73992 (Azat Khuzhin).
  • Добавлена опция distributed для EXPLAIN PLAN. Теперь EXPLAIN distributed=1 ... дописывает удалённый план к шагам ReadFromParallelRemote*. #73994 (Nikolai Kochetov).
  • Используется корректный тип возвращаемого значения для not/xor с аргументами Dynamic. #74013 (Pavel Kruglov).
  • Добавлена возможность изменять add_implicit_sign_column_constraint_for_collapsing_engine после создания таблицы. #74014 (Christoph Wurm).
  • Реализована поддержка подстолбцов в запросе SELECT для материализованного представления. #74030 (Pavel Kruglov).
  • Теперь есть три простых способа задать пользовательскую строку приглашения (prompt) в clickhouse-client: 1. с помощью параметра командной строки --prompt, 2. в конфигурационном файле, с помощью настройки <prompt>[...]</prompt>, и 3. также в конфигурационном файле, с помощью настроек для отдельных подключений <connections_credentials><prompt>[...]</prompt></connection_credentials>. #74168 (Christoph Wurm).
  • Автоматически определять защищённое соединение при подключении к порту 9440 клиентом ClickHouse. #74212 (Christoph Wurm).
  • Аутентифицировать пользователей только по имени пользователя для http_handlers (ранее пользователю также требовалось указывать пароль). #74221 (Azat Khuzhin).
  • Поддержка альтернативных языков запросов PRQL и KQL помечена как экспериментальная. Чтобы использовать их, укажите настройки allow_experimental_prql_dialect = 1 и allow_experimental_kusto_dialect = 1. #74224 (Robert Schulze).
  • Добавлена поддержка возврата типа Enum по умолчанию в большем количестве агрегатных функций. #74272 (Raúl Marín).
  • В операторе OPTIMIZE TABLE теперь можно указывать ключевое слово FORCE в качестве альтернативы существующему ключевому слову FINAL. #74342 (Robert Schulze).
  • Добавлена метрика IsServerShuttingDown, необходимая для срабатывания оповещения, когда завершение работы сервера занимает слишком много времени. #74429 (Miсhael Stetsyuk).
  • Добавлены имена таблиц Iceberg в вывод EXPLAIN. #74485 (alekseev-maksim).
  • Улучшено сообщение об ошибке при использовании RECURSIVE CTE со старым анализатором. #74523 (Raúl Marín).
  • Отображать подробные сообщения об ошибках в system.errors. #74574 (Vitaly Baranov).
  • Разрешает использование пароля для клиентского подключения к clickhouse-keeper. Эта возможность не очень полезна, если вы указываете корректную конфигурацию SSL для сервера и клиента, но всё же может пригодиться в некоторых случаях. Пароль не может быть длиннее 16 символов. Это не связано с моделью аутентификации Keeper. #74673 (alesapin).
  • Добавлен код ошибки для перезагрузчика конфигурации. #74746 (Garrett Thomas).
  • Добавлена поддержка IPv6-адресов в табличных функциях и движках таблиц MySQL и PostgreSQL. #74796 (Mikhail Koviazin).
  • Реализована оптимизация по принципу короткого замыкания для divideDecimal. Исправляет #74280. #74843 (Kevin Mingtarja).
  • Теперь пользователей можно указывать в стартовых скриптах. #74894 (pufit).
  • Добавлена поддержка токенов SAS для Azure. #72959 (Azat Khuzhin).

Исправление ошибки (видимая пользователю неисправность в официальном стабильном релизе)

  • Задавать уровень сжатия Parquet только в том случае, если кодек сжатия поддерживает эту настройку. #74659 (Arthur Passos).
  • Исправлена регрессия, из-за которой при использовании локалей сортировки с модификаторами возникала ошибка. Например, теперь корректно работает запрос SELECT arrayJoin(['kk 50', 'KK 01', ' KK 2', ' KK 3', 'kk 1', 'x9y99', 'x9y100']) item ORDER BY item ASC COLLATE 'tr-u-kn-true-ka-shifted. #73544 (Robert Schulze).
  • Исправлена ошибка, из-за которой не удавалось создать узел SEQUENTIAL с помощью keeper-client. #64177 (Duc Canh Le).
  • Исправлен некорректный подсчёт количества символов в функциях position. #71003 (思维).
  • Операции RESTORE для сущностей доступа требовали больше прав, чем было необходимо, из-за необработанных частичных отзывов прав. Этот PR исправляет проблему. Закрывает #71853. #71958 (pufit).
  • Исключена пауза после ALTER TABLE REPLACE/MOVE PARTITION FROM/TO TABLE. Обеспечено корректное получение настроек планирования фоновых задач. #72024 (Aleksei Filatov).
  • Исправлена обработка пустых кортежей в некоторых форматах ввода и вывода (например, Parquet, Arrow). #72616 (Michael Kolupaev).
  • Операторы GRANT SELECT/INSERT, заданные на уровне столбцов для баз данных/таблиц, указанных с подстановочными символами, теперь приводят к ошибке. #72646 (Johann Gan).
  • Исправлена ситуация, когда пользователь не может выполнить REVOKE ALL ON *.* из-за неявно выданных прав в целевой сущности доступа. #72872 (pufit).
  • Исправлено форматирование положительных значений смещения часового пояса в скалярной функции formatDateTime. #73091 (ollidraese).
  • Исправление для корректного отражения исходного порта при установлении соединения через PROXYv1 и включённом параметре auth_use_forwarded_address — ранее некорректно использовался порт прокси. Добавлена функция currentQueryID(). #73095 (Yakov Olkhovskiy).
  • Передавать настройки формата в NativeWriter внутри TCPHandler, чтобы такие настройки, как output_format_native_write_json_as_string, применялись корректно. #73179 (Pavel Kruglov).
  • Исправлена ошибка, вызывавшая аварийное завершение работы StorageObjectStorageQueue. #73274 (Kseniia Sumarokova).
  • Исправлено редкое падение сервера при завершении работы из‑за обновляемого материализованного представления. #73323 (Michael Kolupaev).
  • Спецификатор %f функции formatDateTime теперь всегда генерирует шесть цифр для долей секунды. Это делает поведение совместимым с функцией MySQL DATE_FORMAT. Предыдущее поведение можно восстановить с помощью настройки formatdatetime_f_prints_scale_number_of_digits = 1. #73324 (ollidraese).
  • Исправлена фильтрация по столбцу _etag при чтении из хранилища s3 и табличной функции s3. #73353 (Anton Popov).
  • Исправлена ошибка Not-ready Set is passed as the second argument for function 'in', возникавшая при использовании IN (subquery) в выражении JOIN ON со старым анализатором. #73382 (Nikolai Kochetov).
  • Исправлена подготовка к схлопыванию для Dynamic- и JSON-столбцов. Ранее в некоторых случаях новые типы могли быть вставлены в shared variant/shared data, даже если лимит на количество типов/путей не был достигнут. #73388 (Pavel Kruglov).
  • Проверять размеры на повреждение при двоичном декодировании типов, чтобы избежать слишком больших выделений памяти. #73390 (Pavel Kruglov).
  • Исправлена логическая ошибка при чтении из однорепликового кластера при включённом механизме параллельных реплик. #73403 (Michael Kolupaev).
  • Исправлена работа очереди ObjectStorageQueue с ZooKeeper и более старыми версиями Keeper. #73420 (Antonio Andelic).
  • Выполнено исправление, необходимое для включения секционирования Hive по умолчанию. #73479 (Yarik Briukhovetskyi).
  • Исправлена гонка данных при создании индекса сходства векторов. #73517 (Antonio Andelic).
  • Исправлена ошибка сегментации, возникающая, если источник словаря содержит функцию с некорректными данными. #73535 (Yarik Briukhovetskyi).
  • Исправлена логика повторных попыток при неудачной вставке в хранилище S3(Azure)Queue. Закрывает #70951. #73546 (Kseniia Sumarokova).
  • Исправлена ошибка в функции tupleElement, которая могла возникать в некоторых случаях для кортежей с элементами типа LowCardinality при включённой настройке optimize_functions_to_subcolumns. #73548 (Anton Popov).
  • Исправлен разбор шаблона перечисления (enum glob), после которого следует диапазон. Это исправляет #73473. #73569 (Konstantin Bogdanov).
  • Исправлена проблема, из-за которой parallel_replicas_for_non_replicated_merge_tree игнорировался в подзапросах для нереплицируемых таблиц. #73584 (Igor Nikonov).
  • Исправление исключения std::logical_error, возникающего, когда задачу невозможно запланировать. Обнаружено в стресс-тестах. #73629 (Alexander Gololobov).
  • Не интерпретировать запросы в режиме EXPLAIN SYNTAX, чтобы избежать логических ошибок из-за некорректного этапа обработки распределённых запросов. Исправляет #65205. #73634 (Dmitry Novik).
  • Исправлена возможная несогласованность данных в динамическом столбце. Устранена потенциальная логическая ошибка Nested columns sizes are inconsistent with local_discriminators column size. #73644 (Pavel Kruglov).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK в запросах с FINAL и SAMPLE. Исправлен некорректный результат в запросах SELECT с FINAL из CollapsingMergeTree и включены оптимизации FINAL. #73682 (Anton Popov).
  • Исправлена ошибка, приводившая к сбою в LIMIT BY COLUMNS. #73686 (Raúl Marín).
  • Исправлена ошибка, когда при принудительном использовании обычной проекции и запросе, в точности совпадающем с определением проекции, сама проекция не выбиралась, из‑за чего возникала ошибка. #73700 (Shichao Jin).
  • Исправлена ошибка в десериализации структуры Dynamic/Object. Это могло приводить к возникновению исключений CANNOT_READ_ALL_DATA. #73767 (Pavel Kruglov).
  • Пропускать файл metadata_version.txt при восстановлении частей из резервной копии. #73768 (Vitaly Baranov).
  • Исправлена ошибка сегментации при приведении к Enum с использованием LIKE. #73775 (zhanglistar).
  • Исправление проблемы, из-за которой корзина S3 Express не работала в качестве диска. #73777 (Sameer Tamsekar).
  • Разрешить слияние строк с недопустимыми значениями в столбце sign в таблицах CollapsingMergeTree. #73864 (Christoph Wurm).
  • Исправлена ошибка, возникавшая при выполнении DDL-запроса с офлайн-репликой. #73876 (Tuan Pham Anh).
  • Исправлена периодически возникающая ошибка при сравнении типов map() из-за того, что можно создать Map без явного указания имён ('keys','values') для его вложенного кортежа. #73878 (Yakov Olkhovskiy).
  • Игнорировать оконные функции при обработке предложения GROUP BY ALL. Исправлена ошибка #73501. #73916 (Dmitry Novik).
  • Исправлены неявные привилегии (раньше вели себя как подстановочный символ). #73932 (Azat Khuzhin).
  • Исправлено повышенное потребление памяти при создании вложенных Map. #73982 (Pavel Kruglov).
  • Исправлена обработка вложенного JSON с пустыми ключами. #73993 (Pavel Kruglov).
  • Исправление: устранена ошибка, из-за которой псевдоним мог не добавляться в проекцию, если на него ссылался другой псевдоним и он выбирался в обратном порядке. #74033 (Yakov Olkhovskiy).
  • Игнорировать ошибки «object not found» для Azure при инициализации диска plain_rewritable. #74059 (Julia Kartseva).
  • Исправлено поведение any и anyLast с типами Enum и пустой таблицей. #74061 (Joanna Hulboj).
  • Исправлена ошибка, возникавшая при указании пользователем именованных аргументов в табличном движке Kafka. #74064 (Yarik Briukhovetskyi).
  • Исправлена возможность изменения настроек хранилища S3Queue из варианта с префиксом «s3queue_» в вариант без префикса и наоборот. #74075 (Kseniia Sumarokova).
  • Добавлена настройка allow_push_predicate_ast_for_distributed_subqueries. Она добавляет проталкивание предикатов на уровне AST (predicate push-down) для распределённых запросов с анализатором. Это временное решение, которое мы используем до тех пор, пока не будет добавлена поддержка распределённых запросов с сериализацией плана запроса. Закрывает #66878 #69472 #65638 #68030 #73718. #74085 (Nikolai Kochetov).
  • Исправляет проблему, когда после #73095 в поле forwarded_for может присутствовать порт, из‑за чего становится невозможно разрешить имя хоста, если в нём указан порт. #74116 (Yakov Olkhovskiy).
  • Исправлено некорректное форматирование оператора ALTER TABLE (DROP STATISTICS ...) (DROP STATISTICS ...). #74126 (Han Fei).
  • Исправление ошибки #66112. #74128 (Anton Ivashkin).
  • Использовать Loop в качестве движка таблицы в CREATE TABLE больше нельзя. Ранее такая комбинация приводила к сегфолтам. #74137 (Yarik Briukhovetskyi).
  • Устранена уязвимость, чтобы предотвратить SQL‑инъекции в табличных функциях postgresql и sqlite. #74144 (Pablo Marcos).
  • Исправлен сбой при чтении подстолбца из сжатой таблицы с движком Memory. Исправляет проблему #74009. #74161 (Nikita Taranov).
  • Исправлен бесконечный цикл, возникавший при запросах к system.detached_tables. #74190 (Konstantin Morozov).
  • Исправлена логическая ошибка в s3queue при пометке файла как ошибочного. #74216 (Kseniia Sumarokova).
  • Исправлены настройки нативного копирования (allow_s3_native_copy/allow_azure_native_copy) для RESTORE из базового бэкапа. #74286 (Azat Khuzhin).
  • Исправлена проблема, возникавшая, если количество отсоединённых таблиц в базе данных было кратно значению max_block_size. #74289 (Konstantin Morozov).
  • Исправлено копирование через ObjectStorage (т.е. S3), когда учетные данные для источника и назначения различаются. #74331 (Azat Khuzhin).
  • Исправлено определение параметра «использовать метод Rewrite в JSON API» при нативном копировании в GCS. #74338 (Azat Khuzhin).
  • Исправлен некорректный расчёт BackgroundMergesAndMutationsPoolSize (он был вдвое больше фактического значения). #74509 (alesapin).
  • Исправлена ошибка утечки наблюдателей Keeper при включении функции Cluster Discovery. #74521 (RinChanNOW).
  • Исправлена ошибка выравнивания памяти, выявленная UBSan #74512. #74534 (Arthur Passos).
  • Исправлена проблема конкурентной очистки KeeperMap при создании таблицы. #74568 (Antonio Andelic).
  • Не удалять неиспользуемые столбцы проекций в подзапросах при наличии EXCEPT или INTERSECT для сохранения корректного результата запроса. Исправляет #73930. Исправляет #66465. #74577 (Dmitry Novik).
  • Исправлены запросы INSERT SELECT между таблицами со столбцами типа Tuple при включённой разрежённой сериализации. #74698 (Anton Popov).
  • Функция right работает некорректно при константном отрицательном смещении. #74701 (Daniil Ivanik).
  • Исправлена проблема, из-за которой вставка gzip-сжатых данных иногда завершалась сбоем из-за некорректной декомпрессии на стороне клиента. #74707 (siyuan).
  • Частичный отзыв прав при грантах с шаблонами (wildcard) мог приводить к удалению большего количества привилегий, чем ожидалось. Закрывает #74263. #74751 (pufit).
  • Keeper: исправлено чтение записей журнала с диска. #74785 (Antonio Andelic).
  • Исправлена проверка привилегий для SYSTEM REFRESH/START/STOP VIEW: теперь для выполнения запроса с конкретным представлением не требуется иметь эти привилегии на *.*, достаточно привилегий только на это представление. #74789 (Alexander Tokmakov).
  • Функция hasColumnInTable не учитывала алиасы столбцов. Исправлена, теперь она также работает с алиасами столбцов. #74841 (Bharat Nallan).
  • Исправлена ошибка FILE_DOESNT_EXIST, возникавшая при слиянии частей данных таблицы с пустым столбцом в Azure Blob Storage. #74892 (Julia Kartseva).
  • Исправлено имя столбца проекции при соединении временных таблиц, закрыта #68872. #74897 (Vladimir Cherkasov).

Улучшения сборки, тестирования и упаковки

  • Универсальный скрипт установки теперь будет предлагать установку даже на macOS. #74339 (Alexey Milovidov).