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

Оглавление

Релиз ClickHouse v25.12, 2025-12-18
Релиз ClickHouse v25.11, 2025-11-27
Релиз 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.12, 2025-12-18

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

  • ALTER MODIFY COLUMN теперь требует явно указывать DEFAULT при преобразовании столбцов с типом Nullable в типы, не допускающие NULL. Раньше такие ALTER могли зависать с ошибкой cannot convert null to not null; теперь значения NULL заменяются выражением DEFAULT столбца. Устраняет #5985. #84770 (Vladimir Cherkasov).
  • Токенизатор n-грамм больше не будет возвращать n-граммы короче заданной для него длины N. Текстовый поиск не будет возвращать строки, если поисковые токены пусты. #89757 (George Larionov).
  • При изменении столбца с String на Nullable(String) мутация данных не выполняется. Однако для агрегатной функции uniq используется другая структура данных: для Nullable-столбца будет использоваться AggregateFunctionNull с вложенным агрегатором uniq. AggregateFunctionNull сериализует дополнительный булев флаг. Это делает файл статистики несовместимым. Исправление заключается в добавлении флага, который при сериализации записывает, является ли столбец Nullable. Формат статистики изменился, и сервер может завершиться с ошибкой, если присутствует статистика в старом формате. Этот PR #90904 исправляет сбой и генерирует исключение, если существующая статистика использует устаревший формат. Чтобы избежать исключения, следует выполнить ALTER TABLE table MATERIALIZE STATISTICS ALL, чтобы заново сгенерировать статистику и устранить проблему. #90311 (Han Fei).
  • Удалены настройки allow_not_comparable_types_in_order_by/allow_not_comparable_types_in_comparison_functions. Разрешение использования несравнимых типов в ORDER BY или функциях сравнения может приводить к логическим ошибкам и непредсказуемым результатам. Устраняет #90028. #90527 (Pavel Kruglov).
  • Изменено значение по умолчанию для настройки check_query_single_value_result с true на false. В результате CHECK TABLE теперь возвращает подробные результаты по каждой части вместо агрегированного результата (1 = всё в порядке, 0 = обнаружены ошибки). По сравнению с прежним поведением это, вероятно, лучше соответствует ожиданиям пользователя. #91009 (Robert Schulze).
  • Несколько исправлений, связанных с неявными индексами. Отображаемая или сохраняемая схема (метаданные Keeper) не будет включать неявные индексы, например создаваемые настройками add_minmax_index_for_numeric_columns или add_minmax_index_for_string_columns. Это может вызывать ошибки метаданных, если таблица ReplicatedMergeTree создаётся или обновляется в более новой версии, тогда как одна из реплик работает на более старом релизе. В таких случаях отправляйте DDL-запросы в старую реплику, пока кластер не будет полностью обновлён. #91429 (Raúl Marín).
  • Обновлён clickhouse-client: теперь при тайм-ауте запроса из-за receive_timeout он возвращает ненулевой код выхода (159 - TIMEOUT_EXCEEDED). Ранее при тайм-аутах возвращался код выхода 0 (успех), из-за чего скриптам и средствам автоматизации было сложно выявлять такие сбои. #91432 (Sav).
  • Теперь запрещено создавать специализированные таблицы MergeTree (такие как ReplacingMergeTree, CollapsingMergeTree и т. д.) с пустым ключом ORDER BY, поскольку поведение операций слияния в таких таблицах не определено. Если вам всё же нужно создать такую таблицу, включите настройку allow_suspicious_primary_key. #91569 (Anton Popov).
  • Исправлены функции bitShiftLeft и bitShiftRight: теперь они возвращают 0 или пустое значение при сдвиге, равном размеру типа. #91943 (Pablo Marcos).
  • В развитие #88380. В этом PR отключение позиционных аргументов в проекциях помечено как обратно несовместимое изменение. Кроме того, в нём добавлена настройка enable_positional_arguments_for_projections, которая позволяет безопасно обновить кластер ClickHouse, если в проекциях используются позиционные аргументы. #92007 (Dmitry Novik).
  • По умолчанию включено расширенное использование общих данных для JSON. После этого изменения откат на версии ниже 25.8 станет невозможен, поскольку они не смогут читать новые части данных с JSON-столбцом. Для безопасного обновления рекомендуется установить для настройки compatibility значение предыдущей версии или задать настройки MergeTree dynamic_serialization_version='v2', object_serialization_version='v2'. #92511 (Pavel Kruglov).

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

  • Теперь пользователи могут настраивать таблицы S3/Azure Queue так, чтобы перемещать или помечать обработанные файлы, помимо прежних вариантов — сохранять или удалять их. Закрывает #72944. #86907 (Murat Khairulin).
  • Для хранилищ S3/Azure Queue добавлена настройка commit_on_select (чтобы задать, нужно ли фиксировать обработанные данные и применять действие after_processing). Значение по умолчанию — false; исправлена проверка присоединённого mv при выполнении select. #91450 (Kseniia Sumarokova).
  • Добавлена поддержка инструментирования во время выполнения с помощью XRay для отладки неполадок в продакшене и детерминированного профилирования. Устраняет #74249. #89173 (Pablo Marcos).
  • Разрешает использовать неконстантные вторые аргументы для IN. Также поддерживает Tuple в качестве второго аргумента. #77906 (Yarik Briukhovetskyi).
  • Функции для вычисления площади и периметра для типа Geometry. #89047 (Konstantin Vedernikov).
  • Реализована функция dictGetKeys, которая возвращает ключ или ключи словаря, атрибут которого равен указанному значению. Она использует кэш обратного поиска на уровне запроса, настраиваемый параметром max_reverse_dictionary_lookup_cache_size_bytes, чтобы ускорить повторные обращения. #89197 (Nihal Z. Miaji).
  • Добавлена настройка type_json_skip_invalid_typed_paths, которая отключает исключения при вставке/приведении типов к типу JSON, если входной JSON нельзя привести к явно типизированным путям в типе JSON. В этом случае используется значение null/0 для типизированного пути. #89886 (Max Justus Spransy).
  • Добавлена поддержка direct (JOIN на вложенных циклах) для таблиц MergeTree. Чтобы использовать этот алгоритм, укажите его как единственный вариант в настройке: join_algorithm = 'direct'. #89920 (Vladimir Cherkasov).
  • Добавлена поддержка ORDER BY в операции CREATE для Iceberg и сортировки при INSERT. Закрывает #89916. #90141 (Konstantin Vedernikov).
  • Добавлены настройки на уровне проекций, доступные через новое предложение WITH SETTINGS в ALTER TABLE ... ADD PROJECTION. Эти настройки позволяют проекциям переопределять некоторые параметры хранения MergeTree (например, index_granularity, index_granularity_bytes) для каждой проекции отдельно. #90158 (Amos Bird).
  • Добавлена функция SQL HMAC(algorithm, message, key) в рамках #73900 и #38775. #90837 (Mikhail f. Shiryaev).
  • Добавлена поддержка функции has: теперь, если первый аргумент — константный массив, можно использовать первичный ключ и индексы пропуска данных. Закрывает #90980. #91023 (Nihal Z. Miaji).
  • Реализован новый входной и выходной формат Buffers. Этот формат похож на Native, однако, в отличие от Native, не хранит имена столбцов, типы столбцов и какие-либо дополнительные метаданные. Закрывает #84017. #91156 (Nihal Z. Miaji).
  • Добавлена настройка max_streams_for_files_processing_in_cluster_functions для управления количеством потоков для параллельного чтения файлов в табличных функциях Cluster. Закрывает #90223. #91323 (Pavel Kruglov).
  • Маскирование данных для построчной безопасности (доступно только в ClickHouse Cloud). В clickhouse-client добавлен парсер политик маскирования данных для поддержки этой функции. #90552 (pufit).
  • Добавлена опция allow_reentry для агрегатной функции windowFunnel. Когда она включена вместе с strict_order, события, нарушающие порядок, игнорируются вместо того, чтобы останавливать анализ воронки. Это позволяет корректно обрабатывать пользовательские сценарии с обновлением страницы (A->A->B) или возвратом назад (A->B->A->C), не занижая показатели конверсии. #86916 (Lee ChaeRok).
  • Совместимость Keeper с ZooKeeper: create со statistics. #88797 (Konstantin Vedernikov).
  • Поддержка постоянных наблюдений ZooKeeper в ClickHouse Keeper. Продолжение, часть 2: https://github.com/ClickHouse/ClickHouse/pull/78207. #88813 (Konstantin Vedernikov).
  • Добавлена настройка MergeTree alter_column_secondary_index_mode, чтобы управлять тем, как обрабатывать индексы во время мутаций. Возможные значения: сгенерировать исключение, удалить, перестроить и режим совместимости. Закрывает #77797. #89335 (Raúl Marín).
  • Поскольку типы данных Time и Time64 готовы к использованию в production, настройка enable_time_time64_type теперь включена по умолчанию. #89345 (Yarik Briukhovetskyi).
  • Добавлена поддержка чтения DeltaLake CDF через табличную функцию deltaLake с настройками delta_lake_snapshot_start_version, delta_lake_snapshot_end_version. CDF (Change Data Feed — возможность, которая позволяет автоматически фиксировать изменения данных на уровне строк, такие как вставки, обновления и удаления, и выполнять к ним запросы между версиями Delta-таблицы) включается в DeltaLake через delta.enableChangeDataFeed. Вместе с данными предоставляются столбцы _change_type, _commit_version, _commit_timestamp. #90431 (Kseniia Sumarokova).
  • Поддержка отрицательных индексов при доступе к элементам кортежа (например, tuple.-1). #91665 (Amos Bird).

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

  • Представлен формат текстового индекса v3, получивший статус бета.
  • Добавлена новая логика для автоматического выполнения запросов с использованием параллельных реплик, управляемая настройкой automatic_parallel_replicas_mode. При обычном выполнении на одном узле ClickHouse собирает статистику, которая затем учитывается на этапе планирования. Если статистика показывает, что параллельные реплики, вероятно, будут полезны, ClickHouse автоматически выполнит данный запрос с их использованием. Набор поддерживаемых запросов пока довольно ограничен. #87541 (Nikita Taranov).
  • Добавлен доступ к экземплярам ClickHouse Cloud с помощью учетных данных Cloud через —login. #89261 (Krishna Mannem).
  • Добавлена настройка уровня сеанса aggregate_function_input_format, улучшающая запросы INSERT в таблицы со столбцами AggregateFunction и позволяющая выполнять вставку данных в виде сериализованного состояния, исходных значений или массивов. #88088 (Punith Nandyappa Subashchandra).

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

  • Оптимизируйте запросы ORDER BY...LIMIT N с помощью индекса пропуска данных и динамического фильтра по пороговому значению, чтобы значительно сократить количество обрабатываемых строк. #89835 (Shankar Iyer).
  • Теперь ClickHouse использует индексы пропуска данных для анализа индексов в предложениях WHERE со смешанными условиями фильтрации, объединёнными AND и OR. Ранее, чтобы задействовать индексы пропуска данных, предложение WHERE должно было быть конъюнкцией (AND) условий фильтрации. Этой возможностью управляет новая настройка use_skip_indexes_for_disjunctions (по умолчанию: включено). (issue #75228). #87781 (Shankar Iyer).
  • Добавлена поддержка сохранения чтения по порядку из левой таблицы при операциях LEFT/INNER JOIN, что может использоваться на следующих этапах. Эту возможность можно отключить с помощью настройки query_plan_read_in_order_through_join. Для LEFT/INNER JOIN также добавлена поддержка оптимизации чтения с виртуальной строкой (см. настройку read_in_order_use_virtual_row). #89815 (Vladimir Cherkasov).
  • Повышена производительность отложенно материализуемых столбцов благодаря увеличению лимита. #90309 (Nikolai Kochetov).
  • Пользователи должны заметить снижение задержки при анализе индексов, если присутствуют большие индексы minmax (миллионы гранул). #90428 (Shankar Iyer).
  • Реализован простой алгоритм переупорядочивания INNER JOIN на основе DPsize. Новая экспериментальная настройка задаёт, какие алгоритмы и в каком порядке использовать; например, query_plan_optimize_join_order_algorithm='dpsize,greedy' означает, что сначала пробуется DPsize, а затем выполняется fallback на greedy. #91002 (Alexander Gololobov).
  • Запросы теперь сразу завершаются с ошибкой при достижении лимита строк. Исправляет #61872. #62804 (Sean Haynes).
  • #84477 добавил ограничения, касающиеся SELECT-запросов, которые можно использовать в запросах insert select from s3Cluster(...) для параллельного распределённого выполнения. Это изменение позволяет использовать WHERE, как и прежде. #84611 (Igor Nikonov).
  • Использовать предвыборку ключей при итерации по хеш-таблице, чтобы свести к минимуму промахи кэша. #84708 (lgbo).
  • Оптимизирована агрегатная функция histogram: сортируется только хвост массива точек, а для монотонных входных значений сортировка пропускается, что даёт прирост производительности примерно на 10%. #85760 (MakarDev).
  • Повышена производительность фильтрации для предикатов с такими функциями, как like, equals, has и другие, за счёт использования дополнительного предварительного фильтра, построенного на основе text index. Эта оптимизация включается настройкой query_plan_text_index_add_hint. Также улучшено использование text index для столбцов типа данных Map. #88550 (Anton Popov).
  • Оптимизированы повторяющиеся обратные обращения к словарю за счёт более быстрых поисков по заранее вычисленному набору возможных значений ключей. Закрывает #7968. #88971 (Nihal Z. Miaji).
  • Улучшены производительность и работа агрегатной функции topK. #90091 (Raúl Marín).
  • Повышена производительность операций сравнения Decimal. Устранена проблема #28192. #90153 (Konstantin Bogdanov).
  • Добавлена поддержка отсечения партиций для функций Apache Paimon как продолжение https://github.com/ClickHouse/ClickHouse/pull/84423. #90253 (JIaQi).
  • Используются расширенные SIMD-операции для логических функций через динамическую диспетчеризацию. #90432 (Raúl Marín).
  • Улучшена производительность JIT-функции за счёт устранения ненужной инициализации результирующего столбца нулём. #90449 (Raúl Marín).
  • Ускорена декомпрессия T64 за счёт динамической диспетчеризации. #90610 (Raúl Marín).
  • Оптимизирована фильтрация inplace в модуле чтения MergeTree. Исправляет #87119. #90630 (Xiaozhe Yu).
  • Добавлена дополнительная эвристика, уменьшающая количество частей в выбранных вариантах слияния. Более узкие слияния увеличивают усиление записи, но при этом могут помочь избежать ошибок TOO_MANY_PARTS. #91163 (Mikhail Artemenko).
  • Улучшена производительность запросов для таблиц S3, созданных с использованием glob-шаблона, за счет проталкивания значений фильтра _path, что позволяет избежать операций листинга в S3. Управляется настройкой s3_path_filter_limit. #91165 (Eduard Karacharov).
  • Ускорено преобразование столбцов к типу bool (в предложениях WHERE) за счёт динамической диспетчеризации. #91203 (Raúl Marín).
  • Ускорена сортировка отдельного числового блока с помощью динамической диспетчеризации. #91213 (Raúl Marín).
  • Добавлена оптимизация, удаляющая неиспользуемые столбцы из планов запросов. Устраняет #75152. #76487 (János Benjamin Antal).
  • Значение параметра query_plan_optimize_join_order_limit по умолчанию изменено на 10. #89312 (Alexey Milovidov).
  • Настройка allow_statistics_optimize теперь включена по умолчанию, чтобы оптимизатор JOIN использовал статистику столбцов. #89332 (Alexey Milovidov).
  • Добавлена поддержка JOIN Runtime Filters для ANTI JOIN. Также переработана реализация runtime-фильтров, чтобы снизить конкуренцию за блокировки. #89710 (Dmitry Novik).
  • Снижает использование памяти при слияниях в таблице system.metric_log (включено по умолчанию), задавая min_bytes_for_wide_part и vertical_merge_algorithm_min_bytes_to_activate значение 128MB. #89811 (filimonov).
  • Добавлена возможность использовать инвертированный индекс в PREWHERE. Устраняет #89975. #89977 (Peng Jian).
  • Не добавляйте провайдеры S3 при использовании GCP OAuth — это повышает производительность в GCS. #91706 (Antonio Andelic).

Улучшения

  • Добавлена новая настройка apply_row_policy_after_final, которая позволяет применять политику строк к запросу только после FINAL, что делает поведение ReplacingMergeTree с политиками строк более корректным. Исправляет #90986. #91065 (Yarik Briukhovetskyi).
  • В формате Pretty именованные кортежи теперь отображаются в виде Pretty JSON. Это закрывает #65022. #91779 (Mostafa Mohamed Salah).
  • В таблицу system.error_log добавлены поля last_error_time, last_error_message, last_error_query_id и last_error_trace. #89879 (Narasimha Pakeer).
  • CLI-клиент теперь может отключать вывод сообщения ‘Версия сервера ClickHouse старее, чем версия клиента ClickHouse. Это может указывать на то, что сервер устарел и его можно обновить’ при указании --no-server-client-version-message или false. #87784 (Larry Snizek).
  • Добавлено сообщение об ошибке о том, что часть была дедуплицирована. #80264 (Aleksandr Musorin).
  • Добавлены столбцы dependencies и missing_dependencies в system.kafka_consumers, чтобы показывать целевые таблицы materialized view для таблиц Kafka. Добавлен Counter KafkaMVNotReady. #85346 (Ilya Golshtein).
  • Теперь выражения по умолчанию в таблице корректно работают при вставке через remote и собственный протокол. Закрывает #87972. #88540 (Pervakov Grigorii).
  • Добавлена возможность отключать сбор асинхронных метрик PSI_*_*. #88557 (MikhailBurdukov).
  • Добавлена поддержка разреженной сериализации для столбцов типа Nullable. Это развитие #44539. #88999 (Amos Bird).
  • У диска plain-rewritable собственные реализация и структура. Не будем реализовывать его поверх обычных дисков plain. #89807 (Mikhail Artemenko).
  • Ни одно исключение HTTP не должно содержать завершающий нулевой фрагмент. #89998 (Kaviraj Kanagaraj).
  • Добавлена проверка на стороне сервера Keeper при рукопожатии, чтобы отклонять клиентов, когда last_zxid_seen (provided by the client) > last_processed_zxid. Это предотвращает чтение устаревших данных, когда клиенты повторно подключаются к отстающим репликам. #90016 (Miсhael Stetsyuk).
  • Добавлен настраиваемый параметр kafka_consumer_reschedule_ms для движка таблицы Kafka, позволяющий задавать, как долго потребители ждут новых данных. Исправляет #89204. #90112 (Jeremy Aguilon).
  • В system.mutations добавлен новый столбец parts_in_progress_names для улучшения диагностики. #90155 (Shaohua Wang).
  • Повторная попытка при сетевых ошибках, когда библиотека S3 разбирает XML-ответ. #90216 (Sema Checherinda).
  • Мы хотим запускать Keeper в отдельных процессах сервера и, чтобы не перегружать Prometheus в крупных регионах, по-прежнему экспортировать только метрики Keeper. #90244 (Miсhael Stetsyuk).
  • Добавлена поддержка загрузки конфигурации клиента ClickHouse из путей XDG Base Directory (например, ~/.config/clickhouse/config.xml) в дополнение к устаревшему пути ~/.clickhouse-client/. Исправлено #89882. #90306 (Wujun Jiang).
  • Добавлено ограничение на размер батча запросов append в Keeper в байтах. Ограничение задается с помощью keeper_server.coordination_settings.max_requests_append_bytes_size. #90342 (Antonio Andelic).
  • Добавлена настройка для Iceberg, предотвращающая слишком большое число партиций. #90365 (Konstantin Vedernikov).
  • Обновлены предупреждения при приближении к пределам guardrails: теперь в них показываются текущие значения и значения параметра «сгенерировать исключение». #90438 (Nikita Fomichev).
  • В таблице system.filesystem_cache фрагменты теперь отдаются потоково, а не одним фрагментом со всем состоянием кэша. Чтение состояния файлового кэша при больших объёмах кэша может занимать много времени и потреблять много памяти, поэтому потоковая выдача незаменима для крупных развертываний. #90508 (Kseniia Sumarokova).
  • Исправлено некорректное сообщение об исключении в механизме партиционирования Hive: в нём не хватало пробела. #90685 (Alexey Milovidov).
  • Записи в кэше индекса векторного сходства теперь удаляются при удалении частей таблицы или их замене более новыми частями. Ранее они очищались только по мере вытеснения из кэша. #90750 (Shankar Iyer).
  • Обновлён chdig (инструмент диагностики ClickHouse для командной строки) до версии v25.12.1. #91394 (Azat Khuzhin).
  • Теперь предварительно подписанные URL поддерживаются в S3. Закрывает #65032. #90827 (Yarik Briukhovetskyi).
  • Текстовый индекс теперь работает с таблицами ReplacingMergeTree. #90908 (Elmi Ahmadov).
  • Не раскрывать версию сервера ClickHouse в HTTP-ответах с ошибками, возвращаемых до аутентификации. #91003 (filimonov).
  • Теперь при достижении hard_limit для HTTP-подключений клиентов будет сгенерировано исключение HTTP_CONNECTION_LIMIT_REACHED. Для подключений к дискам это значение установлено в 20000. #91016 (Sema Checherinda).
  • Добавлены system.background_schedule_pool{,_log} для улучшения диагностики фоновых задач. #91157 (Azat Khuzhin).
  • Теперь в редакторе запросов веб-интерфейса можно быстро закомментировать или раскомментировать выделенные строки с помощью Ctrl+/ (или Cmd+/ на Mac), что упрощает временное отключение частей запроса во время тестирования. #91160 (Samuel K.).
  • В список всегда доступных таблиц добавлена system.completions. #91166 (Yakov Olkhovskiy).
  • Добавлены события профиля FailedInitialQuery и FailedInitialSelectQuery. #91172 (RinChanNOW).
  • Исправлено потенциальное голодание в пуле потоков при чтении выборок столбцов для JSON-столбцов с большим количеством подстолбцов: теперь учитывается настройка merge_tree_use_prefixes_deserialization_thread_pool, а не используется пул потоков безусловно. #91208 (Raufs Dunamalijevs).
  • Добавлена поддержка типа JSON в tupleElement. Закрывает #81630. #91327 (Pavel Kruglov).
  • Исправлены ложные ошибки, связанные с ограничением памяти, при включенном кэше страниц в пространстве пользователя. #91361 (Michael Kolupaev).
  • Токенизатор n-грамм теперь можно создавать при ngram_length = 1. #91529 (George Larionov).
  • Добавлена поддержка настроек хранилища внутри функций в INSERT INTO FUNCTION, как это уже поддерживается для SELECT. Закрывает #89386. #91707 (Kseniia Sumarokova).
  • Генерировать исключение “not implemented” при запросе TRUNCATE для озер данных вместо того, чтобы молча ничего не делать. Закрывает #86604. #91713 (Kseniia Sumarokova).
  • В ридере Parquet v3 задан максимальный размер сообщения, чтобы избежать ошибки DB::Exception: apache::thrift::transport::TTransportException: MaxMessageSize reached. #91737 (Arthur Passos).
  • Добавлена настройка insert_select_deduplicate. Она яснее показывает, как обрабатывается дедупликация вставки для INSERT SELECT. В общем случае для таких запросов дедупликация невозможна, но если таблица не меняется, а результат отсортирован, то при повторной попытке дедупликацию можно выполнить. Мы не могли отследить, что источник один и тот же. Но могли проверить, что результат запроса SELECT отсортирован. На практике оказалось, что в общем случае это действительно очень трудно проверить, но простой случай с ORDER BY ALL обрабатывается легко. Сейчас логика здесь фактически сломана. Мы пытаемся выполнять дедупликацию, но в большинстве случаев она просто не видит дубликаты среди блоков, потому что SELECT возвращает разные данные. #91830 (Sema Checherinda).
  • Разрешено неявное преобразование типов при приведении Array к QBit. Теперь целочисленные массивы и массивы с плавающей точкой можно вставлять напрямую в столбцы QBit без явного приведения типов. #91846 (Raufs Dunamalijevs).
  • Добавлено ограничение на размер сообщения CapnProto. Его можно изменить с помощью format_capn_proto_max_message_size. #91888 (Antonio Andelic).
  • Уточнены метрики кэша меток, чтобы они учитывали только запросы (после #83415 MarkCacheHits/MarkCacheMisses также обновлялись для слияний; этот PR возвращает прежнее поведение). #91910 (Azat Khuzhin).
  • Исправлена проблема, из-за которой для локальных подключений client_info.interface устанавливался в TCP. #91933 (Konstantin Bogdanov).
  • Параметр refresh_certificates_task_interval в конфигурации клиента ACME теперь принимает значение в секундах. #92211 (Konstantin Bogdanov).
  • Логирование событий частей в system.part_log для system.*_log. #92217 (Azat Khuzhin).

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

  • Исправлены некоторые ошибки в PREWHERE, связанные с супертипами для типов данных Time и Time64. Устранена проблема #84544. #84715 (Yarik Briukhovetskyi).
  • DNSResolver теперь инициализируется перед использованием, чтобы применялись пользовательские настройки. Исправлено #76296. #81302 (Zhigao Hong).
  • Исправлено чтение подстолбцов из столбца, в имени которого есть точка, в некоторых случаях. Устраняет #81261, #82058, #88169. #87205 (Pavel Kruglov).
  • Исправлен сбой движка GenerateRandom при использовании нелитеральных параметров: теперь вместо LOGICAL_ERROR возвращается BAD_ARGUMENTS с понятным сообщением. #88157 (Shafi Ahmed).
  • Исправлено удаление неиспользуемых столбцов проекции при наличии UNION. Устранена проблема #88180. #88350 (Sema Checherinda).
  • Исправлено некорректное разбиение на сегменты при оптимизации JOIN, когда первичный ключ отсортирован по убыванию. Устраняет #88512. #88794 (Amos Bird).
  • Снова включена s3queue_keeper_fault_injection_probablility, исправлены проблемы. #88800 (Kseniia Sumarokova).
  • Исправлено несколько проблем, вызванных преждевременным удалением столбцов при применении TTL. Исправляет #88002. #88860 (Amos Bird).
  • Генерировать исключение, если temporary_files_buffer_size установлено в 0. Устраняет #88900. #88917 (Vladimir Cherkasov).
  • Исправлена ошибка Bad get, возникавшая при анализе индекса Set, если предикат содержал константу NULL. Исправляет #84856 и #82974. #89429 (Nikolai Kochetov).
  • Исправлена ошибка Cannot add subcolumn X.Y: column with this name already exists. Устраняет #89599. #89602 (Azat Khuzhin).
  • Исправлены ошибки в функциях theilsU и contingency, из-за которых результаты были некорректными. #89760 (Nihal Z. Miaji).
  • Исправлены проблемы со стабильностью псевдонимов: исправлен StrictnessLevel для SharedDatabaseCatalog, запрещено, чтобы target также был псевдонимом, и реализованы дополнительные интерфейсы (getSerializationHints, supportsReplication, getStoragePolicy, totalBytesUncompressed, lifetimeRows, lifetimeBytes, storesDataOnDisk, tryLockForShare, lockForShare). Исправляет #89106. #89812 (Kai Zhu).
  • Исправлено возможное аварийное завершение при удалённом запросе с ARRAY JOIN внутри IN и при включённой настройке enable_lazy_columns_replication. Устраняет #90361. #89997 (Pavel Kruglov).
  • Исправлена возможная логическая ошибка при использовании analyzer_compatibility_join_using_top_level_identifier с несколькими операциями JOIN. #90010 (Vladimir Cherkasov).
  • Исправлено распознавание некорректных значений DateTime64 из строк в текстовых форматах в некоторых случаях. Устраняет #89368. #90013 (Pavel Kruglov).
  • Добавлены проверки размера при десериализации данных из состояний агрегации и других источников. #90031 (Raúl Marín).
  • Разделение диапазонов частей по характеристикам томов, чтобы включить TTL-слияния с удалением для холодных томов. После этого исправления части, у которых max TTL < now, будут удаляться из холодного хранилища. Алгоритм будет планировать только удаление отдельных частей. #90059 (Mikhail Artemenko).
  • В случае, если таблица Kafka была создана с настройкой kafka_handle_error_mode = 'dead_letter_queue', а таблица system.dead_letter_queue не была настроена, сервер мог аварийно завершиться. Это поведение исправлено. Исправлено #87573. #90064 (Nikita Mikhaylov).
  • Исправлена возможная ошибка Column with Array type is not represented by ColumnArray column: Replicated при вставке с использованием ARRAY JOIN, когда включена настройка enable_lazy_columns_replication. #90066 (Pavel Kruglov).
  • Исправлен сбой при корректном завершении работы сервера из-за неправильного порядка уничтожения объектов. Решает проблему #82420. #90076 (Nikita Mikhaylov).
  • Исправлены логическая ошибка и ошибка вычисления по модулю в системной таблице numbers при использовании большого шага. Закрывает #83398. #90123 (Nihal Z. Miaji).
  • Исправлена запись в Parquet, при которой исходный порядок не сохранялся при использовании собственного механизма однопоточной записи. Частично отменяет https://github.com/ClickHouse/ClickHouse/pull/64424/files. #90126 (Arthur Passos).
  • Не применять оптимизацию константных узлов для выражения LIMIT/OFFSET. Исправляет #89607. #90156 (Yakov Olkhovskiy).
  • Исправлена несовместимость Hive-партиционирования, препятствовавшая плавному обновлению в версии 25.8 (устранена ошибка All hive partitioning columns must be present in the schema, возникавшая во время обновления). #90202 (Kseniia Sumarokova).
  • Исправлено исключение JSON в таблице Iceberg со столбцом с временной меткой при использовании Glue catalog. Устранена проблема #90210. #90209 (Alsu Giliazova).
  • Исправляет несоответствие числа строк в MergeTreeReaderIndex, когда в части данных меньше строк, чем в index_granularity. Устраняет #89691. #90254 (Peng Jian).
  • Исправлен бесконечный запрос WITH FILL с nan/inf. Исправляет #69261. #90255 (Konstantin Bogdanov).
  • Исправлена ошибка ‘столбец не найден’ при query_plan_use_logical_join_step=0 и наличии остаточного условия в JOIN ON. Устраняет #88635. #90279 (Vladimir Cherkasov).
  • Исправлена работа некоторых запросов при оптимизации агрегированными проекциями. #90288 (János Benjamin Antal).
  • Исправлена ошибка при чтении подстолбцов из JSON в компактных частях, которая могла приводить к ошибке CANNOT_READ_ALL_DATA. Устраняет #90264. #90302 (Pavel Kruglov).
  • Теперь ClickHouse не будет использовать оптимизацию чтения в порядке сортировки для Iceberg, если порядок сортировки не указан в файлах manifest (или не совпадает с default_sort_order в таблице). Исправляет #89178. #90304 (alesapin).
  • Time и Time64 теперь должны корректно учитывать часовые пояса при преобразовании из DateTime и DateTime64 (они должны отображать время в том же часовом поясе, что и DateTime[64] для пользователя). Закрывает #89896. #90310 (Yarik Briukhovetskyi).
  • Исправлена ошибка, из-за которой SELECT CAST(CAST(now(), 'Time'), 'Time64') выдавал некорректный результат. Закрывает #88349. #90324 (Yarik Briukhovetskyi).
  • Исправлен сбой из-за переполнения целого числа в randomStringUTF8. #90326 (Michael Kolupaev).
  • Исправлены обновления Cluster Discovery в мультикластерных конфигурациях с multicluster_root_path, чтобы избежать задержек и пропуска обновлений ZooKeeper. #90341 (RinChanNOW).
  • Исправлена возможная логическая ошибка в prewhere при обращении к несуществующему пути JSON с index_granularity_bytes=0. Устраняет #86924. #90375 (Pavel Kruglov).
  • Исправлена ошибка в L2DistanceTransposed, которая приводила к сбоям, если аргумент precision выходил за пределы допустимого диапазона. Закрывает #90401. #90405 (Raufs Dunamalijevs).
  • Исправлена возможная логическая ошибка в arrayUnion при аргументе Array(Dynamic). Устраняет проблему #90270. #90409 (Pavel Kruglov).
  • Исправлена возможная логическая ошибка при переименовании и изменении одного и того же вложенного столбца в одной команде ALTER. Устраняет #90406. #90412 (Pavel Kruglov).
  • Исправлен разбор значений JSON/Dynamic/Variant, передаваемых через HTTP-параметры. Устраняет #88925. #90430 (Pavel Kruglov).
  • Исправлено состояние гонки в партиционировании Hive: статический KeyValuePairExtractor мог приводить к повреждению данных или сбоям при параллельном чтении файлов. #90474 (Paresh Joshi).
  • Исправлены некорректные вычисления расстояния в L2DistanceTransposed при использовании ссылочных векторов-массивов (для которых по умолчанию используется Array(Float64))) со столбцами QBit с типами элементов, отличными от Float64 (Float32, BFloat16). Теперь функция автоматически приводит ссылочный вектор к типу элемента столбца QBit. Устраняет #89976. #90485 (Raufs Dunamalijevs).
  • Исправлена ошибка, из-за которой toDateTimeOrNull для отрицательного аргумента возвращает NULL. #90490 (Yarik Briukhovetskyi).
  • Исправлена возможная логическая ошибка при выводе LowCardinality(Bool/Date32) в формате Arrow. Исправление #83883. #90505 (Pavel Kruglov).
  • Исправлены функции парсинга IPv4 (например, IPv4StringToNumOrDefault), которые для некоторых некорректных входных данных возвращали произвольные значения. Исправляет #90544. Исправляет #87583. #90545 (Michael Kolupaev).
  • Повторять попытку markReplicasActive при сбое разрешения адреса во время проверки локального хоста: выводить предупреждение в лог, если при проверке собственного хоста в DDLTask возникает исключение. В DDLWorker::markReplicasActive — сгенерировать исключение для повторной попытки, если локальный хост не найден, а в кластерах есть идентификаторы хостов. #90556 (Tuan Pham Anh).
  • Исправлена логическая ошибка, возникавшая в редком случае в функции equals. Закрывает #88142. #90557 (Nihal Z. Miaji).
  • Предположительно устраняет сбои ThreadSanitizer в test_ssh/test.py::test_paramiko_password. #90612 (Govind R Nair).
  • Исправлена логическая ошибка в функции concatWithSeparator при использовании константного столбца нестрокового типа. Закрывает #90596. #90655 (Nihal Z. Miaji).
  • Исправлено форматирование в INTO OUTFILE. Устранена проблема #90207. #90656 (Azat Khuzhin).
  • Устранено возможное аварийное завершение при выполнении мутаций с подзапросами и allow_statistics_optimize=1. Устраняет #90626. #90664 (Azat Khuzhin).
  • Исправлена валидация analyzer для LIMIT BY с GROUP BY, чтобы при использовании в LIMIT BY столбцов, отсутствующих в GROUP BY, возвращалась корректная ошибка NOT_AN_AGGREGATE вместо NOT_FOUND_COLUMN_IN_BLOCK. Закрывает #89713. #90665 (xiaohuanlin).
  • Исправлены ошибки приведения типов при использовании столбцов LowCardinality в ключах партиционирования. Исправление закрывает #89412. #90666 (xiaohuanlin).
  • Исправлена проблема, из-за которой запросы с фильтрующими предикатами, содержащими константы, полученные свёрткой недетерминированных функций (например, shardNum()), могли некорректно использовать кэш условий запроса. #90692 (Eduard Karacharov).
  • Исправлен segfault в запросе с функцией EXISTS в секции ON оператора JOIN. Теперь запрос просто возвращает ошибку INVALID_JOIN_ON_EXPRESSION. Закрывает #90698. #90719 (Vladimir Cherkasov).
  • Исправлена логическая ошибка: ‘Inconsistent AST formatting’ для AccessRightsElement при использовании базы данных по умолчанию без указания какой-либо таблицы. #90742 (Pablo Marcos).
  • Исправлена проверка прав доступа для запросов ALTER UPDATE при использовании табличной функции remote с localhost в качестве целевого хоста. #90761 (pufit).
  • Исправлено: скрытие секретов в именованных коллекциях теперь зависит от display_secrets_in_show_and_select и format_display_secrets_in_show_and_select. #90765 (Pablo Marcos).
  • Отключён параметр enable_shared_storage_snapshot_in_query (приводит к утечкам памяти). #90770 (Azat Khuzhin).
  • Исправлена проблема с дублированием данных в RIGHT JOIN с distributed таблицей при включенных параллельных репликах. #90806 (zoomxi).
  • Исправлено возможное неконсистентное состояние общих данных и динамических путей в JSON, которое могло приводить к логическим ошибкам и непредсказуемым результатам. #90816 (Pavel Kruglov).
  • Исправлена ошибка в ALTER MODIFY QUERY с dictGet() и именем словаря в CSE для SharedCatalog (Только в ClickHouse Cloud). #90860 (Azat Khuzhin).
  • Исправлена совместимость сериализации в памяти для состояния агрегации String. Различия в сериализации могли приводить к дублированию результатов, если запрос агрегации выполнялся на экземплярах с разными версиями. Новую сериализацию можно включить с помощью serialize_string_in_memory_with_zero_byte. #90880 (Antonio Andelic).
  • Исправлен фоновый сброс Buffer при частых операциях INSERT. #90892 (Azat Khuzhin).
  • Не включать родительский каталог contrib/ в system.licenses. #90901 (Raúl Marín).
  • Исправлено повышенное использование памяти при чтении столбцов JSON/Dynamic/Variant. #90907 (Pavel Kruglov).
  • Исправлено выделение буфера в функции base58Decode. #90909 (Antonio Andelic).
  • Исправлена возможная логическая ошибка при получении от реплики ещё одного запроса на чтение после того, как был отправлен ответ с флагом finish=true. Это могло происходить из-за состояния гонки в логике MergeTreeReadPoolParallelReplicas, хотя вероятность такого сценария была крайне мала. #90921 (Nikita Taranov).
  • Исправлена проверка привилегий с символами подстановки при частичном отзыве. Добавлено больше тестов. #90922 (pufit).
  • Исправлена агрегация в SummingMergeTree для столбцов Nested LowCardinality. #90927 (Ivan Babrou).
  • Исправлена обработка глобальных привилегий при отзыве привилегий с подстановочными знаками. Устраняет проблему, из-за которой при отзыве привилегии с подстановочным знаком могли случайно отозваться некоторые привилегии глобального уровня, такие как CREATE USER. #90928 (pufit).
  • Исправлен возможный бесконечный цикл при выполнении azure list blobs. #90947 (Julia Kartseva).
  • Исправлены слишком частые сбросы Buffer (нагружают CPU и создают массу журналов). #91000 (Azat Khuzhin).
  • … Не разрешать устанавливать adaptive_write_buffer_initial_size в 0. #91001 (Pedro Ferreira).
  • Исправлена ошибка в JSON, возникавшая, когда путь мог одновременно присутствовать и в общих данных, и в динамических путях при чтении подобъекта в компактных частях с отключённым write_marks_for_substreams_in_compact_parts. #91014 (Pavel Kruglov).
  • Исправлена ошибка std::out&#95;of&#95;range в CTE с dictGet без аргументов. Закрывает #91027. #91022 (Pavel Kruglov).
  • Исправлено чтение динамических подстолбцов из материализованных столбцов в мутациях. Закрывает #90653. #91040 (Pavel Kruglov).
  • Исправлена ошибка, из-за которой функция arrayFilter не работала при использовании пустого массива и функции isNull. Закрывает #73849. #91105 (Nihal Z. Miaji).
  • Исправлена логическая ошибка в ARRAY JOIN, возникавшая, когда один из столбцов таблицы имеет тип пустого кортежа. Закрывает #90801. #91123 (Nihal Z. Miaji).
  • Исправлена отложенная материализация столбца, добавленного через alter add column в старых частях. #91142 (Pavel Kruglov).
  • Исправлено слияние JSON-столбцов в Summing/Aggregating/Coalescing MergeTree. Ранее это могло приводить к появлению неожиданных динамических путей при записи в части данных. #91151 (Pavel Kruglov).
  • Исправлена возможная несогласованность динамической структуры при записи в компактных частях, из-за которой мог возникать segfault. #91152 (Pavel Kruglov).
  • Исправлен парсинг субнормальных значений с плавающей запятой в научной нотации. Закрывает #78903. #91162 (Nihal Z. Miaji).
  • Исправлен неверный вывод схемы в INSERT SELECT из подзапроса с источником с неявной схемой. #91204 (Pervakov Grigorii).
  • Исправлена проблема https://github.com/clickhouse/clickhouse/issues/91206: если создать таблицу со STATISTICS, записать в нее данные и удалить одну статистику, при повторном чтении происходил сбой. Это было связано с тем, что предполагалось совпадение типов статистики при сериализации и десериализации. В этом исправлении проверяется, содержит ли текущая метадата сериализованную статистику; если нет, создается фиктивная статистика, а десериализация выполняется только для того, чтобы ее пропустить. #91227 (Han Fei).
  • Исправлена вставка в столбец CoalescingMergeTree с типом Tuple из JSON/Dynamic и LowCardinality. Закрывает #91215. #91270 (Pavel Kruglov).
  • Исправлена команда SYSTEM DROP FILESYSTEM CACHE ON CLUSTER. #91304 (Anton Ivashkin).
  • Устранена возможная логическая ошибка “Bad cast from type DB::ColumnSparse to DB::ColumnNullable”. Закрывает #91284. #91309 (Pavel Kruglov).
  • Исправлен сбой, возникавший при десериализации вредоносно сформированных потоков байтов во вложенные типы QBit; это не должно быть возможным, но могло использоваться для аварийного завершения работы сервера. #91313 (Raufs Dunamalijevs).
  • Исправлена alias-таблица с пустыми аргументами в базе данных Replicated. Исправлено в #91378. #91382 (Kai Zhu).
  • Сейчас этот параметр имеет значение false, поэтому при сбросе очереди async insert на удалённый server вставки всегда выполняются синхронно — даже если для пользователя этот параметр имеет значение True. #91386 (Mikhail f. Shiryaev).
  • Убраны разреженные столбцы из заголовка в алгоритмах слияния. Закрывает #91377. #91396 (Pavel Kruglov).
  • Исправлена ошибка партиционирования Hive в 25.8, которая может приводить к ошибочному выбросу исключения A hive partitioned file can't contain only partition columns. #91403 (Kseniia Sumarokova).
  • Исправлен сбой в dictGetDescendants, вызванный NULL, когда тип словаря поддерживает Hierarchy, но ни один столбец не является HIERARCHICAL. Закрывает #92026. Закрывает #92121. #91420 (Nihal Z. Miaji).
  • Исправлено падение в функции IN при использовании лямбда-выражения и неконстантных кортежных аргументов. Закрывает #91379. #91446 (Nihal Z. Miaji).
  • Исправлены параллельные записи, возникавшие при вставках в MaterializedView в хранилища, которые их не поддерживают. #91449 (Pervakov Grigorii).
  • Обработка значений NULL для XML-словарей Ytsaurus. #91465 (MikhailBurdukov).
  • Исправлена ошибка, из-за которой тип QBit не поддерживал параметры запроса, такие как SET param_q=[1,2,3,4]; SELECT {q:QBit(Float32,4)}. #91488 (Raufs Dunamalijevs).
  • Исправлена ошибка LOGICAL_ERROR при использовании untuple в константном выражении. #91507 (Pervakov Grigorii).
  • Исправлено возможное состояние гонки в librdkafka. #91521 (János Benjamin Antal).
  • Исправлена логическая ошибка, вызванная использованием аргумента «звёздочка» в функции remote. Закрывает #90568. #91524 (Nihal Z. Miaji).
  • Исправлено переполнение при чтении из формата ORC для типов Date и DateTime64. Закрывает #70976. #91572 (Yarik Briukhovetskyi).
  • Запрещены операции ALTER для движков таблиц Объектного хранилища. Например, команда ALTER ADD PROJECTION могла привести к невозможности перезапустить сервер, поскольку движки Объектного хранилища не поддерживают проекции. #91573 (Nikolay Degterinsky).
  • Исправлена ошибка, из-за которой L2DistanceTransposed возвращала некорректные результаты при использовании неконстантных опорных векторов (например, из table). #91517. #91593 (Raufs Dunamalijevs).
  • Исправлена ошибка, из-за которой JOIN при условиях FALSE возвращали LOGICAL_ERROR на этапе диспетчеризации. Закрывает #91173. #91598 (Yarik Briukhovetskyi).
  • Устранено повышенное использование памяти при JOIN с “дополнительным фильтром”, закрыт #91011. #91664 (Vladimir Cherkasov).
  • Исправлена ошибка в JOIN-запросах с представлением и включенными параллельными репликами. #91813 (Igor Nikonov).
  • Исправлена настройка delta lake delta_lake_snapshot_version, которая могла давать некорректный результат при использовании с движком таблицы (а не с табличной функцией) и значением -1 (отключено), если до этого уже использовалась версия снимка. Закрывает #87676. #91818 (Kseniia Sumarokova).
  • Исправлена ошибка LOGICAL_ERROR в RecursiveCTEChunkGenerator. #91827 (Pablo Marcos).
  • Исправлено несоответствие в структуре блока в запросах, использующих FINAL и PREWHERE. #91847 (Antonio Andelic).
  • Исправлена логическая ошибка, связанная с join_use_nulls, несколькими JOIN и CROSS JOIN. #91853 (Vladimir Cherkasov).
  • Добавлен механизм восстановления для JSON со дублирующимся путём в общих данных и динамических путях, что могло происходить из-за ошибки, исправленной в https://github.com/ClickHouse/ClickHouse/pull/90816. #91886 (Pavel Kruglov).
  • Исправлена ошибка в ридере ORC при чтении строковых столбцов, закодированных с помощью DICTIONARY_V2 и содержащих только значения NULL. #91889 (Peng Jian).
  • Исправлена несогласованность сериализации между разреженными и Nullable-подпотоками в столбцах Tuple, которая могла приводить к повреждению частей или сбоям при чтении. Это устраняет проблему, описанную в https://github.com/ClickHouse/ClickHouse/pull/91851 . @Algunenano Не могли бы вы помочь проверить, исправит ли это стресс-тест в приватном репозитории? @CurtizJ Не могли бы вы тоже посмотреть? Спасибо! #91932 (Amos Bird).
  • Исправлена ошибка Directory '{}' does not exist (LOGICAL_ERROR) при создании резервных копий на обычных дисках с возможностью перезаписи. #91935 (Julia Kartseva).
  • Предотвращён сбой при подключении к MongoDB с использованием именованных коллекций. #91959 (Antonio Andelic).
  • Исправлена ошибка “TOO_MANY_MARKS”, которая могла возникать после некоторых запросов ALTER на компактных частях. #91980 (alesapin).
  • Закрыта проблема https://github.com/clickhouse/clickhouse/issues/87417: в схеме записи формата v1 есть ошибка: тип “added_snapshot_id” должен быть “long”, а не “null, long”, поскольку это обязательное поле. Это баг, так как такая схема несовместима с другими системами, например со Spark. При смешивании их manifest files возникает эта ошибка. #92078 (Han Fei).
  • Исправлены некорректные названия readWKT и readWKB, которые в предыдущих версиях были оформлены в неправильном стиле. #92094 (Alexey Milovidov).
  • Исправлены многочисленные логические ошибки, переполнения и ошибки в работе функции midpoint. Закрывает #91816. #92102 (Nihal Z. Miaji).
  • Исправляет некорректные результаты, которые могли возникать при чтении некоторых подстолбцов (например, размера строки) с разреженным кодированием. #92156 (Pavel Kruglov).
  • Исправлен сбой system.view_refreshes с ошибкой No macro 'replica' in config. #92203 (Michael Kolupaev).
  • Исправлена замена UDF в формате. #92210 (Raúl Marín).
  • В ddlworker::markreplicasactive, если активный хост не найден, а в remote_servers есть несколько host&#95;id, мы записываем предупреждение в лог вместо того, чтобы генерировать исключение. #92223 (Tuan Pham Anh).
  • Заключайте операторы IN и NOT IN в круглые скобки. Исправляет #85075. #92225 (Mikhail f. Shiryaev).
  • Исправлено резервное копирование таблиц KeeperMap и Memory. Создание резервных копий таблиц на одном из этих двух движков при значении max_compress_block_size, равном 0, могло приводить к сбою. #92237 (Antonio Andelic).
  • Исправлен сбой при чтении данных типа String и подстолбца .size из движка Log. Это исправляет #89909. Сюда входят некоторые коммиты из #92290. #92341 (Amos Bird).
  • Исправлена логическая ошибка, вызванная использованием типа Nothing в аргументах функции caseWithExpression. Закрывает #85354. #92351 (Nihal Z. Miaji).
  • Устранён возможный сбой в агрегатных функциях после MEMORY_LIMIT_EXCEEDED. #92390 (Azat Khuzhin).

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

Релиз ClickHouse 25.11, 2025-11-27

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

  • Удалён устаревший тип Object. #85718 (Pavel Kruglov).
  • Удалена устаревшая возможность LIVE VIEW. Если вы используете LIVE VIEW, обновиться до новой версии будет невозможно. #88706 (Alexey Milovidov).
  • В предыдущих версиях тип Geometry был псевдонимом String, а теперь это полноценный тип. #83344 (scanhex12).
  • Добавлено экранирование имён файлов, создаваемых для подстолбцов типа Variant в wide data part таблиц MergeTree. Это изменение нарушает совместимость со старыми таблицами с типами данных Variant/Dynamic/JSON. Оно исправляет хранение типов со специальными символами внутри Variant (например, DateTime с определённой временной зоной, содержащей \). Экранирование можно отключить, изменив настройку MergeTree escape_variant_subcolumn_filenames (чтобы сохранить совместимость, отключите эту настройку в конфигурации MergeTree или перед обновлением установите настройку compatibility на предыдущую версию). Исправляет #69590. #87300 (Pavel Kruglov).
  • Для типа данных String по умолчанию включён формат сериализации with_size_stream. Это изменение обратно совместимо, но новый формат сериализации поддерживается только начиная с версии 25.10, а значит, откатиться на версии ниже 25.10 будет невозможно. Если вы хотите сохранить возможность отката до 25.9 и более ранних версий, задайте serialization_info_version как basic, а string_serialization_version как single_stream в разделе merge_tree конфигурации сервера. #89329 (Alexey Milovidov).
  • Добавлена поддержка тегирования исключений в HTTP-ответах с результатами, чтобы клиенты могли надёжнее разбирать исключения. Исправляет #75175. Настройка http_write_exception_in_output_format по умолчанию отключена для единообразия между форматами. #88818 (Kaviraj Kanagaraj). Хотя это не должно ломать существующее поведение (в худшем случае к сообщению об исключении добавится странная строка), категорию changelog «Обратно несовместимое изменение» всё же имеет смысл использовать просто для информирования (потому что кто знает, как какие-нибудь кривые скрипты разбирают сообщение об исключении).
  • Запрещено создавать несколько дисков plain-rewritable поверх общего пути Объектного хранилища, поскольку это может привести к неопределённому поведению при коллизиях разных транзакций хранения метаданных. #89038 (Mikhail Artemenko).
  • Исправлен приоритет настроек SASL для хранилища Kafka. Настройки SASL на уровне таблицы, указанные в запросах CREATE TABLE, теперь корректно переопределяют настройки consumer/producer из файлов конфигурации. #89401 (János Benjamin Antal).
  • Временные метки Parquet без часового пояса (isAdjustedToUTC=false) теперь читаются как DateTime64(…, ‘UTC’) вместо DateTime64(…). Это менее ошибочно, поскольку преобразование такой UTC-временной метки в строку даёт корректное представление локального времени. Используйте input_format_parquet_local_time_as_utc = 0, чтобы получить прежнее поведение. Исправляет #87469. #87872 (Michael Kolupaev).
  • Небольшое улучшение для кодека T64: он больше не принимает типы данных, не выровненные по размеру элемента сжатия, поскольку иначе это приводит к ошибке. Исправляет #89282. #89432 (yanglongwei).

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

  • Добавлен тип Geometry. Поддерживается чтение для него форматов WKB и WKT. В предыдущих версиях тип Geometry был псевдонимом String, а теперь это полнофункциональный тип. #83344 (scanhex12).
  • Добавлен новый SQL-оператор EXECUTE AS для поддержки выполнения от имени другого пользователя. Исправляет #39048. #70775 (Shankar).
  • Добавлена функция naiveBayesClassifier для классификации текста с помощью Naive Bayes на основе n-грамм. #88677 (Nihal Z. Miaji).
  • Добавлена поддержка дробных LIMIT и OFFSET для выборки части таблицы. Закрывает #81892. #88755 (Ahmed Gouda).
  • Подсистема ClickHouse для каталога Microsoft OneLake. #89366 (scanhex12).
  • Добавлена функция flipCoordinates, которая разворачивает необходимое число размерностей в массиве и переставляет указатели внутри столбца Tuple. Устраняет проблему #79469. #79634 (Sachin Kumar Singh).
  • Добавлена таблица system.unicode, содержащая список символов Unicode и их свойств. Закрывает #80055. #80857 (wxybear).
  • Добавлена новая настройка MergeTree merge_max_dynamic_subcolumns_in_wide_part, позволяющая ограничивать количество динамических подстолбцов в Wide-части после слияния независимо от параметров, указанных в типе данных. #87646 (Pavel Kruglov).
  • Добавлена поддержка оконной функции cume_dist. Исправлена проблема #86920. #88102 (Manuel).
  • Теперь при создании текстового индекса можно добавлять новый аргумент preprocessor. Это произвольное выражение, которое преобразует каждый документ перед токенизацией. #88272 (Jimmy Aguilar Mena).
  • Добавляет поле memory_usage в X-ClickHouse-Progress и X-ClickHouse-Summary. Это можно использовать для сбора данных об использовании памяти запросами в реальном времени на стороне клиента. #88393 (Christoph Wurm).
  • Добавлена настройка into_outfile_create_parent_directories, которая автоматически создаёт родительские каталоги для INTO OUTFILE, предотвращая ошибки, если указанные пути вывода не существуют. Это упрощает сценарии, в которых запросы записывают результаты во вложенные каталоги. Исправляет #88610. #88795 (Saksham).
  • Добавлена поддержка синтаксиса CREATE OR REPLACE для временных таблиц. Закрывает #35888. #89450 (Aleksandr Musorin).
  • Добавлена поддержка arrayRemove для удаления из массива arr всех элементов, равных elem. Это требуется только для совместимости с Postgres, поскольку в ClickHouse уже есть гораздо более мощная функция arrayFilter. Решает #52099. #89585 (tiwarysaurav).
  • Добавлена скалярная функция midpoint для вычисления среднего значения. Устраняет #89029. #89679 (simonmichal).
  • Веб-интерфейс теперь содержит кнопку загрузки. Она загружает результат целиком, даже если в интерфейсе отображается только его часть. #89768 (Alexey Milovidov).
  • Добавлена настройка arrow_flight_request_descriptor_type для поддержки Dremio и других серверов Arrow Flight, которым требуются дескрипторы командного типа. Реализовано в #89523. #89826 (Shreyas Ganesh).
  • Новые агрегатные функции argAndMin и argAndMax, которые возвращают аргумент и соответствующее минимальное или максимальное значение. В предыдущих версиях этого также можно было добиться, используя кортеж в качестве аргумента. #89884 (AbdAlRahman Gad).
  • Настройки для записи и проверки контрольных сумм Parquet. #79012 (Michael Kolupaev).
  • Добавлена настройка kafka_schema_registry_skip_bytes для движка таблицы Kafka, позволяющая пропускать байты заголовка обёртки (например, 19-байтный префикс AWS Glue Schema Registry) перед разбором полезной нагрузки сообщения. Это позволяет ClickHouse читать сообщения из реестров схем, добавляющих заголовки метаданных. #89621 (Taras Polishchuk).
  • Добавлена функция h3PolygonToCells, позволяющая заполнять геометрию H3-шестиугольниками. Решает #33991. #66262 (Zacharias Knudsen).
  • Добавлен новый виртуальный столбец _tags (Map(String, String)) со всеми тегами объекта в S3 (обратите внимание: если у объекта нет тегов, дополнительный запрос выполняться не будет). Исправлено #72945. #77773 (Zicong Qu).

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

  • Добавлена поддержка получения TLS-сертификатов от ACME-провайдеров по RFC 8555, таких как Let’s Encrypt. Это позволяет автоматически настраивать TLS в распределённых кластерах. #66315 (Konstantin Bogdanov).
  • Добавлена поддержка части Prometheus HTTP Query API. Чтобы включить её, добавьте правило с типом query_api в разделе <prometheus> файла конфигурации. Поддерживаются обработчики /api/v1/query_range и /api/v1/query. #86132 (Nikita Mikhaylov).
  • Полнотекстовый поиск теперь находится в статусе бета (ранее он был экспериментальным). #88928 (Robert Schulze).
  • Alias переведён в экспериментальный статус; его можно включить с помощью allow_experimental_alias_table_engine = 1. #89712 (Kai Zhu).

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

  • Ридер Parquet v3 включен по умолчанию. #88827 (Michael Kolupaev).
  • Распределённое выполнение: улучшено разбиение задач по идентификаторам групп строк, а не по файлам. #87508 (scanhex12).
  • RIGHT и FULL JOIN теперь используют ConcurrentHashJoin; это означает, что такие JOIN теперь выполняются с более высокой степенью параллелизма. В ряде случаев это ускоряет RIGHT и FULL JOIN до двух раз. Решает #78027. #78462 (Yarik Briukhovetskyi).
  • Оптимизация обработки больших значений в константных выражениях запросов. Закрывает #72880. #81104 (Yakov Olkhovskiy).
  • Запросы SELECT выполняются до 8 раз быстрее при интенсивном отсечении партиций в таблицах с 10K+ частями. #85535 (James Morrison).
  • Когда запрос использует фиксированную хеш-таблицу для состояния агрегации (при группировке по небольшому целому числу), ClickHouse объединяет состояние агрегации параллельно, чтобы ускорить запрос. #87366 (Jianfei Hu).
  • Разрешено использовать проекции (которые используют SELECT с _part_offset и другой ORDER BY) в качестве вторичного индекса. Если эта возможность включена, некоторые предикаты запроса можно использовать для чтения из частей проекций и построения битмапов, чтобы эффективно фильтровать строки на этапе PREWHERE. Это третий шаг в реализации индекса проекций после #80343. #81021 (Amos Bird).
  • Исправлена работа VDSO на редких системах Aarch64 и, возможно, на других сочетаниях архитектуры и ядра. #86096 (Tomas Hulata).
  • Ускорена распаковка LZ4 за счёт упрощения кода и доработки алгоритма выбора. #88360 (Raúl Marín).
  • S3 внутри себя распределяет объекты по префиксам имён ключей и автоматически поддерживает высокую частоту запросов на партицию. Это изменение добавляет две новые настройки BACKUP: data_file_name_generator и data_file_name_prefix_length. Когда data_file_name_generator=checksum, файлы данных резервной копии получают имена на основе хэша их содержимого. Пример: для checksum = abcd1234ef567890abcd1234ef567890 и data_file_name_prefix_length = 3 итоговый путь будет таким: abc/d1234ef567890abcd1234ef567890. Такое распределение ключей улучшает балансировку нагрузки между партициями S3 и снижает риск троттлинга. #88418 (Julia Kartseva).
  • Повышена производительность текстового индекса за счёт кэширования блоков словаря и использования хеш-таблиц для поиска токенов вместо двоичного поиска. #88786 (Elmi Ahmadov).
  • Теперь запросы могут одновременно использовать преимущества optimize_read_in_order и query_plan_optimize_lazy_materialization. Исправлено #88767. #88866 (Manuel).
  • Используйте агрегатную проекцию для запросов с DISTINCT. Закрывает #86925. #88894 (Nihal Z. Miaji).
  • Кэширование списков вхождений для повышения производительности при повторных запусках. #88912 (Elmi Ahmadov).
  • Выполнять потоковое преобразование LIMIT BY в случаях, когда порядок сортировки входных данных соответствует ключам LIMIT BY. #88969 (Eduard Karacharov).
  • В некоторых случаях разрешено переписывать ANY LEFT JOIN или ANY RIGHT JOIN в ALL INNER JOIN. #89403 (Dmitry Novik).
  • Снижены накладные расходы на логирование: на каждую запись используется меньше атомарных операций. #89651 (Sergei Trifonov).
  • Когда в запросе с несколькими JOIN включены runtime filters и добавляется несколько runtime filters, реализован pushdown шагов вновь добавленных фильтров поверх остальных. #89725 (Alexander Gololobov).
  • Немного ускорили некоторые операции uniqExact, снизив накладные расходы на слияние хеш-таблиц. #89727 (Raúl Marín).
  • Увеличен лимит количества строк для lazy materialization с 10 до 100. #89772 (Alexey Milovidov).
  • Параметр allow_special_serialization_kinds_in_output_formats теперь включён по умолчанию. Это позволит снизить использование памяти и ускорить выполнение запроса при выводе разреженных/Replicated столбцов в некоторых построчных форматах вывода. #89402 (Pavel Kruglov).
  • Добавлена поддержка параллельного выполнения запросов ALTER TABLE ... FREEZE. #71743 (Kirill).
  • Добавлен кэш для bcrypt-аутентификации. #87115 (Nikolay Degterinsky).
  • Если индекс пропуска данных, используемый в запросе с FINAL, построен по столбцу, входящему в первичный ключ, дополнительный шаг проверки пересечения по первичному ключу в других частях не нужен и теперь не выполняется. Устраняет #85897. #88368 (Shankar Iyer).
  • Оптимизация enable_lazy_columns_replication теперь включена по умолчанию, что позволит экономить память при JOIN. #89316 (Alexey Milovidov).
  • Добавлен кэш ColumnsDescription на уровне таблицы для частей, что уменьшает использование памяти, если таблицы содержат много частей и столбцов. #89352 (Azat Khuzhin).
  • Добавлен кэш для десериализованного заголовка текстового индекса, чтобы снизить объём I/O и повысить производительность запросов. Кэш можно настроить с помощью новых настроек сервера: - text_index_header_cache_policy - text_index_header_cache_size - text_index_header_cache_max_entries - text_index_header_cache_size_ratio. #89513 (Elmi Ahmadov).

Улучшения

  • UNION должен при необходимости унифицировать типы с помощью Variant, если включён use_variant_as_common_type. Исправляет #82772. #83246 (Mithun p).
  • Роли, определённые в SQL, теперь можно назначать пользователям, определённым в users.xml. #88139 (c-end).
  • Логировать внутренние запросы (те, которые выполняются внутри словарей, refreshable materialized views и т. д.) и добавить новый столбец is_internal в system.query_log. #83277 (Miсhael Stetsyuk).
  • Улучшен оператор IS NOT DISTINCT FROM (<=>): добавлена поддержка инверсного IS DISTINCT FROM, а также совместимых числовых операндов разных типов (например, Nullable(UInt32) и Nullable(Int64)). Устраняет проблему #86763. #87581 (yanglongwei).
  • В clickhouse-client и clickhouse-local в интерактивном режиме будут подсвечиваться идентификаторы в командной строке с тем же именем, что и у текущего идентификатора под курсором. #89689 (Alexey Milovidov).
  • Настройки, связанные с форматом вывода, больше не влияют на кэширование запросов. Кроме того, при кэшировании запросов теперь игнорируется настройка http_response_headers. Это необходимо для реализации таких возможностей, как скачивание результата из кэша в веб-интерфейсе. #89756 (Alexey Milovidov).
  • HTTP interface будет передавать заголовки Age и Expires при использовании кэша результатов запроса. Наличие заголовка Age показывает, получен ли результат из кэша, а Expires также устанавливается при первой записи. Добавлены новые profile events: QueryCacheAgeSeconds, QueryCacheReadRows, QueryCacheReadBytes, QueryCacheWrittenRows, QueryCacheWrittenBytes. #89759 (Alexey Milovidov).
  • Разрешена вставка в удалённые таблицы и таблицы в озёрах данных, если включён disable_insertion_and_mutation (то есть для хранилищ только для чтения в ClickHouse Cloud). #88549 (Alexander Tokmakov).
  • Добавлен запрос SYSTEM DROP TEXT INDEX CACHES. #90287 (Anton Popov).
  • Параметр enable_shared_storage_snapshot_in_query теперь включён по умолчанию для повышения гарантий согласованности. Каких-либо недостатков быть не должно. #82634 (Alexey Milovidov).
  • Добавлена настройка send_profile_events, которая позволяет клиентам сократить сетевой трафик, если profile events не используются. #89588 (Kaviraj Kanagaraj).
  • Добавлена возможность отключать фоновую загрузку соседних сегментов для отдельных запросов. Исправление #89524. #89668 (tanner-bruce).
  • Разрешён FETCH PARTITION при наличии повреждённых дисков в реплицируемых таблицах MergeTree. #58663 (Duc Canh Le).
  • Исправлено необработанное исключение при получении схемы таблицы MySQL в движке базы данных MySQL. #69358 (Duc Canh Le).
  • Все DDL-запросы с ON CLUSTER теперь выполняются в контексте пользователя исходного запроса, что улучшает проверку прав доступа. #71334 (pufit).
  • Добавлена поддержка UUID в Parquet при представлении в виде FixedString(16) с логическим типом UUID. #74484 (alekseev-maksim).
  • ThreadFuzzer по умолчанию отключён для несерверных бинарных файлов. #89115 (Raúl Marín).
  • Оптимизации плана запроса теперь видны входному подплану коррелированного подзапроса благодаря отложенной материализации. Часть #79890. #85455 (Dmitry Novik).
  • В clickhouse-client теперь можно увидеть индикатор выполнения, журналы и статистику производительности для запросов CREATE OR REPLACE TABLE с SELECT. Такой запрос больше не будет приводить к тайм-ауту, даже если SELECT занимает довольно много времени. Исправлено #38416. #87247 (Diskein).
  • Добавлена поддержка типов JSON и Dynamic в хеш-функциях. Исправлено #87734. #87791 (Pavel Kruglov).
  • Реализованы недостающие компоненты сервера ArrowFlight. #88013 (Vitaly Baranov).
  • Добавлено несколько метрик-гистограмм для сервера и Keeper, чтобы измерять длительность этапов выполнения запросов в Keeper. На сервере будут добавлены следующие метрики: keeper_client_queue_duration_milliseconds, keeper_client_send_duration_milliseconds, keeper_client_roundtrip_duration_milliseconds. В Keeper будут добавлены следующие метрики: keeper_server_preprocess_request_duration_milliseconds, keeper_server_process_request_duration_milliseconds, keeper_server_queue_duration_milliseconds, keeper_server_send_duration_milliseconds. #88158 (Miсhael Stetsyuk).
  • Добавлена опция input_headers в EXPLAIN-запрос, чтобы добавлять входные заголовки к шагам. #88311 (János Benjamin Antal).
  • Добавлены события profile events для подсчёта числа запросов к S3 и AzureBlobStorage, задержанных троттлерами. Устранено несоответствие между событиями profile events ThrottlerCount для дисковых и недисковых операций. Теперь HTTP-запросы DELETE к AzureBlobStorage не троттлируются. #88535 (Sergei Trifonov).
  • Кэширование статистики на уровне таблицы: добавлены две настройки. Настройка MergeTree refresh_statistics_interval задаёт интервал обновления кэша статистики; значение 0 означает, что кэш создаваться не будет. Настройка сеанса use_statistics_cache определяет, использовать ли статистику на уровне таблицы в запросе. Иногда требуется более точная статистика, поэтому мы предпочитаем её игнорировать. #88670 (Han Fei).
  • Исправлена бинарная десериализация Array и Map: при проверке ограничений размера теперь используется настройка max_binary_array_size вместо max_binary_string_size. Это гарантирует применение правильных ограничений при чтении в формате RowBinary. #88744 (Raufs Dunamalijevs).
  • Добавлен класс LockGuardWithStopWatch, который используется во фоновом пуле для выполнения слияний. Если mutex удерживается в течение секунды или какому-либо thread не удаётся получить его в течение секунды, выводится предупреждение. Тяжёлый код был перенесён из деструктора MergeMutateSelectedEntry в метод finalize, чтобы не удерживать блокировку слишком долго в исполнителе MergeTreeBackground. #88898 (Nikita Mikhaylov).
  • Разрешено автоматически использовать opt-in-регионы AWS для S3, если регион не указан в конечной точке. См.: opt-in AWS regions. #88930 (Andrey Zvonov).
  • Теперь пользователь может отменить запрос в clickhouse-client, нажав Ctrl-C при запущенном пейджере. Устраняет #80778. #88935 (Grigorii).
  • Веб-интерфейс будет отображать полосы в таблице, даже если значения отрицательные. Таким образом, он сможет показывать двустороннюю столбчатую диаграмму, где для отрицательной и положительной частей используются полосы разных цветов. #89016 (Alexey Milovidov).
  • Отключите shared_merge_tree_create_per_replica_metadata_nodes, чтобы сократить объём метаданных, хранимых SharedMergeTree в Keeper. #89036 (Alexander Tokmakov).
  • Теперь S3Queue учитывает настройку сервера disable_insertion_and_mutation. #89048 (Raúl Marín).
  • В версии 25.6 значение s3_retry_attempts по умолчанию установлено равным 500, чтобы резервные копии успешно выполнялись, если в S3 происходит переразбиение и S3 более 10 минут отвечает ошибками SlowDown. #89051 (Nikita Mikhaylov).
  • Настройки kafka_compression_codec и kafka_compression_level теперь можно использовать для указания сжатия для продюсеров Kafka в обоих движках Kafka. #89073 (János Benjamin Antal).
  • Добавлен новый столбец statistics в system.columns, указывающий, какие типы статистики построены для этой таблицы. Если какой-либо тип статистики создаётся автоматически, в суффиксе он будет отображаться как (auto). #89086 (Han Fei).
  • Улучшено сообщение об error, если в табличную функцию *Cluster вместо имени кластера передаётся обобщённая подстановка. #89093 (Konstantin Bogdanov).
  • YTsaurus: теперь можно использовать replicated_table в качестве источника данных. #89107 (MikhailBurdukov).
  • Запросы, начинающиеся с пробелов, больше не сохраняются в истории CLI. #89116 (Konstantin Bogdanov).
  • Поддержка типа Array(String) в качестве входных данных для функций hasAnyTokens или hasAllTokens. #89124 (Elmi Ahmadov).
  • Изменён способ хранения метаданных в памяти для дисков plain-rewritable, что устраняет множество ошибок, связанных с вложенностью каталогов и смежными проблемами. #89125 (Mikhail Artemenko).
  • Подзапросы в выражениях IN при запросе к таблице Iceberg будут корректно предварительно вычисляться до анализа отсечения партиций. #89177 (Daniil Ivanik).
  • Параметр create_table_empty_primary_key_by_default теперь включен по умолчанию. Это удобнее в использовании. #89333 (Alexey Milovidov).
  • Исправлен некорректный код в движке базы данных Backup, который мог приводить к генерации недопустимого запроса при выполнении SHOW CREATE DATABASE или при запросе engine_full из system.databases. Закрывает #89477. #89341 (Alexey Milovidov).
  • В предыдущих версиях настройка create_table_empty_primary_key_by_default не работала, если в запросе CREATE TABLE не был указан движок таблицы. #89342 (Alexey Milovidov).
  • Обновлён chdig до v25.11.1 — в выпуск включены значительные улучшения логирования и ряд других доработок (примечания к выпуску 25.11). #89957 (Azat Khuzhin). (примечания к выпуску 25.10). #89452 (Azat Khuzhin).
  • Растягивание текстового поля запроса в веб-интерфейсе сделали на всю ширину, что немного удобнее. Кроме того, встроенный в браузер механизм изменения размера был недоступен в Safari на iPad, а после этого изменения можно хотя бы перетаскивать нижний край текстового поля — если знать, что это возможно. #89457 (Alexey Milovidov).
  • Улучшено отслеживание памяти при формировании результата hash JOIN. Ранее временные выделения памяти при формировании результата JOIN отслеживались некорректно, что могло приводить к превышению лимитов памяти. #89560 (Azat Khuzhin).
  • Асинхронный лог сервера: выполнять сброс раньше и увеличить размер очереди по умолчанию. #89597 (Raúl Marín).
  • Исправлены некорректные значения FilesystemCacheBytes (и других метрик) в system.asynchronous_metrics. Запросы SYSTEM для файловых кэшей теперь выполняются только один раз. Атомарное представление для кэшей, указывающее на один и тот же путь в system.filesystem_caches. #89640 (Azat Khuzhin).
  • Уточнено описание некоторых столбцов таблицы system.view_refreshes. #89701 (Tuan Pham Anh).
  • Добавлено кэширование учетных данных S3 при взаимодействии с конечной точкой STS, чтобы их можно было повторно использовать в разных вызовах функций. Количеством кэшированных учетных данных можно управлять с помощью s3_credentials_provider_max_cache_size. #89734 (Antonio Andelic).
  • Исправлен pushdown runtime-фильтра, когда под ним находится несколько шагов вычисления выражений. #89741 (Alexander Gololobov).
  • Если системной памяти меньше 5 ГБ, по умолчанию не блокировать исполняемый файл в памяти с помощью mlock. #89751 (Alexey Milovidov).
  • Подсказки типов в веб-интерфейсе больше не налезают на заголовок таблицы. Также исправлено отображение всплывающих подсказок — теперь они больше не оказываются за заголовком таблицы. #89753 (Alexey Milovidov).
  • Отображать свойства таблицы в веб-интерфейсе. При нажатии на число строк или байтов открывается запрос к system.tables. При нажатии на движок таблицы открывается SHOW TABLES. #89771 (Alexey Milovidov).
  • Добавлена поддержка non_replicated_deduplication_window для таблиц с диском, не поддерживающим запись с append. Исправляет проблему #87281. #89796 (Tuan Pham Anh).
  • Добавлена возможность указывать список таблиц для сброса в команде SYSTEM FLUSH ASYNC INSERT QUEUE. #89915 (Sema Checherinda).
  • Сохранять идентификаторы блоков дедупликации в system.part_log. #89928 (Sema Checherinda).
  • Значение по умолчанию для настройки файлового кэша keep_free_space_remove_batch изменено с 10 на 100, так как это оптимальнее. #90030 (Kseniia Sumarokova).
  • Добавлен тип слияния TTL DROP, и после таких слияний расписание следующего TTL-слияния с удалением больше не обновляется. #90077 (Mikhail Artemenko).
  • Снижен лимит узлов для запроса RemoveRecursive в Keeper при очистке S3Queue. #90201 (Antonio Andelic).
  • Запрос SYSTEM FLUSH LOGS теперь ожидает создания таблицы, даже если журналы пусты. #89408 (János Benjamin Antal).
  • Исправлено некорректное значение rows_before_limit_at_least, когда в распределённой агрегации со слиянием участвуют несколько удалённых сегментов или используются подзапросы в IN. Это исправляет #63280. #63511 (Amos Bird).
  • Исправлено появление 0 rows in set после запроса INSERT INTO ... SELECT. Закрывает #47800. #79462 (Engel Danila).

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

  • Исправлен multiIf для константных аргументов и укороченного вычисления. Закрывает #72714. #84546 (Yakov Olkhovskiy).
  • Исправлена логическая ошибка при выборке из таблицы с ограничением, включающим подзапрос. Исправлено в #84190. #85575 (Pervakov Grigorii).
  • Исправлена ошибка в специальных запросах, использующих URI со знаками вопроса. #85663 (Yarik Briukhovetskyi).
  • Исправлено иногда пропадавшее отображение столбцов в выводе EXPLAIN indexes = 1. Устраняет проблему #86696. #87083 (Michael Kolupaev).
  • Исправлена возможная ошибка «Cannot add subcolumn with parallel replicas». Закрывает #84888. #87514 (Pavel Kruglov).
  • В модуле записи Parquet строка created_by теперь выводится в правильном формате, например ClickHouse version 25.10.1 (build 5b1dfb14925db8901a4e9202cd5d63c11ecfbb9f) вместо ClickHouse v25.9.1.1-testing. Исправлена совместимость ридера Parquet с некорректными файлами, записанными старой версией parquet-mr. #87735 (Michael Kolupaev).
  • Исправлено вычисление phi-squared, из-за которого cramersV, cramersVBiasCorrected, theilsU и contingency возвращали некорректные результаты. #87831 (Nihal Z. Miaji).
  • Исправлено чтение смешанного массива значений Float и Bool в JSON. Ранее вставка таких данных приводила к исключению. #88008 (Pavel Kruglov).
  • Использование shared_ptr для QueryState в TCPHandler, чтобы определять, является ли состояние недействительным в setProgressCallback, setFileProgressCallback и setBlockMarshallingCallback. #88201 (Tuan Pham Anh).
  • Исправлена логическая ошибка при изменении порядка CROSS JOIN, когда query_plan_optimize_join_order_limit > 1, закрыт #89409. #88286 (Vladimir Cherkasov).
  • Исправление #88426: 1. В Alias запрещены явные определения столбцов, а сами столбцы автоматически загружаются из целевой таблицы. Это гарантирует, что псевдоним всегда соответствует схеме целевой таблицы. 2. Проксирование большего числа методов из IStorage. #88552 (Kai Zhu).
  • После восстановления реплика базы данных Replicated могла надолго зависнуть и выводить сообщения вида Failed to marked query-0004647339 as finished (finished=No node, synced=No node); это исправлено. #88671 (Alexander Tokmakov).
  • Исправлена возможная ошибка “Context has expired” в новом анализаторе при работе с подзапросами. #88694 (Azat Khuzhin).
  • Исправлено падение с ошибкой сегментации в ридере Parquet, когда input_format_parquet_local_file_min_bytes_for_seek установлен в 0. Устраняет #78456. #88784 (Animesh).
  • Исправлен некорректный результат min(PK)/max(PK), когда PK задан в обратном порядке. Это исправляет #83619. #88796 (Amos Bird).
  • Исправлена передача ограничений на размер, задаваемых настройками max_table_size_to_drop и max_partition_size_to_drop, при DROP внутренних таблиц. #88812 (Nikolay Degterinsky).
  • Исправлено: top_k теперь учитывает параметр threshold при вызове с одним аргументом. Закрывает #88757. #88867 (Manuel).
  • Источники ArrowFlight с конечными точками, для которых требовалось SSL-подключение (например, за AWS ALB), теперь могут корректно запрашивать конкретный набор данных. #88868 (alex-shchetkov).
  • Исправлена обработка нематериализованного Nested(Tuple(…)) (добавленного через ALTER). Исправление #83133. #88879 (Azat Khuzhin).
  • Исправлена ошибка в функции reverseUTF8. В предыдущих версиях она ошибочно переставляла байты в кодовых точках UTF-8 длиной 4 байта. Это закрывает #88913. #88914 (Alexey Milovidov).
  • Исправлен протокол icebergS3Cluster. Добавлена поддержка эволюции схемы, позиционных удалений и удалений по равенству в кластерной функции iceberg. Исправляет #88287. #88919 (Yang Jiang).
  • Отключена parallel&#95;replicas&#95;support&#95;projection для запросов с параллельными репликами к distributed таблицам. Закрывает #88899. #88922 (zoomxi).
  • Передача контекста во внутренних приведениях типов. Исправлено несколько проблем, из-за которых настройки приведения типов не передавались. Закрывает #88873. Закрывает #78025. #88929 (Manuel).
  • Исправлено определение формата файла по глоб-шаблонам в функции file(). Устраняет #88920. #88947 (Vitaly Baranov).
  • Не проверять права доступа SET DEFINER <current_user>:definer при создании представления с SQL SECURITY DEFINER. #88968 (pufit).
  • Исправлен LOGICAL_ERROR в L2DistanceTransposed(vec1, vec2, p): оптимизация частичного чтения QBit ошибочно удаляла Nullable из возвращаемого типа, когда p имел тип Nullable. #88974 (Raufs Dunamalijevs).
  • Исправлен сбой при неизвестном типе каталога. Устраняет #88819. #88987 (scanhex12).
  • Исправление закрывает #88081. #88988 (scanhex12).
  • Устранено снижение производительности при анализе индексов пропуска данных. #89004 (Anton Popov).
  • Исправлена ошибка ACCESS_ENTITY_NOT_FOUND при попытке выполнить clusterAllReplicas от имени пользователя с несуществующей ролью. Устраняет #87670. #89068 (pufit).
  • Исправлена обработка разреженных столбцов ограничением CHECK. Закрывает #88637. #89076 (Eduard Karacharov).
  • Исправлен неверный подсчёт строк при заполнении виртуальных столбцов в MergeTreeReaderTextIndex, приводивший к сбою с LOGICAL_ERROR. #89095 (Peng Jian).
  • Предотвращены утечки счётчика TTL-слияний при возникновении исключений во время подготовки слияния. Устраняет #89019. #89127 (save-my-heart).
  • Исправлен расчёт размера буфера, необходимого для операций кодирования и декодирования в base32/base58. #89133 (Antonio Andelic).
  • Исправлена ошибка use-after-free в Distributed из-за состояния гонки между завершением работы и фоновыми операциями INSERT. Устраняет проблему #88640. #89136 (Azat Khuzhin).
  • Предотвращены возможные состояния гонки из-за изменяемых объектов исключений при разборе Parquet. Исправляет #88385. #89174 (Azat Khuzhin).
  • refreshable materialized view: исправлен редкий сбой сервера, если исходная таблица была полностью удалена во время обновления. #89203 (Michael Kolupaev).
  • Буферы сбрасываются при отправке ошибки в середине сжатого потока в HTTP-интерфейсе. #89256 (Alexander Tokmakov).
  • Предотвращено ошибочное применение правил маскировки запросов к DDL-командам. #89272 (MikhailBurdukov).
  • Исправлено неверное число строк при заполнении виртуальных столбцов в MergeTreeReaderTextIndex, которое вызывало сбой с LOGICAL_ERROR. Снова открывает #89095. #89303 (Jimmy Aguilar Mena).
  • Исправлена ошибка LOGICAL_ERROR в Statistics countmin, возникавшая из-за отсутствия поддержки оценочного типа данных LowCardinality(Nullable(String)). #89343 (Han Fei).
  • Возможен сбой/неопределённое поведение в функции IN, если типы столбцов первичного ключа отличаются от типов столбцов в правой части выражения IN. Пример: SELECT string_column, int_column FROM test_table WHERE (string_column, int_column) IN (SELECT ‘5’, ‘not a number’). Возникает, если выбрано много строк и среди них есть строки с несовместимыми типами. #89367 (Ilya Golshtein).
  • Устранено усечение аргументов countIf(*). Закрывает #89372. #89373 (Manuel).
  • Предотвращена потеря несжатых контрольных сумм в статистике мутаций. #89381 (Azat Khuzhin).
  • Исправлена ошибка LOGICAL_ERROR в L2DistanceTransposed(vec1, vec2, p), при которой оптимизация частичного чтения QBit некорректно удаляла Nullable из возвращаемого типа, если p имел тип LowCardinality(Nullable(T)). Устраняет #88362. #89397 (Raufs Dunamalijevs).
  • Исправлена загрузка таблиц с некорректной разреженной сериализацией самого Tuple, записанной более старыми версиями ClickHouse. #89405 (Azat Khuzhin).
  • Исправлена некорректная обработка слияния частей, очищенных TTL, с непустыми проекциями при использовании deduplicate_merge_projection_mode='ignore'. Устраняет #89430. #89458 (Amos Bird).
  • Исправлена логическая ошибка в JOIN full_sorting_merge при наличии дублирующихся столбцов. Устраняет #86957. #89495 (Vladimir Cherkasov).
  • Исправлено чтение файлов changelog при запуске Keeper в случаях, когда файл changelog не был должным образом переименован при ротации. #89496 (Antonio Andelic).
  • Исправлены некорректные результаты JOIN при использовании условий OR с уникальными ключами в правой таблице. Исправляет #89391. #89512 (Vladimir Cherkasov).
  • Исправлена возможная ошибка “Context has expired” при использовании анализатора и PK IN (подзапроса) (v2). Исправление #89433. #89527 (Azat Khuzhin).
  • Исправлена репликация MaterializedPostgreSQL для таблиц с именами столбцов, заданными в верхнем регистре. Устраняет проблему #72363. #89530 (Danylo Osipchuk).
  • Исправлен сбой, возникавший, если состояние агрегатной функции содержит сериализованное значение столбца LowCardinality(String). #89550 (Pavel Kruglov).
  • Исправлен сбой при использовании ARRAY JOIN в правой части оператора JOIN при включенной настройке enable_lazy_columns_replication. #89551 (Pavel Kruglov).
  • Исправлена логическая ошибка в query_plan_convert_join_to_in. Исправление устраняет #89066. #89554 (Vladimir Cherkasov).
  • Исправлено исключение в оценщике статистики при попытке оценить условия с несовместимыми типами столбца и константы, которые нельзя преобразовать. #89596 (Han Fei).
  • Добавлять runtime filter только для поддерживаемых алгоритмов JOIN, то есть для hash JOIN. Фильтр можно построить, только если алгоритм JOIN сначала полностью считывает правую сторону, а затем — левую, но, например, FullSortingMergeJoin считывает обе стороны одновременно. Исправлено #89220. #89652 (Alexander Gololobov).
  • Исправлены проблемы при параллельном выполнении функций hasAnyTokens, hasAllTokens и tokens с токенизатором sparseGrams. Устранена проблема #89605. #89665 (Elmi Ahmadov).
  • Исправлены логическая ошибка и сбой, связанные с runtime-фильтром JOIN в некоторых случаях. Исправляет #89062. #89666 (Alexander Gololobov).
  • Исправлена возможная логическая ошибка при ARRAY JOIN по столбцу Map при включённом параметре enable_lazy_columns_replication. Закрывает #89705. #89717 (Pavel Kruglov).
  • Предотвращён сбой, вызванный чтением с удалённого сервера после разрыва соединения в удалённых запросах во время отмены. Исправляет #89468. #89740 (Azat Khuzhin).
  • Исправлено состояние гонки при чтении индекса проекции. Устраняет #89497. #89762 (Peng Jian).
  • Исправлена ошибка при чтении индекса проекции, которая могла приводить к состоянию гонки. Устраняет #89497. #89775 (Amos Bird).
  • Исправлена обработка табличной функции Paimon для таблиц без партиций. Устраняет проблему #89690. #89793 (JIaQi).
  • Исправлена возможная логическая ошибка при чтении путей и их подстолбцов в усовершенствованной JSON-сериализации с общими данными. Закрывает #89805. #89819 (Pavel Kruglov).
  • Исправлено возможное переполнение стека при бинарной десериализации типов данных. Закрывает #88710. #89822 (Pavel Kruglov).
  • Исправлена логическая ошибка с пустым кортежем в функции IN. Закрывает #88343. #89850 (Nihal Z. Miaji).
  • Инъективные функции удалены из GROUP BY в старом анализаторе вне зависимости от optimize_injective_functions_in_group_by для обеспечения совместимости. Устраняет #89854. #89870 (Raufs Dunamalijevs).
  • Если слияние было прервано, например, из-за ограничения памяти, фоновый исполнитель merge mutate вызовет cancel для задачи слияния без блокировки, но в этом случае частично созданная результирующая часть не будет удалена (поскольку она не была завершена и на этом этапе ещё не была видна). После этого задача слияния будет уничтожена, что приведёт к уничтожению результирующей части. Это откатит дисковую транзакцию и приведёт к удалению данных из S3. В итоге эта очистка мусора выполнялась под блокировкой фонового исполнителя merge mutate. #89875 (Mikhail Artemenko).
  • Исправлена логическая ошибка с пустым кортежем в функциях reverse и CAST. Закрывает #89137. #89908 (Nihal Z. Miaji).
  • Теперь ClickHouse по умолчанию отображает базу данных каталога озера данных в запросе SHOW DATABASES. #89914 (alesapin).
  • Исправлено использование нативного копирования в GCS для резервных копий. Из-за некорректного клонирования клиента нативное копирование в GCS всегда завершалось ошибкой, поэтому вместо него использовался менее эффективный подход с ручным чтением и записью данных. #89923 (Antonio Andelic).
  • Исправлен расчет размера буфера для base32Encode. Вычисление base32Encode для столбца строк размером менее 5 могло приводить к сбоям. Исправляет #89911. #89929 (Antonio Andelic).
  • Исправлено некорректное экранирование запросов SHOW COLUMNS и SHOW FUNCTIONS. #89942 (alesapin).
  • Исправлена проверка URL в движке MongoDB, если имя пользователя содержит символ ’@’. Ранее имена пользователей с символом ’@’ вызывали ошибку из-за некорректного кодирования. #89970 (Kai Zhu).
  • Выполнен бэкпорт в #90592: исправлено возможное аварийное завершение при удаленном запросе с ARRAY JOIN внутри IN и включенной настройкой enable_lazy_columns_replication. Устраняет #90361. #89997 (Pavel Kruglov).
  • Бэкпортировано в #90448: в некоторых случаях исправлено определение некорректных значений DateTime64 из строк в текстовых форматах. Устраняет #89368. #90013 (Pavel Kruglov).
  • Исправлена логическая ошибка, вызванная пустым столбцом типа кортеж в BSONEachRow и MsgPack. Закрывает #89814. Закрывает #71536. #90018 (Nihal Z. Miaji).
  • Бэкпорт в #90457: добавлены проверки размера при десериализации данных из состояний агрегации и других источников. #90031 (Raúl Marín).
  • Исправлена возможная ошибка ‘Invalid number of rows in Chunk’ при JOIN с дублирующимися столбцами. Устраняет #89411. #90053 (Vladimir Cherkasov).
  • В #90588 выполнен бэкпорт: исправлена возможная ошибка Column with Array type is not represented by ColumnArray column: Replicated при вставке с использованием ARRAY JOIN и при включенной настройке enable_lazy_columns_replication. #90066 (Pavel Kruglov).
  • Разрешена работа с файлами, начинающимися с точки, в user_files. Закрывает #89662. #90079 (Raúl Marín).
  • Бэкпорт в #90647: исправлены логическая ошибка и ошибка вычисления по модулю в системной таблице numbers при использовании большого шага. Закрывает #83398. #90123 (Nihal Z. Miaji).
  • Исправлено целочисленное переполнение при разборе аргумента словаря. Закрывает #78506. #90171 (Raúl Marín).
  • Бэкпортировано в #90468: устранена несовместимость партиционирования Hive, мешавшая корректному обновлению до 25.8 (исправлена ошибка All hive partitioning columns must be present in the schema, возникавшая при обновлении). #90202 (Kseniia Sumarokova).
  • Исправлены возможные некорректные результаты SELECT-запросов после легковесных обновлений при включенном кэше условий запроса. Исправляет #90176. Исправляет #90054. #90204 (Anton Popov).
  • Исправлен сбой в StorageDistributed при разборе некорректных имён каталогов сегментов. #90243 (Aleksandr Musorin).
  • Реализована обработка неявного преобразования строки в целое число или булево значение в LogicalExpressionOptimizerPass. Исправляет #89803. #90245 (Elmi Ahmadov).
  • Исправлено некорректное форматирование некоторых индексов пропуска данных в определении таблицы, из-за которого возникала ошибка METADATA_MISMATCH и не удавалось создавать новые реплики в базе данных Replicated. #90251 (Nikolay Degterinsky).
  • Бэкпортировано в #90381: исправлено несоответствие количества строк в MergeTreeReaderIndex, когда часть содержит меньше строк, чем index_granularity. Устраняет #89691. #90254 (Peng Jian).
  • Бэкпортировано в #90608: исправлена ошибка чтения подстолбцов JSON в компактных частях, которая могла приводить к ошибке CANNOT_READ_ALL_DATA. Исправляет #90264. #90302 (Pavel Kruglov).
  • Исправлена ошибка в функциях trim, ltrim, rtrim, из-за которой они не работали с двумя аргументами. Закрывает #90170. #90305 (Nihal Z. Miaji).
  • Бэкпортировано в #90625: исправлена возможная логическая ошибка в prewhere для несуществующего JSON-пути при index_granularity_bytes=0. Устраняет #86924. #90375 (Pavel Kruglov).
  • Выполнен бэкпорт в #90484: исправлена ошибка в L2DistanceTransposed, из-за которой происходили сбои, когда аргумент precision выходил за пределы допустимого диапазона. Закрывает #90401. #90405 (Raufs Dunamalijevs).
  • В #90577 выполнен бэкпорт: исправлены некорректные вычисления расстояния в L2DistanceTransposed при использовании эталонных векторов в виде массивов (для которых по умолчанию используется Array(Float64))) со столбцами QBit, у которых тип элементов отличается от Float64 (Float32, BFloat16). Теперь функция автоматически приводит эталонный вектор к типу элементов QBit. Устраняет #89976. #90485 (Raufs Dunamalijevs).
  • Бэкпортировано в #90601: исправлена логическая ошибка, возникавшая в редком случае в функции equals. Закрывает #88142. #90557 (Nihal Z. Miaji).
  • Исправлена работа CoalescingMergeTree с типами Tuple. #88828 (scanhex12).

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

  • Исправлена ошибка Connection refused при запуске ClickHouse в Docker с SQL-скриптами initdb и переопределённым TCP-портом. #88042 (Grigorii).
  • В экспериментальном режиме добавлена поддержка e2k как новой платформы для ClickHouse. #90159 (Ramil Sattarov).
  • Удалено оставшееся использование FindPackage в CMake. Сборки не должны зависеть от системных пакетов. #89380 (Alexey Milovidov).
  • Кэш компилятора теперь используется в сборках при конфигурации CMake (например, для protoc). #89613 (Konstantin Bogdanov).
  • Используется sysroot от FreeBSD 13.4. #89617 (Konstantin Bogdanov).

Релиз 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).
  • Параметр server 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).
  • Новый синтаксис позволяет более гибко задавать параметр токенизатора для текстового индекса. #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, позволяющая указать минимальный уровень, начиная с которого part будет создаваться как wide part. #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, хранящий векторы в bit-sliced формате, и функция L2DistanceTransposed, которая позволяет выполнять приближённый векторный поиск, где компромисс между точностью и скоростью задаётся параметром. #87922 (Raufs Dunamalijevs).
  • Функции searchAll и searchAny теперь работают и со столбцами, среди которых нет текстовых. В таких случаях они используют токенизатор по умолчанию. #87722 (Jimmy Aguilar Mena).

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

  • Реализована ленивая репликация столбцов в JOIN и ARRAY JOIN. Исключено преобразование специальных представлений столбцов, таких как Sparse и Replicated, в полные столбцы в некоторых выходных форматах. Это позволяет избежать лишнего копирования данных в памяти. #88752 (Pavel Kruglov).
  • Добавлена необязательная сериализация подстолбца .size для String-столбцов верхнего уровня в таблицах MergeTree, чтобы улучшить сжатие и обеспечить эффективный доступ к подстолбцам. Добавлены новые настройки MergeTree для управления версией сериализации и оптимизации выражений для пустых строк. #82850 (Amos Bird).
  • Поддержка read in order для 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).
  • Производительность запросов улучшена за счёт переработки порядка взаимодействия и интеграции кэша условий запроса (QCC) с анализом индексов. Фильтрация QCC теперь применяется до анализа первичного ключа и индекса пропуска данных, что сокращает объём лишних вычислений индексов. Анализ индексов был расширен для поддержки нескольких фильтров диапазона, а результаты фильтрации теперь также сохраняются обратно в QCC. Это значительно ускоряет запросы, в которых анализ индексов занимает основную часть времени выполнения, — особенно запросы, использующие индекс пропуска данных (например, векторные или инвертированные индексы). #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 из таблицы AggregatingMergeTree с FINAL, если в таблице есть столбцы типа SimpleAggregateFunction(anyLast). #84428 (Duc Canh Le).
  • Добавлена логика проталкивания вниз дизъюнктивных предикатов JOIN. Пример: в TPC-H Q7 для условия по 2 таблицам 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, чтобы уменьшить использование памяти в hash JOIN с большим числом совпадений по ключу. Она позволяет разбивать результат JOIN на фрагменты даже в пределах совпадений для одной строки левой таблицы, что особенно полезно, когда одной строке из левой таблицы соответствуют тысячи или миллионы строк из правой таблицы. Ранее все совпадения приходилось материализовать в памяти сразу. Это снижает пиковое потребление памяти, но может увеличить использование CPU. #87913 (Vladimir Cherkasov).
  • Улучшения в SharedMutex (улучшена производительность при большом количестве параллельных запросов). #87491 (Raúl Marín).
  • Повышена производительность построения текстового индекса для документов, содержащих в основном редкие токены. #87546 (Anton Popov).
  • Ускорен типичный сценарий работы деструктора Field (улучшена производительность при большом количестве небольших запросов). #87631 (Raúl Marín).
  • Исключён перерасчёт статистики hash table во время выполнения при оптимизации 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 merging должны проходить только пересекающиеся диапазоны. #88090 (Shankar Iyer).
  • Снизить влияние работы без fail points (кодовый путь по умолчанию, когда отладка не активна). #88196 (Raúl Marín).
  • Исключено полное сканирование system.tables при фильтрации по uuid (может быть полезно, если у вас есть только UUID из журналов или путь ZooKeeper). #88379 (Azat Khuzhin).
  • Повышена производительность функций tokens, hasAllTokens, hasAnyTokens. #88416 (Anton Popov).
  • Заинлайнили AddedColumns::appendFromBlock, что в некоторых случаях немного улучшает производительность JOIN. #88455 (Nikita Taranov).
  • Автодополнение в клиенте стало быстрее и работает более единообразно благодаря использованию system.completions вместо выполнения нескольких запросов к системным таблицам. #84694 (|2ustam).
  • Добавлен новый параметр текстового индекса dictionary_block_frontcoding_compression для управления сжатием словаря. По умолчанию он включён, чтобы использовать сжатие front-coding. #87175 (Elmi Ahmadov).
  • Данные из всех потоков объединяются перед вставкой в materialized views в зависимости от настроек min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. Ранее, если был включен parallel_view_processing, каждый поток, выполняющий вставку в конкретное materialized view, объединял данные вставки независимо, что могло приводить к увеличению числа создаваемых частей. #87280 (Antonio Andelic).
  • Добавлена настройка temporary_files_buffer_size для управления размером буфера при записи во временные файлы. * Оптимизировано использование памяти в операции scatter (используется, например, в grace hash JOIN) для столбцов LowCardinality. #88237 (Vladimir Cherkasov).
  • Добавлена поддержка прямого чтения из текстовых индексов с параллельными репликами. Повышена производительность чтения текстовых индексов из объектного хранилища. #88262 (Anton Popov).
  • Запросы к таблицам из каталогов озёр данных будут использовать параллельные реплики для распределённой обработки. #88273 (scanhex12).
  • Внутренняя эвристика настройки алгоритма фонового слияния под названием “to_remove_small_parts_at_right” теперь выполняется до вычисления оценки диапазона слияния. Ранее селектор слияний выбирал слияние в формате wide, а затем отфильтровывал его суффикс. Исправления: #85374. #88736 (Mikhail Artemenko).

Улучшения

  • Теперь функция generateSerialID поддерживает неконстантный аргумент с именем серии. Закрывает #83750. #88270 (Alexey Milovidov).
  • В функцию generateSerialID добавлен необязательный параметр start_value, позволяющий задавать пользовательские начальные значения для новых серий. #88085 (Manuel).
  • В clickhouse-format добавлена опция --semicolons_inline, которая форматирует запросы так, что точки с запятой размещаются на последней строке, а не на новой. #88018 (Jan Rada).
  • Добавлена возможность настраивать троттлинг на уровне сервера, если конфигурация переопределяется в Keeper. Закрывает #73964. #74066 (JIaQi).
  • mannWhitneyUTest больше не генерирует исключение, если обе выборки содержат только одинаковые значения. Теперь функция возвращает корректный результат, согласующийся с SciPy. Это закрывает: #79814. #80009 (DeanNeaht).
  • Транзакция Rewrite для диска объектного хранилища удаляет предыдущие blobs в удалённом хранилище, если транзакция метаданных успешно зафиксирована. #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: - При удалении с указанием database или при удалении всей реплики также удаляется реплика для каждой таблицы в database - Если указан ‘WITH TABLES’, реплика удаляется для каждого хранилища - В противном случае логика не меняется: удаляется только реплика на уровне database - При удалении реплики database с указанием пути Keeper: - Если указан ‘WITH TABLES’: - Восстановить database как Atomic - Восстановить таблицы RMT из оператора в Keeper - Удалить database (восстановленные таблицы также будут удалены) - В противном случае удаляется только реплика по указанному пути Keeper. #85637 (Tuan Pham Anh).
  • Исправлено непоследовательное форматирование TTL, когда он содержит функцию materialize. Закрывает #82828. #85749 (Alexey Milovidov).
  • Состояние таблицы Iceberg больше не хранится в объекте хранилища. Это должно позволить использовать Iceberg в ClickHouse с параллельно выполняемыми запросами. #86062 (Daniil Ivanik).
  • Блокировка бакета в упорядоченном режиме S3Queue сделана постоянной, аналогично узлам processing при 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: теперь его флаги CLI принимают - вместо _. #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).
  • Добавлена возможность проверять состояние произвольного узла Keeper во время транзакции записи. Это может помочь выявлять проблему ABA. #87282 (Mikhail Artemenko).
  • Тяжёлые запросы ytsaurus теперь перенаправляются на heavy-прокси. #87342 (MikhailBurdukov).
  • Исправлены откаты операций unlink/rename/removeRecursive/removeDirectory/etc, а также счётчики жёстких ссылок при любых возможных рабочих нагрузках для метаданных в дисковых транзакциях; кроме того, упрощены интерфейсы, чтобы сделать их более универсальными и пригодными для повторного использования в других хранилищах метаданных. #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 теперь возвращает 0 совпадений для пустого токена (тогда как ранее это вызывало исключение). #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), для выполняемого на стороне сервера (native) копирования в пункт назначения резервной копии. Пометить 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 (Konstantin Bogdanov).
  • Исправлена утечка памяти, связанная с 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).
  • Исправлена обработка таблиц озера данных, в имени которых есть последовательность с процентным кодированием. Закрывает #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 для всех числовых типов. Исправляет проверку Date32 на выход за нижнюю границу диапазона при приведении из int16. #87176 (Pervakov Grigorii).
  • Исправлена логическая ошибка в работе параллельных реплик для запросов с несколькими JOIN, в частности когда после LEFT/INNER JOIN используется RIGHT 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 из-за смешения const- и non-const-блоков. #87231 (Azat Khuzhin).
  • Исправлена ошибка в легковесных обновлениях с подзапросами, читающими данные из других таблиц MergeTree. #87285 (Anton Popov).
  • Исправлена оптимизация move-to-prewhere, не работавшая при наличии ROW POLICY. Продолжение #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).
  • Исправлено создание массива пустых Tuple. #87520 (Pavel Kruglov).
  • Проверка недопустимых столбцов при создании временной таблицы. #87524 (Pavel Kruglov).
  • Никогда не помещайте столбцы партиции Hive в заголовок формата. Исправлено #87515. #87528 (Arthur Passos).
  • Исправлена подготовка к чтению из формата DeltaLake при использовании текстового формата. #87529 (Pavel Kruglov).
  • Исправлена проверка прав доступа при SELECT и вставке в таблицы Buffer. #87545 (pufit).
  • Запрещено создание индекса пропуска данных для таблицы S3. #87554 (Bharat Nallan).
  • Устранена утечка учитываемой памяти при асинхронном логировании (дрейф может быть значительным — за 10 часов ~100GiB), а также в text_log (возможен почти такой же дрейф). #87584 (Azat Khuzhin).
  • Исправлена ошибка, которая могла приводить к переопределению глобальных настроек сервера настройками SELECT для View или materialized view, если это представление удалялось асинхронно, а сервер перезапускался до завершения фоновой очистки. #87603 (Alexander Tokmakov).
  • Исключать байты кэша страниц в пространстве пользователя (если возможно) при расчете предупреждения о перегрузке памяти. #87610 (Bharat Nallan).
  • Исправлена ошибка, из-за которой неверный порядок типов при десериализации CSV приводил к LOGICAL_ERROR. #87622 (Yarik Briukhovetskyi).
  • Исправлена некорректная обработка command_read_timeout для словарей executable. #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).
  • Исправлено чтение null-подстолбца map у Variants, которые не могут находиться внутри Nullable. #87798 (Pavel Kruglov).
  • Исправлена обработка ошибки, возникавшей, если на вторичном узле кластера не удавалось полностью удалить базу данных. #87802 (Tuan Pham Anh).
  • Исправлено несколько ошибок в skip-индексах. #87817 (Raúl Marín).
  • В AzureBlobStorage обновили логику: теперь сначала выполняется попытка нативного копирования, а при ошибке ‘Unauthroized’ система переключается на чтение и запись (в AzureBlobStorage, если для источника и пункта назначения используются разные учетные записи хранения, возникает ошибка ‘Unauthorized’). Также исправлено применение “use_native_copy”, когда в конфигурации указана конечная точка. #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).
  • Исправлено некорректное отсечение гранул/партиций для ключей на основе DateTime при использовании настройки session_timezone в запросах. #87987 (Eduard Karacharov).
  • Возвращает количество затронутых строк после выполнения запроса в интерфейсе PostgreSQL. #87990 (Artem Yurov).
  • Ограничено использование pushdown для фильтрации в PASTE JOIN, поскольку это может приводить к некорректным результатам. #88078 (Yarik Briukhovetskyi).
  • Применяет нормализацию URI перед проверкой привилегий, добавленной в https://github.com/ClickHouse/ClickHouse/pull/84503. #88089 (pufit).
  • Исправлена логическая ошибка, возникавшая, когда ARRAY JOIN COLUMNS() не находит ни одного столбца в новом анализаторе. #88091 (xiaohuanlin).
  • Исправлено предупреждение “Высокое потребление памяти ClickHouse” (без учёта кэша страниц). #88092 (Azat Khuzhin).
  • Исправлена возможная порча данных в таблицах MergeTree с заданным TTL для столбца. #88095 (Anton Popov).
  • Исправлено возможное неперехваченное исключение при чтении system.tables при подключенных внешних базах данных (PostgreSQL/SQLite/…) с некорректными таблицами. #88105 (Azat Khuzhin).
  • Исправлен сбой в функциях mortonEncode и hilbertEncode, возникавший при вызове с пустым кортежем в качестве аргумента. #88110 (xiaohuanlin).
  • Теперь запросы с ON CLUSTER будут выполняться быстрее при наличии неактивных реплик в кластере. #88153 (alesapin).
  • Теперь DDL-воркер очищает набор реплик от устаревших хостов. Это уменьшит объем метаданных, хранимых в 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).
  • Исправлен случай ложной циклической зависимости с materialized views в базе данных Replicated, из-за которого нельзя было добавить в базу данных новые реплики. #88423 (Nikolay Degterinsky).
  • Исправлена агрегация разреженных столбцов при значении group_by_overflow_mode, равном any. #88440 (Eduard Karacharov).
  • Исправлена ошибка “столбец не найден” при использовании 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 для типов Tuple. Это закрывает #88469. #88526 (scanhex12).
  • Удаления для iceberg_format_version=1 запрещены. Это закрывает #88444. #88532 (scanhex12).
  • Этот патч исправляет операцию перемещения на дисках plain-rewritable для папок с произвольной глубиной вложенности. #88586 (Mikhail Artemenko).
  • Исправлена работа SQL SECURITY DEFINER с *cluster-функциями. #88588 (Julian Maicher).
  • Исправлено потенциальное падение, вызванное одновременной мутацией базовых const-столбцов 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).
  • Очередная попытка исправить ошибку “having zero bytes” в движке таблицы S3 при включенном кэше. #88740 (Kseniia Sumarokova).
  • Исправлена проверка прав доступа при выполнении SELECT для табличной функции loop. #88802 (pufit).
  • Перехватывать исключения при сбое асинхронного логирования, чтобы предотвратить аварийное завершение программы. #88814 (Raúl Marín).
  • Бэкпортировано в #89060: исправлен top_k — при вызове с одним аргументом теперь учитывается параметр threshold. Закрывает #88757. #88867 (Manuel).
  • Бэкпорт в #88944: исправлена ошибка в функции reverseUTF8. В предыдущих версиях она ошибочно обращала порядок байтов в 4-байтных кодовых точках UTF-8. Это закрывает #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).
  • Для FreeBSD включена поддержка ICU. #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 и больше не влияют на производительность. В этом случае queries SYSTEM ENABLE/DISABLE FAILPOINT возвращают error 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).
  • Окно дедупликации для Replicated увеличено до 10000. Это полностью совместимо, но можно представить сценарии, в которых это изменение приведёт к высокому потреблению ресурсов при большом количестве таблиц. #86820 (Sema Checherinda).

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

  • Теперь вы можете использовать NATS JetStream для чтения сообщений, задав новые настройки nats_stream и nats_consumer для движка NATS. #84799 (Dmitry Novikov).
  • Добавлена поддержка authentication и SSL в табличной функции arrowFlight. #87120 (Vitaly Baranov).
  • Добавлен новый параметр в движок таблицы S3 и табличную функцию s3 с именем storage_class_name, который позволяет указать интеллектуальный класс хранения, поддерживаемый 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 (Konstantin Morozov).
  • Добавлена функция 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: принимают параметры начальной временной метки, конечной временной метки, шага и окна просмотра назад, а также два аргумента для временных меток и значений, но требуют как минимум 1 значение в окне вместо 2. Вычисляют PromQL changes/resets, подсчитывая, сколько раз значение изменяется или уменьшается в указанном окне для каждой временной метки во временной сетке, заданной параметрами. Возвращаемый тип — Array(Nullable(Float64)). #86010 (Stephen Chi).
  • Позволяет пользователям создавать временные представления с синтаксисом, аналогичным синтаксису временных таблиц (CREATE TEMPORARY VIEW). #86432 (Aly Kafoury).
  • Добавлены предупреждения об использовании CPU и памяти в таблицу system.warnings. #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).

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

  • Добавлена поддержка фильтрации частей данных с помощью индекса пропуска данных при чтении, чтобы сократить количество лишних чтений индекса. Управляется новой настройкой 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 всегда разрешаются в коалесцированный столбец, а квалифицированные идентификаторы — в некоалесцированные столбцы, независимо от того, какие ещё идентификаторы присутствуют в запросе. Например: ```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).
  • Распределённый 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).
  • Улучшена производительность вертикальных слияний после легковесного удаления. #86169 (Anton Popov).
  • Незначительно повышена производительность HashJoin в случае LEFT/RIGHT JOIN с большим количеством несовпавших строк. #86312 (Nikita Taranov).
  • Поразрядная сортировка: помогает компилятору использовать SIMD и эффективнее выполнять предварительную выборку. Использует динамическую диспетчеризацию, чтобы задействовать программную предварительную выборку только на процессорах 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).
  • При создании materialized view можно использовать параметры запроса после 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 в партиции таблицы 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 and QueriesPeakMemoryUsage). #86669 (Azat Khuzhin).
  • Вы можете использовать флаг clickhouse-benchmark --precise для более точного отображения QPS и других метрик за интервал. Это помогает получать стабильный QPS в случаях, когда длительность запросов сопоставима с интервалом вывода --delay D. #86684 (Sergei Trifonov).
  • Добавлена возможность настраивать значения nice для потоков Linux, чтобы назначать некоторым потокам (merge/mutate, запросов, materialized view, клиента ZooKeeper) более высокий или низкий приоритет. #86703 (Miсhael Stetsyuk).
  • Исправлена вводящая в заблуждение ошибка «specified upload does not exist», возникающая, когда из-за состояния гонки при multipart-загрузке теряется исходное исключение. #86725 (Julia Kartseva).
  • Ограничено описание плана запроса для запроса EXPLAIN. Для запросов, отличных от EXPLAIN, описание больше не вычисляется. Добавлена настройка query_plan_max_step_description_length. #86741 (Nikolai Kochetov).
  • Добавлена возможность настраивать количество ожидающих сигналов, чтобы избежать CANNOT&#95;CREATE&#95;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).
  • Теперь при удалении каталога на обычном перезаписываемом диске мы записываем размеры blob-объектов для prefix.path. #86908 (alesapin).
  • Добавлена поддержка тестов производительности для удалённых экземпляров ClickHouse, включая ClickHouse Cloud. Пример использования: tests/performance/scripts/perf.py tests/performance/math.xml --runs 10 --user <username> --password <password> --host <hostname> --port <port> --secure. #86995 (Raufs Dunamalijevs).
  • В некоторых местах, где, как известно, выделяется значительный (>16MiB) объём памяти (сортировка, асинхронные вставки, file log), теперь учитываются ограничения по памяти. #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-запросов теперь проверяются только на узле-инициаторе для баз данных Replicated и внутренне реплицируемых таблиц. Это устраняет ситуации, когда уже зафиксированный 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 (требуется для https://github.com/ClickHouse/ClickHouse/pull/81040). #85538 (Arthur Passos).
  • Предотвращена лишняя оптимизация первого аргумента функций IN, которая иногда приводила к ошибке при маппинге массива. #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 listener, если исходный IPv6 listener завершается с ошибкой. #85901 (jskong1124).
  • Этот PR закрывает #77990. Для TableFunctionRemote в globalJoin добавлена поддержка параллельных реплик. #85929 (zoomxi).
  • Исправлен null pointer в orcschemareader::initializeifneeded(). Этот PR устраняет следующую проблему: #85292 ### Запись в документации об изменениях, заметных пользователям. #85951 (yanglongwei).
  • Добавлена проверка, разрешающая коррелированные подзапросы в секции FROM только в том случае, если они используют столбцы внешнего запроса. Исправлено #85469. Исправлено #85402. #85966 (Dmitry Novik).
  • Исправлено обновление ALTER столбца с подстолбцом, используемым в материализованном выражении другого столбца. Ранее материализованный столбец с подстолбцом в выражении обновлялся некорректно. #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-запросе с индексом пропуска данных возникало исключение, если таблица (например, ReplacingMergeTree) была создана с настройкой index_granularity_bytes = 0. Теперь эта ошибка исправлена. #86147 (Shankar Iyer).
  • Устраняет UB и исправляет проблемы при разборе выражения партиции Iceberg. #86166 (Daniil Ivanik).
  • Исправлен сбой при наличии const- и non-const-блоков в одном 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).
  • Исправлено отсутствие столбца definer в system.tables. #86295 (Raúl Marín).
  • Исправлено приведение типов из LowCardinality(Nullable(T)) в Dynamic. #86365 (Pavel Kruglov).
  • Исправлена логическая ошибка при записи в DeltaLake. Закрывает #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 при чтении пустых блобов из Azure Blob Storage для диска plain_rewritable. #86400 (Julia Kartseva).
  • Исправлена ошибка в GROUP BY Nullable(JSON). #86410 (Pavel Kruglov).
  • Исправлена ошибка в Materialized Views: после создания, удаления и повторного создания MV с тем же именем оно могло не работать. #86413 (Alexander Tokmakov).
  • Завершаться с ошибкой, если при чтении из функций *cluster недоступны все реплики. #86414 (Julian Maicher).
  • Исправлена утечка MergesMutationsMemoryTracking, вызванная таблицами Buffer, а также исправлен query_views_log при стриминге из Kafka (и других источников). #86422 (Azat Khuzhin).
  • Исправлено отображение таблиц после удаления опорной table для хранилища 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 для таблиц движка базы данных Postgres со столбцами типов numeric/decimal. #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 при выполнении запроса с part-файлами нулевого размера. #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 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 для персистентных узлов обработки. Исправление для https://github.com/ClickHouse/ClickHouse/pull/85995. Закрывает #86406. #86841 (Kseniia Sumarokova).
  • Исправлена проблема, при которой таблица с движком TimeSeries нарушала создание новой реплики в базе данных Replicated. #86845 (Nikolay Degterinsky).
  • Исправлена работа запросов к system.distributed_ddl_queue в случаях, когда у задач отсутствуют определённые узлы Keeper. #86848 (Antonio Andelic).
  • Исправлена операция seek в конце распакованного блока. #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: после запроса DROP данные оставались в ZooKeeper. #87112 (Nikolay Degterinsky).
  • Исправлено чтение из Parquet идентификаторов полей для maps и arrays. #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).
  • Требовать обратные кавычки вокруг идентификаторов с точками в выражениях по умолчанию, чтобы они не разбирались как составные идентификаторы. #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. Это значительно повышает производительность чтения подстолбцов из вновь созданных компактных частей. Серверы версии ниже 25.5 не смогут читать новые компактные части. #84171 (Pavel Kruglov).
  • Ранее значением по умолчанию для concurrent_threads_scheduler было round_robin, но при большом количестве однопоточных запросов (например, INSERT) этот планировщик показал себя несправедливым. Теперь значением по умолчанию стал более безопасный планировщик fair_round_robin. #84747 (Sergei Trifonov).
  • ClickHouse поддерживает синтаксис heredoc в стиле PostgreSQL: $tag$ string contents... $tag$, также известный как строковые литералы с долларовым quoting. В предыдущих версиях ограничения на теги были слабее: они могли содержать произвольные символы, включая знаки пунктуации и пробельные символы. Это создаёт неоднозначность при разборе идентификаторов, которые тоже могут начинаться со знака доллара. При этом PostgreSQL допускает в тегах только символы слова. Чтобы устранить проблему, теперь теги heredoc могут содержать только символы слова. Закрывает #84731. #84846 (Alexey Milovidov).
  • Функции azureBlobStorage, deltaLakeAzure и icebergAzure были обновлены для корректной проверки разрешений AZURE. Все функции варианта cluster (функции -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, а теперь их исходный код открыт. Синхронизированы некоторые интерфейсы, например сериализация параметров подключения для Объектного хранилища. #84011 (Alexey Milovidov).
  • Добавлена поддержка позиционных удалений в табличном движке Iceberg. #83094 (Daniil Ivanik).
  • Добавлена поддержка Equality Deletes в Iceberg. #85843 (Han Fei).
  • Поддержка записи в Iceberg при создании. Закрывает #83927. #83983 (Konstantin Vedernikov).
  • Поддержка каталогов Glue для записи. #84136 (Konstantin Vedernikov).
  • REST-каталоги Iceberg для записи данных. #84684 (Konstantin Vedernikov).
  • Объединяет все файлы позиционного удаления 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 (Konstantin Vedernikov).
  • Поддержка записи в DeltaLake. Закрывает #79603. #85564 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_snapshot_version для чтения конкретной версии снимка в движке таблицы DeltaLake. #85295 (Kseniia Sumarokova).
  • В метаданные Iceberg (записи manifest) записывается больше статистики (размеры столбцов, нижние и верхние границы) для min-max-отсечения. #85746 (Konstantin Vedernikov).
  • Добавлена поддержка добавления/удаления/изменения столбцов в Iceberg для простых типов. #85769 (Konstantin Vedernikov).
  • 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 (“очередь недоставленных сообщений”). #68873 (Ilya Golshtein).
  • Новая команда SYSTEM RESTORE DATABASE REPLICA для баз данных Replicated, аналогичная уже существующей возможности восстановления в ReplicatedMergeTree. #73100 (Konstantin Morozov).
  • Протокол 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&#95;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).
  • В AzureBlobStorage добавлены extra_credentials для аутентификации с помощью 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).
  • Легковесные обновления и удаления переведены из экспериментальных в статус бета.
  • Приближённый векторный поиск с индексами векторного сходства теперь имеет статус GA. #85888 (Robert Schulze).
  • Добавлены движок таблицы и табличная функция Ytsaurus. #77606 (MikhailBurdukov).
  • Ранее данные текстового индекса разделялись на несколько сегментов (по умолчанию размер каждого сегмента составлял 256 MiB). Это могло снизить потребление памяти при построении текстового индекса, однако увеличивало требования к дисковому пространству и время отклика запроса. #84590 (Elmi Ahmadov).

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

  • Новая реализация ридера Parquet. В целом она быстрее и поддерживает pushdown фильтра на уровне страниц и PREWHERE. Пока что экспериментальная. Для включения используйте настройку input_format_parquet_use_native_reader_v3. #82789 (Michael Kolupaev).
  • Заменили официальный HTTP-транспорт в библиотеке Azure на собственную реализацию HTTP-клиента для Azure Blob Storage. Добавили несколько настроек для этого клиента, аналогичных настройкам S3. Ввели жесткие тайм-ауты подключения как для Azure, так и для S3. Улучшили introspection для profile events и метрик 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, если правая сторона функционально определяется столбцами ключа JOIN (то есть во всех строках значения ключа JOIN уникальны). #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 вынесена за пределы основного цикла hash JOIN. Производительность ALL JOIN немного улучшена. #83216 (Nikolai Kochetov).
  • Сначала обрабатываются min-max-индексы с более высокой гранулярностью. Закрывает #75381. #83798 (Maruth Goyal).
  • Выполнение оконных агрегатных функций DISTINCT ускорено до линейного времени, а также исправлена ошибка в sumDistinct. Закрывает #79792. Закрывает #52253. #79859 (Nihal Z. Miaji).
  • Запросы векторного поиска с использованием индекса векторного сходства выполняются с меньшей задержкой благодаря меньшему числу чтений с диска и снижению нагрузки на CPU. #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).
  • Индекс bloom filter теперь используется для условий вида 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).
  • Более точечно отключаются индексы пропуска данных, зависящие от столбцов, обновляемых на лету или патч-частями. Теперь индексы пропуска данных не используются только в частях, затронутых мутациями на лету или патч-частями; ранее эти индексы отключались для всех частей. #84241 (Anton Popov).
  • Для encrypted_buffer в зашифрованных именованных коллекциях теперь выделяется минимально необходимый объём памяти. #84432 (Pablo Marcos).
  • Улучшена поддержка индексов bloom filter (обычных, n-грамм и токенов): теперь они могут использоваться, когда первый аргумент — константный массив (множество), а второй — индексируемый столбец (подмножество), что делает выполнение запросов эффективнее. #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. Если настройка отсутствует в запросе CREATE для БД 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, а значение по умолчанию изменено с 64KB на 256KB для согласованности со Spark и Hive. #80602 (李扬).
  • В часть Wide добавлен файл columns_substreams.txt для отслеживания всех подпотоков, хранящихся в этой части. Это позволяет отслеживать динамические потоки в типах JSON и Dynamic и тем самым не читать выборку из этих столбцов, чтобы получить список динамических потоков (например, для расчёта размеров столбцов). Кроме того, теперь все динамические потоки отображаются в system.parts_columns. #81091 (Pavel Kruglov).
  • В clickhouse format добавлен CLI-флаг —show_secrets, чтобы по умолчанию скрывать конфиденциальные данные. #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).
  • Теперь в типе JSON можно использовать типы Time и Time64. #83784 (Yarik Briukhovetskyi).
  • В запросах JOIN с параллельными репликами теперь используется логический шаг join. Если при выполнении запросов JOIN с параллельными репликами возникнут какие-либо проблемы, попробуйте SET query_plan_use_new_logical_join_step=0 и сообщите о проблеме. #83801 (Vladimir Cherkasov).
  • Исправлена совместимость cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
  • Добавлена возможность изменять настройки вставки mv на уровне таблицы S3Queue. Добавлены новые настройки уровня S3Queue: min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. По умолчанию используются настройки уровня profile, а настройки уровня 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).
  • Панель мониторинга: всплывающая подсказка больше не будет выходить за верхнюю границу контейнера. #84072 (Alexey Milovidov).
  • Слегка улучшен внешний вид точек на панели мониторинга. #84074 (Alexey Milovidov).
  • У панели мониторинга теперь немного более удачный фавикон. #84076 (Alexey Milovidov).
  • Веб-интерфейс: браузеры теперь смогут предлагать сохранить пароль. Также будут запоминаться значения URL. #84087 (Alexey Milovidov).
  • Добавлена поддержка применения дополнительных ACL для определённых узлов Keeper с использованием конфигурации apply_to_children. #84137 (Antonio Andelic).
  • Исправлено использование сериализации дискриминаторов Variant в формате “compact” в MergeTree. Ранее в некоторых случаях она не применялась, хотя могла. #84141 (Pavel Kruglov).
  • В настройки базы данных Replicated добавлена настройка сервера logs_to_keep, позволяющая изменять значение параметра logs_to_keep, используемое по умолчанию для реплицируемых баз данных. Меньшие значения уменьшают количество ZNodes (особенно если баз данных много), а большие позволяют отстающей реплике догнать остальные спустя более длительное время. #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, позволяющая отключить логи обработчика выражений, так как они могут быть слишком подробными даже для уровня журналирования test при отладке. #84315 (Kseniia Sumarokova).
  • Метрики уровня cgroup и общесистемные метрики теперь публикуются вместе. Метрики уровня cgroup имеют имена CGroup<Metric>, а метрики уровня ОС (собираемые из procfs) — имена OS<Metric>. #84317 (Nikita Taranov).
  • Графики в веб-интерфейсе стали чуть лучше. Не намного, но всё же лучше. #84326 (Alexey Milovidov).
  • Значение по умолчанию для настройки базы данных Replicated 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 для настройки стратегии задержки между повторными попытками S3, используемой при операциях резервного копирования и восстановления. #84421 (Julia Kartseva).
  • Исправление упорядоченного режима S3Queue: завершение теперь происходит раньше, если был вызван shutdown. #84463 (Kseniia Sumarokova).
  • Добавлена поддержка записи в Iceberg для чтения из pyiceberg. #84466 (Konstantin Vedernikov).
  • Разрешено приведение типов для значений Set при проталкивании фильтров IN / GLOBAL IN по первичным ключам хранилищ KeyValue (например, EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • chdig обновлён до 25.7.1. #84521 (Azat Khuzhin).
  • Теперь при возникновении низкоуровневых ошибок во время выполнения UDF возвращается код ошибки UDF_EXECUTION_FAILED, тогда как ранее могли возвращаться разные коды ошибок. #84547 (Xu Jia).
  • В KeeperClient добавлена команда get_acl. #84641 (Antonio Andelic).
  • В движки таблиц для озёр данных добавлена версия снимка. #84659 (Pete Hampton).
  • Добавлена метрика размера ConcurrentBoundedQueue с разбиением по типу очереди (то есть по её назначению) и идентификатору очереди (то есть по случайно сгенерированному идентификатору текущего экземпляра очереди). #84675 (Miсhael Stetsyuk).
  • В таблице system.columns теперь column используется как псевдоним для существующего столбца name. #84695 (Yunchi Pang).
  • Новая настройка MergeTree search_orphaned_parts_drives, позволяющая ограничить область поиска частей, например, только дисками с локальными метаданными. #84710 (Ilya Golshtein).
  • В Keeper добавлен 4LW lgrq для включения и отключения логирования полученных запросов. #84719 (Antonio Andelic).
  • Сопоставление external auth forward_headers без учета регистра. #84737 (ingodwerust).
  • Инструмент encrypt_decrypt теперь поддерживает зашифрованные соединения с ZooKeeper. #84764 (Roman Vasin).
  • В system.errors добавлен столбец format string. Этот столбец нужен для группировки по одному и тому же типу ошибок в правилах оповещений. #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).
  • Пропущены создание и переименование старой временной таблицы для RMV DDL-запросов без append в БД Replicated. #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 для файлов позиционного удаления хранит все данные в оперативной памяти. Это может быть довольно затратно, если файлы позиционного удаления большие, а это бывает часто. В моей реализации в оперативной памяти хранится только последняя группа строк из файлов удаления Parquet, что обходится значительно дешевле. #85329 (Konstantin Vedernikov).
  • chdig: устранены артефакты на экране, исправлен сбой после редактирования запроса в редакторе, добавлен поиск editor в path, обновлён до 25.8.1. #85341 (Azat Khuzhin).
  • В конфигурацию Azure добавлен отсутствующий partition_columns_in_data_file. #85373 (Arthur Passos).
  • В функциях timeSeries*ToGrid разрешён нулевой шаг. Это часть #75036. #85390 (Vitaly Baranov).
  • Добавлен флаг show_data_lake_catalogs_in_system_tables для управления добавлением таблиц из озёр данных в system.tables. Исправляет #85384. #85411 (Smita Kulkarni).
  • Добавлена поддержка подстановки макросов в remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).
  • ИИ в clickhouse-client станет немного лучше. #85447 (Alexey Milovidov).
  • Для старых развертываний опция trace&#95;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).

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

  • Этот PR исправляет определение метаданных при выполнении запросов к таблицам 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 (<subquery>) при включенном кэше условий запроса (настройка use_query_condition_cache). #83445 (LB7666).
  • Исторически для использования функции gcs не требовалось никаких прав доступа. Теперь при ее использовании будет проверяться наличие привилегии GRANT READ ON S3. Закрывает #70567. #83503 (pufit).
  • Пропуск недоступных узлов при INSERT SELECT из s3Cluster() в реплицируемую таблицу MergeTree. #83676 (Igor Nikonov).
  • Исправлена запись в режиме append (в 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 при работе в интерактивном режиме с подсветкой синтаксиса. #84025 (Bharat Nallan).
  • Исправлены ошибочные результаты при использовании кэша условий запроса в сочетании с рекурсивными CTE (issue #81506). #84026 (zhongyuankai).
  • Корректная обработка исключений при периодическом обновлении частей. #84083 (Azat Khuzhin).
  • Исправлено слияние фильтра в условие JOIN в случаях, когда операнды равенства имеют разные типы или ссылаются на константы. Исправлена проблема #83432. #84145 (Dmitry Novik).
  • Исправлен редкий сбой ClickHouse, возникавший, если в таблице есть projection, lightweight_mutation_projection_mode = 'rebuild', а пользователь выполняет lightweight delete, удаляющий ВСЕ строки из какого-либо блока таблицы. #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 Catalog, в которых тип таблицы указан строчными буквами. #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 в ключах сортировки. Теперь при операциях ALTER использование столбцов TTL в предложениях ORDER BY корректно отклоняется, что предотвращает возможное повреждение таблицы. #84536 (xiaohuanlin).
  • Для совместимости значение allow_experimental_delta_kernel_rs до версии 25.5 изменено на false. #84587 (Kseniia Sumarokova).
  • Больше не получает схему из manifest files, а сохраняет соответствующие схемы для каждого снимка отдельно. Для каждого файла данных соответствующая схема теперь определяется по связанному с ним снимку. Прежнее поведение нарушало спецификацию Iceberg для записей в manifest files со статусом existing. #84588 (Daniil Ivanik).
  • Исправлена проблема, из-за которой настройка Keeper rotate_log_storage_interval = 0 приводила к аварийному завершению работы ClickHouse. (проблема #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).
  • Исправлено отсечение столбцов при использовании delta-kernel в хранилище DeltaLake. Закрывает #84543. #84745 (Kseniia Sumarokova).
  • Обновлены учетные данные в delta-kernel для хранилища DeltaLake. #84751 (Kseniia Sumarokova).
  • Устранён избыточный запуск внутренних резервных копий после проблем с подключением. #84755 (Vitaly Baranov).
  • Исправлена проблема, из-за которой выполнение запроса к удалённому источнику с высокой задержкой могло вызывать ошибку vector out of bounds. #84820 (George Larionov).
  • Токенизаторы ngram и no_op больше не приводят к сбою (экспериментального) текстового индекса на пустых входных токенах. #84849 (Robert Schulze).
  • Исправлена работа легковесных обновлений для таблиц с движками ReplacingMergeTree и CollapsingMergeTree. #84851 (Anton Popov).
  • Обеспечено корректное сохранение всех настроек в метаданных таблиц для таблиц, использующих движок object queue. #84860 (Antonio Andelic).
  • Исправлено общее количество наблюдений, возвращаемое Keeper. #84890 (Antonio Andelic).
  • Исправлена работа легковесных обновлений для таблиц с движком ReplicatedMergeTree, созданных на серверах с версией ниже 25.7. #84933 (Anton Popov).
  • Исправлена работа легковесных обновлений для таблиц с движком MergeTree без репликации после выполнения запроса ALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov).
  • Исправлена генерация имён столбцов для булевых литералов: теперь используются “true”/“false” вместо “1”/“0”, что предотвращает конфликты имён столбцов между булевыми и целочисленными литералами в запросах. #84945 (xiaohuanlin).
  • Исправлен дрейф учёта памяти в фоновом пуле планировщика и исполнителе. #84946 (Azat Khuzhin).
  • Исправлены потенциальные проблемы с некорректной сортировкой в движке таблицы Merge. #85025 (Xiaozhe Yu).
  • Реализованы недостающие API для DiskEncrypted. #85028 (Azat Khuzhin).
  • Добавлена проверка на случай, если коррелированный подзапрос используется в распределённом контексте, чтобы избежать аварийного завершения. Исправляет #82205. #85030 (Dmitry Novik).
  • Теперь Iceberg не пытается кэшировать актуальную версию снимка между SELECT-запросами и всегда заново определяет снимок. Предыдущая попытка кэшировать снимок Iceberg приводила к проблемам при использовании таблицы Iceberg с time travel. #85038 (Daniil Ivanik).
  • Исправлено двойное освобождение памяти в 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).
  • Исправлено восстановление баз данных Replicated в случаях, когда перемещение файла метаданных занимает много времени. #85177 (Tuan Pham Anh).
  • Исправлена ошибка с Not-ready Set для IN (subquery) внутри выражения настройки additional_table_filters. #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 на новой реплике базы данных Replicated, если 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).
  • Исправлено возможное UB (сбои) при MEMORY_LIMIT_EXCEEDED во время десериализации String. #85440 (Azat Khuzhin).
  • Исправлены ошибки в метриках KafkaAssignedPartitions и KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
  • Исправлено занижение статистики обработанных байтов при использовании 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).
  • Исправлено чтение значения count из кэша в Delta Lake. #85704 (Kseniia Sumarokova).
  • Исправлен segfault в CoalescingMergeTree при больших строках. Это закрывает #84582. #85709 (Konstantin Vedernikov).
  • Обновлена временная метка метаданных при записи в Iceberg. #85711 (Konstantin Vedernikov).
  • Использовать distributed_depth как индикатор функции Cluster было некорректно и могло приводить к дублированию данных; вместо этого используйте client_info.collaborate_with_initiator. #85734 (Konstantin Bogdanov).
  • Spark не может читать файлы позиционного удаления. #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).
  • Исправлена возможность принимать NULL у полей в Iceberg. #85977 (Konstantin Vedernikov).
  • Исправлена ошибка при восстановлении базы данных Replicated: если имя таблицы содержало символ %, при восстановлении таблица могла быть заново создана под другим именем. #85987 (Alexander Tokmakov).
  • Исправлена ошибка BACKUP_ENTRY_NOT_FOUND, возникавшая при восстановлении пустой таблицы Memory из резервной копии. #86012 (Julia Kartseva).
  • Добавлены проверки для sharding_key при ALTER Distributed таблицы. Ранее некорректный ALTER приводил к повреждению определения таблицы и сбою при перезапуске сервера. #86015 (Nikolay Degterinsky).
  • Больше не создаётся пустой delete-файл 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_backup_bandwidth_for_server, max_mutations_bandwidth_for_server и max_merges_bandwidth_for_server) теперь используются общие для всего сервера throttler’ы для локальных (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) операций. #81753 (Sergei Trifonov).
  • Запрещено создание таблицы без столбцов, в которые можно выполнять вставку. #81835 (Pervakov Grigorii).
  • Кластерные функции теперь выполняются параллельно по файлам внутри архивов. В предыдущих версиях весь архив (например, zip, tar или 7z) был единицей работы. Добавлена новая настройка cluster_function_process_archive_on_multiple_nodes, по умолчанию равная true. Если задано true, это повышает производительность обработки архивов в кластерных функциях. Для совместимости и во избежание ошибок при обновлении до 25.7+ при использовании кластерных функций с архивами в более ранних версиях следует установить false. #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 (Konstantin Vedernikov).
  • Добавлена поддержка операций INSERT в таблицы Iceberg. #82692 (Konstantin Vedernikov).
  • Чтение файлов данных Iceberg по идентификаторам полей. Это улучшает совместимость с Iceberg: поля можно переименовывать в метаданных, при этом они будут сопоставляться с другими именами в самих файлах Parquet. Это закрывает #83065. #83653 (Konstantin Vedernikov).
  • Теперь ClickHouse поддерживает сжатые файлы metadata.json для Iceberg. Исправлено #70874. #81451 (alesapin).
  • Добавлена поддержка TimestampTZ в каталоге Glue. Закрывает #81654. #83132 (Konstantin Vedernikov).
  • В клиент ClickHouse добавлена генерация SQL с помощью ИИ. Теперь вы можете генерировать SQL-запросы по описаниям на естественном языке, добавив ?? в начало запроса. Поддерживаются провайдеры OpenAI и Anthropic с автоматическим определением схемы. #83314 (Kaushik Iska).
  • Добавлена функция для записи гео-типов в формат 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: новая структура данных с bit-sliced-сжатием и сжатием на основе Roaring-битмапов, а также более 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, возможности автоматического определения схемы и т. д. #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, связанная с экспериментальной zero-copy репликацией. Она никогда не использовалась, и этот код никто не поддерживает. Поскольку с ней не было даже тестов, велика вероятность, что она сломалась уже давно. #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, чтобы уменьшить эффект ложного разделения кэш-линий. #82697 (Jiebin Sun).
  • Оптимизации для null_map и JoinMask из #82308 были применены к случаю JOIN с несколькими дизъюнкциями. Также была оптимизирована структура данных KnownRowsHolder. #83041 (Nikita Taranov).
  • Для флагов JOIN используется простой std::vector<std::atomic_bool>, чтобы не вычислять hash при каждом обращении к флагам. #83043 (Nikita Taranov).
  • Не выполнять предварительное выделение памяти для столбцов результата, когда HashJoin использует режим вывода lazy. Это неэффективно, особенно если число совпадений невелико. Кроме того, после завершения JOIN точно известно количество совпадений, поэтому память можно выделить более точно. #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 и в режиме echo в clickhouse-client, а теперь также работает и в строке ввода команд. #82871 (Alexey Milovidov).
  • Подсветка в clickhouse-format и при echo в клиенте будет работать так же, как и в приглашении командной строки. #82874 (Alexey Milovidov).
  • Теперь диски plain_rewritable можно использовать для хранения метаданных базы данных. В plain_rewritable реализованы методы moveFile и replaceFile, чтобы поддержать его использование в качестве диска базы данных. #79424 (Tuan Pham Anh).
  • Разрешено создавать резервные копии баз данных PostgreSQL, MySQL и DataLake. Резервная копия такой базы данных сохраняет только её определение, но не содержащиеся в ней данные. #79982 (Nikolay Degterinsky).
  • Параметр allow_experimental_join_condition объявлен устаревшим, поскольку теперь он всегда разрешён. #80566 (Vladimir Cherkasov).
  • Добавлены метрики давления в набор асинхронных метрик 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 также позволит реализовать 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 увеличена версия протокола cluster functions, что позволяет передавать дополнительную информацию от инициатора к репликам. Эта дополнительная информация содержит выражение преобразования delta-kernel, необходимое для разбора столбцов партиции (а в будущем — и некоторых других вещей, например вычисляемых столбцов и т. д.). #82132 (Kseniia Sumarokova).
  • Функция reinterpret теперь поддерживает преобразование в Array(T), где T — это тип данных фиксированного размера (issue #82621). #83399 (Shankar Iyer).
  • Теперь база данных Datalake генерирует более понятное исключение. Исправлено в #81211. #82304 (alesapin).
  • Улучшена работа CROSS JOIN: HashJoin::needUsedFlagsForPerRightTableRow теперь возвращает false. #82379 (lgbo).
  • Разрешены запись и чтение столбцов map как Array из Tuple. #82408 (MikhailBurdukov).
  • Добавлен список лицензий крейтов Rust в system.licenses. #82440 (Raúl Marín).
  • Макросы, такие как {uuid}, теперь можно использовать в параметре keeper_path движка таблицы S3Queue. #82463 (Nikolay Degterinsky).
  • Улучшение Keeper: перемещение файлов журнала изменений между дисками в фоновом потоке. Ранее перенос журнала изменений на другой диск глобально блокировал работу 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 со встроенной конфигурацией позволит использовать веб-интерфейс, возвращая HTTP-ответ на OPTIONS-запросы. #82870 (Alexey Milovidov).
  • Добавлена поддержка указания дополнительных ACL Keeper для путей в конфигурации. Если вы хотите добавить дополнительные ACL для определённого пути, задайте их в конфигурации в разделе zookeeper.path_acls. #82898 (Antonio Andelic).
  • Теперь снимок мутаций будет формироваться на основе снимка видимых частей. Также счётчики мутаций в снимке будут пересчитаны на основе включённых мутаций. #82945 (Mikhail Artemenko).
  • Добавлен ProfileEvent, когда Keeper отклоняет запись из-за мягкого лимита памяти. #82963 (Xander Garbett).
  • В system.s3queue_log добавлены столбцы commit_time, commit_id. #83016 (Kseniia Sumarokova).
  • В некоторых случаях метрикам требуется несколько измерений. Например, чтобы считать неудачные слияния или мутации по кодам ошибок, а не ограничиваться одним счётчиком. Добавлена system.dimensional_metrics, которая как раз решает эту задачу и вводит первую метрику с измерениями — failed_merges. #83030 (Miсhael Stetsyuk).
  • Предупреждения о неизвестных настройках в клиенте ClickHouse теперь объединяются и записываются в журнал в виде сводки. #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).
  • В profile events part&#95;log для записей MergeParts добавлены метрики ресурсов процесса (такие как UserTimeMicroseconds, SystemTimeMicroseconds, RealTimeMicroseconds). #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).
  • Исправлена логическая ошибка в файловом кэше: “Ноль байт, но диапазон не завершён”. #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. Обеспечено соблюдение ограничения LIMIT в loop(remote(...)). #80299 (Julia Kartseva).
  • Исправлено некорректное поведение функций to_utc_timestamp и from_utc_timestamp при обработке дат до начала эпохи Unix (1970-01-01) и после максимальной даты (2106-02-07 06:28:15). Теперь эти функции корректно приводят значения к началу эпохи и к максимальной дате соответственно. #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, а результат подзапроса не имеет типа Nullable. #81584 (Pavel Kruglov).
  • Не проверять экспериментальные/подозрительные типы при вычислении выражений default/materialize во время чтения из существующей таблицы. #81618 (Pavel Kruglov).
  • Исправлена ошибка “Context has expired” при слияниях, когда в выражении TTL используется словарь. #81690 (Azat Khuzhin).
  • Исправлена монотонность функции CAST. #81722 (zoomxi).
  • Исправлена проблема, из-за которой при обработке скалярного коррелированного подзапроса не считывались необходимые столбцы. Исправляет #81716. #81805 (Dmitry Novik).
  • В предыдущих версиях сервер возвращал слишком много данных в ответ на запросы к /js. Это исправление закрывает #61890. #81895 (Alexey Milovidov).
  • Ранее в определениях движка таблицы MongoDB в аргументе host:port мог присутствовать компонент пути, который молча игнорировался. Интеграция MongoDB отказывается загружать такие таблицы. Благодаря этому исправлению разрешена загрузка таких таблиц, при этом компонент пути игнорируется, если у движка MongoDB пять аргументов и используется имя database из аргументов. Примечание: это исправление не применяется к вновь создаваемым таблицам и запросам с table function mongo, а также к dictionary source и named collections. #81942 (Vladimir Cherkasov).
  • Исправлено возможное аварийное завершение Aggregator при исключении во время merge. #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 может читать таблицы с вложенными типами данных, в которых некоторые подстолбцы содержат десятичные числа, например: 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).
  • Исправлена ошибка в зависимостях таблиц, из-за которой materialized view пропускали 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 (Konstantin Bogdanov).
  • Исправлена ошибка при использовании аргументов 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).
  • Исправлено аварийное завершение при объединении хранилища ключ-значение с ключом, приведённым к другому типу. #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).
  • Устанавливается salt для данных аутентификации при разборе из AST для типа SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
  • При использовании реализации Database без кэширования после возврата столбцов метаданные соответствующей таблицы удаляются, а ссылка становится недействительной. #82939 (buyval01).
  • Исправлена модификация фильтра для запросов с выражением JOIN с таблицей, использующей движок хранения Merge. Исправляет #82092. #82950 (Dmitry Novik).
  • Исправлен LOGICAL_ERROR в QueryMetricLog: мьютекс не может быть NULL. #82979 (Pablo Marcos).
  • Исправлен некорректный вывод функции formatDateTime при использовании форматтера %f вместе с форматтерами переменной длины (например, %M). #83020 (Robert Schulze).
  • Исправлена деградация производительности при включенном анализаторе, из-за которой вторичные запросы всегда читали все столбцы из VIEW. Исправление #81718. #83036 (Dmitry Novik).
  • Исправлено вводящее в заблуждение сообщение об ошибке при восстановлении резервной копии на диске только для чтения. #83051 (Julia Kartseva).
  • Не выполнять проверку циклических зависимостей для CREATE TABLE без зависимостей. Это устраняет снижение производительности в сценариях с созданием тысяч таблиц, возникшее после изменений в https://github.com/ClickHouse/ClickHouse/pull/65405. #83077 (Pavel Kruglov).
  • Исправляет проблему при неявном чтении отрицательных значений Time в таблицу и устраняет неоднозначности в документации. #83091 (Yarik Briukhovetskyi).
  • Не используйте не относящиеся к делу части общего словаря в функции lowCardinalityKeys. #83118 (Alexey Milovidov).
  • Исправлена регрессия при использовании подстолбцов в Materialized Views. Исправлено: #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. Его также можно задать для конкретных конечных точек с помощью настроек на основе конечных точек. #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 проверка прав должна использовать привилегии пользователя, указанного как definer. Это исправляет #79951. #83502 (pufit).
  • Отключено отсечение файлов по границам для элементов массива Iceberg и значений map 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).
  • Исправлен ряд проблем, которые могут возникнуть при попытке запустить integration tests на localhost. #82135 (Oleg Doronin).
  • SymbolIndex теперь компилируется на Mac и FreeBSD. (Но работает только в системах с ELF: Linux и FreeBSD). #82347 (Alexey Milovidov).
  • Azure SDK обновлён до v1.15.0. #82747 (Smita Kulkarni).
  • В систему сборки добавлен модуль storage из 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).
  • В образы clickhouse/clickhouse-server и официальные образы clickhouse добавлены бинарный файл busybox и инструменты установки. #83735 (Mikhail f. Shiryaev).
  • Добавлена поддержка переменной окружения CLICKHOUSE_HOST для указания хоста ClickHouse server, в соответствии с уже существующими переменными окружения 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:SS[.fractional]), а также некоторые базовые функции CAST и функции для работы с другими типами данных. Добавлены настройки для совместимости с существующей функцией 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” — формат двоичного кодирования различных геометрических типов, используемый в GIS-приложениях). См. #43941. #80139 (scanhex12).
  • Добавлено планирование слотов запросов для рабочих нагрузок; подробности см. в разделе планирование рабочих нагрузок. #78415 (Sergei Trifonov).
  • Вспомогательные функции timeSeries*, ускоряющие некоторые сценарии работы с временными рядами: - ресемплирование данных по временной сетке с указанными начальной временной меткой, конечной временной меткой и шагом - вычисление delta, rate, idelta и irate в стиле PromQL. #80590 (Alexander Gololobov).
  • Добавлены функции mapContainsValuesLike/mapContainsValues/mapExtractValuesLike для фильтрации по значениям Map и их поддержка в индексах на основе bloom filter. #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 для работы с алгоритмом Bech, используемым в Bitcoin (issue #40381). #80239 (George Larionov).
  • Добавлены SQL-функции для анализа имён частей MergeTree. #80573 (Mikhail Artemenko).
  • Добавлен новый виртуальный столбец _disk_name, позволяющий фильтровать части, выбранные для запроса, по диску, на котором они находятся. #80650 (tanner-bruce).
  • Добавлена стартовая страница со списком встроенных веб-инструментов. Она будет открываться при запросе от user agent, имитирующего браузер. #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).

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

  • Для Kafka2 с использованием ClickHouse Keeper реализована логика, аналогичная перебалансировке Kafka. Для каждой реплики поддерживаются два типа блокировок партиций: постоянные и временные. Реплика старается удерживать постоянные блокировки как можно дольше; в любой момент времени на реплике может быть не более 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).

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

  • Добавлена поддержка фильтрации с использованием нескольких projection, что позволяет использовать для фильтрации на уровне частей более одной projection. Это решает проблему #55525. Это второй шаг в реализации projection index после #78429. #80343 (Amos Bird).
  • По умолчанию в файловом кэше используется политика кэширования SLRU. #75072 (Kseniia Sumarokova).
  • Устранена конкуренция за ресурсы на шаге Resize в конвейере выполнения запроса. #77562 (Zhiguo Zhou).
  • Добавлена возможность выполнять (де)сжатие и (де)сериализацию блоков в потоках конвейера, а не в одном потоке, связанном с сетевым соединением. Управляется настройкой enable_parallel_blocks_marshalling. Это должно ускорить распределённые запросы, передающие значительные объёмы данных между инициатором и удалёнными узлами. #78694 (Nikita Taranov).
  • Повышена производительность всех типов bloom filter. Видео с конференции OpenHouse #79800 (Delyan Kratunov).
  • Добавлен быстрый путь выполнения в UniqExactSet::merge на случай, когда одно из множеств пусто. Также теперь, если множество LHS двухуровневое, а RHS — одноуровневое, мы не будем преобразовывать RHS в двухуровневое. #79971 (Nikita Taranov).
  • Повышена эффективность повторного использования памяти и снижено количество страничных ошибок при использовании двухуровневых хеш-таблиц. Это должно ускорить GROUP BY. #80245 (Jiebin Sun).
  • Предотвращено ненужное обновление и снижена конкуренция за блокировки в кэше условий запроса. #80247 (Jiebin Sun).
  • Небольшая оптимизация для concatenateBlocks. Вероятно, полезна для параллельного hash JOIN. #80328 (李扬).
  • При выборе диапазонов mark по диапазону первичного ключа двоичный поиск нельзя использовать, если к первичному ключу применены функции. Этот PR снимает это ограничение: двоичный поиск по-прежнему можно применять, когда к первичному ключу применена цепочка всегда монотонных функций или когда RPN содержит элемент, который всегда истинен. Закрывает #45536. #80597 (zoomxi).
  • Ускорено завершение работы движка Kafka (убрана лишняя задержка в 3 секунды при наличии нескольких таблиц Kafka). #80796 (Azat Khuzhin).
  • Асинхронные вставки: снижают использование памяти и повышают производительность запросов на вставку. #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_connect_timeout_ms. Ранее для запросов с параллельными репликами в качестве тайм-аута подключения использовались настройки connect_timeout_with_failover_ms/connect_timeout_with_failover_secure_ms (по умолчанию — 1 секунда). #80421 (Igor Nikonov).
  • В журналируемой файловой системе вызов mkdir записывается в журнал файловой системы, который сохраняется на диске. Если диск медленный, это может занять много времени. Вынесено за пределы области действия блокировки reserve lock. #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 и общие данные для 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).
  • В движках S3Queue и AzureQueue добавлен виртуальный столбец _time. #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).
  • Исправлено описание в плане EXPLAIN для предварительного шага 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).
  • Изменено поведение отсечения партиций по умолчанию для таблиц 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…”, в system.filesystem_cache добавлен столбец finished_download_time. #80849 (Kseniia Sumarokova).
  • В вывод EXPLAIN добавлен раздел с алгоритмом поиска при использовании indexes = 1. Показывается либо “двоичный поиск”, либо “универсальный алгоритм поиска с исключением”. #80881 (Pablo Marcos).
  • В начале 2024 года для обработчика MySQL значение prefer_column_name_to_alias было жёстко установлено в true, поскольку новый анализатор не был включён по умолчанию. Теперь это жёсткое задание можно убрать. #80916 (Yarik Briukhovetskyi).
  • Теперь system.iceberg_history показывает историю для каталогов баз данных, таких как Glue или Iceberg REST. Также для единообразия в system.iceberg_history столбцы table_name и database_name были переименованы в table и database. #80975 (alesapin).
  • Для табличной функции merge разрешён режим только для чтения, поэтому для её использования не требуется grant 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).
  • В конфигурационном файле clickhouse-local разрешены filesystem_caches и named_collections. #81105 (Alexey Milovidov).
  • Исправлена подсветка PARTITION BY в запросах INSERT. В предыдущих версиях PARTITION BY не подсвечивалось как ключевое слово. #81106 (Alexey Milovidov).
  • Два небольших улучшения в веб-интерфейсе: - корректно обрабатываются запросы без вывода, такие как CREATE, INSERT (до недавнего времени для таких запросов бесконечно отображался индикатор загрузки); - при двойном щелчке по таблице выполняется прокрутка к началу страницы. #81131 (Alexey Milovidov).
  • Метрика MemoryResidentWithoutPageCache показывает объём физической памяти в байтах, используемой процессом сервера, без учёта кэша страниц в пространстве пользователя. Это даёт более точное представление о фактическом использовании памяти при использовании кэша страниц в пространстве пользователя. Если кэш страниц в пространстве пользователя отключён, это значение равно MemoryResident. #81233 (Jayme Bird).
  • Пометить вручную записанные в лог исключения в клиенте, локальном сервере, клиенте Keeper и приложении disks как уже записанные, чтобы не записывать их дважды. #81271 (Miсhael Stetsyuk).
  • Параметры use_skip_indexes_if_final и use_skip_indexes_if_final_exact_mode теперь по умолчанию имеют значение True. Запросы с модификатором FINAL теперь будут использовать индексы пропуска данных (если это применимо) для отбора гранул, а также считывать дополнительные гранулы, соответствующие совпадающим диапазонам первичного ключа. Пользователи, которым нужно прежнее поведение с приблизительными/неточными результатами, могут установить use_skip_indexes_if_final_exact_mode в FALSE после тщательной оценки. #81331 (Shankar Iyer).
  • Если в веб-интерфейсе открыто несколько запросов, будет выполнен тот, над которым находится курсор. Продолжение #80977. #81354 (Alexey Milovidov).
  • Этот PR исправляет проблемы в реализации 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).
  • Исправлена логическая ошибка в файловом кэше: “0 байт, но диапазон не завершён”. #81868 (Kseniia Sumarokova).

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

  • Исправлена ошибка в параметризованном представлении с запросом SELECT EXCEPT. Закрывает #49447. #57380 (Nikolay Degterinsky).
  • Анализатор: исправлено имя проекции столбца после повышения типа столбца при 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; теперь нативное копирование используется только при совпадении учётных данных, что устраняет проблему #78964. #79561 (Smita Kulkarni).
  • Исправлены логические ошибки, связанные с неизвестной областью происхождения столбца, возникавшие при проверке, является ли этот столбец коррелированным. Исправляет #78183. Исправляет #79451. #79727 (Dmitry Novik).
  • Исправлены неверные результаты при использовании grouping sets с ColumnConst и анализатором. #79743 (Andrey Zvonov).
  • Исправлено дублирование результатов локального сегмента при чтении из distributed таблицы, если локальная реплика устарела. #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, если eUDF использовалась в запросе. #80073 (Kyamran).
  • Исправлена логическая ошибка в формате Arrow с LowCardinality(FixedString). #80156 (Pavel Kruglov).
  • Исправлено чтение подстолбцов из движка Merge. #80158 (Pavel Kruglov).
  • Исправлена ошибка при сравнении числовых типов в KeyCondition. #80207 (Yarik Briukhovetskyi).
  • Исправлена ошибка AMBIGUOUS_COLUMN_NAME при применении ленивой материализации к таблице с проекциями. #80251 (Igor Nikonov).
  • Исправлена некорректная оптимизация count для фильтров по строковому префиксу, таких как LIKE ‘ab_c%’, при использовании неявных проекций. Это устраняет проблему #80250. #80261 (Amos Bird).
  • Исправлена некорректная сериализация вложенных числовых полей как строк в документах MongoDB. Снято ограничение на максимальную глубину документов из MongoDB. #80289 (Kirill Nikiforov).
  • Смягчены проверки метаданных для RMT в базе данных Replicated. Закрывает #80296. #80298 (Nikolay Degterinsky).
  • Исправлено текстовое представление типов DateTime и DateTime64 в хранилище PostgreSQL. #80301 (Yakov Olkhovskiy).
  • Разрешено использовать DateTime с часовым поясом в таблицах StripeLog. Это закрывает #44120. #80304 (Alexey Milovidov).
  • Отключено проталкивание фильтра для предиката с недетерминированной функцией, если шаг плана запроса изменяет количество строк. Исправляет #40273. #80329 (Nikolai Kochetov).
  • Исправлены возможные логические ошибки и аварийные завершения в проекциях с подстолбцами. #80333 (Pavel Kruglov).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK, вызванная оптимизацией проталкивания фильтра в логическом JOIN sep в случае, если выражение ON не является простым равенством. Исправляет #79647 Исправляет #77848. #80360 (Nikolai Kochetov).
  • Исправлен некорректный результат при чтении ключей в обратном порядке в таблицах с партициями. Это исправление для #79987. #80448 (Amos Bird).
  • Исправлена некорректная сортировка в таблицах с ключом Nullable и включенной опцией optimize_read_in_order. #80515 (Pervakov Grigorii).
  • Исправлено зависание операции DROP для refreshable materialized view, если представление было приостановлено с помощью 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).
  • Исправлена обработка 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 (активные консьюмеры после остановки могут вызывать различные отладочные проверки, а также читать данные с брокеров в фоновом режиме после удаления/отсоединения таблицы). #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).
  • Исправлено атомарное переименование при TRUNCATE для файлов, у которых сжатие определяется по расширению файла. #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, если таблицу удалили после начала запроса, но до отправки столбцов. #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 в случае разреженного столбца при отправке блока INSERT в non-MT MV. #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 при выводе константных значений Tuple или Map в формате Parquet. #81249 (Michael Kolupaev).
  • Проверка смещений массивов, полученных по сети. #81269 (Azat Khuzhin).
  • Исправлен редкий случай в запросе, который выполняет JOIN пустых таблиц и использует оконные функции. Ошибка приводила к взрывному росту числа параллельных потоков, что вызывало OOM. #81299 (Alexander Gololobov).
  • Исправления для функций Cluster для озёр данных (deltaLakeCluster, icebergCluster и т. д.): (1) исправлен потенциальный сегфолт в DataLakeConfiguration при использовании функции Cluster со старым анализатором; (2) устранено дублирование обновлений метаданных озера данных (лишние запросы к объектному хранилищу); (3) исправлен лишний листинг в объектном хранилище, когда format явно не указан (это уже было сделано для некластерных движков озера данных). #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).
  • Не хранить в памяти содержимое нескольких файлов manifest. #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).
  • Теперь скалярные коррелированные подзапросы возвращают результат выражения проекции типа Nullable. Исправлен случай, когда коррелированный подзапрос возвращает пустой результирующий набор. #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 используется dict. #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: блокируется фиксация новых записей журнала, если в журнале есть некорректная запись. Ранее, если leader некорректно применял некоторые записи журнала, он продолжал фиксировать новые записи, хотя follower обнаруживал несовпадение дайджеста и прерывал работу. #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).
  • Исправлена ошибка, связанная с копированием и вставкой, в arraySimilarity; использование весов UInt32 и Int32 теперь запрещено. Обновлены тесты и документация. #82103 (Mikhail f. Shiryaev).
  • Исправлено возможное состояние гонки данных между потоком подсказок и основным клиентским потоком. #82233 (Azat Khuzhin).

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

  • Используется postgres 16.9. #81437 (Konstantin Bogdanov).
  • Используется openssl 3.2.4. #81438 (Konstantin Bogdanov).
  • Использован abseil-cpp 2025-01-27. #81440 (Konstantin Bogdanov).
  • Используется mongo-c-driver 1.30.4. #81449 (Konstantin Bogdanov).
  • Используйте krb5 1.21.3-final. #81453 (Konstantin Bogdanov).
  • Используется orc 2.1.2. #81455 (Konstantin Bogdanov).
  • Используется grpc 1.73.0. #81629 (Konstantin Bogdanov).
  • Используется delta-kernel-rs v0.12.1. #81707 (Konstantin Bogdanov).
  • Обновлён c-ares до версии v1.34.5. #81159 (Konstantin Bogdanov).
  • Обновлён curl до версии 8.14 для устранения CVE-2025-5025 и CVE-2025-4947. #81171 (larryluogit).
  • Обновлён libarchive до версии 3.7.9 для устранения следующих уязвимостей: CVE-2024-20696 CVE-2025-25724 CVE-2024-48958 CVE-2024-57970 CVE-2025-1632 CVE-2024-48957 CVE-2024-48615. #81174 (larryluogit).
  • Обновлён libxml2 до версии 2.14.3. #81187 (larryluogit).
  • Избегайте копирования вендоризированных исходников Rust в CARGO_HOME. #79560 (Konstantin Bogdanov).
  • Убрали зависимость от библиотеки Sentry, заменив её собственной конечной точкой. #80236 (Alexey Milovidov).
  • Обновлены зависимости Python в образах CI для устранения предупреждений Dependabot. #80658 (Raúl Marín).
  • Добавлена повторная попытка чтения из Keeper при запуске флага остановки реплицируемого DDL, чтобы тесты были более устойчивыми при включенной для Keeper инъекции сбоев. #80964 (Alexander Gololobov).
  • Использовать https для URL-адреса архива Ubuntu. #81016 (Raúl Marín).
  • Обновлены зависимости Python в тестовых образах. #81042 (dependabot[bot]).
  • Добавлен flake.nix для Nix-сборок. #81463 (Konstantin Bogdanov).
  • Исправлена проблема, из-за которой delta-kernel-rs требовал доступа к сети во время сборки. Закрывает #80609. #81602 (Konstantin Bogdanov). Прочитайте статью A Year of Rust in ClickHouse.

Релиз 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). Теперь покрытие тестового набора TPC-H составляет 100%.
  • Векторный поиск с использованием индекса векторного сходства теперь перешёл в статус бета (ранее был экспериментальным). #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>), а также некоторые базовые функции CAST и функции для работы с другими типами данных. Кроме того, существующая функция была переименована с toTime в toTimeWithFixedDate, поскольку функция toTime требуется для CAST. #75735 (Yarik Briukhovetskyi). 72459).
  • Каталог Hive metastore для озера данных Iceberg. #77677 (scanhex12).
  • Индексы типа full_text были переименованы в gin. Это соответствует более привычной терминологии PostgreSQL и других баз данных. Существующие индексы типа full_text по-прежнему можно загружать, но при попытке использовать их в поиске будет сгенерировано исключение (с рекомендацией использовать индексы gin). #79024 (Robert Schulze).

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

  • Изменён формат Compact part: теперь для каждого подпотока сохраняются marks, что позволяет читать отдельные подстолбцы. Старый формат Compact по-прежнему поддерживается для чтения и может быть включён для записи с помощью настройки MergeTree write_marks_for_substreams_in_compact_parts. По умолчанию он отключён для более безопасного обновления, так как меняет формат хранения компактных частей. В одном из следующих релизов он будет включён по умолчанию. #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).
  • Ускорено выполнение запросов за счёт оптимизации trivial 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 part. #79536 (Pavel Kruglov).
  • Добавлена настройка input_format_max_block_size_bytes, чтобы ограничить размер блоков, создаваемых во входных форматах, в байтах. Это помогает избежать чрезмерного использования памяти при импорте данных, когда строки содержат большие значения. #79495 (Pavel Kruglov).
  • Убраны защитные страницы для потоков и 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).
  • Добавлены события profile events: 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).
  • Параметры page cache теперь можно настраивать на уровне отдельных запросов. Это нужно для более быстрых экспериментов и более точной настройки запросов с высокой пропускной способностью и малой задержкой. #79337 (Alexey Milovidov).
  • Не выводить подсказки для чисел в форматах Pretty для значений, похожих на большинство 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).
  • Исправлен возможный бесконечный цикл при перечислении blob-объектов из blob-хранилищ 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).
  • В таблицу system.error_log добавлены last_error_message, last_error_trace и query_id. Связанный тикет #75816. #79836 (Andrei Tinikov).
  • Отправка отчетов о сбоях теперь включена по умолчанию. Это можно отключить в конфигурационном файле сервера. #79838 (Alexey Milovidov).
  • Системная таблица system.functions теперь показывает, в какой версии ClickHouse функции появились впервые. #79839 (Robert Schulze).
  • Добавлена настройка access_control_improvements.enable_user_name_access_type. Эта настройка позволяет включать и отключать точные привилегии для пользователей и ролей, добавленные в 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).
  • materialized view может запускаться с опозданием, например позже таблицы Kafka, которая передаёт в неё данные. #72123 (Ilya Golshtein).
  • Исправлено переписывание запроса SELECT при создании VIEW при включенном анализаторе. закрывает #75956. #76356 (Dmitry Novik).
  • Исправлено применение async_insert, получаемого с сервера (через apply_settings_from_server) (ранее это приводило к ошибкам Unknown packet 11 from server на клиенте). #77578 (Azat Khuzhin).
  • Исправлена проблема, из-за которой refreshable materialized view в базе данных Replicated не работало на вновь добавленных репликах. #77774 (Michael Kolupaev).
  • Исправлена ошибка, из-за которой refreshable materialized view нарушали работу резервных копий. #77893 (Michael Kolupaev).
  • Исправлена давняя логическая ошибка срабатывания в transform. #78247 (Yarik Briukhovetskyi).
  • Исправлены некоторые случаи, когда вторичный индекс не применялся при использовании анализатора. Исправляет #65607, исправляет #69373. #78485 (Nikolai Kochetov).
  • Исправлена выгрузка событий профиля (NetworkSendElapsedMicroseconds/NetworkSendBytes) для HTTP-протокола при включенном сжатии (ошибка не должна превышать размер буфера, обычно около 1MiB). #78516 (Azat Khuzhin).
  • Исправлена ошибка анализатора: когда в JOIN … USING участвует столбец ALIAS, вместо корректной ошибки выдавался LOGICAL_ERROR. #78618 (Yakov Olkhovskiy).
  • Исправлен анализатор: CREATE VIEW … ON CLUSTER вызывает ошибку, если SELECT содержит позиционные аргументы. #78663 (Yakov Olkhovskiy).
  • Исправлена ошибка Block structure mismatch при INSERT SELECT в табличную функцию с автоматическим определением схемы, если SELECT содержит скалярные подзапросы. #78677 (Pervakov Grigorii).
  • Исправлен analyzer: при prefer_global_in_and_join=1 для distributed таблицы в 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 в materialized view для столбцов с разными типами в представлении и целевой таблице. #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).
  • Исправлено чтение из materialized view с целевой таблицей Distributed при другом заголовке в анализаторе. #79059 (Pavel Kruglov).
  • Исправлена ошибка, из-за которой arrayUnion() возвращала лишние (некорректные) значения в таблицах с батч-вставками. Исправление #75057. #79079 (Peter Nguyen).
  • Исправлен сбой сегментации в OpenSSLInitializer. Закрывает #79092. #79097 (Konstantin Bogdanov).
  • Всегда указывайте префикс для S3 ListObject. #79114 (Azat Khuzhin).
  • Исправляет ошибку, из-за которой arrayUnion() возвращала лишние (некорректные) значения в таблицах с батч-вставками. Исправляет #79157. #79158 (Peter Nguyen).
  • Исправлена логическая ошибка после применения pushdown к фильтру. #79164 (Pervakov Grigorii).
  • Исправлена работа движка таблицы DeltaLake при использовании реализации delta-kernel с конечными точками на базе HTTP, а также исправлен NOSIGN. Закрывает #78124. #79203 (Kseniia Sumarokova).
  • Исправление в Keeper: предотвращено срабатывание наблюдений при неудачных 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 поддерживает оптимизацию count, а IcebergS3Cluster — нет. В результате значение count(), возвращаемое в режиме cluster, может быть кратно числу реплик. #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).
  • Обеспечена корректная работа materialized views с операторами 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).
  • Запрос к system database может зависать, если метаданные system database хранятся в 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).
  • Добавлена информация для размотки стека в ассемблерных файлах zstd. #79288 (Michael Kolupaev).

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

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

  • Добавлена проверка того, что все столбцы в materialized view соответствуют целевой таблице, если 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).
  • Time travel в 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. Эта возможность заменяет кэш skipping index из более ранних выпусков. #77905 (Shankar Iyer).
  • Добавлена поддержка отсечения партиций в 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).
  • В движок таблицы Kafka добавлены настройки таблицы для конфигурации SASL и учетных данных. Это позволяет настраивать аутентификацию на основе SASL для Kafka и совместимых с Kafka систем прямо в операторе CREATE TABLE, без необходимости использовать файлы конфигурации или именованные коллекции. #78810 (Christoph Wurm).
  • Добавлена возможность задавать default_compression_codec для таблиц MergeTree: он используется, когда запрос CREATE явно не определяет его для указанных столбцов. Это закрывает #42005. #66394 (gvoelfin).
  • Добавлена настройка bind_host в конфигурацию кластеров, чтобы ClickHouse мог использовать определённую сеть для распределённых соединений. #74741 (Todd Yocum).
  • Добавлен новый столбец parametrized_view_parameters в таблице system.tables. Закрывает 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. Эта функция принимает 2 аргумента (value и unit) и преобразует значение в определённый тип 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 и UTF8. Автор: scanhex12. #78176 (Pervakov Grigorii). Не используйте их: реализация изменится в следующих версиях.

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

  • Повышена производительность благодаря ленивым столбцам, которые считывают данные после ORDER BY и LIMIT. #55518 (Xiaozhe Yu).
  • Кэш условий запроса теперь включен по умолчанию. #79080 (Alexey Milovidov).
  • Ускорено построение результата JOIN благодаря девиртуализации вызовов col->insertFrom(). #77350 (Alexander Gololobov).
  • Условия равенства из шага фильтра в плане запроса теперь объединяются в условие JOIN, если это возможно, чтобы их можно было использовать как ключи хеш-таблицы. #78877 (Dmitry Novik).
  • Используйте динамическую сегментацию для JOIN, если ключ JOIN является префиксом PK в обеих частях. Эта оптимизация включается настройкой query_plan_join_shard_by_pk_ranges (по умолчанию отключена). #74733 (Nikolai Kochetov).
  • Добавлена поддержка отсечения данных Iceberg на основе нижних и верхних граничных значений столбцов. Исправляет #77638. #78242 (alesapin).
  • Реализована простая оптимизация count для Iceberg. Теперь запросы с count() и без каких-либо фильтров должны выполняться быстрее. Закрывает #77639. #78090 (alesapin).
  • Добавлена возможность настраивать количество столбцов, которые могут параллельно записываться при слиянии, с помощью max_merge_delayed_streams_for_parallel_write (это должно сократить использование памяти при вертикальных слияниях в S3 примерно в 25 раз). #77922 (Azat Khuzhin).
  • Отключите filesystem_cache_prefer_bigger_buffer_size, если кеш используется пассивно, например при слияниях. Это снижает потребление памяти во время слияний. #77898 (Kseniia Sumarokova).
  • Теперь для определения размера задачи при чтении с включенными параллельными репликами используется количество реплик. Это обеспечивает более равномерное распределение работы между репликами, когда объем читаемых данных не слишком велик. #78695 (Nikita Taranov).
  • Добавлена поддержка асинхронной предзагрузки ввода-вывода для формата 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).
  • Индекс векторного сходства мог выделять до 2 раз больше оперативной памяти, чем нужно. В этом исправлении переработана стратегия выделения памяти, что снижает её потребление и повышает эффективность кэша индекса векторного сходства. (проблема #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 — просто alias для обратной совместимости. #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).
  • Обновления refreshable materialized views теперь появляются в system.query_log. #71333 (Michael Kolupaev).
  • Пользовательские функции (UDF) теперь можно помечать как детерминированные с помощью новой настройки в их конфигурации. Кроме того, кэш запросов теперь проверяет, являются ли UDF, вызываемые в запросе, детерминированными. Если да, результат запроса кэшируется. (Задача #59988). #77769 (Jimmy Aguilar Mena).
  • Для всех типов реплицируемых задач включена логика задержки повторных попыток. Это позволит снизить нагрузку на 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).
  • В system.errors добавлен query_id. Закрывает #75815. #76581 (Vladimir Baikov).
  • Добавлена поддержка преобразования UInt128 в IPv6. Это позволяет выполнять операцию bitAnd и арифметические операции с IPv6 с последующим обратным преобразованием в IPv6. Закрывает #76752. Кроме того, теперь результат операции bitAnd для IPv6 тоже можно преобразовать обратно в IPv6. См. также #57707. #76928 (Muzammil Abdul Rehman).
  • По умолчанию специальные значения Bool в текстовых форматах внутри типа Variant не разбираются. Это можно включить с помощью настройки allow_special_bool_values_inside_variant. #76974 (Pavel Kruglov).
  • Добавлена возможность настраивать время ожидания низкоприоритетного запроса priority для каждой задачи на уровне сеанса и сервера. #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).
  • Добавлены profile events для числа запросов 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, когда ключ не указан при path-style адресации. #78185 (Arthur Passos).
  • Исправлены некорректные значения асинхронных метрик BlockActiveTime, BlockDiscardTime, BlockWriteTime, BlockQueueTime и BlockReadTime (до этого изменения 1 секунда ошибочно указывалась как 0,001). #78211 (filimonov).
  • Теперь для ошибок при отправке в materialized view для StorageS3(Azure)Queue учитывается ограничение loading_retries. Ранее такие ошибки повторялись неограниченно. #78313 (Kseniia Sumarokova).
  • В DeltaLake с реализацией delta-kernel-rs устранены проблемы с производительностью и индикатором прогресса. #78368 (Kseniia Sumarokova).
  • Добавлена поддержка include, from_env, from_zk для дисков runtime. Закрывает #78177. #78470 (Kseniia Sumarokova).
  • В таблицу system.warnings добавлено динамическое предупреждение о длительно выполняющихся мутациях. #78658 (Bharat Nallan).
  • В системную таблицу system.query_condition_cache добавлено поле condition. В нём хранится условие в открытом виде, хеш которого используется как ключ в кэше условий запроса. #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 при отсутствии присоединенных materialized view. #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).
  • Исправлена проблема, из-за которой refreshable materialized view в базе данных Replicated не работало на недавно добавленных репликах. #77774 (Michael Kolupaev).
  • Исправлен возможный сбой, возникавший при ошибке NOT_FOUND_COLUMN_IN_BLOCK. #77854 (Vladimir Cherkasov).
  • Исправлен сбой в S3/AzureQueue, возникавший при заполнении данными. #77878 (Bharat Nallan).
  • Отключён нечёткий поиск по истории на SSH-сервере (так как для него требуется библиотека skim). #78002 (Azat Khuzhin).
  • Исправляет ошибку, из-за которой запрос векторного поиска по неиндексированному столбцу возвращал некорректные результаты, если в таблице был другой векторный столбец с заданным индексом векторного сходства. (Проблема #77978). #78069 (Shankar Iyer).
  • Исправлена незначительная ошибка в промпте “Запрошенный формат вывода является двоичным… Всё равно вывести? [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, если аргумент max_size имеет значение 0 и тип Int, как это уже сделано для UInt, вместо того чтобы пытаться выполнить операцию с таким значением. #78140 (Eduard Karacharov).
  • Предотвращён сбой при восстановлении потерянной реплики, если локальная таблица удалена до её перевода в состояние detached. #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 view, если у реплики 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 исправлена логическая ошибка “Не удается отменить регистрацию: UUID таблицы не зарегистрирован”. Закрывает #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 исправлен случай, когда схема чтения отличалась от схемы таблицы и при этом одновременно присутствовали столбцы партиции, что приводило к ошибке “столбец не найден”. #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 (issue #78314). #78854 (Elmi Ahmadov).
  • Исправлен сбой в Refreshable MATERIALIZED VIEW при выполнении 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).
  • В clickhouse-server добавлен протокол SSH. Теперь к ClickHouse можно подключаться с помощью любого SSH-клиента. Закрывает: #74340. #74989 (George Gamezardashvili).
  • Табличные функции заменяются их вариантами -Cluster, если включены параллельные реплики. Исправление #65024. #70659 (Konstantin Bogdanov).
  • Новая реализация кэша страниц в пространстве пользователя, которая позволяет кэшировать данные в памяти процесса вместо того, чтобы полагаться на кэш страниц ОС; это полезно, когда данные хранятся в удалённой виртуальной файловой системе без локального файлового кэша. #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).
  • События profile events FilterTransformPassedRows и FilterTransformPassedBytes будут отображать количество строк и байт, отфильтрованных при выполнении запроса. #76662 (Onkar Deshpande).
  • Поддержка метрик типа histogram. Интерфейс во многом повторяет клиент Prometheus: достаточно вызвать observe(value), чтобы увеличить счётчик в бакете, соответствующем значению. Метрики гистограмм доступны через system.histogram_metrics. #75736 (Miсhael Stetsyuk).
  • Поддержка неконстантного CASE при выборе по явным значениям. #77399 (Yarik Briukhovetskyi).

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

  • Добавлена поддержка Unity Catalog для таблиц DeltaLake в AWS S3 и локальной файловой системе. #76988 (alesapin).
  • Добавлена экспериментальная интеграция с каталогом сервисов AWS Glue для таблиц Iceberg. #77257 (alesapin).
  • Добавлена поддержка динамического автообнаружения кластеров. Это расширяет существующую возможность автообнаружения узлов. Теперь ClickHouse может автоматически обнаруживать и регистрировать новые кластеры по общему пути ZooKeeper с помощью <multicluster_root_path>. #76001 (Anton Ivashkin).
  • Добавлена возможность автоматически выполнять очистительные слияния для целых партиций по истечении настраиваемого тайм-аута с помощью новой настройки 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 (李扬).
  • В некоторых случаях (например, если столбец типа Array пуст) части данных могут содержать пустые файлы. Теперь можно пропускать запись пустых blob-объектов в 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).
  • По умолчанию параллельные реплики отключаются, если анализатор отключён, независимо от настройки 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).
  • Удалён trace&#95;id из стандартного ORDER BY для system.opentelemetry_span_log. #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).
  • Используется корректный fallback, если многокомпонентное копирование в S3 при резервном копировании завершается ошибкой Access Denied. Ошибка Access Denied при многокомпонентном копировании может возникать, если резервное копирование выполняется между бакетами с разными учетными данными. #76515 (Antonio Andelic).
  • Обновили librdkafka (которая представляет собой ту еще кучу хлама) до версии 2.8.0 (лучше эта куча не стала) и улучшили последовательность завершения работы для таблиц Kafka, сократив задержки при удалении таблиц и перезапуске сервера. engine=Kafka больше не выполняет явный выход из группы потребителей при удалении таблицы. Вместо этого 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).
  • Ранее база данных Replicated могла выводить в журналы учетные данные, указанные в запросе. Эта проблема устранена. Закрывает: #77123. #77133 (Nikita Mikhaylov).
  • Разрешена команда ALTER TABLE DROP PARTITION для диска plain_rewritable disk. #77138 (Julia Kartseva).
  • Настройка резервного копирования/восстановления allow_s3_native_copy теперь поддерживает три возможных значения: - False — нативное копирование S3 не используется; - True (старое значение по умолчанию) — ClickHouse сначала попытается выполнить нативное копирование S3, а если это не удастся, переключится на подход с чтением и записью; - 'auto' (новое значение по умолчанию) — ClickHouse сначала сравнит учетные данные источника и пункта назначения. Если они совпадают, ClickHouse попытается выполнить нативное копирование S3 и при необходимости может переключиться на подход с чтением и записью. Если они различаются, ClickHouse сразу перейдет к подходу с чтением и записью. #77401 (Vitaly Baranov).
  • Добавлена поддержка токена сеанса AWS и учетных данных из окружения в Delta Kernel для движка таблицы 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’ в system.data_skipping_indices переименовано в ‘marks_bytes’. #76374 (Robert Schulze).
  • Исправлена обработка неожиданных ошибок при вытеснении во время динамического изменения размера файлового кэша. #76466 (Kseniia Sumarokova).
  • Исправлена инициализация used_flag в параллельном хеше. Это могло привести к сбою сервера. #76580 (Nikita Taranov).
  • Исправлена логическая ошибка при вызове функции defaultProfiles в проекции. #76627 (pufit).
  • Убрано запрашивание интерактивной Basic Auth-аутентификации в браузере для веб-интерфейса. Закрывает #76319. #76637 (Alexey Milovidov).
  • Исправлено исключение THERE_IS_NO_COLUMN при выборке булева литерала из distributed таблиц. #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 shortcircuit, а также исправлены ошибки. #76708 (李扬).
  • Перед финализацией буферов записи выходных данных теперь выполняется их сброс. Исправлен LOGICAL_ERROR, возникавший при финализации некоторых выходных форматов, например JSONEachRowWithProgressRowOutputFormat. #76726 (Antonio Andelic).
  • Добавлена поддержка binary UUID в MongoDB (#74452) - Исправлен WHERE pushdown в MongoDB при использовании table function (#72210) - Изменено сопоставление типов MongoDB - ClickHouse таким образом, что binary 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).
  • Исправлена работа индекса bloom filter с Array и неподдерживаемыми функциями. #77271 (Pavel Kruglov).
  • Ограничение на количество таблиц следует проверять только при выполнении первоначального запроса CREATE. #77274 (Nikolay Degterinsky).
  • Не баг: SELECT toBFloat16(-0.0) == toBFloat16(0.0) теперь корректно возвращает true (вместо прежнего false). Это приводит поведение в соответствие с Float32 и Float64. #77290 (Shankar Iyer).
  • Исправлена возможная некорректная ссылка на неинициализированную переменную key_index, которая может привести к сбою в отладочных сборках (в релизных сборках эта неинициализированная ссылка, скорее всего, не вызовет проблем, поскольку последующий код, вероятно, сгенерирует ошибки.) ### запись в документации об изменениях, заметных пользователю. #77305 (wxybear).
  • Исправлено имя партиции для значения Bool. Ошибка появилась в https://github.com/ClickHouse/ClickHouse/pull/74533. #77319 (Pavel Kruglov).
  • Исправлено сравнение кортежей с элементами Nullable и строками. Например, до этого изменения сравнение между Tuple (1, null) и String '(1,null)' приводило к ошибке. Ещё один пример — сравнение между Tuple (1, a), где a — столбец Nullable, и String '(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).
  • Веб-интерфейс теперь поддерживает интерактивную навигацию по базе данных. #75777 (Alexey Milovidov).
  • Разрешено сочетать диски только для чтения и с возможностью чтения и записи в политике хранения (в виде нескольких томов или нескольких дисков). Это позволяет читать данные со всего тома, при этом операции вставки будут использовать диск с возможностью записи в приоритетном порядке (то есть политику хранения Copy-on-Write). #75862 (Azat Khuzhin).
  • Добавлен новый движок базы данных DatabaseBackup,, который позволяет мгновенно подключать таблицу или базу данных из резервной копии. #75725 (Maksim Kita).
  • Поддержка подготовленных операторов в wire protocol Postgres. #75035 (scanhex12).
  • Добавлена возможность ATTACH таблиц без уровня базы данных, что полезно для таблиц MergeTree, расположенных на Web, S3 и в аналогичных внешних виртуальных файловых системах. #75788 (Azat Khuzhin).
  • Добавлена новая функция сравнения строк compareSubstrings для сравнения частей двух строк. Example: 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 в одном запросе отслеживать их совокупное потребление памяти и адаптивно выгружать промежуточные данные во внешнее хранилище, чтобы предотвратить MEMORY_LIMIT_EXCEEDED. #72728 (lgbo).
  • Новый экспериментальный движок таблицы Kafka теперь полностью учитывает feature flags Keeper. #76004 (János Benjamin Antal).
  • Восстановлен кодек QPL (Intel), который был удалён в v24.10 из-за проблем с лицензированием. #76021 (Konstantin Bogdanov).
  • Для интеграции с HDFS добавлена поддержка параметра конфигурации dfs.client.use.datanode.hostname. #74635 (Mikhail Tiukavkin).

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

  • Улучшена производительность чтения всего JSON-столбца из S3 в Wide-частях. Это достигается за счет добавления операций предварительного чтения для десериализации префиксов подстолбцов, кэша десериализованных префиксов и параллельной десериализации префиксов подстолбцов. В результате чтение JSON-столбца из S3 ускоряется в 4 раза в запросах вида SELECT data FROM table и примерно в 10 раз в запросах вида SELECT data FROM table LIMIT 10. #74827 (Pavel Kruglov).
  • Устранена избыточная конкуренция в 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).
  • Bloom-фильтры Parquet и индексы min/max теперь оцениваются совместно. Это необходимо для корректной поддержки выражений вида x = 3 or x > 5, где data = [1, 2, 4, 5]. #71383 (Arthur Passos).
  • Запросы, передаваемые в хранилище Executable, больше не ограничиваются однопоточным выполнением. #70084 (yawnt).
  • Части в ALTER TABLE FETCH PARTITION теперь загружаются параллельно (размер пула потоков задается параметром 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).
  • В 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, созданная поверх базы данных, которой больше не существует. Удалён метод getTotalRows из таблиц Hive, поскольку мы не допускаем выполнения им сложной работы. #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).
  • Исправлено чтение подстолбцов вложенного объекта JSON с некорректным префиксом. #73182 (Pavel Kruglov).
  • Корректно передавать настройки формата Native при взаимодействии клиента с сервером. #73924 (Pavel Kruglov).
  • Проверка неподдерживаемых типов для некоторых хранилищ. #74218 (Pavel Kruglov).
  • Исправлен сбой при выполнении запроса INSERT INTO SELECT через интерфейс PostgreSQL в macOS (issue #72938). #74231 (Artem Yurov).
  • Исправлена неинициализированная переменная max_log_ptr в базе данных Replicated. #74336 (Konstantin Morozov).
  • Исправлен сбой при вставке интервала (проблема #74299). #74478 (NamHoaiNguyen).
  • Исправлено форматирование константных JSON-литералов. Ранее это могло приводить к синтаксическим ошибкам при отправке запроса на другой сервер. #74533 (Pavel Kruglov).
  • Исправлено некорректное формирование запроса CREATE при использовании константных выражений для партиции с включенными неявными проекциями. Это исправляет #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).
  • Обновление krb-билета для HDFS при ошибке SASL во время выполнения запроса select к HDFS. #74930 (inv2004).
  • Исправлены запросы к базе данных Replicated в startup_scripts. #74942 (Azat Khuzhin).
  • Исправлены проблемы с выражениями, для типа которых используется псевдоним, в условии JOIN ON при использовании null-safe-сравнения. #74970 (Vladimir Cherkasov).
  • Состояние части возвращается из deleting обратно в устаревший, если операция удаления завершилась с ошибкой. #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 при создании materialized view с внутренними таблицами, так как такие сглаженные столбцы нельзя использовать. #75085 (Christoph Wurm).
  • Исправлена ошибка, из-за которой некоторые адреса IPv6 (например, ::ffff:1.1.1.1) в поле forwarded_for интерпретировались неверно, что приводило к отключению клиента с исключением. #75133 (Yakov Olkhovskiy).
  • Исправлена обработка null-safe JOIN для типа данных LowCardinality с Nullable. Ранее JOIN ON с null-safe-сравнением, таким как 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, приводившая к сбою при вставке. #75188 (Shichao Jin).
  • Исправление Keeper: предотвращена запись в повреждённые changelog-файлы при откате логов. #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 мог ошибочно выполнять 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, возникавшая при использовании подстолбцов JSON типа Array в JOIN с distributed таблицами. #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, если materialized view записывает в движок URL и возникает проблема с подключением. #75679 (Christoph Wurm).
  • Исправлены редкие сбои при чтении из таблицы MergeTree после нескольких асинхронных запросов RENAMEalter_sync = 0) для столбцов разных типов. #75693 (Anton Popov).
  • Исправлена ошибка Block structure mismatch in QueryPipeline stream, возникавшая для некоторых запросов с UNION ALL. #75715 (Nikolai Kochetov).
  • Пересборка проекции при ALTER MODIFY её столбца PK. Ранее это могло приводить к ошибкам CANNOT_READ_ALL_DATA при выполнении SELECT после ALTER MODIFY столбца, используемого в PK проекции. #75720 (Pavel Kruglov).
  • Исправлен некорректный результат ARRAY JOIN для скалярных подзапросов (с анализатором). #75732 (Nikolai Kochetov).
  • Исправлено обращение по нулевому указателю в DistinctSortedStreamTransform. #75734 (Nikita Taranov).
  • Исправлено некорректное поведение allow_suspicious_ttl_expressions. #75771 (Aleksei Filatov).
  • Исправлено обращение к неинициализированной памяти при чтении в функции translate. Это закрывает #75592. #75794 (Alexey Milovidov).
  • Настройки format теперь распространяются и на строковое форматирование JSON в Native format. #75832 (Pavel Kruglov).
  • В истории изменений настроек зафиксировано включение parallel hash по умолчанию в качестве алгоритма JOIN в v24.12. Это означает, что ClickHouse продолжит выполнять JOIN с использованием непараллельного hash, если настроен уровень совместимости ниже v24.12. #75870 (Robert Schulze).
  • Исправлена ошибка, из-за которой таблицы с автоматически добавленными min-max-индексами нельзя было скопировать в новую таблицу (issue #75677). #75877 (Smita Kulkarni).
  • clickhouse-library-bridge позволяет открывать произвольные библиотеки из файловой системы, поэтому его безопасно запускать только в изолированной среде. Чтобы устранить уязвимость при запуске рядом с clickhouse-server, мы ограничим пути к библиотекам расположением, указанным в конфигурации. Эта уязвимость была обнаружена Arseniy Dugin в рамках ClickHouse Bug Bounty Program. #75954 (Alexey Milovidov).
  • Так получилось, что для части метаданных мы использовали сериализацию JSON, и это было ошибкой, поскольку JSON не поддерживает двоичные данные внутри строковых литералов, включая нулевые байты. SQL-запросы могут содержать двоичные данные и некорректный UTF-8, поэтому это нужно поддерживать и в наших файлах метаданных. В то же время JSONEachRow в ClickHouse и похожие форматы обходят это ограничение, отступая от стандарта 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 требовал grant 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).
  • Исправлена поддержка reverse key в PartsSplitter. Это устраняет #73400. #73418 (Amos Bird).

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

  • Добавлена поддержка сборки HDFS как на ARM, так и на Intel Mac. #74244 (Yan Xin).
  • Включены ICU и GRPC при кросс-компиляции для Darwin. #75922 (Raúl Marín).
  • Выполнено обновление до встроенного LLVM 19. #75148 (Konstantin Bogdanov).
  • В Docker-образе отключён сетевой доступ для пользователя default. #75259 (Mikhail f. Shiryaev). Все действия, связанные с clickhouse-server, вынесены в функцию и выполняются только при запуске бинарного файла по умолчанию из entrypoint.sh. Это давно ожидавшееся улучшение было предложено в #50724. В clickhouse-extract-from-config добавлен ключ --users для получения значений из 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).
  • По умолчанию в ORDER BY и функциях сравнения less/greater/equal/etc больше не допускаются несравнимые типы (например, JSON/Object/AggregateFunction). #73276 (Pavel Kruglov).
  • Устаревший движок базы данных MaterializedMySQL удалён и больше недоступен. #73879 (Alexey Milovidov).
  • Источник словаря mysql больше не выполняет запрос SHOW TABLE STATUS, поскольку он не даёт никакой пользы для таблиц InnoDB, как и в любых современных версиях MySQL. Это закрывает #72636. Это изменение обратно совместимо, но помещено в эту категорию, чтобы вы его не пропустили. #73914 (Alexey Milovidov).
  • Для запросов CHECK TABLE теперь требуется отдельный grant CHECK. В предыдущих версиях для выполнения этих запросов было достаточно grant 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).
  • Реализовано отсечение партиций в таблицах Iceberg для операций преобразования партиций, связанных со временем. #72044 (Daniil Ivanik).
  • Добавлена поддержка подстолбцов в ключе сортировки MergeTree и индексах пропуска данных. #72644 (Pavel Kruglov).
  • Добавлена поддержка чтения значений HALF_FLOAT из Apache Arrow/Parquet/ORC (они преобразуются в Float32 при чтении). Это закрывает #72960. Имейте в виду, что half float по стандарту 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-индексы пропуска для столбцов в таблицах 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).
  • Добавлена поддержка оптимизации проталкивания предикатов на уровне плана запроса для шага MergingAggregated. Это повышает производительность некоторых запросов при использовании анализатора. #74073 (Nikolai Kochetov).
  • Разбиение блоков левой table по hash было удалено из этапа 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 за счет повторной сортировки правой таблицы JOIN по ключам. #72237 (kevinyhzou).
  • Добавлена возможность для arrayROCAUC и arrayAUCPR вычислять частичную площадь под всей кривой, чтобы распараллеливать вычисления на огромных наборах данных. #72904 (Emmanuel).
  • Избегайте создания слишком большого количества бездействующих потоков. #72920 (Guo Wangyang).
  • Не перечислять ключи blob storage, если в table function используется только раскрытие фигурных скобок. Закрывает #73333. #73518 (Konstantin Bogdanov).
  • Оптимизация вычислений с коротким замыканием для функций, выполняемых над аргументами Nullable. #73820 (李扬).
  • Исключено применение maskedExecute к столбцам, не являющимся функциями; улучшена производительность выполнения с коротким замыканием. #73965 (lgbo).
  • Отключено автоматическое определение заголовков во входных форматах для Kafka/NATS/RabbitMQ/FileLog с целью повышения производительности. #74006 (Azat Khuzhin).
  • Выполнение конвейера с более высокой степенью параллелизма после агрегации с наборами группировки. #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, которая отключает создание индексов пропуска данных при слиянии. Это позволяет явно управлять тем, когда создаются индексы пропуска данных (через ALTER TABLE [..] MATERIALIZE INDEX [...]). Это может быть полезно, если построение индексов пропуска данных требует больших затрат (например, для индексов векторного сходства). #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 (многофункциональный MySQL CLI от 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. #74182 (Alexey Milovidov).
  • Даже если HTTP-ответ сжат, отправляйте пакеты сразу по мере поступления. Это позволяет браузеру получать пакеты «Прогресс» и сжатые данные. #74201 (Alexey Milovidov).
  • Если число выходных записей превышает N = output_format_pretty_max_rows, то вместо отображения только первых N строк мы будем обрезать выходную таблицу посередине, показывая N/2 первых строк и N/2 последних строк. Продолжение #64200. Закрывает #59502. #73929 (Alexey Milovidov).
  • Разрешен более общий алгоритм планирования JOIN при включенном алгоритме hash join. #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).
  • В таблицу журналов спанов OpenTelemetry добавлены HTTP-заголовки для повышения трассируемости. #70516 (jonymohajanGmail).
  • Добавлена поддержка записи файла orc с пользовательским часовым поясом вместо обязательного часового пояса GMT. #70615 (kevinyhzou).
  • Учитывать настройки планирования операций ввода-вывода при записи резервных копий между облаками. #71093 (János Benjamin Antal).
  • Добавлен псевдоним name для столбца metric в 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”. #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 (Konstantin Morozov).
  • Теперь ограничение max_bytes_before_external_sort зависит от общего потребления памяти запросом (раньше это было количество байтов в блоке сортировки для одного потока сортировки, теперь этот параметр имеет тот же смысл, что и max_bytes_before_external_group_by, — это общий лимит памяти для всего запроса по всем потокам). Также добавлена ещё одна настройка для управления размером блока на диске — min_external_sort_block_bytes. #72598 (Azat Khuzhin).
  • Игнорирование ограничений памяти коллектором трассировок. #72606 (Azat Khuzhin).
  • В system.server_settings добавлены настройки сервера dictionaries_lazy_load и wait_dictionaries_load_at_startup. #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).
  • Использовать мультизапросы Keeper в потоке очистки ObjectStorageQueueMetadata. #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).
  • Добавлена возможность изменять настройки commit в хранилище S3(Azure)Queue. (Настройки commit: 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 прогресс агрегируется по источникам, чтобы сравнивать его с настройками лимита коммита. #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 для совместимости с wire-протоколом Postgres. #73812 (scanhex12).
  • Функция isIPv4String возвращала true, если после корректного IPv4-адреса следовал нулевой байт, хотя в этом случае должна возвращать false. Продолжение #65387. #73946 (Alexey Milovidov).
  • Код ошибки в протоколе MySQL приведён в соответствие с MySQL. Продолжение #56831. Закрывает #50957. #73948 (Alexey Milovidov).
  • Добавлена настройка validate_enum_literals_in_opearators для проверки литералов enum в операторах, таких как IN и NOT IN, на соответствие типу enum и для генерации исключения, если литерал не является допустимым значением enum. #73985 (Vladimir Cherkasov).
  • В хранилище S3(Azure)Queue фиксация всех файлов (в одном пакете, определяемом настройками commit) теперь выполняется в рамках одной транзакции Keeper. #73991 (Kseniia Sumarokova).
  • Отключено определение заголовков для исполняемых UDF и словарей (это могло приводить к ошибке Function ‘X’: неверный результат, ожидалось Y строк(и), фактически 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-запросе materialized view. #74030 (Pavel Kruglov).
  • Теперь в 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).
  • В EXPLAIN добавлены названия таблиц Iceberg. #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).
  • Исправлена регрессия, из-за которой использование локалей collation с модификаторами приводило к ошибке. Например, 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).
  • Исправлена ошибка, из-за которой не удавалось создать последовательный узел с помощью 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).
  • Исправлен редкий сбой в refreshable materialized view при остановке сервера. #73323 (Michael Kolupaev).
  • Заполнитель %f функции formatDateTime теперь всегда выводит шесть цифр (доли секунды). Это делает поведение совместимым с функцией MySQL DATE_FORMAT. Предыдущее поведение можно восстановить с помощью настройки formatdatetime_f_prints_scale_number_of_digits = 1. #73324 (ollidraese).
  • Исправлена фильтрация по столбцу _etag при чтении из хранилища s3 и с помощью табличной функции. #73353 (Anton Popov).
  • Исправлена ошибка Not-ready Set is passed as the second argument for function 'in', возникавшая при использовании IN (subquery) в выражении JOIN ON со старым анализатором. #73382 (Nikolai Kochetov).
  • Исправлена подготовка к squashin для столбцов Dynamic и JSON. Ранее в некоторых случаях новые типы могли вставляться в shared variant/общие данные, даже если лимит по типам/путям ещё не был достигнут. #73388 (Pavel Kruglov).
  • Проверка повреждённых размеров при декодировании типов из бинарного формата, чтобы избежать чрезмерно больших выделений памяти. #73390 (Pavel Kruglov).
  • Исправлена логическая ошибка при чтении в кластере с одной репликой при включенных параллельных репликах. #73403 (Michael Kolupaev).
  • Исправлена работа ObjectStorageQueue с ZooKeeper и более старыми версиями Keeper. #73420 (Antonio Andelic).
  • Внесено исправление, необходимое для включения hive-партиционирования по умолчанию. #73479 (Yarik Briukhovetskyi).
  • Исправлено состояние гонки при создании индекса векторного сходства. #73517 (Antonio Andelic).
  • Исправлен segfault, возникающий, когда источник словаря содержит функцию с некорректными данными. #73535 (Yarik Briukhovetskyi).
  • Исправлена обработка повторных попыток при неудачной вставке в хранилище S3(Azure)Queue. Закрывает #70951. #73546 (Kseniia Sumarokova).
  • Исправлена ошибка в функции tupleElement, которая в некоторых случаях могла возникать для кортежей с элементами LowCardinality и включённой настройкой optimize_functions_to_subcolumns. #73548 (Anton Popov).
  • Исправлен парсинг glob-шаблона enum, за которым следует диапазон. Исправление #73473. #73569 (Konstantin Bogdanov).
  • Исправлена ошибка, из-за которой параметр parallel&#95;replicas&#95;for&#95;non&#95;replicated&#95;merge&#95;tree игнорировался в подзапросах для нереплицируемых таблиц. #73584 (Igor Nikonov).
  • Исправлено сгенерированное исключение std::logical&#95;error, возникавшее, когда задачу не удавалось запланировать. Обнаружено в стресс-тестах. #73629 (Alexander Gololobov).
  • Запросы в EXPLAIN SYNTAX больше не интерпретируются, чтобы избежать логических ошибок из-за некорректной стадии обработки распределенных запросов. Исправляет #65205. #73634 (Dmitry Novik).
  • Устранена возможная несогласованность данных в столбце типа Dynamic. Исправлена возможная логическая ошибка 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, приводившее к segmentation fault. #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 для распределённых запросов с analyzer. Это временное решение, которое мы используем до тех пор, пока не будет поддерживаться выполнение распределённых запросов с сериализацией плана запроса. Закрывает #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&#95;block&#95;size. #74289 (Konstantin Morozov).
  • Исправлено копирование через ObjectStorage (то есть S3) в случаях, когда учетные данные источника и пункта назначения не совпадают. #74331 (Azat Khuzhin).
  • Исправлено распознавание “use the Rewrite method in the 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).
  • Частичный отзыв привилегий с подстановочными знаками мог отзывать больше привилегий, чем ожидалось. Закрывает #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).
  • Исправлено имя столбца в проекции при выполнении JOIN временных таблиц, закрывает #68872. #74897 (Vladimir Cherkasov).

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

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