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

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

Изменения в JSON и форматах данных

  • По умолчанию отключено заключение 64-битных целых чисел в кавычки в JSON formats. #74079 (Pavel Kruglov).
  • Для массивов значений разных типов в JSON теперь определяется Array(Dynamic) вместо безымянного Tuple. Чтобы использовать прежнее поведение, отключите настройку input_format_json_infer_array_of_dynamic_from_array_of_different_types. #80859 (Pavel Kruglov).
  • По умолчанию значения типа Enum записываются как BYTE_ARRAY с логическим типом ENUM в output format Parquet. #84169 (Pavel Kruglov).

Хранение и партиционирование

  • Добавлена поддержка записи в стиле Hive partitioning, а реализация чтения переработана (столбцы партиций Hive больше не являются виртуальными). #76802 (Arthur Passos).
  • По умолчанию включена настройка MergeTree write_marks_for_substreams_in_compact_parts. Это значительно повышает производительность чтения подстолбцов из вновь созданных компактных частей. Серверы версии ниже 25.5 не смогут читать новые компактные части. #84171 (Pavel Kruglov).
  • Запрещены RENAME COLUMN и DROP COLUMN, затрагивающие явно перечисленные столбцы для суммирования в SummingMergeTree. Закрывает #81836. #82821 (Alexey Milovidov).

Улучшения функций

  • В функцию extractKeyValuePairs добавлен новый argument unexpected_quoting_character_strategy, который определяет, что происходит, если quoting_character обнаружен там, где его не ожидали. Подробнее см. в документации по extractKeyValuePairs. #80657 (Arthur Passos).
  • Ранее функция countMatches прекращала подсчёт на первом пустом совпадении, даже если шаблон регулярного выражения это допускал. Чтобы устранить эту проблему, countMatches теперь продолжает работу, сдвигаясь на один символ вперёд при возникновении пустого совпадения. Пользователи, которые хотят сохранить прежнее поведение, могут включить настройку count_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).

Улучшения типов данных

  • Повышена точность преобразования из Decimal в Float32. Реализовано преобразование из Decimal в BFloat16. Исправляет #82660. #82823 (Alexey Milovidov).

Производительность и управление ресурсами

  • Ранее запросы BACKUP, слияния и мутации не использовали общесерверные ограничители пропускной способности для локального (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) трафика, а ограничивались только специальными настройками сервера (max_backup_bandwidth_for_server, max_mutations_bandwidth_for_server и max_merges_bandwidth_for_server). Теперь они одновременно используют оба типа ограничителей. #81753 (Sergei Trifonov).
  • Добавлена новая настройка cluster_function_process_archive_on_multiple_nodes, которая повышает производительность обработки архивов в кластерных функциях, если установлена в true (по умолчанию). Для совместимости и во избежание ошибок при обновлении до 25.7+ её следует установить в false, если вы используете кластерные функции с архивами в более ранних версиях. #82355 (Kseniia Sumarokova).
  • Ранее значением по умолчанию для concurrent_threads_scheduler было round_robin, которое показало себя несправедливым при большом количестве однопоточных запросов (например, INSERT). Теперь значением по умолчанию стал более безопасный альтернативный планировщик fair_round_robin. #84747 (Sergei Trifonov).
  • Ленивая материализация включена только при использовании analyzer, чтобы не поддерживать её без analyzer, где возможны некоторые проблемы (например, при использовании indexHint() в условиях). #83791 (Igor Nikonov).

Схема и синтаксис SQL

  • Запретить создание таблицы без столбцов, в которые можно вставлять данные. #81835 (Pervakov Grigorii).
  • Требовать заключать в обратные кавычки идентификаторы с точками в выражениях по умолчанию, чтобы они не разбирались как составные идентификаторы. #83162 (Pervakov Grigorii).
  • Добавлена поддержка синтаксиса Heredoc в стиле PostgreSQL: $tag$ string contents... $tag$, также известного как строковые литералы, заключённые в знаки доллара. В предыдущих версиях для тегов было меньше ограничений: они могли содержать произвольные символы, включая знаки пунктуации и пробельные символы. Это создаёт неоднозначность при разборе идентификаторов, которые тоже могут начинаться со знака доллара. В то же время PostgreSQL допускает в тегах только буквенно-цифровые символы и подчёркивание. Чтобы решить эту проблему, теперь теги Heredoc могут содержать только такие символы. Закрывает #84731. #84846 (Alexey Milovidov).

Безопасность и права доступа

  • SYSTEM RESTART REPLICAS перезапускает реплики только в тех базах данных, где у вас есть разрешение на SHOW TABLES. Ранее этот запрос приводил к пробуждению таблиц в базе данных Lazy даже без доступа к ней, в то время как эти таблицы одновременно удалялись. #83321 (Alexey Milovidov).
  • Функции azureBlobStorage, deltaLakeAzure и icebergAzure были обновлены и теперь корректно проверяют разрешения AZURE. Все функции кластерного варианта (функции -Cluster) теперь проверяют разрешения так же, как и соответствующие некластерные аналоги. Чтобы избежать ошибок прав доступа, убедитесь, что пользователи, вызывающие функции -Cluster, имеют необходимые привилегии (например, GRANT S3 ON *.* TO user). Кроме того, функции icebergLocal и deltaLakeLocal теперь также проверяют разрешение FILE. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov

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

Типы данных

  • Добавлены новые типы данных: Time ([H]HH:MM:SS) и Time64 ([H]HH:MM:SS[.fractional]), а также некоторые базовые функции преобразования типов и функции для работы с другими типами данных. Добавлены настройки для совместимости с устаревшей функцией ToTime. #81217 (Yarik Briukhovetskyi).

Функции

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

Iceberg и DeltaLake

  • Поддержка сложных типов при эволюции схемы Iceberg. #73714 (scanhex12).
  • Добавлена запись в Iceberg для запросов insert. #82692 (scanhex12).
  • Поддержка позиционных удалений для движка таблицы Iceberg. #83094 (Daniil Ivanik).
  • Чтение файлов данных Iceberg по идентификаторам полей. Закрывает #83065. #83653 (scanhex12).
  • Добавлена запись в Iceberg для CREATE. Закрывает #83927. #83983 (scanhex12).
  • Добавлена запись для каталогов Glue. #84136 (scanhex12).
  • Добавлена запись для REST-каталогов Iceberg. #84684 (scanhex12).
  • Объединение всех файлов позиционного удаления Iceberg с файлами данных. Это уменьшит количество и размер файлов Parquet в хранилище Iceberg. Синтаксис: OPTIMIZE TABLE table_name. #85250 (scanhex12).
  • Поддержка DROP TABLE для Iceberg (удаление из REST/Glue-каталогов и удаление метаданных таблицы). #85395 (scanhex12).
  • Поддержка мутаций ALTER DELETE для Iceberg в формате merge-on-read. #85549 (scanhex12).
  • Поддержка записи в DeltaLake. Закрывает #79603. #85564 (Kseniia Sumarokova).
  • Запись более подробной статистики Iceberg (размеры столбцов, нижние и верхние границы) в метаданные (элементы manifest) для min-max pruning. #85746 (scanhex12).
  • Поддержка добавления/удаления/изменения столбцов в Iceberg для простых типов. #85769 (scanhex12).

MergeTree и хранилище

  • Теперь все таблицы поддерживают виртуальный столбец _table, а не только таблицы типа Merge. #63665 (Xiaozhe Yu).
  • Добавлен SZ3 — кодек сжатия с потерями, но с ограниченной погрешностью, для столбцов типа Float32 и Float64. #67161 (scanhex12).
  • Добавлена поддержка легковесных обновлений для таблиц семейства MergeTree. Легковесные обновления можно использовать с помощью нового синтаксиса: UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. Также добавлена реализация легковесных удалений через легковесные обновления; её можно включить, задав lightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov).
  • Добавлена поддержка виртуального столбца _part_granule_offset в таблицах семейства MergeTree. Этот столбец указывает начинающийся с нуля индекс гранулы/метки, к которой относится каждая строка в пределах своей части данных. Это исправляет #79572. #82341 (Amos Bird).

Поддержка протоколов и клиентов

  • Добавлена поддержка протокола ArrowFlight RPC путем добавления движка таблицы arrowflight. #74184 (zakr600).
  • Добавлена поддержка команды COPY протокола PostgreSQL. #74344 (scanhex12).
  • Добавлена поддержка C#-клиента для протокола MySQL. Это закрывает #83992. #84397 (scanhex12).
  • Для mysql_port и postgresql_port принудительно включено защищенное соединение. #82962 (Shaohua Wang).

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

  • Теперь поддерживается DESCRIBE SELECT в дополнение к DESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi).
  • Теперь поддерживается запись USE DATABASE {name}. #81307 (Yarik Briukhovetskyi).
  • Для параллельных реплик реализовано чтение из проекций. Добавлена новая настройка parallel_replicas_support_projection, которая управляет тем, включена ли поддержка проекций. Для упрощения реализации поддержка проекций включается только при активном parallel_replicas_local_plan. #82807 (zoomxi).

Форматы

  • Добавлена настройка format_schema_source, которая определяет источник для format_schema. #80874 (Tuan Pham Anh).
  • Добавлен новый формат вывода Hash. Он вычисляет единое хеш-значение для всех столбцов и строк результата. Это полезно для вычисления «отпечатка» результата, например в сценариях, где передача данных является узким местом. Пример: SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash возвращает e5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze).

Конфигурация сервера и управление рабочей нагрузкой

  • Настройка сервера cpu_slot_preemption включает вытесняющее планирование CPU для рабочих нагрузок и обеспечивает max-min-справедливое распределение процессорного времени между рабочими нагрузками. Добавлены новые настройки рабочей нагрузки для ограничения CPU: max_cpus, max_cpu_share и max_burst_cpu_seconds. #80879 (Sergei Trifonov).
  • Теперь поддерживается настройка рабочей нагрузки max_waiting_queries. Ее можно использовать для ограничения размера очереди запросов. Если лимит достигнут, все последующие запросы будут завершаться с ошибкой SERVER_OVERLOADED. #81250 (Oleg Doronin).
  • TCP-соединение теперь можно разрывать после заданного количества запросов или по достижении порога времени. Исправляет #68000. #81472 (Kenny Sun).

Облачное хранилище

  • В AzureBlobStorage добавлены extra_credentials для аутентификации с помощью client_id и tenant_id. #84235 (Pablo Marcos).

Keeper

  • Добавлена возможность устанавливать произвольные наблюдения в мультизапросах Keeper. #84964 (Mikhail Artemenko).
  • Добавлена поддержка частично агрегированных метрик. #85328 (Mikhail Artemenko).

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

Движки таблиц и табличные функции

  • Добавлены движок таблицы Ytsaurus и табличная функция Ytsaurus. #77606 (MikhailBurdukov).

Улучшения текстовых индексов

  • Добавлены функции searchAny и searchAll — универсальные средства для поиска по текстовым индексам. #80641 (Elmi Ahmadov).
  • Текстовый индекс теперь поддерживает токенизатор string. #81752 (Elmi Ahmadov).
  • Значение гранулярности индекса по умолчанию для text-индексов изменено на 64. Это повышает ожидаемую производительность типичного тестового запроса во внутренних бенчмарках. #82162 (Jimmy Aguilar Mena).
  • 256-битный битмап хранит исходящие метки состояния в упорядоченном виде, но сами исходящие состояния сохраняются на диск в том порядке, в котором они появляются в хеш-таблице. Поэтому при чтении с диска метка могла указывать на неверное следующее состояние. #82783 (Elmi Ahmadov).
  • В настоящее время дерево FST сохраняется на диск без сжатия. Это может приводить к снижению производительности или повышенному потреблению пропускной способности I/O как при записи на диск, так и при чтении с диска. #83093 (Elmi Ahmadov).

Обновления статуса зрелости возможностей

  • Каталог переведён в бета-статус. #85848 (Melvyn Peignon).
  • Легковесные обновления переведены из экспериментального статуса в бета-статус. #85952 (Anton Popov).

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

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

  • Простая оптимизация для комбинатора агрегатной функции -If. #78454 (李扬).
  • Добавлена новая логика (управляется настройкой enable_producing_buckets_out_of_order_in_aggregation, включенной по умолчанию), которая позволяет отправлять некоторые бакеты не по порядку при агрегации с эффективным использованием памяти. Если слияние одних бакетов агрегации занимает значительно больше времени, чем других, это повышает производительность, позволяя инициатору тем временем сливать бакеты с более высокими идентификаторами. Недостатком может быть более высокое использование памяти (но оно не должно быть значительным). #80179 (Nikita Taranov).
  • Конвейер после шага TOTALS сделан многопоточным. #80331 (UnamedRus).
  • Когда агрегационный запрос содержит только одну функцию COUNT() для столбца NOT NULL, логика агрегации полностью встраивается в процесс проверки хеш-таблицы. Это позволяет избежать выделения и поддержки какого-либо состояния агрегации, значительно снижая использование памяти и нагрузку на CPU. Это частично решает #81982. #82104 (Amos Bird).
  • Реализовано столбцовое вычисление сериализованного ключа при GROUP BY по нескольким строковым или числовым столбцам. #83884 (李扬).
  • Реализован addManyDefaults для комбинаторов -If. #83870 (Raúl Marín).

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

  • Добавлена новая настройка min_joined_block_size_rows (по аналогии с min_joined_block_size_bytes; значение по умолчанию — 65409), которая задаёт минимальный размер блока (в строках) для входных и выходных блоков JOIN (если это поддерживается алгоритмом JOIN). Небольшие блоки будут укрупняться. #81886 (Nikita Taranov).
  • Оптимизирована производительность HashJoin: в типичном случае с одним столбцом ключа убран дополнительный цикл по хеш-таблицам, а также исключены проверки null_map и join_mask, когда они всегда имеют значения true/false. #82308 (Nikita Taranov).
  • Оптимизации для null_map и JoinMask из #82308 применены к случаю JOIN с несколькими дизъюнктами. Также оптимизирована структура данных KnownRowsHolder. #83041 (Nikita Taranov).
  • Для флагов JOIN теперь используется обычный std::vector<std::atomic_bool>, что позволяет избежать вычисления hash при каждом обращении к флагам. #83043 (Nikita Taranov).
  • Обработка max_joined_block_rows вынесена за пределы основного цикла hash JOIN. Это немного повышает производительность для ALL JOIN. #83216 (Nikolai Kochetov).
  • Когда HashJoin использует режим вывода lazy, память для результирующих столбцов больше не выделяется заранее. Это неоптимально, особенно при небольшом числе совпадений. Кроме того, после завершения JOIN точное число совпадений уже известно, поэтому предварительное выделение памяти можно выполнить точнее. #83304 (Nikita Taranov).
  • Все LEFT/INNER JOIN будут автоматически преобразовываться в RightAny, если правая сторона функционально определяется столбцами ключа JOIN (то есть все строки имеют уникальные значения ключа JOIN). #84010 (Nikita Taranov).
  • Повышена производительность применения патч-частей в режиме Join. #85040 (Anton Popov).

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

  • Добавлена возможность перенести (де)сжатие и (де)сериализацию блоков в потоки конвейера вместо одного потока, связанного с сетевым соединением. Управляется настройкой enable_parallel_blocks_marshalling. Это должно ускорить распределенные запросы, передающие значительные объемы данных между инициатором и удаленными узлами. #78694 (Nikita Taranov).
  • Параллельный распределенный INSERT SELECT включен по умолчанию в режиме, где INSERT SELECT выполняется на каждом сегменте независимо; см. настройку parallel_distributed_insert_select. #80425 (Igor Nikonov).
  • Добавлено сжатие журналов и событий профилирования в собственном протоколе. В кластерах со 100+ репликами несжатые события профилирования занимают 1..10 МБ/с, а индикатор прогресса работает медленно при медленном интернет-соединении. Это закрывает #82533. #82535 (Alexey Milovidov).
  • Параллельный распределенный INSERT SELECT включен по умолчанию в режиме, где INSERT SELECT выполняется на каждом сегменте независимо; см. настройку parallel_distributed_insert_select. #83040 (Igor Nikonov).
  • Исправлен расчет минимального размера задачи для параллельных реплик. #84752 (Nikita Taranov).

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

  • Запросы векторного поиска, использующие индекс векторного сходства, теперь выполняются с меньшей задержкой за счет сокращения чтений из хранилища и снижения нагрузки на CPU. #79103 (Shankar Iyer).
  • В filterPartsByQueryConditionCache теперь учитывается merge_tree_min_{rows,bytes}_for_seek, чтобы привести этот метод в соответствие с другими методами фильтрации по индексам. #80312 (李扬).
  • Min-max индексы с более высокой гранулярностью теперь обрабатываются первыми. Закрывает #75381. #83798 (Maruth Goyal).
  • Индекс bloom filter теперь используется для условий вида has([c1, c2, ...], column), где column не имеет тип Array. Это повышает производительность таких запросов, делая их такими же эффективными, как оператор IN. #83945 (Doron David).
  • Индексы теперь обрабатываются в порядке возрастания размера файла. В итоге приоритет отдается minmax-индексам и векторным индексам (из-за их простоты и селективности соответственно), а затем — небольшим индексам. Внутри групп minmax и векторных индексов также предпочтение отдается индексам меньшего размера. #84094 (Maruth Goyal).
  • Ранее данные текстового индекса разделялись на несколько сегментов (по умолчанию размер каждого сегмента составлял 256 MiB). Это могло снизить потребление памяти при построении текстового индекса, однако увеличивало требования к дисковому пространству и время ответа запроса. #84590 (Elmi Ahmadov).

Оптимизации подзапросов

  • Оптимизирован план, сгенерированный для коррелированных подзапросов, за счёт удаления избыточных операций JOIN с использованием классов эквивалентности. Если для всех коррелированных столбцов существуют эквивалентные выражения, CROSS JOIN не создаётся при включённой настройке query_plan_correlated_subqueries_use_substitution. #82435 (Dmitry Novik).
  • В коррелированном подзапросе читаются только необходимые столбцы, если он используется как аргумент функции EXISTS. #82443 (Dmitry Novik).

Улучшения Azure Blob Storage

  • Движок таблицы azureBlobStorage теперь кэширует и повторно использует токены аутентификации управляемой идентификации, когда это возможно, чтобы избежать троттлинга. #79860 (Nick Blakely).
  • Для Azure Blob Storage HTTP-клиент curl заменен на HTTP-клиент poco. Добавлено несколько настроек для этих клиентов, аналогичных настройкам S3. Для Azure и S3 введены уменьшенные тайм-ауты подключения. Улучшены средства интроспекции для событий профиля Azure и метрик. Новый клиент включен по умолчанию и обеспечивает значительно меньшие задержки для холодных запросов к Azure Blob Storage. Старый клиент Curl можно вернуть, установив azure_sdk_use_native_client=false. #83294 (alesapin).

Улучшения движка хранения

  • Исправлена фильтрация по ключу для хранилищ Redis и KeeperMap. #81833 (Pervakov Grigorii).
  • ATTACH PARTITION больше не приводит к сбросу всех кэшей. #82377 (Alexey Milovidov).
  • При создании данных снимка хранилища больше не удерживается блокировка, что снижает конкуренцию за неё при высокой параллельной нагрузке. #83510 (Duc Canh Le).
  • Удаление временных частей может занимать некоторое время (особенно при использовании S3), и сейчас это происходит при удержании глобальной блокировки в MergeTreeBackgroundExecutor. Когда из-за потери соединения требуется перезапустить все таблицы и мы ждём завершения фоновых задач, таблицы могут застревать в режиме только для чтения даже на час. Однако, похоже, для вызова cancel эта блокировка не нужна. #84311 (Alexander Tokmakov).

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

  • Новая реализация ридера Parquet. В целом она работает быстрее и поддерживает pushdown фильтров на уровне страниц и PREWHERE. Пока экспериментальная. Для включения используйте настройку input_format_parquet_use_native_reader_v3. #82789 (Michael Kolupaev).
  • Повышена производительность входного формата ProtobufSingle за счёт повторного использования сериализатора при отсутствии ошибок разбора. #83613 (Eduard Karacharov).

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

  • Значительно повышена производительность чтения подстолбцов JSON из общих данных в MergeTree благодаря внедрению новых сериализаций для общих данных JSON в MergeTree. #83777 (Pavel Kruglov).
  • Оптимизирована десериализация строк за счёт упрощения кода. Закрывает #38564. #84561 (Alexey Milovidov).

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

  • Минимизировать копирование данных в заголовках портов при построении конвейера. Первоначальный PR от heymind. #83381 (Raúl Marín).
  • Улучшить производительность построения конвейера. #83631 (Raúl Marín).
  • Оптимизировать MergeTreeReadersChain::getSampleBlock. #83875 (Raúl Marín).
  • Оптимизировать материализацию констант в случаях, когда она выполняется только для возврата одной строки. #85071 (Alexey Milovidov).

Оптимизация памяти и ресурсов

  • Скорректированы некоторые настройки jemalloc для повышения производительности. #81807 (Antonio Andelic).
  • В Counter для ProfileEvents добавлено выравнивание, чтобы уменьшить ложный общий доступ. #82697 (Jiebin Sun).
  • Уменьшено количество лишних вызовов memcpy в CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).

Планирование и анализ запросов

Улучшения в логировании

  • Добавлено асинхронное логирование. #82516 (Raúl Marín).

Оптимизации функций

  • Оптимизирована функция largestTriangleThreeBuckets за счёт удаления временных данных. #84479 (Alexey Milovidov).
  • Оптимизирована и упрощена реализация многих функций для работы со строками. Исправлена некорректная документация по нескольким функциям. Примечание: результат byteSize для столбцов String и сложных типов, содержащих столбцы String, изменился с 9 байт на пустую строку до 8 байт на пустую строку, что является ожидаемым поведением. #85063 (Alexey Milovidov).

Улучшения Keeper

  • Улучшена работа Keeper при начальной загрузке RocksDB. #83390 (Antonio Andelic).

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

  • Улучшена параллельная обработка файлов на базе backend-а delta-kernel-rs. #85642 (Azat Khuzhin).

Улучшения

Управление доступом и безопасность

  • Введены два новых типа доступа для источников: 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).
  • Разрешено использовать параметры в запросах CREATE USER для имен пользователей. #81387 (Diskein).
  • Чувствительные данные исключены из core dump. Добавлены два аллокатора: совместимый с библиотекой AWS AwsNodumpMemoryManager и совместимый со STL JemallocNodumpSTLAllocator. Оба представляют собой обертки над аллокатором Jemalloc. Они используют extent hooks Jemalloc и madvise, чтобы помечать страницы памяти как «не выгружать в дамп». Используется для учетных данных S3, учетных данных пользователей и некоторых данных запросов. #82441 (Miсhael Stetsyuk).
  • Представления, созданные эфемерными пользователями, теперь будут хранить копию фактического пользователя и больше не будут становиться недействительными после удаления эфемерного пользователя. #84763 (pufit).
  • Сопоставление forward_headers при внешней аутентификации теперь выполняется регистронезависимым образом. #84737 (ingodwerust).
  • В system.grants добавлен столбец parameter, чтобы определять тип источника для GRANT READ/WRITE и движок таблицы для GRANT TABLE ENGINE. #85643 (MikhailBurdukov).

Резервное копирование и восстановление

  • Добавлена поддержка резервного копирования баз данных PostgreSQL, MySQL и DataLake. Резервная копия такой базы данных сохраняет только её определение, но не содержащиеся в ней данные. #79982 (Nikolay Degterinsky).
  • Все сообщения лога, связанные с записью файлов резервных копий, переведены на уровень TRACE. #82907 (Hans Krutzer).
  • Добавлены backup_restore_s3_retry_initial_backoff_ms, backup_restore_s3_retry_max_backoff_ms, backup_restore_s3_retry_jitter_factor для настройки стратегии задержки повторных попыток S3, используемой при операциях резервного копирования и восстановления. #84421 (Julia Kartseva).
  • Добавлена новая настройка backup_slow_all_threads_after_retryable_s3_error, чтобы снизить нагрузку на S3 во время всплесков повторных попыток, вызванных ошибками вроде SlowDown: при обнаружении одной ошибки, допускающей повторную попытку, замедляются все потоки. #84854 (Julia Kartseva).

Целостность данных и валидация

  • Проверять согласованность файла checksum.txt у части непосредственно перед коммитом. #76625 (Sema Checherinda).
  • Запрещён запуск alter-мутации RENAME COLUMN, если она переименовывает столбец, который в данный момент затронут незавершённой мутацией данных. #81823 (Mikhail Artemenko).
  • Теперь снимок мутаций будет строиться на основе снимка видимых частей. Счётчики мутаций, используемые в снимке, также будут пересчитываться по включённым мутациям. #82945 (Mikhail Artemenko).
  • Добавлена возможность разбирать префикс и суффикс части, а также проверять покрытие для неконстантных столбцов. #83377 (Mikhail Artemenko).

Движок таблицы Iceberg

  • Добавлена поддержка position deletes для движка таблицы Iceberg. #80237 (YanghongZhong).
  • Теперь ClickHouse поддерживает сжатые файлы metadata.json для Iceberg. Исправлено в #70874. #81451 (alesapin).
  • Исправлено чтение Iceberg по идентификаторам полей для сложных типов. #84821 (scanhex12).
  • Добавлена поддержка записи в Iceberg с возможностью чтения из pyiceberg. #84466 (scanhex12).
  • Добавлена версия снимка в движки таблиц для озер данных. #84659 (Pete Hampton).
  • Добавлена поддержка записи файла version-hint для Iceberg. Это закрывает #85097. #85130 (scanhex12).
  • Добавлена поддержка сжатого файла .metadata.json через настройку iceberg_metadata_compression_method. Поддерживаются все методы сжатия ClickHouse. Это закрывает #84895. #85196 (scanhex12).
  • Оптимизировано использование памяти для файлов позиционного удаления Iceberg. Вместо загрузки всех данных таких файлов в память теперь в оперативной памяти хранится только текущая группа строк из файлов удаления Parquet. Это значительно снижает потребление памяти при работе с большими файлами позиционного удаления. #85329 (scanhex12).
  • Добавлена возможность асинхронно итерировать объекты из таблицы Iceberg без явного хранения объектов для каждого файла данных. #85369 (Daniil Ivanik).
  • Добавлена поддержка equality deletes в Iceberg. #85843 (Han Fei).

Движок таблицы DeltaLake

  • Улучшен движок таблицы DeltaLake: в delta-kernel-rs есть API ExpressionVisitor, реализованное в этом PR и используемое для преобразования выражений столбцов партиции (оно заменит старый устаревший подход из delta-kernel-rs, который ранее использовался в нашем коде). В будущем ExpressionVisitor также позволит реализовать pruning на основе статистики и некоторые проприетарные возможности Delta Lake. Кроме того, цель этого изменения — добавить поддержку partition pruning в движок таблицы DeltaLakeCluster (результат разбора выражения — ActionsDAG — будет сериализован и отправлен с узла-инициатора вместе с путём к данным, поскольку такого рода информация, необходимая для pruning, доступна только в виде метаинформации при перечислении data files, которое выполняется только на узле-инициаторе, но при этом должна применяться к данным на каждом server, выполняющем чтение). #81136 (Kseniia Sumarokova).
  • Исправлен partition pruning в cluster table function для озер данных. #82131 (Kseniia Sumarokova).
  • Исправлено чтение партиционированных данных в табличной функции DeltaLakeCluster. В этом PR увеличена версия protocol для cluster functions, что позволяет передавать дополнительную информацию от узла-инициатора репликам. Эта дополнительная информация содержит выражение преобразования delta-kernel, необходимое для разбора столбцов партиции (а в будущем и некоторых других сущностей, например generated columns, и т. д.). #82132 (Kseniia Sumarokova).
  • Теперь database Datalake генерирует более понятное Исключение. Исправлено в #81211. #82304 (alesapin).
  • Реализована внутренняя фильтрация в delta-kernel-rs (по статистике и partition pruning) в хранилище DeltaLake. #84006 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_enable_expression_visitor_logging, позволяющая отключить логи expression visitor, так как они могут быть слишком подробными даже для test log level при debugging. #84315 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_snapshot_version, позволяющая читать конкретную версию снимка в движке таблицы DeltaLake. #85295 (Kseniia Sumarokova).

Интеграция с озерами данных

  • Ускорен вывод списка таблиц в каталогах данных за счет асинхронных запросов. #81084 (alesapin).
  • Добавлена поддержка TimestampTZ в Glue catalog. Это закрывает #81654. #83132 (scanhex12).
  • FormatParserGroup разделен на две независимые структуры: первая отвечает за общие вычислительные ресурсы и ресурсы IO, вторая — за общие ресурсы фильтрации (ActionDag фильтра, KeyCondition). Это сделано для более гибкого совместного использования этих структур разными потоками. #83997 (Daniil Ivanik).
  • В конфигурацию Azure добавлен отсутствующий параметр partition_columns_in_data_file. #85373 (Arthur Passos).
  • Добавлен флаг show_data_lake_catalogs_in_system_tables для управления добавлением таблиц озер данных в system.tables, что решает #85384. #85411 (Smita Kulkarni).

S3 и Объектное хранилище

  • Реализованы методы moveFile и replaceFile в s3_plain_rewritable, что позволяет использовать его как диск базы данных. #79424 (Tuan Pham Anh).
  • Запросы чтения и записи S3 теперь ограничиваются по скорости на уровне HTTP-сокета (а не на уровне всего S3-запроса), чтобы избежать проблем с throttling для max_remote_read_network_bandwidth_for_server и max_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov).
  • В этот PR в механизм retry для S3 добавлен джиттер, когда включена конфигурация s3_slow_all_threads_after_network_error. #81849 (zoomxi).
  • Реализована аутентификация AWS S3 с явно заданной ролью IAM. Реализован OAuth для GCS. Ранее эти возможности были доступны только в ClickHouse Cloud, а теперь опубликованы в open source. Также синхронизированы некоторые interfaces, например сериализация параметров connection для объектных хранилищ. #84011 (Alexey Milovidov).
  • Разрешено использовать любую storage policy (то есть Объектное хранилище, например S3) для внешней агрегации и сортировки. #84734 (Azat Khuzhin).
  • Все удаляемые объекты теперь собираются для выполнения одной операции удаления в Объектном хранилище. #85316 (Mikhail Artemenko).

Движок таблицы S3Queue

  • Макросы, такие как {uuid}, теперь можно использовать в настройке keeper_path движка таблицы S3Queue. #82463 (Nikolay Degterinsky).
  • Добавлена новая настройка сервера s3queue_disable_streaming, которая отключает стриминг в таблицах с движком таблицы S3Queue. Эту настройку можно изменять без перезапуска сервера. #82515 (Kseniia Sumarokova).
  • В system.s3queue_log добавлены столбцы commit_time и commit_id. #83016 (Kseniia Sumarokova).
  • Добавлены записи в журнал для процесса завершения работы S3Queue. #83163 (Kseniia Sumarokova).
  • Стриминг S3(Azure/etc)Queue теперь останавливается до остановки любых таблиц при завершении работы сервера. #83530 (Kseniia Sumarokova).
  • Добавлена поддержка изменения настроек вставки для mv на уровне таблицы S3Queue. Добавлены новые настройки уровня S3Queue: min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. По умолчанию используются настройки уровня профиля, а настройки уровня S3Queue их переопределяют. #83971 (Kseniia Sumarokova).
  • Исправлен упорядоченный режим S3Queue: завершение происходит раньше, если был вызван shutdown. #84463 (Kseniia Sumarokova).

Интеграция Kafka

Улучшения ClickHouse Keeper

  • Улучшение Keeper: перемещение файлов changelog между дисками в фоновом потоке. Раньше перенос changelog на другой диск глобально блокировал Keeper до завершения операции. Это приводило к снижению производительности, если перенос занимал много времени (например, на S3-диск). #82485 (Antonio Andelic).
  • Улучшение Keeper: добавлена новая конфигурация keeper_server.cleanup_old_and_ignore_new_acl. Если она включена, ACL всех узлов будут очищены, а ACL для новых запросов будут игнорироваться. Если цель — полностью удалить ACL с узлов, важно оставить эту конфигурацию включенной до создания нового снимка. #82496 (Antonio Andelic).
  • Улучшение Keeper: добавлена поддержка отдельных разрешений для ACL world:anyone. #82755 (Antonio Andelic).
  • Добавлена поддержка указания дополнительных ACL Keeper для путей в конфигурации. Если вы хотите добавить дополнительный ACL для конкретного пути, задайте его в конфигурации в разделе zookeeper.path_acls. #82898 (Antonio Andelic).
  • Добавлен ProfileEvent, который срабатывает, когда Keeper отклоняет запись из-за soft memory limit. #82963 (Xander Garbett).
  • В Keeper по умолчанию включены feature flags create_if_not_exists, check_not_exists, remove_recursive, которые добавляют новые типы запросов. #83488 (Antonio Andelic).
  • Добавлена поддержка применения дополнительного ACL к определенным узлам Keeper с помощью конфигурации apply_to_children. #84137 (Antonio Andelic).
  • В KeeperClient добавлена команда get_acl. #84641 (Antonio Andelic).
  • В Keeper добавлен 4LW lgrq для переключения журналирования входящих запросов. #84719 (Antonio Andelic).
  • Уменьшена конкуренция за блокировку хранилища в Keeper. #84732 (Antonio Andelic).
  • Инструмент encrypt_decrypt теперь поддерживает зашифрованные соединения с ZooKeeper. #84764 (Roman Vasin).
  • Размер кэша записей журнала Keeper теперь ограничивается количеством записей с помощью keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold и keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic).

Типы JSON и Dynamic

  • В часть Wide добавлен файл columns_substreams.txt для отслеживания всех подпотоков, хранящихся в этой части. Это позволяет отслеживать динамические потоки в типах JSON и Dynamic и тем самым избежать чтения выборки из этих столбцов для получения списка динамических потоков (например, при вычислении размеров столбцов). Кроме того, теперь все динамические потоки отображаются в system.parts_columns. #81091 (Pavel Kruglov).
  • Для столбцов JSON и Dynamic теперь разрешён ALTER UPDATE. #82419 (Pavel Kruglov).
  • Теперь внутри типа JSON можно использовать типы Time и Time64. #83784 (Yarik Briukhovetskyi).
  • Добавлена настройка json_type_escape_dots_in_keys, экранирующая точки в ключах JSON при разборе JSON. По умолчанию настройка отключена. #84207 (Pavel Kruglov).

Форматы Parquet и ORC

  • Добавлены настройки для задания размера блока сжатия ORC, а значение по умолчанию изменено с 64KB на 256KB для согласованности со Spark и Hive. #80602 (李扬).
  • Добавлена поддержка записи enum в Parquet как массива байтов, как того требует спецификация. Позже будет добавлено больше информации. #81090 (Arthur Passos).
  • Добавлена поддержка записи в GeoParquet как в выходной формат. #81784 (scanhex12).

Распределенные запросы и параллельные реплики

  • Добавлена новая настройка enable_add_distinct_to_in_subqueries. Когда она включена, ClickHouse автоматически добавляет DISTINCT в подзапросы в секциях IN для распределенных запросов. Это может существенно уменьшить размер временных таблиц, передаваемых между сегментами, и повысить эффективность использования сети. Примечание: это компромисс — хотя объем сетевой передачи уменьшается, на каждом узле требуется дополнительная работа по слиянию (устранению дубликатов). Включайте эту настройку, если передача данных по сети является узким местом, а затраты на слияние приемлемы. #81908 (fhw12345).
  • Добавлена поддержка table function remote-() с параллельными репликами, если cluster указан в аргументе address_expression. Также исправлена проблема #73295. #82904 (Igor Nikonov).
  • JOIN с параллельными репликами теперь используют логический шаг JOIN. Если возникнут проблемы с запросами JOIN, использующими параллельные реплики, попробуйте SET query_plan_use_new_logical_join_step=0 и сообщите о проблеме. #83801 (Vladimir Cherkasov).

Настройки и конфигурация

  • Настройка allow_experimental_join_condition помечена как устаревшая. #80566 (Vladimir Cherkasov).
  • Общие и пользовательские сетевые throttler’ы больше не сбрасываются, что гарантирует, что лимиты max_network_bandwidth_for_all_users и max_network_bandwidth_for_all_users никогда не будут превышены. #81729 (Sergei Trifonov).
  • Добавлена настройка optimize_rewrite_regexp_functions (включена по умолчанию), которая позволяет оптимизатору переписывать некоторые вызовы replaceRegexpAll, replaceRegexpOne и extract в более простую и эффективную форму при обнаружении определённых шаблонов регулярных выражений. (issue #81981). #81992 (Amos Bird).
  • Размер очереди TCP-серверов (64 по умолчанию) теперь настраивается на основе listen_backlog (4096 по умолчанию). #82045 (Azat Khuzhin).
  • Добавлена возможность перезагружать max_local_read_bandwidth_for_server и max_local_write_bandwidth_for_server на лету без перезапуска сервера. #82083 (Kai Zhu).
  • Добавлена настройка enable_vector_similarity_index, которую необходимо включить для использования индекса векторного сходства. Существующая настройка allow_experimental_vector_similarity_index теперь устарела. При необходимости она по-прежнему работает. #83459 (Robert Schulze).
  • Добавлен max_joined_block_size_bytes в дополнение к max_joined_block_size_rows, чтобы ограничить использование памяти для JOIN с тяжёлыми столбцами. #83869 (Nikolai Kochetov).
  • Исправлена совместимость для cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
  • Поддержка коррелированных подзапросов теперь включена по умолчанию. #85107 (Dmitry Novik).
  • Добавлены настройки database_replicated, определяющие значения по умолчанию для DatabaseReplicatedSettings. Если настройка отсутствует в запросе CREATE для Replicated DB, используется значение из этой настройки. #85127 (Tuan Pham Anh).
  • Добавлена поддержка аргументов в формате ключ-значение в движке таблицы/функции s3 или s3Cluster, например s3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova).
  • Некоррелированный EXISTS теперь выполняется как скалярный подзапрос. Это позволяет использовать кеш скалярных подзапросов и сворачивать результат в константу, что полезно для индексов. Для совместимости добавлена новая настройка execute_exists_as_scalar_subquery=1. #85481 (Nikolai Kochetov).
  • Расширена поддержка разрешения составных идентификаторов для большего числа случаев. В частности, это улучшает совместимость ARRAY JOIN со старым анализатором. Добавлена новая настройка analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested для сохранения прежнего поведения. #85492 (Nikolai Kochetov).

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

  • В асинхронные метрики ClickHouse добавлены pressure-метрики. #80779 (Xander Garbett).
  • Добавлены метрики MarkCacheEvictedBytes, MarkCacheEvictedMarks, MarkCacheEvictedFiles для отслеживания вытеснений из кэша меток. (issue #60989). #80799 (Shivji Kumar Jha).
  • Таблица system.formats теперь содержит расширенную информацию о форматах, такую как HTTP content type, возможности определения схемы и т. д. #81505 (Alexey Milovidov).
  • Добавлена поддержка очистки всех предупреждений из таблицы system.warnings с помощью TRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov).
  • Лицензии Rust-крейтов теперь перечисляются в system.licenses. #82440 (Raúl Marín).
  • Добавлена оценка сложных cnf/dnf, например (a < 1 and a > 0) or b = 3, по статистике. #82663 (Han Fei).
  • В некоторых случаях метрикам требуется несколько измерений. Например, чтобы считать неудачные слияния или Мутации по кодам ошибок, а не иметь один общий счётчик. #83030 (Miсhael Stetsyuk).
  • В profile events part_log для записей MergeParts добавлены метрики ресурсов процесса (такие как UserTimeMicroseconds, SystemTimeMicroseconds, RealTimeMicroseconds). #83460 (Vladimir Cherkasov).
  • Метрики уровня cgroup и общесистемные метрики теперь публикуются вместе. Метрики уровня cgroup имеют имена CGroup<Metric>, а метрики уровня ОС (собираемые из procfs) — имена OS<Metric>. #84317 (Nikita Taranov).
  • Добавлены размерные метрики для мониторинга размера ограниченных конкурентных очередей с метками по типу очереди и ID экземпляра для лучшей обсервабилити. #84675 (Miсhael Stetsyuk).
  • Таблица system.columns теперь предоставляет column как alias для существующего столбца name. #84695 (Yunchi Pang).
  • В system.errors добавлен столбец format string. Этот столбец нужен для группировки одного и того же типа ошибок в правилах оповещений. #84776 (Miсhael Stetsyuk).
  • Лимиты для Async Log сделаны настраиваемыми, а также добавлена интроспекция. #85105 (Raúl Marín).
  • UNKNOWN_DATABASE игнорируется при получении размеров столбцов таблиц для system.columns. #85632 (Azat Khuzhin).

Движки баз данных

Системные и внутренние улучшения

  • Исправлено подключение баз данных с удалёнными дисками только для чтения за счёт ручного добавления UUID таблиц в DatabaseCatalog. #82670 (Tuan Pham Anh).
  • Улучшена обработка DDL-задач при 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).
  • Изменён порядок завершения работы SystemLogs: теперь это происходит после обычных таблиц (и перед системными таблицами, а не перед обычными таблицами). #83134 (Kseniia Sumarokova).
  • Добавлена настройка сервера logs_to_keep для настроек базы данных Replicated, позволяющая задавать значение параметра logs_to_keep по умолчанию для баз данных Replicated. Более низкие значения уменьшают число узлов ZooKeeper (что особенно полезно при большом количестве баз данных), а более высокие позволяют отставшим репликам догонять состояние после более длительных периодов простоя. #84183 (Alexey Khatskevich).
  • Значение по умолчанию для настройки базы данных Replicated max_retries_before_automatic_recovery изменено на 10, что в некоторых случаях ускоряет восстановление. #84369 (Alexander Tokmakov).
  • Оптимизированы DDL-операции для refreshable materialized view без append-режима в базах данных Replicated за счёт пропуска создания и переименования старых временных таблиц. #84858 (Tuan Pham Anh).

Репликация и синхронизация

Системные и внутренние улучшения

  • Улучшена команда SYSTEM RESTART REPLICA: теперь она повторяет попытку создания таблицы при проблемах с подключением к ZooKeeper, чтобы таблицы не терялись. #82616 (Nikolay Degterinsky).
  • Добавлена проверка UUID в ReplicatedMergeTree::executeMetadataAlter, чтобы предотвратить некорректные определения таблиц при их обмене между моментом получения StorageID и вызовом IDatabase::alterTable. #82666 (Nikolay Degterinsky).
  • Удалена экспериментальная логика send_metadata, связанная с экспериментальной репликацией с нулевым копированием. Этот код никогда не использовался, не поддерживался и, вероятно, был неисправен; кроме того, не было тестов для проверки его работоспособности. #82508 (alesapin).
  • Добавлена поддержка раскрытия макросов в remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).

Функции и выражения

  • Функция addressToSymbol и таблица system.symbols будут использовать смещения файла вместо адресов виртуальной памяти. #81896 (Alexey Milovidov).
  • Стараться сохранять имена элементов при выведении супертипов для именованных кортежей. #81345 (lgbo).
  • Разрешено использовать разные collation для одного и того же столбца в разных окнах. #82877 (Yakov Olkhovskiy).
  • Добавлена функция для записи типов в формате WKB. #82935 (scanhex12).
  • Добавлена возможность разбирать Time и Time64 в форматах MM:SS, M:SS, SS или S. #83299 (Yarik Briukhovetskyi).
  • Функция reinterpret() теперь поддерживает преобразование в Array(T), где T — тип данных фиксированного размера (задача #82621). #83399 (Shankar Iyer).
  • Исправлены функции structureToProtobufSchema и structureToCapnProtoSchema: теперь они корректно добавляют завершающий нулевой байт вместо символа новой строки, что предотвращает отсутствие переводов строк в выводе и возможные переполнения буфера в функциях, зависящих от нулевого байта (таких как logTrace, demangle, extractURLParameter, toStringCutToZero и encrypt/decrypt). Закрывает #85062. #85063 (Alexey Milovidov).
  • Исправлена структура словаря regexp_tree, чтобы поддерживать обработку строк, содержащих нулевые байты. #85063 (Alexey Milovidov).
  • Исправлена функция formatRowNoNewline, которая по ошибке обрезала последний символ в выводе при вызове с форматом Values или любым другим форматом без символа новой строки в конце строк. #85063 (Alexey Milovidov).
  • Исправлена ошибка в обработке исключений в функции stem, которая в редких случаях могла приводить к утечкам памяти. #85063 (Alexey Milovidov).
  • Исправлена функция initcap для аргументов FixedString, чтобы она корректно распознавала начало слов в начале строк, если предыдущая строка в блоке заканчивалась символом, входящим в состав слова. #85063 (Alexey Milovidov).
  • Исправлена уязвимость в формате Apache ORC, которая могла привести к раскрытию неинициализированной памяти. #85063 (Alexey Milovidov).
  • Изменено поведение replaceRegexpAll и его alias REGEXP_REPLACE: теперь допускаются пустые совпадения в конце строк, даже если предыдущее совпадение охватило всю строку целиком (например, ^a*|a*$ или ^|.*). Это соответствует семантике JavaScript, Perl, Python, PHP и Ruby, но отличается от PostgreSQL. #85063 (Alexey Milovidov).
  • Оптимизирована и упрощена реализация многих функций для работы со строками. Исправлена некорректная документация для нескольких функций. Примечание: результат byteSize для столбцов String и сложных типов, содержащих столбцы String, изменился с 9 байт для пустой строки до 8 байт для пустой строки, что соответствует ожидаемому поведению. #85063 (Alexey Milovidov).
  • Разрешён нулевой шаг в функциях timeSeries*ToGrid(). Это часть #3 из https://github.com/ClickHouse/ClickHouse/pull/75036. #85390 (Vitaly Baranov).
  • Добавлена поддержка вложенных массивов для функции nested. #85719 (Nikolai Kochetov).

Улучшения MergeTree

  • Реализовано более точечное отключение индексов пропуска данных, зависящих от столбцов, обновляемых на лету или патч-частями. Теперь индексы пропуска данных не используются только в частях, затронутых мутациями на лету или патч-частями; ранее эти индексы отключались для всех частей. #84241 (Anton Popov).
  • Добавлена настройка MergeTree search_orphaned_parts_drives, чтобы ограничить область поиска частей, например по дискам с локальными метаданными. #84710 (Ilya Golshtein).
  • Добавлена отсутствовавшая поддержка read_in_order_use_virtual_row для WHERE. Это позволяет пропускать чтение дополнительных частей для запросов с фильтрами, которые не были полностью перенесены в PREWHERE. #84835 (Nikolai Kochetov).
  • Исправлено использование сериализации дискриминаторов Variant в формате "compact" в MergeTree. Ранее в некоторых случаях она не использовалась, хотя могла бы. #84141 (Pavel Kruglov).
  • Добавлено ограничение (настройка таблицы max_uncompressed_bytes_in_patches) на общее количество несжатых байтов в патч-частях. Это предотвращает значительные замедления запросов SELECT после легковесных обновлений и возможное злоупотребление легковесными обновлениями. #85641 (Anton Popov).

Управление кэшем и памятью

  • Исправлена логическая ошибка в файловом кэше: “Having zero bytes but range is not finished”. #81868 (Kseniia Sumarokova).
  • Добавлено rendezvous-хеширование для улучшения локальности кэша. #82511 (Anton Ivashkin).
  • Переработана возможность динамического изменения размера файлового кэша. Добавлено больше журналов для диагностики. #82556 (Kseniia Sumarokova).
  • Снижены накладные расходы на отслеживание памяти запросов для исполняемых пользовательских функций. #83929 (Eduard Karacharov).
  • Все выделения памяти, выполняемые внешними библиотеками, теперь видны трекеру памяти ClickHouse и корректно учитываются. Это может привести к «увеличению» отображаемого использования памяти для некоторых запросов или к ошибкам MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov).
  • Для encrypted_buffer в зашифрованных именованных коллекциях теперь выделяется минимально необходимый объём памяти. #84432 (Pablo Marcos).

Индекс векторного сходства

  • Запрещено использовать nan и inf с NumericIndexedVector. Исправляет #82239 и кое-что ещё. #82681 (Raufs Dunamalijevs).
  • Индекс векторного сходства теперь поддерживает двоичную квантизацию. Двоичная квантизация значительно снижает расход памяти и ускоряет построение векторного индекса (за счёт более быстрого вычисления расстояния). Кроме того, существующая настройка vector_search_postfilter_multiplier была объявлена устаревшей и заменена более общей настройкой: vector_search_index_fetch_multiplier. #85024 (Shankar Iyer).
  • Приблизительный векторный поиск с индексами векторного сходства теперь имеет статус GA. #85888 (Robert Schulze).

Обработка ошибок и сообщения

  • Заголовок Connection теперь отправляется в конце заголовков, когда уже известно, нужно ли сохранять соединение. #81951 (Sema Checherinda).
  • В предыдущих версиях умножение состояния агрегатной функции на IPv4 приводило к логической ошибке вместо возврата корректного кода ошибки. Закрывает #82817. #82818 (Alexey Milovidov).
  • Улучшена обработка ошибок в AsynchronousMetrics. Если каталог /sys/block существует, но недоступен, сервер запустится без мониторинга блочных устройств. Закрывает #79229. #83115 (Alexey Milovidov).
  • Некорректно выполнялась проверка зависимостей для INSERT с materialized view, у которых были ошибочные SELECT-запросы, из-за чего пользователь мог получить малопонятное std::exception вместо осмысленной ошибки с понятным объяснением. Теперь это исправлено. Исправляет: #82889. #83190 (Nikita Mikhaylov).
  • Больше не выводятся очень длинные описания действий выражений в сообщениях об исключениях. Закрывает #83164. #83350 (Alexey Milovidov).
  • Когда хранилище завершает работу, getStatus генерирует исключение ErrorCodes::ABORTED. Ранее из-за этого завершался с ошибкой SELECT-запрос. Теперь исключения ErrorCodes::ABORTED перехватываются и намеренно игнорируются. #83435 (Miсhael Stetsyuk).
  • Сообщения об исключениях для некоторых ситуаций при загрузке и добавлении проекций стали понятнее. #83728 (Robert Schulze).
  • Проверка на отмену соединения теперь выполняется до проверки EOF, чтобы предотвратить чтение из закрытого соединения. Исправляет #83893. #84227 (Raufs Dunamalijevs).
  • Улучшена обработка завершения работы сервера для клиентских соединений за счёт упрощения внутренних проверок. #84312 (Raufs Dunamalijevs).
  • Низкоуровневые ошибки во время выполнения UDF теперь приводят к ошибке с кодом UDF_EXECUTION_FAILED, тогда как ранее могли возвращаться разные коды ошибок. #84547 (Xu Jia).

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

  • Исправлено непоследовательное форматирование 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).
  • Исправлено форматирование CREATE USER с параметрами запроса (то есть CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin).
  • Исправлен разбор завершающей запятой в списке столбцов запроса CREATE DICTIONARY после столбца с параметрами, например Decimal(8). Закрывает #85586. #85653 (Nikolay Degterinsky).

Внешние интеграции

  • Унифицированы имена параметров в ODBC и JDBC при использовании именованных коллекций. #83410 (Andrey Zvonov).
  • MongoDB: Неявное преобразование строк в числовые типы. Ранее, если из источника MongoDB для числового столбца в таблице ClickHouse поступало строковое значение, генерировалось исключение. Теперь движок автоматически пытается разобрать числовое значение из строки. Закрывает #81167. #84069 (Kirill Nikiforov).
  • Разрешено использование simdjson на неподдерживаемых архитектурах (ранее это приводило к ошибкам CANNOT_ALLOCATE_MEMORY). #84966 (Azat Khuzhin).

Прочие улучшения

  • Добавлены движок таблицы Ytsaurus и табличная функция. #77606 (MikhailBurdukov).
  • Улучшен HashJoin::needUsedFlagsForPerRightTableRow: теперь для cross join он возвращает false. #82379 (lgbo).
  • Разрешены запись и чтение столбцов Map как массива кортежей. #82408 (MikhailBurdukov).
  • Этот PR был откатан. #82884 (Mithun p).
  • Асинхронные журналы: ограничено максимальное число записей, хранящихся в очереди. #83214 (Raúl Marín).
  • В форматах ввода JSON включена поддержка Date/Date32 как целых чисел. #83597 (MikhailBurdukov).
  • Улучшена поддержка Bloom filter indexes (обычных, n-граммных и token), чтобы они могли использоваться, когда первый аргумент — константный массив (множество), а второй — индексируемый столбец (подмножество), что повышает эффективность выполнения запросов. #84700 (Doron David).
  • Разрешено приведение типов значений множества при проталкивании фильтров IN / GLOBAL IN по primary keys хранилища KeyValue (например, EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • Устранено полное сканирование в случаях, когда анализ индексов приводит к пустым диапазонам при чтении параллельными репликами. #84971 (Eduard Karacharov).
  • Исправлен ряд проблем, которые могут возникать при попытке запустить integration tests на локальной машине. #82135 (Oleg Doronin).
  • Для старых развертываний trace_log.symbolize теперь включён по умолчанию. #85456 (Azat Khuzhin).

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

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

  • Исправлена деградация производительности в SummingMergeTree, появившаяся в версии 25.5 в https://github.com/ClickHouse/ClickHouse/pull/79051. #82130 (Pavel Kruglov).
  • Исправлена деградация производительности при включенном анализаторе, из-за которой вторичные запросы всегда читали все столбцы из VIEW. Исправлено #81718. #83036 (Dmitry Novik).
  • Отключена проверка циклических зависимостей при создании таблицы без зависимостей. Это устраняет деградацию производительности в сценариях с созданием тысяч таблиц, появившуюся в https://github.com/ClickHouse/ClickHouse/pull/65405. #83077 (Pavel Kruglov).
  • Оконные агрегаты DISTINCT теперь выполняются за линейное время; также исправлена ошибка в sumDistinct. Закрывает #79792. Закрывает #52253. #79859 (Nihal Z. Miaji).

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

  • Для запросов с комбинацией ORDER BY ... LIMIT BY ... LIMIT N, когда ORDER BY выполняется в режиме PartialSorting, счётчик rows_before_limit_at_least теперь отражает количество строк, обработанных оператором LIMIT, а не преобразованием сортировки. #78999 (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).
  • Исправлено выполнение IN с transform_null_in=1 при NULL в левом аргументе и не-Nullable результате подзапроса. #81584 (Pavel Kruglov).
  • Исправлена проблема, из-за которой при обработке скалярного коррелированного подзапроса не считывались необходимые столбцы. Исправлено в #81716. #81805 (Dmitry Novik).
  • Исправлен анализ фильтра, когда в запросе используется только константный столбец-псевдоним. Исправление #79448. #82037 (Dmitry Novik).
  • Исправлена ошибка Not found column в запросах с arrayJoin в условии WHERE при использовании IndexSet. #82113 (Nikolai Kochetov).
  • Исправлено Исключение TOO_DEEP_SUBQUERIES, возникавшее, когда определение CTE ссылалось на другое табличное выражение с тем же именем. #83413 (Dmitry Novik).
  • Исправлен некорректный результат запросов с условием WHERE ... IN (<subquery>) при включенном кэше условий запроса (настройка use_query_condition_cache). #83445 (LB7666).
  • INSERT SELECT с UNION ALL в редком случае мог приводить к разыменованию нулевого указателя. Закрывает #83618. #83643 (Alexey Milovidov).
  • Исправлен LOGICAL_ERROR, возникавший при анализе выражения политики строк для коррелированных столбцов. #82618 (Dmitry Novik).
  • Исправлены некорректные результаты, возникавшие при использовании кэша условий запроса совместно с рекурсивными CTE (issue #81506). #84026 (zhongyuankai).
  • Исправлен бесконечный рекурсивный разбор некорректных определений WINDOW. Исправление #83131. #84242 (Dmitry Novik).
  • Исправлен Not-ready Set для IN (subquery) в настройке additional_table_filters expression. #85210 (Nikolai Kochetov).
  • Исправлена логическая ошибка с повторяющимися подзапросами, когда включен optimize_syntax_fuse_functions; закрывает #75511. #83300 (Vladimir Cherkasov).

Исправления Iceberg и DataLake

  • Исправлено разрешение метаданных при выполнении запросов к таблицам Iceberg через REST-каталог. … #80562 (Saurabh Kumar Ojha).
  • Исправлены гонки данных в Iceberg. #82088 (Azat Khuzhin).
  • Исправлена ошибка “Context has expired” в Iceberg. #82146 (Azat Khuzhin).
  • Теперь ClickHouse может читать таблицы Iceberg из каталога Glue после эволюции схемы. Исправляет #81272. #82301 (alesapin).
  • Исправлены гонки данных в Iceberg. #82841 (Azat Khuzhin).
  • Отключено отсечение файлов по границам для элементов Array и значений Map в Iceberg, включая все их вложенные подполя. #83520 (Daniil Ivanik).
  • Исправлена запись в Iceberg для сложных типов. #85330 (scanhex12).
  • Запись нижних и верхних границ не поддерживается для сложных типов. #85332 (scanhex12).
  • Исправлена nullable-принадлежность полей в Iceberg. #85977 (scanhex12).
  • Пустой delete-файл Iceberg больше не создается. #86061 (scanhex12).
  • Обновлена временная метка метаданных при записи в Iceberg. #85711 (scanhex12).
  • Spark не может читать файлы позиционного удаления. #85762 (scanhex12).
  • Схема больше не берется из manifest files; вместо этого для каждого снимка независимо сохраняются релевантные схемы. Релевантная схема для каждого файла данных определяется по соответствующему снимку. Предыдущее поведение нарушало спецификацию Iceberg для записей manifest files с существующим status. #84588 (Daniil Ivanik).
  • Теперь Iceberg не пытается кэшировать релевантную версию снимка между select-запросами и всегда заново разрешает снимок. Предыдущая попытка кэшировать снимок Iceberg приводила к проблемам при использовании таблиц Iceberg с time travel. #85038 (Daniil Ivanik).
  • Исправлено разрешение метаданных при выполнении запросов к таблицам Iceberg через REST-каталог. … #85531 (Saurabh Kumar Ojha).
  • Исправлено маскирование secrets в table functions icebergS3Cluster и icebergAzureCluster. #85658 (MikhailBurdukov).

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

  • Исправлено отсечение столбцов с delta-kernel в хранилище DeltaLake. Закрывает #84543. #84745 (Kseniia Sumarokova).
  • Исправлено обновление учетных данных в delta-kernel в хранилище DeltaLake. #84751 (Kseniia Sumarokova).
  • Исправлен segfault в реализации delta-kernel. #85160 (Kseniia Sumarokova).
  • Исправлено состояние гонки в реализации delta-kernel движка DeltaLake. #85221 (Kseniia Sumarokova).
  • Исправлено чтение партиционированных данных при отключённом delta-kernel в движке DeltaLake. Проблема появилась в 25.7 (https://github.com/ClickHouse/ClickHouse/pull/81136). #85223 (Kseniia Sumarokova).
  • Для совместимости значение allow_experimental_delta_kernel_rs, использовавшееся до 25.5, изменено на false. #84587 (Kseniia Sumarokova).
  • Исправлено чтение значения count из кэша для Delta Lake. #85704 (Kseniia Sumarokova).

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

  • Пересчитывается min-max индекс, когда TTL сокращает количество строк, чтобы обеспечить корректность алгоритмов, которые на него опираются, таких как minmax_count_projection. Это устраняет #77091. #77166 (Amos Bird).
  • Исправлен некорректный пересчёт TTL в TTL GROUP BY при обновлении TTL. #81222 (Evgeniy Ulasik).
  • Исправлена ошибка «Context has expired» во время слияний, когда в выражении TTL используется dict. #81690 (Azat Khuzhin).
  • Исправлены LOGICAL_ERROR и последующий сбой при использовании одного и того же столбца в TTL для GROUP BY и SET. #82054 (Pablo Marcos).
  • MergeTree теперь не выполняет никаких действий, связанных с TTL, если из таблицы удалены все TTL. #84441 (alesapin).
  • Исправлено поведение, при котором ALTER MODIFY ORDER BY не проверял TTL-столбцы в ключах сортировки. Теперь TTL-столбцы корректно отклоняются при использовании в секциях ORDER BY во время операций ALTER, что предотвращает возможное повреждение таблицы. #84536 (xiaohuanlin).

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

  • Исправлена логическая ошибка при материализации проекции, если тип столбца был изменён на Nullable. #80741 (Pavel Kruglov).
  • Исправлено некорректное использование родительских метаданных в табличной функции mergeTreeProjection, когда enable_shared_storage_snapshot_in_query = 1. Исправление для #82634. #82638 (Amos Bird).
  • Исправлен редкий сбой ClickHouse, возникавший, когда у таблицы есть проекция, lightweight_mutation_projection_mode = 'rebuild', и пользователь выполняет lightweight delete, удаляющий ВСЕ строки из какого-либо блока таблицы. #84158 (alesapin).
  • Исправлено резервное копирование частей с повреждёнными проекциями. #85362 (Antonio Andelic).
  • Использование столбца _part_offset в проекциях запрещено в релизах до его стабилизации. #85372 (Sema Checherinda).

Исправления для параллельных реплик

  • Для некоторых запросов, выполняемых с параллельными репликами, оптимизация чтения In order могла применяться на инициаторе, но не на удалённых узлах. Из-за этого координатор параллельных реплик (на инициаторе) и удалённые узлы использовали разные режимы чтения, что является логической ошибкой. #80652 (Igor Nikonov).
  • Параллельные реплики отключаются, если подзапрос содержит FINAL #81401 by . #83455 (zoomxi).
  • Исправлен LOGICAL_ERROR для запросов с параллельными репликами и несколькими INNER JOIN, после которых следует RIGHT JOIN. Для таких запросов параллельные реплики не используются. #84299 (Vladimir Cherkasov).
  • Запросы с параллельными репликами, использующие оптимизацию обратного чтения In order, могут возвращать некорректный результат. #85406 (Igor Nikonov).

Аутентификация и безопасность

  • Исправлено сокрытие значений именованной коллекции в журналах/query_log. Закрывает #82405. #82510 (Kseniia Sumarokova).
  • Добавлена установка salt для данных аутентификации при разборе AST с типом SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
  • Скрыты данные аутентификации Avro schema registry, чтобы они не были видны пользователю и в журналах. #83713 (János Benjamin Antal).
  • Исправлено некорректное поведение, при котором выполнение REVOKE S3 ON system.* отзывает разрешения S3 для *.*. Это исправляет #83417. #83420 (pufit).
  • Исправлен сбой сервера, когда пользователь, созданный с no_password, пытается войти после изменения настройки сервера allow_no_password на 0. #84426 (Shankar Iyer).
  • Улучшено сообщение об ошибке при попытке создать пользователя с аутентификацией через JWT. #85072 (Konstantin Bogdanov).
  • Скрыты учетные данные для deltaLakeAzure, deltaLakeCluster, icebergS3Cluster и icebergAzureCluster. #85889 (Julian Maicher).
  • Исправлена ошибка, добавленная в #79963. При вставке в materialized view с definer при проверке прав доступа должны использоваться привилегии definer. Исправляет #79951. #83502 (pufit).

Исправления резервного копирования и восстановления

  • Исправлена ошибка резервного копирования пустой таблицы Memory, из-за которой восстановление из резервной копии завершалось с ошибкой BACKUP_ENTRY_NOT_FOUND. #82791 (Julia Kartseva).
  • Исправлено вводящее в заблуждение сообщение об ошибке при восстановлении резервной копии на диске в режиме только для чтения. #83051 (Julia Kartseva).
  • Исправлен запуск лишних внутренних резервных копий после проблем с подключением. #84755 (Vitaly Baranov).

Оконные и агрегатные функции

  • Исправлен возможный сбой в Aggregator в случае исключения во время слияния. #81450 (Nikita Taranov).
  • Исправлен возможный сбой в Aggregator в случае исключения во время слияния. #82022 (Nikita Taranov).
  • Исправлена ошибка копирования и вставки в arraySimilarity, из-за которой допускалось использование весов UInt32 и Int32. Обновлены тесты и документация. #82103 (Mikhail f. Shiryaev).
  • Исправлено переполнение в функциях numericIndexedVectorPointwiseAdd, numericIndexedVectorPointwiseSubtract, numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, возникавшее при их применении к большим числам. #82165 (Raufs Dunamalijevs).

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

  • Исправлена ошибка, из-за которой bloom filter в Parquet некорректно применял условие вида WHERE function(key) IN (...) так, как если бы это было WHERE key IN (...). #81255 (Michael Kolupaev).
  • Исправлен вывод некорректной статистики (min/max) модулем записи Parquet для типов Decimal. #83754 (Michael Kolupaev).
  • Исправлена десериализация groupArraySample/groupArrayLast в случае пустых элементов (десериализация могла пропустить часть бинарных данных, если входные данные были пустыми; это может привести к повреждению данных при чтении и UNKNOWN_PACKET_FROM_SERVER в TCP-протоколе). Это не затрагивает числовые типы и типы дата-время. #82763 (Pedro Ferreira).
  • Исправлена запись JSON-путей со значениями NULL в формате RowBinary. #83923 (Pavel Kruglov).

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

  • Исправлено изменение filter для запросов с выражением JOIN с таблицей на движке Merge. Исправляет #82092. #82950 (Dmitry Novik).
  • Исправлен сбой при JOIN с хранилищем типа ключ-значение по ключу с приведением типа. #82497 (Pervakov Grigorii).
  • Исправлена логическая ошибка при разрешении matcher в запросе с несколькими JOIN; закрывает #81969. #82421 (Vladimir Cherkasov).
  • Исправлено слияние filter с условием JOIN в случаях, когда операнды равенства имеют разные типы или ссылаются на константы. Исправляет #83432. #84145 (Dmitry Novik).
  • Исправлена логическая ошибка Expected single dictionary argument for function при выполнении JOIN по условию неравенства, когда один из столбцов имеет тип LowCardinality, а другой — константа. Закрывает #81779. #84019 (Alexey Milovidov).

Исправления базы данных Replicated

  • Исправлено markReplicasActive в DDLWorker и DatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh).
  • Исправлен DatabaseReplicated::getClusterImpl. Если первый элемент hosts (или несколько первых элементов) имеет id == DROPPED_MARK и для того же сегмента нет других элементов, первый элемент shards будет пустым вектором, что приводит к std::out_of_range. #82093 (Miсhael Stetsyuk).
  • Добавлен учет количества асинхронных задач загрузки таблиц. Если есть выполняющиеся задачи, tail_ptr в TransactionLog::removeOldEntries больше не обновляется. #82824 (Tuan Pham Anh).
  • Исправлена проблема, из-за которой, если таблица MergeTree создается с add_minmax_index_for_numeric_columns=1 или add_minmax_index_for_string_columns=1, а затем индекс материализуется во время операции ALTER, база данных Replicated не может корректно инициализироваться на новой реплике. #83751 (Nikolay Degterinsky).
  • Исправлено создание RMV на новой реплике базы данных Replicated, если DEFINER удален. #85327 (Nikolay Degterinsky).
  • Исправлено восстановление реплицируемых баз данных, когда перемещение файла метаданных занимает много времени. #85177 (Tuan Pham Anh).
  • Добавлено принудительное восстановление базы данных Replicated после восстановления метаданных базы данных в Keeper. #85960 (Tuan Pham Anh).
  • Исправлена ошибка при восстановлении базы данных Replicated: если имя таблицы содержит символ %, во время восстановления таблица могла быть повторно создана под другим именем. #85987 (Alexander Tokmakov).
  • Теперь DDL-воркер очищает набор реплик от устаревших хостов. Это уменьшит объем метаданных, хранимых в ZooKeeper. #88154 (alesapin).

Исправления легковесных обновлений

  • Исправлены легковесные обновления для таблиц с движками ReplacingMergeTree и CollapsingMergeTree. #84851 (Anton Popov).
  • Исправлена логическая ошибка в легковесных обновлениях, затрагивающих все столбцы таблицы. #84380 (Anton Popov).
  • Исправлены легковесные обновления для таблиц с движком ReplicatedMergeTree, созданных на серверах с версией ниже 25.7. #84933 (Anton Popov).
  • Исправлены легковесные обновления для таблиц с нереплицируемым движком MergeTree после выполнения запроса ALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov).
  • Исправлена очистка патч-частей в ReplicatedMergeTree. Ранее результат легковесного обновления мог временно не отображаться на реплике, пока с другой реплики не будет загружена слитая или мутированная часть, материализующая патч-части. #85121 (Anton Popov).

Исправления S3 и объектного хранилища

  • Исправлена проверка аргументов табличной функции S3 при маскировании секретов, что предотвращает возможный LOGICAL_ERROR; закрывает #80620. #82056 (Vladimir Cherkasov).
  • Исправлена возможная взаимная блокировка для удалённых запросов, когда сервер испытывает нехватку памяти. #82160 (Kirill).
  • Для токена AWS ECS добавлено время истечения, чтобы его можно было перезагружать. #82422 (Konstantin Bogdanov).
  • Исправлено отключение выравнивания границ для кэшированного буфера во внешних движках таблиц. Ошибка появилась в https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
  • Исправлен no_sign_request для клиента S3. Его можно использовать, чтобы явно отключить подписание запросов S3. Его также можно задавать для конкретных конечных точек с помощью настроек для конечных точек. #83379 (Antonio Andelic).
  • Недоступные узлы теперь пропускаются при INSERT SELECT из s3Cluster() в replicated MergeTree. #83676 (Igor Nikonov).
  • Исправлено условие преждевременного выхода для замедления скорости запросов S3: чтобы включить замедление, когда все потоки приостановлены из-за ошибки, допускающей повторную попытку, теперь достаточно, чтобы значение true имел либо s3_slow_all_threads_after_network_error, либо backup_slow_all_threads_after_retryable_s3_error, а не оба сразу. #85505 (Julia Kartseva).
  • Исправлена логическая ошибка при чтении из функций объектного хранилища через distributed таблицу или табличную функцию remote. Исправляет: #84658, исправляет #85173, исправляет #52022. #85359 (alesapin).
  • Исправлена логическая ошибка в S3Queue: “Table is already registered”. Закрывает #84433. Ошибка появилась после https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой большие значения настроек нарушали работу таблиц S3Queue и перезапуск реплики. #86074 (Nikolay Degterinsky).

DynamicAndVariantTypeFixes

  • Исправлен откат столбца типа Dynamic при сбое парсинга. #82169 (Pavel Kruglov).
  • Исправлено возможное аварийное завершение в типе Variant при UNION. #83295 (Pavel Kruglov).
  • Исправлено чтение столбца Variant с ленивой материализацией. #84400 (Pavel Kruglov).
  • Не проверять экспериментальные/подозрительные типы при выполнении выражений default/materialize во время чтения из существующей таблицы. #81618 (Pavel Kruglov).

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

  • Исправление в Keeper: корректно обновляется общее число наблюдений при удалении эфемерных узлов при закрытии сеанса. #83583 (Antonio Andelic).
  • Исправлены записи в журнал изменений Keeper, выполнявшиеся не по порядку. Ранее могли оставаться незавершённые записи в журнал изменений, а откат мог приводить к одновременному изменению целевого файла. Это приводило к несогласованности журналов и возможной потере данных. #84434 (Antonio Andelic).
  • Исправлены утечки в Keeper с хранилищем RocksDB (итераторы не уничтожались). #84523 (Azat Khuzhin).
  • Исправлена проблема, из-за которой настройка Keeper rotate_log_storage_interval = 0 приводила к сбою ClickHouse. (проблема #83975). #84637 (George Larionov).
  • Исправлен подсчёт общего числа наблюдений, возвращаемого Keeper. #84890 (Antonio Andelic).
  • Блокировка ‘mutex’ при получении ZooKeeper из ‘view’ в RefreshTask. #84699 (Tuan Pham Anh).

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

  • Исправлен избыточный пропуск гранул при фильтрации по индексам token/ngram с regexp, содержащим чередование и нелитеральную первую альтернативу. #79373 (Eduard Karacharov).
  • Реализация настройки use_skip_indexes_if_final_exact_mode (добавленной в 25.6) могла не выбирать подходящий диапазон в зависимости от настроек движка MergeTree / распределения данных. Теперь это исправлено. #82667 (Shankar Iyer).
  • Оптимизация настройки use_skip_indexes_if_final_exact_mode (добавленной в 25.6) могла не выбирать подходящий диапазон в зависимости от настроек движка MergeTree / распределения данных. Теперь это исправлено. #82879 (Shankar Iyer).
  • Ранее индексы set не учитывали столбцы Nullable при проверке того, проходит ли гранула фильтр (проблема #75485). #84305 (Elmi Ahmadov).
  • При сравнении со значением nan во время оценки индекса MinMax использовались неверные диапазоны. #84386 (Elmi Ahmadov).
  • Токенизаторы ngram и no_op больше не приводят к сбою экспериментального текстового индекса на пустых входных токенах. #84849 (Robert Schulze).

Исправления materialized view

  • Исправлена ошибка в зависимостях таблиц, из-за которой Materialized Views пропускали запросы INSERT. #82222 (Nikolay Degterinsky).
  • После https://github.com/ClickHouse/ClickHouse/pull/79963 перестало работать использование подстолбцов в Materialized Views, и пользователь мог получать ошибку Not found column X in block. Это исправлено. Исправлено: #82784. #83221 (Nikita Mikhaylov).
  • Исправлен illegal_type_of_argument в mv, когда типы различаются. #85135 (Sema Checherinda).

Исправления для Azure и облачного хранилища

  • В AzureBlobStorage при нативном копировании выполняется сравнение методов аутентификации; если при этом возникает исключение, код теперь переключается на чтение и копирование (то есть на ненативное копирование). #82693 (Smita Kulkarni).
  • Исправлено двойное освобождение памяти в AzureIteratorAsync. #85064 (Nikita Taranov).

Исправления сбоев и повышения стабильности

  • Исправлен возможный сбой в логировании при завершении сеанса, поскольку user_id иногда может быть пустым. #82513 (Bharat Nallan).
  • Исправлен сбой в клиенте из-за того, что после некорректного INSERT соединение оставалось разорванным. #83253 (Azat Khuzhin).
  • Исправлен сбой при вычислении размера блока с пустыми столбцами. #83271 (Raúl Marín).
  • Исправлен сбой, который может возникать при выполнении запроса с настройкой ‘max_threads=1’ под нагрузкой и с включённым планированием CPU. #83387 (Fan Ziqi).
  • zoutofmemory теперь считается аппаратной ошибкой, иначе будет сгенерирована логическая ошибка. См. https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei).
  • Исправлено возможное аварийное завершение работы (из-за присоединения потоков из задачи) и, возможно, зависания (в модульных тестах) при остановке BackgroundSchedulePool. #83769 (Azat Khuzhin).
  • Исправлена взаимная блокировка, вызванная фоновым потоком проверки отмены. #84203 (Antonio Andelic).
  • Исправлена взаимная блокировка при остановке из-за рекурсивной блокировки контекста во время очистки library bridge. #83824 (Azat Khuzhin).
  • Исправлен сбой в клиенте из-за того, что после некорректного INSERT соединение оставалось разорванным. #83842 (Azat Khuzhin).
  • Исправлено возможное UB (сбои) в случае MEMORY_LIMIT_EXCEEDED при десериализации String. #85440 (Azat Khuzhin).
  • Исправлен редкий сбой в асинхронных вставках, изменяющих настройки log_comment или insert_deduplication_token. #85540 (Anton Popov).

Исправления для Glue и каталогов

  • Исправлена ошибка в интеграции с Glue Catalog. Теперь ClickHouse может читать таблицы со вложенными типами данных, где некоторые подстолбцы имеют тип Decimal, например: map<string, decimal(9, 2)>. Исправляет #81301. #82114 (alesapin).
  • ClickHouse теперь читает таблицы из Glue Catalog, у которых тип таблицы указан в нижнем регистре. #84316 (alesapin).
  • Unity Catalog теперь игнорирует схемы с некорректными типами данных для таблиц, не являющихся Delta-таблицами. Исправляет #85699. #85950 (alesapin).

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

  • Функции trim{Left,Right,Both} теперь поддерживают входные строки типа FixedString(N). Например, теперь работает SELECT trimBoth(toFixedString('abc', 3), 'ac'). #82691 (Robert Schulze).
  • Если функция trim вызывается только с константными аргументами, она теперь возвращает константную строку. (Ошибка #78796). #82900 (Robert Schulze).
  • Исправлен некорректный результат функции formatDateTime, когда форматтер %f используется вместе с форматтерами переменной длины (например, %M). #83020 (Robert Schulze).
  • Исправлена ошибка при использовании аргументов NULL в функции CASE. #82436 (Yarik Briukhovetskyi).
  • Функция lowCardinalityKeys больше не использует несвязанные части общего словаря. #83118 (Alexey Milovidov).
  • Исправлена работа функций colorSRGBToOKLCH/colorOKLCHToSRGB для сочетания константных и неконстантных аргументов. #83906 (Azat Khuzhin).
  • Исправлено некорректное создание пустых Tuple в функции array(). Это исправляет #84202. #84297 (Amos Bird).
  • Исправлена ошибка, приводившая к некорректному кодированию и декодированию Bech32. Изначально её не удалось обнаружить, потому что онлайн-реализация алгоритма, использовавшаяся для тестирования, имела ту же проблему. #84257 (George Larionov).

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

  • Разрешалось параллельное распределённое INSERT SELECT с LIMIT, что некорректно и приводило к дублированию данных в целевой таблице. #84477 (Igor Nikonov).
  • Не пытаться заменять табличные функции их кластерными альтернативами при наличии JOIN или подзапроса. #84335 (Konstantin Bogdanov).
  • Добавлена проверка на использование коррелированного подзапроса в распределённом контексте, чтобы избежать аварийного завершения. Исправляет #82205. #85030 (Dmitry Novik).
  • Использование distributed_depth как индикатора функции *Cluster было некорректным и могло приводить к дублированию данных; вместо этого теперь используется client_info.collaborate_with_initiator. #85734 (Konstantin Bogdanov).
  • Добавлена поддержка глобальных констант из оператора WITH для параллельного распределённого INSERT SELECT с целевой таблицей Distributed. Ранее запрос мог завершиться ошибкой Unknown expression identifier. #85811 (Nikolai Kochetov).
  • Исправлена логическая ошибка при попытке выполнить CREATE ... AS (SELECT * FROM s3Cluster(...)) с DatabaseReplicated. #85904 (Konstantin Bogdanov).
  • Добавлены проверки sharding_key при выполнении ALTER для таблицы Distributed. Ранее некорректный ALTER приводил к повреждению определения таблицы и сбою при перезапуске сервера. #86015 (Nikolay Degterinsky).

Исправления метрик и мониторинга

  • Исправлена проверка настроек асинхронных метрик asynchronous_metrics_update_period_s и asynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan).
  • Исправлены метрики IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles (ранее они включались в метрику без префикса Cache). #83730 (Azat Khuzhin).
  • Исправлен LOGICAL_ERROR в QueryMetricLog: mutex не может быть NULL. #82979 (Pablo Marcos).
  • Исправлены некорректные метрики KafkaAssignedPartitions и KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
  • Исправлено занижение статистики обработанных байтов при использовании PREWHERE (явно или автоматически). #85495 (Michael Kolupaev).
  • Исправлен дрейф учёта памяти в фоновом пуле планировщика и исполнителе. #84946 (Azat Khuzhin).

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

  • Исправлены случаи, когда разбор Time мог вызывать проблемы с msan. Исправление: #82477. #82514 (Yarik Briukhovetskyi).
  • Исправлена сортировка значений NaN для типа LowCardinality(Float32|Float64|BFloat16). #83786 (Pervakov Grigorii).
  • Исправлено переполнение для больших значений (>2106-02-07) при приведении Date к DateTime64. #83982 (Yarik Briukhovetskyi).
  • Исправлена проблема с неявным чтением отрицательных значений Time в таблицу, а также сделана документация менее запутанной. #83091 (Yarik Briukhovetskyi).
  • Кодек DoubleDelta теперь можно применять только к столбцам числовых типов. В частности, столбцы FixedString больше нельзя сжимать с помощью DoubleDelta. (исправляет #80220). #84383 (Jimmy Aguilar Mena).
  • Исправлена потеря точности в JSONExtract при преобразовании чисел JSON в десятичные типы. Теперь числовые значения JSON сохраняют точное десятичное представление, что позволяет избежать ошибок округления чисел с плавающей запятой. #85665 (ssive7b).

Управление памятью и ресурсами

  • Исправлен некорректный учет памяти, связанный с max_untracked_memory. #83607 (Azat Khuzhin).
  • async_read_counters больше не используются совместно между запросами. #83423 (Azat Khuzhin).
  • Исправлены возможные ошибки неинициализированного File Cache при использовании его в качестве временного хранилища данных. #83539 (Bharat Nallan).
  • filesystem_prefetches_limit теперь применяется всегда (а не только из MergeTreePrefetchedReadPool). #83999 (Azat Khuzhin).

Исправления конфигурации и настроек

  • При передаче настроек через URI учитывается последнее значение. #82137 (Sema Checherinda).
  • Исправлены гонки данных в клиенте (за счёт отказа от использования глобального контекста) и переопределения session_timezone (ранее, если session_timezone был задан, например, в users.xml/параметрах клиента как непустой, а в контексте запроса — как пустой, использовалось значение из users.xml, что было неверно; теперь контекст запроса всегда имеет приоритет над глобальным контекстом). #82444 (Azat Khuzhin).
  • Запрещено устанавливать threadpool_writer_pool_size в ноль, чтобы операции сервера не зависали. #82532 (Bharat Nallan).
  • Устранено незначительное целочисленное переполнение в конфигурации настройки role_cache_expiration_time_seconds (проблема #83374). #83461 (wushap).
  • Запрещено задавать max_insert_block_size равным нулю, так как это могло вызывать логическую ошибку. #83688 (Bharat Nallan).
  • Исправлен бесконечный цикл в estimateCompressionRatio() при block_size_bytes=0. #83704 (Azat Khuzhin).
  • Параметры вроде date_time_input_format просто игнорировались при использовании HTTP с multipart. #85570 (Sema Checherinda).

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

  • Ранее определения движка таблицы MongoDB могли включать компонент пути в аргументе host:port, который молча игнорировался. Интеграция MongoDB отказывалась загружать такие таблицы. Благодаря этому исправлению теперь такие таблицы можно загружать, а компонент пути игнорируется, если у движка MongoDB пять аргументов, при этом используется имя базы данных из аргументов. Примечание: Исправление не применяется к вновь создаваемым таблицам и запросам с табличной функцией mongo, а также к источникам словарей и именованным коллекциям. #81942 (Vladimir Cherkasov).

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

  • В предыдущих версиях server возвращал слишком много данных в ответ на запросы к /js. Это исправление закрывает #61890. #81895 (Alexey Milovidov).
  • Исправлен InterpreterInsertQuery::extendQueryLogElemImpl: при необходимости к именам баз данных и таблиц снова добавляются обратные кавычки (например, если имена содержат специальные символы, такие как -). #81528 (Ilia Shvyrialkin).
  • Исправлено возможное состояние гонки между потоком подсказок и основным потоком клиента. #82233 (Azat Khuzhin).
  • Исправлена безопасность при исключениях при переписывании union/intersect/except_default_mode. Закрывает #82664. #82820 (Alexey Milovidov).
  • При использовании реализации Database без кэширования метаданные соответствующей таблицы удаляются после возврата столбцов, а ссылка аннулируется. #82939 (buyval01).
  • Вызов onprogress в JSONEachRowWithProgress теперь синхронизирован с финализацией. #83879 (Sema Checherinda).
  • Исправлена редкая ошибка, из-за которой запрос MATERIALIZE COLUMN мог приводить к появлению неожиданных файлов в checksums.txt и, как следствие, к переходу частей данных в состояние detached. #84007 (alesapin).
  • Исправлена обработка исключений при периодическом обновлении частей. #84083 (Azat Khuzhin).
  • Исправлена генерация имён столбцов для булевых литералов: теперь вместо “1”/“0” используются “true”/“false”, что предотвращает конфликты имён столбцов между булевыми и целочисленными литералами в запросах. #84945 (xiaohuanlin).
  • Исправлены возможные проблемы с некорректной сортировкой в движке таблицы Merge. #85025 (Xiaozhe Yu).
  • Реализованы недостающие API для DiskEncrypted. #85028 (Azat Khuzhin).
  • Добавлена настройка для обратной совместимости, позволяющая новому analyzer ссылаться на внешний псевдоним в секции WITH при конфликтах имён. Исправляет #82700. #83797 (Dmitry Novik).
  • Разрешена ссылка на любую таблицу в аргументе view(...) табличной функции remote при включенном analyzer. Исправлено #78717. Исправлено #79377. #83844 (Dmitry Novik).
  • Исправлена запись в режиме append (в MergeTree, используемом для экспериментальных транзакций) с типами метаданных plain_rewritable/plain, которые ранее просто игнорировались. #83695 (Tuan Pham Anh).
  • Исправлено использование logger в IAccessStorage. #84365 (Konstantin Bogdanov).
  • Исправлено отсечение файлов по виртуальному столбцу в озерах данных. #84520 (Kseniia Sumarokova).
  • Исправлена проблема, при которой запрос к удалённому источнику с задержкой мог приводить к выходу за пределы вектора. #84820 (George Larionov).
  • Корректное сохранение всех настроек в метаданных таблицы для движка object queue. #84860 (Antonio Andelic).
  • Исправлена ошибка CORRUPTED_DATA, возникавшая при использовании ленивых столбцов с внешней сортировкой. #84738 (János Benjamin Antal).
  • Убраны лишние вызовы getStatus() при выполнении запросов SYSTEM DROP REPLICA. Исправлен случай, когда таблица удаляется в фоновом режиме и генерируется исключение Shutdown for storage is called. #85220 (Nikolay Degterinsky).
  • Добавлены недостающие проверки длины имени таблицы в запросах CREATE OR REPLACE и RENAME. #85326 (Michael Kolupaev).
  • Исправлены сбой и повреждение данных при ALTER UPDATE для JSON. #85383 (Pavel Kruglov).
  • Исправлен segfault в coalescing merge tree при работе с большими строками. Это закрывает #84582. #85709 (scanhex12).
  • Исправлен send_logs_source_regexp (после рефакторинга асинхронного логирования в #85105). #85797 (Azat Khuzhin).
  • Исправлена возможная несогласованность в словарях с update_field при ошибках MEMORY_LIMIT_EXCEEDED. #85807 (Azat Khuzhin).
  • Исправлены HTTP-запросы, выполняемые табличной функцией url(), чтобы при обращении к нестандартным портам они корректно включали номера портов в заголовок Host. Это устраняет ошибки аутентификации при использовании предварительно подписанных URL с S3-совместимыми сервисами, такими как MinIO, работающими на нестандартных портах, что часто встречается в средах разработки. (Исправляет #85898). #85921 (Tom Quist).
Последнее изменение 10 июня 2026 г.