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

Список изменений v25.8 для Cloud

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

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

  • По умолчанию отключено заключение 64-битных целых чисел в кавычки в форматах JSON. #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 в формате вывода Parquet. #84169 (Pavel Kruglov).

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

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

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

  • Добавлен новый аргумент unexpected_quoting_character_strategy в функцию extractKeyValuePairs, который определяет поведение при неожиданном обнаружении 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).
  • Отложенная материализация включена только при использовании анализатора, чтобы избежать поддержки режима без анализатора, в котором возможны некоторые проблемы (например, при использовании 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).
  • Поддержка записи для каталогов Iceberg REST. #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 (размеры столбцов, нижние и верхние границы) в метаданные (записи манифеста) для min-max-фильтрации. #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).

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

  • Добавлен параметр extra_credentials в AzureBlobStorage для аутентификации по client_id и tenant_id. #84235 (Pablo Marcos).

Keeper

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

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

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

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

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

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

Обновления статуса зрелости функций

  • Каталог переведен в стадию beta. #85848 (Melvyn Peignon).
  • Легковесные обновления переведены из экспериментальной в стадию beta. #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).
  • Вычислять сериализованный ключ столбцово при группировке по нескольким строковым или числовым столбцам. #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>, чтобы избежать вычисления хеша при каждом обращении к флагам. #83043 (Nikita Taranov).
  • Обработка max_joined_block_rows перенесена за пределы основного цикла HashJoin. Небольшой прирост производительности для ALL JOIN. #83216 (Nikolai Kochetov).
  • Память для результирующих столбцов больше не предварительно выделяется, когда HashJoin использует режим ленивого (lazy) вывода. Это неоптимально, особенно когда число совпадений невелико. Более того, после завершения JOIN мы знаем точное количество совпадений и можем выполнить более точное предварительное выделение. #83304 (Nikita Taranov).
  • Все LEFT/INNER JOIN будут автоматически преобразованы в RightAny, если правая сторона функционально определяется столбцами ключа JOIN (все строки имеют уникальные значения ключа JOIN). #84010 (Nikita Taranov).
  • Улучшена производительность применения частей-патчей (patch parts) в режиме Join. #85040 (Anton Popov).

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

  • Добавлена опция вынесения (де)сжатия и (де)сериализации блоков в конвейерные потоки (pipeline threads) вместо единственного потока, связанного с сетевым соединением. Управляется настройкой 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).
  • Параметр merge_tree_min_{rows,bytes}_for_seek теперь учитывается в filterPartsByQueryConditionCache, чтобы привести его в соответствие с другими методами, фильтрующими по индексам. #80312 (李扬).
  • Сначала обрабатываются min-max индексы с более высокой гранулярностью. Закрывает #75381. #83798 (Maruth Goyal).
  • Индекс Bloom-фильтра теперь используется для условий вида has([c1, c2, ...], column), где column не имеет тип Array. Это повышает производительность таких запросов, делая их столь же эффективными, как оператор IN. #83945 (Doron David).
  • Индексы обрабатываются в порядке увеличения размера файла. Итоговый порядок индексов отдаёт приоритет min-max и векторным индексам (из-за простоты и избирательности соответственно), а затем — небольшим индексам. Среди min-max и векторных индексов также предпочитаются более компактные индексы. #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 теперь кэширует и повторно использует токены аутентификации управляемой учётной записи (managed identity), когда это возможно, чтобы избежать ограничения частоты запросов. #79860 (Nick Blakely).
  • HTTP‑клиент curl заменён на HTTP‑клиент poco для Azure Blob Storage. Добавлено несколько настроек для этих клиентов, аналогичных настройкам для 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. В целом работает быстрее и поддерживает проталкивание фильтров на уровне страниц и PREWHERE. Пока носит экспериментальный характер. Используйте настройку input_format_parquet_use_native_reader_v3 для включения. #82789 (Michael Kolupaev).
  • Повышена производительность входного формата ProtobufSingle за счёт повторного использования сериализатора при отсутствии ошибок разбора. #83613 (Eduard Karacharov).

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

  • Существенно улучшена производительность чтения подстолбцов JSON из общих данных (shared data) в 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 для уменьшения ложного совместного использования (false sharing). #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

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

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

  • Улучшена параллельная обработка файлов с использованием бэкенда 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 для пометки страниц памяти как "don't dump". Используются для учётных данных 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 для настройки стратегии backoff при повторных попытках доступа к S3, используемой во время операций резервного копирования и восстановления. #84421 (Julia Kartseva).
  • Добавить новую настройку backup_slow_all_threads_after_retryable_s3_error для снижения нагрузки на S3 во время штормов повторных попыток, вызванных ошибками, такими как SlowDown, за счет замедления всех потоков после возникновения первой такой повторяемой ошибки. #84854 (Julia Kartseva).

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

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

Табличный движок Iceberg

  • Добавлена поддержка позиционных удалений для табличного движка Iceberg. #80237 (YanghongZhong).
  • Теперь ClickHouse поддерживает сжатые файлы metadata.json в Iceberg. Исправляет #70874. #81451 (alesapin).
  • Исправлено чтение Iceberg по ID полей для сложных типов. #84821 (scanhex12).
  • Добавлена поддержка записи в формате Iceberg, совместимой с pyiceberg. #84466 (scanhex12).
  • Добавлено хранение версии snapshot для табличных движков озер данных. #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 также позволит реализовать отсечение по статистике и некоторые проприетарные функции delta-lake. Дополнительно, цель этого изменения — поддержать отсечение партиций в движке таблиц DeltaLakeCluster (результат разобранного выражения — ActionsDAG — будет сериализован и отправлен с инициатора вместе с путём к данным, поскольку такого рода информация, необходимая для отсечения, доступна только как метаинформация при получении списка файлов с данными, которое выполняется только инициатором, но должна применяться к данным на каждом сервере, выполняющем чтение). #81136 (Kseniia Sumarokova).
  • Исправлено отсечение партиций в функциях кластера озера данных. #82131 (Kseniia Sumarokova).
  • Исправлено чтение партиционированных данных в табличной функции DeltaLakeCluster. В этом PR увеличена версия протокола кластерных функций, что позволяет передавать дополнительную информацию от инициатора к репликам. Эта дополнительная информация содержит выражение преобразования delta-kernel, которое необходимо для разбора столбцов партиций (и некоторых других вещей в будущем, например, сгенерированных столбцов и т.д.). #82132 (Kseniia Sumarokova).
  • Теперь база данных Datalake выбрасывает более удобное исключение. Исправляет #81211. #82304 (alesapin).
  • Реализована внутренняя фильтрация delta-kernel-rs (статистика и отсечение партиций) в хранилище DeltaLake. #84006 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_enable_expression_visitor_logging для отключения логов ExpressionVisitor, так как они могут быть слишком подробными даже для тестового уровня логирования при отладке. #84315 (Kseniia Sumarokova).
  • Добавлена настройка delta_lake_snapshot_version, позволяющая читать конкретную версию снимка в движке таблиц DeltaLake. #85295 (Kseniia Sumarokova).

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

  • Ускорено получение списка таблиц в каталогах данных за счёт асинхронных запросов. #81084 (alesapin).
  • Добавлена поддержка TimestampTZ в каталоге Glue. Закрывает #81654. #83132 (scanhex12).
  • Разделён FormatParserGroup на две независимые структуры: первая отвечает за общие вычислительные и I/O‑ресурсы, вторая — за общие ресурсы фильтрации (filter ActionDag, KeyCondition). Это сделано для более гибкого совместного использования этих структур разными потоками. #83997 (Daniil Ivanik).
  • Добавлен отсутствующий partition_columns_in_data_file в конфигурацию Azure. #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), чтобы избежать проблем с ограничениями max_remote_read_network_bandwidth_for_server и max_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov).
  • В этом PR к механизму повторных попыток S3 добавлен джиттер при включённой конфигурации s3_slow_all_threads_after_network_error. #81849 (zoomxi).
  • Реализована аутентификация AWS S3 с явным указанием роли IAM. Реализован OAuth для GCS. Ранее эти возможности были доступны только в ClickHouse Cloud, а теперь открыты в виде open source. Синхронизированы некоторые интерфейсы, такие как сериализация параметров подключения для объектных хранилищ. #84011 (Alexey Milovidov).
  • Разрешено использовать любую политику хранения (то есть объектное хранилище, такое как 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).
  • Поддерживается изменение настроек вставки в материализованные представления на уровне таблицы S3Queue. Добавлены новые настройки уровня S3Queue: min_insert_block_size_rows_for_materialized_views и min_insert_block_size_bytes_for_materialized_views. По умолчанию используются настройки уровня профиля, а настройки уровня S3Queue их переопределяют. #83971 (Kseniia Sumarokova).
  • Исправлен режим упорядоченной обработки S3Queue: более раннее завершение, если была запрошена остановка. #84463 (Kseniia Sumarokova).

Интеграция с Kafka

Улучшения ClickHouse Keeper

  • Улучшение Keeper: перенос файлов журнала изменений между дисками в фоновом потоке. Ранее перенос журнала изменений на другой диск глобально блокировал Keeper до завершения операции. Это приводило к снижению производительности, если перенос занимал много времени (например, на диск S3). #82485 (Antonio Andelic).
  • Улучшение Keeper: добавлена новая настройка keeper_server.cleanup_old_and_ignore_new_acl. Если она включена, на всех узлах ACL будут очищены, а ACL для новых запросов будут игнорироваться. Если цель — полностью удалить ACL с узлов, важно оставить эту настройку включённой до создания нового снимка состояния (snapshot). #82496 (Antonio Andelic).
  • Улучшение Keeper: поддержка отдельных прав доступа для ACL world:anyone. #82755 (Antonio Andelic).
  • Добавлена поддержка указания дополнительных ACL Keeper для путей в конфиге. Если нужно добавить дополнительные ACL для конкретного пути, определите их в конфиге в секции zookeeper.path_acls. #82898 (Antonio Andelic).
  • Добавлен ProfileEvent в случае, когда Keeper отклоняет запись из-за мягкого ограничения по памяти. #82963 (Xander Garbett).
  • В Keeper по умолчанию включены feature-флаги 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

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

Форматы Parquet и ORC

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

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

  • Добавлена новая настройка enable_add_distinct_to_in_subqueries. Когда она включена, ClickHouse автоматически добавляет DISTINCT к подзапросам в выражениях IN для распределённых запросов. Это может значительно сократить размер временных таблиц, передаваемых между сегментами, и повысить эффективность использования сети. Примечание: это компромисс — хотя сетевой трафик уменьшается, на каждом узле требуется дополнительная работа по слиянию (удалению дублей). Включайте эту настройку, когда узким местом является передача по сети и стоимость слияния приемлема. #81908 (fhw12345).
  • Добавлена поддержка табличных функций remote-() с параллельными репликами, если кластер указан в аргументе 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).
  • Общие и пользовательские ограничители сетевой пропускной способности больше не сбрасываются, что гарантирует, что ограничения 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. Если настройка отсутствует в запросе создания реплицируемой БД (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. #80779 (Xander Garbett).
  • Добавлены метрики MarkCacheEvictedBytes, MarkCacheEvictedMarks, MarkCacheEvictedFiles для отслеживания удалений из кеша меток (mark cache). (issue #60989). #80799 (Shivji Kumar Jha).
  • Таблица system.formats теперь содержит расширенную информацию о форматах, такую как тип содержимого HTTP (Content-Type), возможности автоматического вывода схемы (schema inference) и т. д. #81505 (Alexey Milovidov).
  • Добавлена поддержка очистки всех предупреждений из таблицы system.warnings с помощью TRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov).
  • В system.licenses теперь перечисляются лицензии Rust-crate'ов. #82440 (Raúl Marín).
  • Сложные выражения в КНФ/ДНФ, например (a < 1 and a > 0) or b = 3, теперь оцениваются по статистике. #82663 (Han Fei).
  • В некоторых случаях нам нужны многомерные метрики. Например, подсчёт неудачных слияний или мутаций по кодам ошибок, а не одним счётчиком. #83030 (Miсhael Stetsyuk).
  • Добавлены метрики ресурсов процесса (такие как UserTimeMicroseconds, SystemTimeMicroseconds, RealTimeMicroseconds) в события профиля part_log для записей MergeParts. #83460 (Vladimir Cherkasov).
  • Теперь метрики на уровне cgroup и системные метрики сообщаются вместе. Метрики уровня cgroup имеют имена вида CGroup<Metric>, а метрики уровня ОС (собираемые из procfs) имеют имена вида OS<Metric>. #84317 (Nikita Taranov).
  • Добавлены многомерные (dimensional) метрики для мониторинга размера параллельных ограниченных очередей, помеченных типом очереди и ID экземпляра для улучшения обсервабилити. #84675 (Miсhael Stetsyuk).
  • Таблица system.columns теперь предоставляет column в качестве синонима для существующего столбца name. #84695 (Yunchi Pang).
  • В system.errors добавлен строковый столбец шаблона формата (format string column). Этот столбец нужен для группировки по одному типу ошибки в правилах оповещений. #84776 (Miсhael Stetsyuk).
  • Сделаны настраиваемыми лимиты для Async Log и добавлена возможность интроспекции. #85105 (Raúl Marín).
  • При получении размеров столбцов таблиц для system.columns теперь игнорируется UNKNOWN_DATABASE. #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 для реплицируемых баз данных, позволяющая задавать значение по умолчанию параметра logs_to_keep для таких баз. Меньшие значения уменьшают количество узлов ZooKeeper (особенно полезно при большом числе баз данных), а большие позволяют отсутствующим репликам догонять после более длительных периодов простоя. #84183 (Alexey Khatskevich).
  • Изменено значение по умолчанию настройки реплицируемой базы данных Replicated max_retries_before_automatic_recovery на 10, что в некоторых случаях обеспечивает более быстрое восстановление. #84369 (Alexander Tokmakov).
  • Оптимизированы DDL-операции refreshable materialized view в реплицируемых базах данных для не-append-сценариев за счёт пропуска создания и переименования старых временных таблиц. #84858 (Tuan Pham Anh).

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

SystemAndInternalImprovements

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

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

  • Функция addressToSymbol и таблица system.symbols будут использовать смещения в файле вместо адресов в виртуальной памяти. #81896 (Alexey Milovidov).
  • Старайтесь сохранять имена элементов при выведении супертипов для именованных кортежей. #81345 (lgbo).
  • Разрешено смешивать разные правила сравнения строк (collations) для одного и того же столбца в разных окнах. #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).
  • Исправлена ошибка в exception safety функции stem, которая в редких случаях могла приводить к утечкам памяти. #85063 (Alexey Milovidov).
  • Исправлена функция initcap для аргументов типа FixedString, чтобы корректно распознавать начало слов в начале строк, если предыдущая строка в блоке заканчивалась буквенно-цифровым символом. #85063 (Alexey Milovidov).
  • Исправлена уязвимость безопасности в формате Apache ORC, которая могла приводить к раскрытию неинициализированной памяти. #85063 (Alexey Milovidov).
  • Изменено поведение replaceRegexpAll и его алиаса REGEXP_REPLACE, чтобы разрешить пустые совпадения в конце строк, даже если предыдущее совпадение охватывало всю строку целиком (например, ^a*|a*$ или ^|.*), что согласуется с семантикой JavaScript, Perl, Python, PHP и Ruby, но отличается от PostgreSQL. #85063 (Alexey Milovidov).
  • Оптимизирована и упрощена реализация целого ряда функций обработки строк. Исправлена неверная документация для нескольких функций. Примечание: результат byteSize для столбцов типа String и сложных типов, содержащих столбцы типа String, изменился с 9 байт за пустую строку на 8 байт за пустую строку, что и является ожидаемым поведением. #85063 (Alexey Milovidov).
  • Разрешено значение шага 0 в функциях timeSeries*ToGrid(). Это часть #3 из https://github.com/ClickHouse/ClickHouse/pull/75036. #85390 (Vitaly Baranov).
  • Реализована поддержка внутренних массивов в функции nested. #85719 (Nikolai Kochetov).

Улучшения MergeTree

  • Более тонкое управление отключением пропускающих индексов, которые зависят от столбцов, обновляемых «на лету» или с помощью patch parts. Теперь пропускающие индексы не используются только в частях, затронутых мутациями «на лету» или patch parts; ранее эти индексы отключались для всех частей. #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) на общее количество несжатых байт в patch parts. Оно предотвращает существенное замедление запросов SELECT после легковесных обновлений и возможное неправильное использование легковесных обновлений. #85641 (Anton Popov).

Кэш и управление памятью

  • Исправлена логическая ошибка в кэше файловой системы: «Having zero bytes but range is not finished». #81868 (Kseniia Sumarokova).
  • Добавлено rendezvous-хеширование для улучшения локальности кэша. #82511 (Anton Ivashkin).
  • Проведен рефакторинг механизма динамического изменения размера кэша файловой системы. Добавлено больше логов для анализа работы. #82556 (Kseniia Sumarokova).
  • Снижены накладные расходы на отслеживание использования памяти запросом для исполняемых пользовательских функций (UDF). #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 views, которые содержат некорректные SELECT-запросы, и пользователь мог получить непонятное исключение std::exception вместо осмысленной ошибки с понятным объяснением. Теперь это исправлено. Исправляет: #82889. #83190 (Nikita Mikhaylov).
  • Не выводить очень длинные описания операций выражений в сообщениях об исключениях. Закрывает #83164. #83350 (Alexey Milovidov).
  • При завершении работы хранилища getStatus генерирует исключение ErrorCodes::ABORTED. Ранее это приводило к ошибке запроса SELECT. Теперь мы перехватываем исключения ErrorCodes::ABORTED и намеренно их игнорируем. #83435 (Miсhael Stetsyuk).
  • Сообщения об исключениях для некоторых ситуаций при загрузке и добавлении PROJECTION сделаны более читаемыми. #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, теперь возвращает false для cross join. #82379 (lgbo).
  • Разрешена запись/чтение столбцов map как массива кортежей. #82408 (MikhailBurdukov).
  • Этот PR был откатан. #82884 (Mithun p).
  • Асинхронные логи: ограничено максимальное количество записей, удерживаемых в очереди. #83214 (Raúl Marín).
  • Включена поддержка Date/Date32 как целых чисел во входных форматах JSON. #83597 (MikhailBurdukov).
  • Улучшена поддержка индексов Bloom filter (обычных, ngram и token), чтобы они использовались в случаях, когда первый аргумент — константный массив (множество), а второй — индексируемый столбец (подмножество), что обеспечивает более эффективное выполнение запросов. #84700 (Doron David).
  • Разрешено приведение типов значений множеств при проталкивании фильтров IN / GLOBAL IN к первичным ключам хранилищ KeyValue (например, EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • Исключены полные сканы для случаев, когда анализ индекса даёт пустые диапазоны при параллельном чтении реплик. #84971 (Eduard Karacharov).
  • Исправлен ряд проблем, которые могут возникать при попытке запускать интеграционные тесты на локальном хосте. #82135 (Oleg Doronin).
  • Параметр trace_log.symbolize по умолчанию включён для старых развертываний. #85456 (Azat Khuzhin).

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

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

  • Исправлена деградация производительности в SummingMergeTree, которая появилась в 25.5 в результате изменений из https://github.com/ClickHouse/ClickHouse/pull/79051. #82130 (Pavel Kruglov).
  • Исправлена деградация производительности с включённым analyzer, когда вторичные запросы всегда читают все столбцы из 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 в левом аргументе и результатом подзапроса, не допускающим NULL. #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).
  • Отключено отсечение файлов на основе границ для элементов массивов Iceberg и значений карт Iceberg, включая все их вложенные подполе. #83520 (Daniil Ivanik).
  • Исправлена запись в Iceberg для сложных типов. #85330 (scanhex12).
  • Запись нижних и верхних границ не поддерживается для сложных типов. #85332 (scanhex12).
  • Исправлена поддержка NULL для полей в Iceberg. #85977 (scanhex12).
  • Больше не создаётся пустой файл удаления Iceberg. #86061 (scanhex12).
  • Обновляется временная метка метаданных при записях в Iceberg. #85711 (scanhex12).
  • Spark не может читать файлы position delete. #85762 (scanhex12).
  • Схема больше не берётся из manifest-файлов; вместо этого соответствующие схемы для каждого snapshot теперь хранятся независимо. Соответствующая схема для каждого data-файла выводится из его snapshot. Предыдущее поведение нарушало спецификацию Iceberg для записей manifest-файлов со статусом existing. #84588 (Daniil Ivanik).
  • Теперь Iceberg не пытается кэшировать актуальную версию snapshot между SELECT-запросами и каждый раз заново определяет snapshot. Более ранняя попытка кэширования snapshot Iceberg приводила к проблемам при использовании таблицы Iceberg с возможностью «time travel». #85038 (Daniil Ivanik).
  • Исправлено разрешение метаданных при выполнении запросов к таблицам Iceberg через REST-каталог. ... #85531 (Saurabh Kumar Ojha).
  • Исправлено маскирование секретов в табличных функциях icebergS3Cluster и icebergAzureCluster. #85658 (MikhailBurdukov).

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

  • Исправлено отсечение неиспользуемых столбцов (column pruning) с использованием delta-kernel в хранилище DeltaLake. Закрывает #84543. #84745 (Kseniia Sumarokova).
  • Исправлено обновление учетных данных (credentials) в delta-kernel в хранилище DeltaLake. #84751 (Kseniia Sumarokova).
  • Исправлена ошибка сегментирования (segfault) в реализации delta-kernel. #85160 (Kseniia Sumarokova).
  • Исправлено состояние гонки (race condition) в реализации 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 из кэша для DeltaLake. #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. #81690 (Azat Khuzhin).
  • Исправлен LOGICAL_ERROR и последующее аварийное завершение работы при использовании одного и того же столбца в TTL для GROUP BY и SET. #82054 (Pablo Marcos).
  • MergeTree теперь не выполняет действий, связанных с TTL, если все TTL удалены из таблицы. #84441 (alesapin).
  • Исправлено отсутствие проверки столбцов TTL в ключах сортировки при ALTER MODIFY ORDER BY. Столбцы 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', и пользователь выполнял легковесное удаление, удаляющее ВСЕ строки из любого блока в таблице. #84158 (alesapin).
  • Исправлено резервное копирование частей с повреждёнными проекциями. #85362 (Antonio Andelic).
  • В релизах до стабилизации запрещено использование столбца _part_offset в проекциях. #85372 (Sema Checherinda).

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

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

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

  • Исправлено сокрытие значений именованных коллекций в журналах/query_log. Исправляет #82405. #82510 (Kseniia Sumarokova).
  • Установлена соль для данных аутентификации при разборе из 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 (Константин Богданов).
  • Добавлено маскирование учетных данных для deltaLakeAzure, deltaLakeCluster, icebergS3Cluster и icebergAzureCluster. #85889 (Julian Maicher).
  • Исправлена ошибка, допущенная в #79963. При вставке в materialized view с 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-фильтре Parquet, при которой условие вида WHERE function(key) IN (...) ошибочно применялось как WHERE key IN (...). #81255 (Michael Kolupaev).
  • Исправлена ошибка в модуле записи Parquet, приводившая к сохранению некорректной статистики (min/max) для типов Decimal. #83754 (Michael Kolupaev).
  • Исправлена десериализация groupArraySample/groupArrayLast в случае пустых элементов (десериализация могла пропускать часть бинарных данных, если вход был пустым, что могло приводить к повреждению при чтении данных и UNKNOWN_PACKET_FROM_SERVER в протоколе TCP). Это не затрагивает числовые типы и типы даты/времени. #82763 (Pedro Ferreira).
  • Исправлена запись JSON-путей со значениями NULL в формате RowBinary. #83923 (Pavel Kruglov).

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

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

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

  • Исправлена функция 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 и мешает корректной инициализации реплицируемой базы данных на новой реплике. #83751 (Nikolay Degterinsky).
  • Исправлено создание RMV на новой реплике реплицируемой базы данных, если DEFINER был удалён. #85327 (Nikolay Degterinsky).
  • Исправлено восстановление реплицируемых баз данных, когда перемещение файла метаданных занимает много времени. #85177 (Tuan Pham Anh).
  • Реализовано принудительное восстановление реплицируемой базы данных после восстановления метаданных базы в Keeper. #85960 (Tuan Pham Anh).
  • Исправлена ошибка при восстановлении базы данных Replicated: если имя таблицы содержит символ %, во время восстановления таблица могла быть пересоздана с другим именем. #85987 (Alexander Tokmakov).
  • Теперь DDLWorker удаляет устаревшие хосты из набора реплик. Это уменьшит объём хранимых метаданных в 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. Его также можно задавать для конкретных endpoint'ов с использованием настроек на основе endpoint'ов. #83379 (Antonio Andelic).
  • Теперь пропускаются недоступные узлы при выполнении INSERT SELECT из s3Cluster() в реплицированный MergeTree. #83676 (Igor Nikonov).
  • Исправлено условие раннего выхода для замедления скорости запросов к S3: теперь для включения поведения замедления, когда все потоки приостановлены из-за повторяемой ошибки, требуется, чтобы было истинно хотя бы одно из 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

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

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

  • Исправлено избыточное пропускание гранул при фильтрации по token/ngram-индексам с регулярным выражением, содержащим альтернативы и нелитеральную первую альтернативу. #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 view пропускали запросы INSERT. #82222 (Nikolay Degterinsky).
  • После https://github.com/ClickHouse/ClickHouse/pull/79963 использование подстолбцов в materialized view было нарушено, и пользователь мог получать ошибку Not found column X in block. Это поведение исправлено. Исправлено в: #82784. #83221 (Nikita Mikhaylov).
  • Исправлена ошибка illegal_type_of_argument в materialized view, возникавшая при различии типов. #85135 (Sema Checherinda).

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

  • В AzureBlobStorage при нативном копировании (native copy) мы сравниваем методы аутентификации; если при этом возникает исключение, код обновлён так, чтобы выполнялся откат к чтению и копированию (т.е. к не нативному копированию, non-native copy). #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 (undefined behavior, приводящее к сбоям) в случае 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).
  • Исправлено некорректное построение пустых кортежей в функции array(). Это исправляет #84202. #84297 (Amos Bird).
  • Исправлена ошибка, приводившая к некорректному кодированию и декодированию Bech32. Изначально ошибка не была обнаружена, поскольку онлайн-реализация алгоритма, использованная для тестирования, имела ту же проблему. #84257 (George Larionov).

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

  • Параллельный распределённый 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: мьютекс не может быть 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 в типы Decimal. Теперь числовые значения JSON сохраняют своё точное десятичное представление, что позволяет избежать ошибок округления при вычислениях с плавающей запятой. #85665 (ssive7b).

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

  • Исправлена некорректная работа с памятью вокруг max_untracked_memory. #83607 (Azat Khuzhin).
  • Не использовать общие async_read_counters для разных запросов. #83423 (Azat Khuzhin).
  • Исправлены возможные ошибки «file cache not initialized», возникавшие при использовании кэша файлов как временного хранилища данных. #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).

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

  • В предыдущих версиях сервер возвращал лишний контент в ответ на запросы к /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 и в итоге — к отсоединению частей данных. #84007 (alesapin).
  • Обеспечена корректная обработка исключений при периодическом обновлении частей. #84083 (Azat Khuzhin).
  • Исправлена генерация имен столбцов для булевых литералов: теперь используются "true"/"false" вместо "1"/"0", что предотвращает конфликты имен столбцов между булевыми и целочисленными литералами в запросах. #84945 (xiaohuanlin).
  • Исправлены потенциальные проблемы с некорректной сортировкой в движке таблиц Merge. #85025 (Xiaozhe Yu).
  • Реализованы недостающие API для DiskEncrypted. #85028 (Azat Khuzhin).
  • Добавлена настройка обратной совместимости, позволяющая новому анализатору в случае конфликта имён ссылаться на внешний псевдоним в секции WITH. Исправляет #82700. #83797 (Dmitry Novik).
  • Разрешена возможность ссылаться на любую таблицу в аргументе view(...) табличной функции remote при включённом анализаторе. Исправлены #78717 и #79377. #83844 (Dmitry Novik).
  • Исправлена работа записи с добавлением (в MergeTree, используемом для экспериментальных транзакций) для типов метаданных plain_rewritable/plain, которые ранее просто игнорировались. #83695 (Tuan Pham Anh).
  • Исправлено использование логгера в IAccessStorage. #84365 (Konstantin Bogdanov).
  • Исправлено отсечение файлов по виртуальному столбцу в озёрах данных. #84520 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой при выполнении запроса к удалённому источнику с задержкой мог происходить выход за границы вектора. #84820 (George Larionov).
  • Корректно сохранять все настройки в метаданных таблицы движка очереди объектов. #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).
  • Исправлена ошибка сегментации в CoalescingMergeTree при работе с длинными строками. Закрывает #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).