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

Журнал изменений Cloud v25.12

Изменения, нарушающие обратную совместимость

Изменения типов данных

  • Добавлен тип Geometry. Для него добавлена поддержка чтения форматов WKB и WKT. В предыдущих версиях тип Geometry был псевдонимом для String, но теперь это полнофункциональный тип. #83344 (Konstantin Vedernikov).
  • Удалён устаревший тип данных Object. #85718 (Pavel Kruglov).
  • Теперь экранируются имена файлов, создаваемые для подстолбцов типа Variant в широкой части данных таблиц MergeTree. Это изменение нарушает совместимость со старыми таблицами с типами данных Variant/Dynamic/JSON. Исправлено хранение типов со специальными символами внутри Variant (например, DateTime с конкретным часовым поясом, который содержит \). Экранирование можно отключить, изменив настройку MergeTree escape_variant_subcolumn_filenames (для сохранения совместимости отключите эту настройку в конфиге для MergeTree или установите настройку compatibility на предыдущую версию перед обновлением). Решена проблема #69590. #87300 (Pavel Kruglov).

Изменения запросов и функций

  • Теперь ALTER MODIFY COLUMN требует явного DEFAULT при преобразовании Nullable-столбцов в типы, не допускающие NULL. Ранее такие операции ALTER могли «зависать» с ошибками cannot convert null to not null, теперь значения NULL заменяются выражением значения по умолчанию для столбца. Устраняет проблему #5985. #84770 (Vladimir Cherkasov).
  • Удалены настройки allow_not_comparable_types_in_order_by/allow_not_comparable_types_in_comparison_functions. Разрешение несравнимых типов в ORDER BY или в функциях сравнения может приводить к логическим ошибкам и неожиданным результатам. Устраняет проблему #90028. #90527 (Pavel Kruglov).
  • Исправлены функции bitShiftLeft и bitShiftRight, чтобы возвращать 0 или пустое значение в случае сдвига ровно на размер типа. #91943 (Pablo Marcos).
  • Токенизатор ngram больше не будет возвращать n-граммы короче длины N, с которой он был настроен. Поиск по тексту не будет возвращать ни одной строки, если поисковые токены пустые. #89757 (George Larionov).

Изменения в хранилище и индексах

  • Удалена устаревшая функциональность LIVE VIEW. Если вы используете LIVE VIEW, обновление до новой версии будет невозможно. #88706 (Alexey Milovidov).
  • Запрещено создание нескольких дисков plain-rewritable поверх общего пути объектного хранилища, так как это может приводить к неопределенному поведению при коллизиях разных транзакций записи метаданных. #89038 (Mikhail Artemenko).
  • Теперь запрещено создавать специальные таблицы MergeTree (такие как ReplacingMergeTree, CollapsingMergeTree и т.д.) с пустым ключом ORDER BY, поскольку поведение слияний (merge) в таких таблицах неопределено. Если вам все же необходимо создать такую таблицу, включите настройку allow_suspicious_primary_key. #91569 (Anton Popov).
  • Несколько исправлений в работе с неявными индексами. Схема, отображаемая или сохраняемая (метаданные в Keeper), больше не будет включать неявные индексы, такие как индексы, создаваемые настройками add_minmax_index_for_numeric_columns или add_minmax_index_for_string_columns. Это может привести к ошибкам метаданных, когда таблица ReplicatedMergeTree создается или обновляется в новой версии, в то время как одна из реплик работает на более старом релизе. #91429 (Raúl Marín).

Изменения в настройках и конфигурации

  • Добавлена поддержка тегирования исключений в HTTP-ответах, чтобы клиенты могли более надёжно разбирать исключения. Исправляет #75175. Настройка http_write_exception_in_output_format по умолчанию отключена для обеспечения согласованности между форматами. #88818 (Kaviraj Kanagaraj).
  • Исправлён приоритет настроек SASL в хранилище Kafka. Настройки SASL на уровне таблицы, указанные в запросах CREATE TABLE, теперь корректно переопределяют настройки consumer/producer из конфигурационных файлов. #89401 (János Benjamin Antal).
  • Переименованы параметры конфигурации ACME: refresh_certificates_task_interval в refresh_certificates_task_interval_seconds и refresh_certificates_before в refresh_certificates_before_seconds. Параметр refresh_certificates_task_interval_seconds теперь ожидает значение в секундах. #92211 (Konstantin Bogdanov).
  • Отключённые позиционные аргументы в проекциях теперь считаются обратно несовместимым изменением. Дополнительно введена настройка enable_positional_arguments_for_projections для обеспечения безопасного обновления кластера ClickHouse, когда в проекциях используются позиционные аргументы. #92007 (Dmitry Novik).

Изменения в клиенте

  • Обновлён clickhouse-client, чтобы возвращать ненулевой код выхода (159 — TIMEOUT_EXCEEDED), когда запрос завершается по таймауту из‑за receive_timeout. Ранее при превышении времени ожидания возвращался код выхода 0 (успех), что затрудняло скриптам и системам автоматизации обнаружение сбоев по таймауту. #91432 (Sav).

Изменения формата статистики

  • При изменении типа столбца с String на Nullable(String) мутация данных выполняться не будет. Однако для агрегатной функции uniq используется иная структура данных: для nullable-столбца будет использоваться AggregateFunctionNull со вложенным агрегатором uniq. AggregateFunctionNull будет сериализовывать дополнительный флаг типа bool. Это приведёт к несовместимости файла статистики. Формат статистики изменился, сервер аварийно завершится, если существуют статистики в старом формате. Чтобы избежать исключения, выполните ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL для пересоздания статистики. #90311 (Han Fei).

Другие критические изменения

  • Исправлена фатальная ошибка (Fatal) при сжатии данных, размер которых не выровнен по размеру элемента (в кодеке T64). Устраняет проблему #89282. #89432 (yanglongwei).

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

Functions

  • Добавлен новый SQL-оператор EXECUTE AS для поддержки выдачи полномочий от имени другого пользователя (user impersonation). Исправляет #39048. #70775 (Shankar).
  • Добавлена функция flipCoordinates, которая разворачивает требуемое количество измерений в массиве и меняет местами указатели внутри столбца Tuple. Исправляет #79469. #79634 (Sachin Kumar Singh).
  • Расширен оператор IS NOT DISTINCT FROM (<=>): добавлена поддержка обратного IS DISTINCT FROM, а также поддержка совместимых числовых операндов разных типов (например, Nullable(UInt32) и Nullable(Int64)). #87581 (yanglongwei).
  • Добавлена поддержка оконной функции cume_dist. Исправляет #86920. #88102 (Manuel).
  • Добавлены функции для вычисления площади и периметра для типа Geometry. #89047 (Konstantin Vedernikov).
  • Реализована функция dictGetKeys, которая возвращает ключ(и) словаря, атрибут которого равен заданному значению. Она использует кэш обратного поиска в рамках одного запроса, который настраивается с помощью параметра max_reverse_dictionary_lookup_cache_size_bytes, чтобы ускорить повторяющиеся обращения. #89197 (Nihal Z. Miaji).
  • Добавлена поддержка arrayRemove(arr, elem) для удаления всех элементов, равных elem, из массива arr. Исправляет #52099. #89585 (tiwarysaurav).
  • Добавлена скалярная функция midpoint, которая вычисляет среднее значение. Исправляет #89029. #89679 (simonmichal).
  • Теперь вы можете получать как аргумент, так и соответствующее ему минимальное или максимальное значение с помощью новых функций argAndMin и argAndMax. #89884 (AbdAlRahman Gad).
  • Добавлена SQL-функция HMAC(algorithm, message, key) как часть #73900 и #38775. #90837 (Mikhail f. Shiryaev).
  • Добавлена поддержка использования первичного ключа и индексов пропуска данных в функции has(), когда первый аргумент является константным массивом. Закрывает #90980. #91023 (Nihal Z. Miaji).

Системные таблицы

  • Добавлена таблица system.unicode, содержащая список символов Unicode и их свойства. Закрывает #80055. #80857 (wxybear).
  • Добавлена новая системная таблица shared_merge_tree_condemned_parts, аналогичная shared_merge_tree_outdated_parts, которая перечисляет части, помеченные к удалению потоком PartsKillerThread. (Smita Kulkarni).

Движки таблиц и хранилище

  • Поддержка части Prometheus HTTP Query API. Чтобы включить её, добавьте правило с типом query_api в секцию <prometheus> конфигурационного файла. Поддерживаемые обработчики: /api/v1/query_range и /api/v1/query. #86132 (Nikita Mikhaylov).
  • Пользователи теперь могут настраивать таблицы S3/Azure Queue для перемещения или добавления тегов к обработанным файлам, помимо прежних вариантов — оставлять или удалять файлы. Закрывает #72944. #86907 (Murat Khairulin).
  • Добавлена новая настройка MergeTree merge_max_dynamic_subcolumns_in_wide_part, позволяющая ограничивать количество динамических подстолбцов в Wide‑части после слияния независимо от параметров, заданных в типе данных. #87646 (Pavel Kruglov).
  • Интеграция с каталогом Microsoft OneLake. #89366 (Konstantin Vedernikov).
  • Поддержка синтаксиса CREATE OR REPLACE для временных таблиц. Закрывает #35888. #89450 (Aleksandr Musorin).
  • Поддержка direct (nested loop) join для таблиц MergeTree. Чтобы использовать его, укажите его как единственный вариант в настройке: join_algorithm = 'direct'. #89920 (Vladimir Cherkasov).
  • Этот PR добавляет настройки на уровне проекций, доступные через новую конструкцию WITH SETTINGS в ALTER TABLE ... ADD PROJECTION. Эти настройки позволяют проекциям переопределять отдельные параметры хранения MergeTree (например, index_granularity, index_granularity_bytes) для каждой проекции. #90158 (Amos Bird).

Iceberg и озера данных

Возможности SQL и запросов

  • Добавлен параметр allow_reentry в агрегатную функцию windowFunnel. При включении вместе с strict_order он игнорирует события, нарушающие порядок, вместо того чтобы останавливать анализ воронки. Это позволяет корректно обрабатывать пользовательские сценарии с обновлением страницы (A->A->B) или возвратом назад (A->B->A->C) без занижения показателей конверсии. #86916 (Lee ChaeRok).
  • Теперь пользователь может добавить новый аргумент preprocessor при построении текстового индекса. Аргумент представляет собой произвольное выражение, которое трансформирует каждый документ перед токенизацией. #88272 (Jimmy Aguilar Mena).
  • Добавлена поддержка дробных значений LIMIT и OFFSET для выбора части таблицы. Закрывает задачу #81892. #88755 (Ahmed Gouda).
  • Добавлена настройка into_outfile_create_parent_directories для автоматического создания родительских директорий для INTO OUTFILE, что предотвращает ошибки при отсутствии выходных путей. Решает задачу #88610. #88795 (Saksham).
  • Добавлена настройка type_json_skip_invalid_typed_paths для отключения исключений при вставках/преобразованиях типов в тип JSON, когда входной JSON не может быть приведён к явно типизированным путям в типе JSON. В таком случае используется значение null/0 для типизированного пути. Закрывает задачу #86917. #89886 (Max Justus Spransy).

Возможности клиента и CLI

  • CLI-клиент теперь может подавлять сообщение «ClickHouse server version is older than ClickHouse client. It may indicate that the server is out of date and can be upgraded.» с помощью параметра --no-server-client-version-message или значения false. #87784 (Larry Snizek).
  • Доступ к экземплярам ClickHouse Cloud с использованием учетных данных Cloud с помощью параметра --login. #89261 (Krishna Mannem).
  • Веб-интерфейс теперь предоставляет кнопку скачивания. Она скачивает полный результат, даже если в интерфейсе отображается только его часть. #89768 (Alexey Milovidov).

Конфигурация и мониторинг сервера

  • Добавлено поле memory_usage в X-ClickHouse-Progress и X-ClickHouse-Summary. Его можно использовать для сбора данных об использовании памяти запросами в режиме реального времени на стороне клиента. #88393 (Christoph Wurm).
  • Добавлена настройка send_profile_events, которая позволяет клиентам сократить объём сетевого трафика, когда profile events не используются. #89588 (Kaviraj Kanagaraj).

Keeper

  • Совместимость Keeper с ZooKeeper: создание с использованием статистики. #88797 (Konstantin Vedernikov).
  • Поддержка постоянных наблюдателей (persistent watches) ZooKeeper в ClickHouse Keeper. #88813 (Konstantin Vedernikov).

Форматы ввода/вывода

  • Реализован новый формат ввода/вывода Buffers. Этот формат аналогичен Native, однако, в отличие от Native, он не сохраняет имена столбцов, их типы или какие-либо дополнительные метаданные. Закрывает #84017. #91156 (Nihal Z. Miaji).
  • Добавлена настройка arrow_flight_request_descriptor_type для поддержки Dremio и других серверов Arrow Flight, которые требуют дескрипторов командного стиля. Исправляет #89523. #89826 (Shreyas Ganesh).
  • В движок таблиц Kafka добавлена настройка kafka_schema_registry_skip_bytes для пропуска байт заголовка оболочки (например, 19-байтового префикса AWS Glue Schema Registry) перед разбором полезной нагрузки сообщения. #89621 (Taras Polishchuk).

Другие новые возможности

  • Добавлена настройка max_streams_for_files_processing_in_cluster_functions для управления количеством потоков при параллельном чтении файлов в табличных функциях Cluster. Закрывает #90223. #91323 (Pavel Kruglov).
  • Добавлена возможность отключать фоновую загрузку данных соседних частей на уровне отдельного запроса. Исправляет #89524. #89668 (tanner-bruce).
  • Экспериментальная поддержка архитектуры e2k (Elbrus-2000) в качестве новой платформы для ClickHouse. #90159 (Ramil Sattarov).

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

  • Поддержка получения TLS-сертификатов от ACME-провайдеров, RFC 8555. #66315 (Konstantin Bogdanov).
  • Введён новый механизм автоматического выполнения запросов с использованием параллельных реплик, управляемый настройкой automatic_parallel_replicas_mode. #87541 (Nikita Taranov).
  • Полнотекстовый поиск теперь доступен в режиме закрытого предварительного доступа (ранее находился на экспериментальной стадии). #88928 (Robert Schulze).
  • Alias переведён в категорию экспериментальных функций; его можно включить с помощью allow_experimental_alias_table_engine=1. #89712 (Kai Zhu).

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

Выполнение и оптимизация запросов

  • Прерывать выполнение запросов при достижении лимитов по строкам. Решает #61872. #62804 (Sean Haynes).
  • Добавлена оптимизация для удаления неиспользуемых столбцов в планах запросов. Решает #75152. #76487 (János Benjamin Antal).
  • Оптимизация для больших значений в ConstantNode. Закрывает #72880. #81104 (Yakov Olkhovskiy).
  • Предвыборка ключей при итерации хеш-таблицы для минимизации промахов кэша. #84708 (lgbo).
  • Повышена скорость декомпрессии LZ4 за счёт упрощения кода и настройки алгоритма выбора. #88360 (Raúl Marín).
  • Реализовано ленивое дублирование столбцов в JOIN и ARRAY JOIN. Избегается преобразование специальных представлений столбцов, таких как Sparse и Replicated, в полные столбцы в некоторых форматах вывода. Это предотвращает ненужное копирование данных в памяти. #88752 (Pavel Kruglov).
  • Используются расширенные SIMD-операции для логических функций через динамическую диспетчеризацию. #90432 (Raúl Marín).
  • Улучшена производительность JIT-функций за счёт отказа от ненужной инициализации результирующего столбца нулями. #90449 (Raúl Marín).
  • Ускорена декомпрессия T64 через динамическую диспетчеризацию. #90610 (Raúl Марín).
  • Ускорено преобразование столбцов к типу bool (в WHERE-условиях) через динамическую диспетчеризацию. #91203 (Raúl Марин).
  • Ускорена сортировка одиночного числового блока через динамическую диспетчеризацию. #91213 (Raúl Марин).

Оптимизации JOIN

  • RIGHT JOIN и FULL JOIN теперь используют ConcurrentHashJoin; это означает, что эти типы join теперь выполняются с более высокой степенью параллелизма. Повышает производительность различных сценариев для RIGHT и FULL JOIN до 2 раз. Исправляет #78027. #78462 (Yarik Briukhovetskyi).
  • Добавлена возможность переписывать ANY LEFT JOIN или ANY RIGHT JOIN в ALL INNER JOIN в некоторых случаях. #89403 (Dmitry Novik).
  • Добавлена поддержка runtime-фильтров JOIN для ANTI JOIN. Также переработана реализация runtime-фильтров для уменьшения конкуренции за блокировки. #89710 (Dmitry Novik).
  • Добавлена поддержка сохранения порядка чтения из левой таблицы в операциях LEFT/INNER JOIN, что может быть использовано на последующих шагах. #89815 (Vladimir Cherkasov).

Оптимизации MergeTree и подсистемы хранения

  • До 8-кратного ускорения SELECT-запросов с интенсивным отсечением партиций на таблицах с более чем 10K частей. #85535 (James Morrison).
  • Когда запрос использует фиксированную хэш-таблицу для состояния агрегации (GROUP BY по небольшому целому числу), ClickHouse выполняет слияние состояния агрегации параллельно, ускоряя выполнение запроса. Исправляет #63666. #87366 (Jianfei Hu).
  • Parquet reader v3 включён по умолчанию. #88827 (Michael Kolupaev).
  • Запросы теперь могут одновременно использовать преимущества optimize_read_in_order и query_plan_optimize_lazy_materialization. Исправляет #88767. #88866 (Manuel).
  • Теперь для запросов с DISTINCT используются агрегатные PROJECTION. Закрывает #86925. #88894 (Nihal Z. Miaji).
  • Выполняется потоковое преобразование LIMIT BY в случаях, когда порядок сортировки входных данных совпадает с ключами LIMIT BY. #88969 (Eduard Karacharov).
  • Добавлена поддержка разреженной сериализации для столбцов типа Nullable. #88999 (Amos Bird).
  • Оптимизировано inplace-фильтрование в MergeTree reader. Исправляет #87119. #90630 (Xiaozhe Yu).
  • Добавлена дополнительная эвристика для уменьшения ширины выбранных вариантов слияния. #91163 (Mikhail Artemenko).

Оптимизации индексов и полнотекстового поиска

  • ClickHouse теперь использует skip-индексы для анализа индексов в предикатах WHERE с комбинированными условиями фильтрации, связанными через AND и OR. Ранее для использования skip-индексов выражение WHERE должно было представлять собой конъюнкцию (AND) условий фильтрации. Новая настройка use_skip_indexes_for_disjunctions (по умолчанию: on) управляет этой возможностью. #87781 (Shankar Iyer).
  • Повышена производительность фильтрации для предикатов с функциями like, equals, has и другими за счёт использования дополнительного предварительного фильтра, построенного на основе текстового индекса. Эта оптимизация включается с помощью настройки query_plan_text_index_add_hint. #88550 (Anton Popov).
  • Улучшена производительность текстового индекса за счёт кэширования блоков словаря и использования хеш-таблиц для поиска токенов вместо двоичного поиска. #88786 (Elmi Ahmadov).
  • Поскольку posting lists (списки вхождений) занимают наибольший объём данных, их кэширование улучшает производительность при последовательных запусках. #88912 (Elmi Ahmadov).
  • Оптимизированы повторяющиеся обратные обращения к словарю за счёт более быстрых поисков в предвычисленном наборе возможных ключевых значений. Исправляет #7968. #88971 (Nihal Z. Miaji).
  • Оптимизированы запросы ORDER BY...LIMIT N с использованием skip-индекса и динамического порогового фильтра для существенного сокращения количества обрабатываемых строк. #89835 (Shankar Iyer).
  • Пользователи должны заметить меньшую задержку при анализе индексов при наличии крупных индексов minmax (с миллионами гранул). #90428 (Shankar Iyer).

Оптимизации агрегации

  • Оптимизирован AggregateFunctionHistogram за счёт сортировки только хвоста массива точек и пропуска сортировки для монотонных входных данных, что даёт примерно 10% ускорения. #85760 (MakarDev).
  • Незначительно ускорены некоторые операции countDistinct за счёт сокращения накладных расходов HashSetTable::merge. #89727 (Raúl Marín).
  • Улучшена производительность и поведение topK. #90091 (Raúl Marín).
  • Улучшена производительность операций сравнения значений типа Decimal. Закрывает #28192. #90153 (Konstantin Bogdanov).

Оптимизации S3 и резервного копирования

  • S3 внутренне распределяет объекты по партициям на основе префиксов в именах ключей и автоматически масштабируется для обработки большого числа запросов на партицию. Это изменение добавляет два новых параметра BACKUP: data_file_name_generator и data_file_name_prefix_length. Когда data_file_name_generator=checksum, файлы данных резервной копии именуются на основе хеша их содержимого. #88418 (Julia Kartseva).
  • Повышена производительность запросов для таблиц S3, созданных с использованием glob-шаблона, за счет проталкивания значений фильтра _path, что позволяет избежать операций перечисления в S3. Управляется настройкой s3_path_filter_limit. #91165 (Eduard Karacharov).

Оптимизации озера данных

  • Распределённое выполнение: задачи теперь разбиваются по идентификаторам групп строк, а не по файлам. #87508 (Konstantin Vedernikov).
  • Поддержка отсечения партиций для функций Paimon. #90253 (JIaQi Tang).

Улучшения

Оптимизация и выполнение запросов

  • Разрешена команда FETCH PARTITION при наличии неисправных дисков в реплицируемых таблицах MergeTree. #58663 (Duc Canh Le).
  • Добавлена функция h3PolygonToCells, заполняющая геометрию h3‑шестиугольниками. Решает #33991. #66262 (Zacharias Knudsen).
  • Все DDL-запросы ON CLUSTER теперь выполняются в контексте исходного пользователя, выполнившего запрос, для более корректной проверки прав доступа. #71334 (pufit).
  • Добавлен параллельный режим выполнения для запросов ALTER TABLE ... FREEZE. #71743 (Kirill).
  • Позволяет использовать неконстантные вторые аргументы для IN. Также поддерживает кортеж в качестве второго аргумента. #77906 (Yarik Briukhovetskyi).
  • Этот PR позволяет использовать обычные проекции в качестве вторичного индекса. При включении некоторые предикаты запроса могут использоваться для чтения данных из частей проекций и генерации битовых карт для эффективной фильтрации строк на этапе PREWHERE. #81021 (Amos Bird).
  • Включена по умолчанию настройка enable_shared_storage_snapshot_in_query для обеспечения более строгих гарантий согласованности. #82634 (Alexey Milovidov).
  • UNION должен при необходимости унифицировать типы с Variant. Исправляет #82772. #83246 (Mithun p).
  • Записывать внутренние запросы (те, которые выполняются внутри сервера словарями, refreshable materialized views и т.п.) и добавить новый столбец is_internal в system.query_log. #83277 (Miсhael Stetsyuk).
  • Добавляет поддержку выполнения INSERT в столбцы типа ALIAS (столбцы, которые просто ссылаются на физический столбец без какого-либо выражения). Закрывает #80060. #84154 (Shaurya Mohan).
  • Теперь в clickhouse-client для запросов CREATE OR REPLACE TABLE с SELECT отображаются индикатор хода выполнения, логи и статистика производительности. Решена #38416. #87247 (Diskein).
  • Добавлена поддержка типов данных JSON и Dynamic в хеш-функциях. Решает проблему из #87734. #87791 (Pavel Kruglov).
  • Значение по умолчанию параметра query_plan_optimize_join_order_limit изменено на 10. #89312 (Alexey Milovidov).
  • Оптимизация enable_lazy_columns_replication теперь используется по умолчанию, что позволит сократить потребление памяти при выполнении операций JOIN. #89316 (Alexey Milovidov).
  • Включить по умолчанию настройку allow_statistics_optimize, чтобы оптимизатор JOIN использовал статистику по столбцам. #89332 (Alexey Milovidov).
  • Теперь по умолчанию включена настройка create_table_empty_primary_key_by_default. Это улучшает удобство использования. #89333 (Alexey Milovidov).
  • Параметр enable_time_time64_type теперь включён по умолчанию. #89345 (Yarik Briukhovetskyi).
  • Настройка allow_special_serialization_kinds_in_output_formats теперь включена по умолчанию. #89402 (Pavel Kruglov).
  • Теперь в запросах, выполняемых через Shared Catalog, игнорируется ON CLUSTER. (Nikolay Degterinsky).
  • Добавлена поддержка ALTER DATABASE MODIFY COMMENT в Shared Catalog. (Nikolay Degterinsky).
  • Добавлена поддержка CREATE OR REPLACE для SharedSet/SharedJoin в базах данных Shared. (Tuan Pham Anh).
  • Исключено ожидание других запросов при выполнении SYNC REPLICA в SharedMergeTree. (Raúl Marín).

Улучшения хранилища и MergeTree

  • Добавлен новый виртуальный столбец _tags (Map(String, String)) со всеми тегами, связанными с объектом (blob) в S3. Решает #72945. #77773 (Zicong Qu).
  • Добавлено сообщение об ошибке о том, что часть была дедуплицирована. #80264 (Aleksandr Musorin).
  • Используется OpenSSL 3.5.4. #81389 (Константин Богданов).
  • Добавлен кэш для аутентификации с использованием bcrypt. #87115 (Nikolay Degterinsky).
  • Метки времени Parquet без часового пояса (isAdjustedToUTC=false) теперь читаются как DateTime64(..., 'UTC') вместо DateTime64(...). #87872 (Michael Kolupaev).
  • Роли, определённые в SQL, теперь могут быть выданы пользователям, определённым в users.xml. #88139 (c-end).
  • Если пропускающий индекс, используемый в запросе с FINAL, находится на столбце, который является частью первичного ключа, дополнительный шаг проверки пересечения по первичному ключу в других частях не требуется и теперь не выполняется. Решает #85897. #88368 (Shankar Iyer).
  • Разрешена вставка в удалённые таблицы и таблицы озера данных, когда включён disable_insertion_and_mutation. #88549 (Alexander Tokmakov).
  • Добавлено кэширование статистики на уровне таблицы, добавлены две настройки: настройка MergeTree refresh_statistics_interval и настройка сессии use_statistics_cache. #88670 (Han Fei).
  • Добавлена настройка MergeTree alter_column_secondary_index_mode для управления тем, что делать с индексами во время мутаций. Возможные значения: throw, drop, rebuild и compatibility. Закрывает #77797. #89335 (Raúl Marín).
  • Введён кэш ColumnsDescription для частей на уровне таблицы, что снижает использование памяти, когда таблицы содержат много частей и много столбцов. #89352 (Azat Khuzhin).

Системные таблицы и мониторинг

  • Добавлено несколько гистограммных метрик для сервера и Keeper для измерения длительности этапов выполнения запросов Keeper. #88158 (Miсhael Stetsyuk).
  • В system.columns добавлен новый столбец statistics, указывающий типы статистик, построенных для этой таблицы. #89086 (Han Fei).
  • HTTP-интерфейс будет предоставлять заголовки Age и Expires при использовании кэша результатов запроса. Добавлены новые profile events: QueryCacheAgeSeconds, QueryCacheReadRows, QueryCacheReadBytes, QueryCacheWrittenRows, QueryCacheWrittenBytes. #89759 (Alexey Milovidov).
  • В Web UI отображаются свойства таблиц. Щелчок по числу строк или байт откроет запрос к system.tables. #89771 (Alexey Milovidov).
  • В таблицу system.error_log добавлены поля last_error_time, last_error_message, last_error_query_id и last_error_trace. #89879 (Narasimha Pakeer).
  • Идентификаторы блоков дедупликации сохраняются в system.part_logs. #89928 (Sema Checherinda).
  • Значение настройки check_query_single_value_result по умолчанию изменено с true на false. Это приводит к тому, что CHECK TABLE возвращает детализированные результаты по каждой части вместо агрегированного результата. #90150 (Robert Schulze).
  • В system.mutations добавлен новый столбец parts_in_progress_names для улучшения диагностики. #90155 (Shaohua Wang).
  • Добавлены таблицы system.background_schedule_pool{,_log} для улучшения анализа фоновых задач. #91157 (Azat Khuzhin).
  • Добавлены profile events FailedInitialQuery и FailedInitialSelectQuery. #91172 (RinChanNOW).
  • В system.tables добавлены три столбца для метрик «висячих» частей. (Han Fei).
  • Значение distributed_cache_client.connection_pool_size экспортировано в виде метрики. (Francesco Ciocchetti).

Улучшения клиента и интерфейса

  • Пользователь теперь может отменить запрос, нажав Ctrl-C при работе постраничного вывода (pager). Исправляет #80778. #88935 (Grigorii Sokolik).
  • Web UI будет отображать столбики в таблице даже при отрицательных значениях. #89016 (Alexey Milovidov).
  • Запросы, начинающиеся с пробельных символов, больше не сохраняются в историю. #89116 (Konstantin Bogdanov).
  • clickhouse-client и clickhouse-local в интерактивном режиме будут подсвечивать в командной строке идентификаторы с тем же именем, что и текущий под курсором. #89689 (Alexey Milovidov).
  • Ползунок изменения размера текстовой области запроса в Web UI теперь занимает всю ширину. #89457 (Alexey Milovidov).
  • Подсказки типов в Web UI больше не «наезжают» на заголовок таблицы. #89753 (Alexey Milovidov).
  • Теперь вы можете быстро комментировать или раскомментировать выделенные строки в редакторе запросов Web UI с помощью Ctrl+/ (или Cmd+/ на Mac). #91160 (Samuel K.).
  • Добавлена поддержка загрузки конфигурации ClickHouse Client из каталогов XDG Base Directory. Исправляет #89882. #90306 (Wujun Jiang).

Улучшения S3 и облачных хранилищ

  • Добавлена возможность автоматически использовать opt-in регионы AWS для S3, когда регион не указан в endpoint. #88930 (Andrey Zvonov).
  • Значение по умолчанию для s3_retry_attempts установлено равным 500 в версии 25.6, чтобы гарантировать успешное создание резервных копий при репартиционировании в S3. #89051 (Nikita Mikhaylov).
  • Кэшируются учетные данные S3 при взаимодействии с endpoint STS, чтобы их можно было переиспользовать для разных вызовов функций. #89734 (Antonio Andelic).
  • Теперь предварительно подписанные (pre-signed) URL-адреса работают с S3. Закрывает #65032. #90827 (Yarik Briukhovetskyi).

Улучшения для озёр данных

  • Поддержка чтения DeltaLake CDF через табличную функцию deltaLake с настройками delta_lake_snapshot_start_version, delta_lake_snapshot_end_version. #90431 (Kseniia Sumarokova).
  • Поддержка настроек хранилища в операторе INSERT INTO табличной функции для согласованности с SELECT. Закрывает #89386. #91707 (Kseniia Sumarokova).
  • Теперь для запроса TRUNCATE по озёрам данных генерируется ошибка «not implemented» вместо того, чтобы молча ничего не делать. Закрывает #86604. #91713 (Kseniia Sumarokova).

Улучшения Kafka

  • Настройки kafka_compression_codec и kafka_compression_level теперь можно использовать для указания сжатия для продюсеров Kafka. #89073 (János Benjamin Antal).
  • Добавлен kafka_consumer_reschedule_ms как настраиваемый параметр движка таблиц Kafka. Устраняет проблему #89204. #90112 (Jeremy Aguilon).

Улучшения Keeper

  • Добавлен лимит на размер в байтах для пакета запросов append в Keeper. Лимит контролируется с помощью keeper_server.coordination_settings.max_requests_append_bytes_size. #90342 (Antonio Andelic).
  • Добавлена проверка на стороне keeper-server во время handshake для отклонения клиентов, если last_zxid_seen (provided by the client) > last_processed_zxid. #90016 (Miсhael Stetsyuk).
  • Используется более низкий лимит на число узлов для запроса RemoveRecursive Keeper во время очистки S3Queue. #90201 (Antonio Andelic).

Улучшения форматов ввода/вывода

  • Добавлена поддержка UUID в Parquet, когда он представлен типом FixedString(16) с логическим типом UUID. #74484 (alekseev-maksim).
  • Добавлена поддержка массива строк в качестве входного параметра для функций hasAnyTokens и hasAllTokens. #89124 (Elmi Ahmadov).
  • В формате Pretty именованные кортежи теперь отображаются как Pretty JSON. Это закрывает #65022. #91779 (Mostafa Mohamed Salah).
  • Добавлено ограничение на максимальный размер сообщения CapnProto. Его можно изменить с помощью format_capn_proto_max_message_size. #91888 (Antonio Andelic).

Улучшения текстового индекса

  • Текстовый индекс теперь работает с таблицами ReplacingMergeTree. #90908 (Elmi Ahmadov).
  • Добавлена возможность использовать инвертированный индекс в PREWHERE. Закрывает #89975. #89977 (Peng Jian).
  • Токенизатор Ngrams теперь можно собирать с ngram_length = 1. #91529 (George Larionov).
  • Добавлен кэш для десериализованного заголовка текстового индекса для уменьшения операций ввода-вывода (I/O) и улучшения производительности запросов. #89513 (Elmi Ahmadov).

Другие улучшения

  • Исправлена бинарная десериализация Array и Map, чтобы при проверке ограничений по размеру использовалась настройка max_binary_array_size вместо max_binary_string_size. #88744 (Raufs Dunamalijevs).
  • Если объем системной памяти меньше 5 ГБ, по умолчанию не выполнять mlock исполняемого файла. #89751 (Alexey Milovidov).
  • Уменьшено потребление памяти во время слияний в таблице system.metric_log путем установки min_bytes_for_wide_part и vertical_merge_algorithm_min_bytes_to_activate в 128 МБ. #89811 (filimonov).
  • Повторять попытки при сетевых ошибках, когда библиотека S3 разбирает XML-ответ. #90216 (Sema Checherinda).
  • Обновлены предупреждения при приближении к ограничениям guardrails: теперь отображаются текущее значение и значение, при котором выбрасывается исключение. #90438 (Nikita Fomichev).
  • Передавать фрагменты потоком в таблице system.filesystem_cache вместо создания одного фрагмента со всем состоянием кеша. #90508 (Kseniia Sumarokova).
  • Элементы в кеше индекса векторного сходства теперь удаляются, когда части таблицы удаляются или заменяются более новыми частями. #90750 (Shankar Iyer).
  • Исключено раскрытие версии сервера ClickHouse в HTTP-ошибках, возвращаемых до прохождения аутентификации. #91003 (filimonov).
  • Добавлены новые настройки apply_row_policy_after_final и apply_prewhere_after_final, позволяющие применять политики строк и условия PREWHERE после обработки FINAL. Исправляет #90986. #91065 (Yarik Briukhovetskyi).
  • Добавлена поддержка типа JSON в функции tupleElement. Закрывает #81630. #91327 (Pavel Kruglov).
  • Добавлена поддержка отрицательных индексов для доступа к элементу кортежа (например, tuple.-1). #91665 (Amos Bird).
  • Разрешено неявное приведение типа при приведении Array к QBit. #91846 (Raufs Dunamalijevs).
  • Добавлен новый столбец elapsed_time_microseconds в system.blob_storage_log. #92322 (Alexey Milovidov).
  • Добавлена новая настройка database_shared_drop_table_delay_seconds, позволяющая пользователям управлять задержкой удаления таблиц в базе данных Shared. (Nikolay Degterinsky).
  • Добавлена отложенная загрузка зашифрованных ключей для именованных коллекций. (Pablo Marcos).
  • Добавлена возможность отключать кеш клиентов по буферу для распределенного кеша. (Kseniia Sumarokova).
  • Добавлен общий лимит для подключений к распределенному кешу. (Kseniia Sumarokova).

Исправления ошибок

Примечание

В этом разделе приведён выбранный набор важных исправлений. Полный список всех исправлений в этом выпуске см. в полном журнале изменений

Исправления выполнения запросов

  • Исправлена некорректная величина rows_before_limit_at_least, когда в распределённой агрегирующей выборке с объединением участвуют несколько удалённых сегментов. #63511 (Amos Bird).
  • Исправлено появление сообщения 0 rows in set после запроса INSERT INTO ... SELECT. Закрывает #47800. #79462 (Engel Danila).
  • Исправлена работа multiIf с константными аргументами и ленивой (short-circuit) оценкой. Закрывает #72714. #84546 (Yakov Olkhovskiy).
  • Исправлена ошибка LogicalError при выборке из таблицы с подзапросом в CONSTRAINT. Решает #84190. #85575 (Pervakov Grigorii).
  • Исправлена логическая ошибка при переупорядочивании cross join, когда query_plan_optimize_join_order_limit > 1. Закрывает #89409. #88286 (Vladimir Cherkasov).
  • Исправлены некорректные результаты JOIN при использовании условий OR с уникальными ключами правой таблицы. Решает #89391. #89512 (Vladimir Cherkasov).
  • Исправлена логическая ошибка в full_sorting_merge join с дублирующимися столбцами. Решает #86957. #89495 (Vladimir Cherkasov).
  • Исправлена возможная ошибка Invalid number of rows in Chunk в JOIN с дублирующимися столбцами. Решает #89411. #90053 (Vladimir Cherkasov).
  • Исправлена проблема с дублированием данных в RIGHT JOIN с distributed таблицей при включённых параллельных репликах. #90806 (zoomxi).
  • Исправлена логическая ошибка при использовании join_use_nulls с несколькими объединениями и cross join. #91853 (Vladimir Cherkasov).

Исправления типов данных и JSON

  • Исправлено чтение подстолбцов из столбца, в имени которого есть точка, в ряде случаев. Исправляет #81261, #82058, #88169. #87205 (Pavel Kruglov).
  • Исправлено чтение смешанного массива Floats и Bools из JSON. Ранее вставка таких данных приводила к исключению. #88008 (Pavel Kruglov).
  • Исправлено приведение типа из LowCardinality(Nullable(T)) к Dynamic. #86365 (Pavel Kruglov).
  • Исправлена возможная логическая ошибка при чтении путей и их подстолбцов в расширенном режиме общей сериализации данных JSON. Исправляет #89805. #89819 (Pavel Kruglov).
  • Исправлено возможное переполнение стека при двоичной десериализации типов данных. Исправляет #88710. #89822 (Pavel Kruglov).
  • Исправлено возможное несогласованное состояние общих данных и динамических путей в JSON, которое могло приводить к логическим ошибкам и неожиданным результатам. #90816 (Pavel Kruglov).
  • Исправлено слияние JSON-столбцов в Summing/Aggregating/Coalescing MergeTree. #91151 (Pavel Kruglov).

Исправления MergeTree и хранилища

  • Исправлено несколько проблем, вызванных ранним удалением столбцов в TTL. Исправляет #88002. #88860 (Amos Bird).
  • Исправлен некорректный результат min(PK)/max(PK), когда PK отсортирован в обратном порядке. Это исправляет #83619. #88796 (Amos Bird).
  • Исправлено некорректное распределение по сегментам в оптимизации JOIN, когда первичный ключ отсортирован по убыванию. Исправляет #88512. #88794 (Amos Bird).
  • Исправлено условие гонки при чтении индекса проекций. Исправляет #89497. #89762 (Peng Jian).
  • Исправлена некорректная обработка слияния частей, очищенных с помощью TTL, с непустыми проекциями при использовании deduplicate_merge_projection_mode='ignore'. Исправляет #89430. #89458 (Amos Bird).
  • Исправлена ошибка TOO_MANY_MARKS, которая могла возникать после некоторых запросов ALTER для компактных частей. #91980 (alesapin).

Исправления для Parquet и форматов

  • Исправлена ошибка сегментации в Parquet-ридере, когда input_format_parquet_local_file_min_bytes_for_seek установлено в 0. Закрывает #78456. #88784 (Animesh).
  • В Parquet-райтере строка created_by теперь выводится в корректном формате. #87735 (Michael Kolupaev).
  • Исправлена проблема, из‑за которой запись в формате Parquet не сохраняла исходный порядок при использовании однопоточной записи с нативным райтером. #90126 (Arthur Passos).
  • Исправлена ошибка ORC-ридера при чтении строковых столбцов, закодированных с помощью DICTIONARY_V2 и содержащих только значения NULL. #91889 (Peng Jian).
  • Исправлено переполнение при чтении из формата ORC для типов Date и DateTime64. Закрывает #70976. #91572 (Yarik Briukhovetskyi).

Исправления для Iceberg и озера данных

  • Исправлен протокол icebergS3Cluster. Теперь поддерживается эволюция схемы, позиционные и удаления по равенству в кластерной функции iceberg. Исправляет #88287. #88919 (Yang Jiang).
  • Исправлено исключение JSON в таблице iceberg со столбцом timestamp при использовании каталога Glue. Исправляет #90210. #90209 (Alsu Giliazova).
  • Теперь ClickHouse не будет использовать оптимизацию read-in-order для iceberg, если порядок сортировки не указан в файлах манифеста. Исправляет #89178. #90304 (alesapin).

Исправления функций

  • Исправлена ошибка в функции reverseUTF8. В предыдущих версиях она некорректно обращала порядок байт UTF-8 кодовых точек длиной 4. Закрывает #88913. #88914 (Alexey Milovidov).
  • Исправлено вычисление phi-squared, приводившее к некорректным результатам в cramersV, cramersVBiasCorrected, theilsU и contingency. #87831 (Nihal Z. Miaji).
  • Исправлено поведение top_k, чтобы параметр порога учитывался при вызове с одним аргументом. Закрывает #88757. #88867 (Manuel).
  • Исправлено некорректное усечение аргументов countIf(*). Закрывает #89372. #89373 (Manuel).
  • Исправлена проблема, из‑за которой функции trim, ltrim, rtrim не работали с двумя аргументами. Закрывает #90170. #90305 (Nihal Z. Miaji).
  • Исправлена работа функции arrayFilter при использовании пустого массива совместно с функцией isNull. Закрывает #73849. #91105 (Nihal Z. Miaji).

Исправления, связанные с памятью и сбоями

  • Исправлен возможный сбой во время выполнения удалённого запроса с ARRAY JOIN внутри IN и включённой настройкой enable_lazy_columns_replication. Исправляет #90361. #89997 (Pavel Kruglov).
  • Исправлен сбой при корректном завершении работы сервера из‑за неверного порядка уничтожения объектов. Исправляет #82420. #90076 (Nikita Mikhaylov).
  • Исправлен сбой в случае, если состояние агрегатной функции содержит сериализованное значение столбца типа LowCardinality(String). #89550 (Pavel Kruglov).
  • Исправлен сбой в StorageDistributed при разборе некорректных имён директорий сегментов. #90243 (Aleksandr Musorin).
  • Исправлены ложные ошибки превышения лимита памяти при включённом кэше страниц в пользовательском пространстве. #91361 (Michael Kolupaev).
  • Исправлен возможный сбой в агрегатных функциях после MEMORY_LIMIT_EXCEEDED. #92390 (Azat Khuzhin).
  • Улучшено отслеживание использования памяти при формировании результата хеш-соединений. #89560 (Azat Khuzhin).

Исправления в области безопасности и доступа

  • Исправлена ошибка ACCESS_ENTITY_NOT_FOUND при попытке выполнить clusterAllReplicas от пользователя с несуществующей ролью. Устраняет проблему #87670. #89068 (pufit).
  • Исправлена проверка прав доступа для запросов ALTER UPDATE, когда функция таблицы remote используется с localhost в качестве целевого хоста. #90761 (pufit).
  • Исправена проверка грантов с подстановочными символами (wildcard) при частичном отзыве привилегий. #90922 (pufit).
  • Исправлена обработка глобальных грантов при их отзыве с использованием подстановочных символов (wildcard). #90928 (pufit).

Исправления для Replicated database

  • После восстановления реплика базы данных Replicated могла надолго зависать, постоянно выводя сообщения вроде Failed to marked query-0004647339 as finished. Это исправлено. #88671 (Alexander Tokmakov).
  • Исправлена ошибка use-after-free в Distributed из-за гонки между завершением работы и фоновыми INSERT. Решает #88640. #89136 (Azat Khuzhin).
  • Refreshable materialized view: исправлен редкий сбой сервера, если исходная таблица была полностью удалена во время обновления. #89203 (Michael Kolupaev).

Исправления в Keeper

  • Исправлено чтение журналов изменений при запуске Keeper в случаях, когда какой‑либо журнал не был корректно переименован во время ротации. #89496 (Antonio Andelic).

Прочие важные исправления

  • Исправлено ухудшение производительности при анализе пропускающих индексов. #89004 (Anton Popov).
  • Исправлена несовместимость Hive-партиционирования, мешавшая плавному обновлению на 25.8. #90202 (Kseniia Sumarokova).
  • Исправлен запрос WITH FILL с бесконечными значениями nan/inf. Исправляет #69261. #90255 (Konstantin Bogdanov).
  • Time и Time64 теперь корректно учитывают часовые пояса при преобразовании из DateTime и DateTime64. Закрывает #89896. #90310 (Yarik Briukhovetskyi).
  • Исправлены потенциально некорректные результаты запросов SELECT после легковесных обновлений при включённом кэше условий запроса. Исправляет #90176. #90204 (Anton Popov).
  • Исправлена совместимость сериализации состояния агрегации типа String в памяти. #90880 (Antonio Andelic).
  • Исправлена агрегация SummingMergeTree для столбцов Nested с типом LowCardinality. #90927 (Ivan Babrou).
  • Исправлена проблема, из-за которой system.view_refreshes завершался с ошибкой No macro 'replica' in config. #92203 (Michael Kolupaev).
  • Исправлена репликация ALTER-запроса, который косвенно добавляет столбец в MV с Shared Catalog. (Nikolay Degterinsky).
  • Исправлена проблема, из-за которой неудачный коммит MV приводил к зависанию применения состояния Shared Catalog. (Nikolay Degterinsky).
  • Исправлена проверка ограничений настроек в командах ALTER на вторичных репликах с Shared Catalog. (Nikolay Degterinsky).
  • Комментарий базы данных теперь сохраняется при миграции SharedCatalog. (Alexander Tokmakov).
  • Исправлена проблема, из-за которой materialized view заменялись на вторичных репликах в Shared Catalog. (Nikolay Degterinsky).
  • Исправлены счетчики system.distributed_cache_usage. (Kseniia Sumarokova).
  • Исправлено зависание операции DROP таблицы, создание которой завершилось с исключением ILLEGAL_COLUMN в Shared Catalog. (Nikolay Degterinsky).
  • Отключена поддержка использования CREATE OR REPLACE для SharedSet/SharedJoin в реплицируемых базах данных. (Tuan Pham Anh).
  • Исправлены исключения UNFINISHED, возникавшие при обновлении RMV в базе данных Shared. (Nikolay Degterinsky).
  • Исправлен сбой при ошибке TABLE_ALREADY_EXISTS в общих базах данных. (Nikolay Degterinsky).
  • Исправлена миграция таблиц с некорректными запросами создания в Shared Catalog. (Nikolay Degterinsky).
  • Всегда использовать виртуальные части из памяти в функции getStatus. (Mikhail Artemenko).
  • Добавлены повторные попытки при запуске приложения состояния Shared catalog. (Nikolay Degterinsky).
  • Исправлена проблема, из-за которой команда DROP DATABASE зависала после возникновения исключения во время создания таблицы. (Nikolay Degterinsky).
  • Исправлена логическая ошибка в распределённом кэше. (Kseniia Sumarokova).
  • Исправлено некорректное сообщение об ошибке в распределённом кэше. (Kseniia Sumarokova).
  • Исправлен LOGICAL_ERROR в ~TemporaryLockForUUIDDirectory в Shared Catalog. (Nikolay Degterinsky).
  • Исправлена ошибка, из-за которой кэш метаданных возвращал некорректные зависимости после переименования базы данных. (Nikolay Degterinsky).
  • Shared Catalog: Исправлена проблема с удалением больших таблиц командой DROP на вторичных репликах. (Raúl Marín).
  • Распределённый кеш: исправлена логическая ошибка в processWriteRequest. (Kseniia Sumarokova).
  • Удалены проверки операций ALTER над MV на вторичных репликах. (Nikolay Degterinsky).