Обратно несовместимые изменения
Изменения в 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добавлен новый argumentunexpected_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).
Функции
- Добавлен
NumericIndexedVector— новая векторная структура данных, использующая сжатие bit-sliced и roaring-bitmap, а также более 20 функций для построения, анализа и покомпонентной арифметики. Позволяет сократить объём хранилища и ускорить JOIN, фильтрацию и агрегации на разреженных данных. Реализует #70582 и статью “Large-Scale Metric Computation in Online Controlled Experiment Platform” авторов T. Xiong и Y. Wang, представленную на VLDB 2024. #74193 (FriendLey). - Добавлены финансовые функции:
financialInternalRateOfReturnExtended(XIRR),financialInternalRateOfReturn(IRR),financialNetPresentValueExtended(XNPV),financialNetPresentValue(NPV). #81599 (Joanna Hulboj). - Добавлены геопространственные функции
polygonIntersectsCartesianиpolygonIntersectsSphericalдля проверки пересечения двух многоугольников. #81882 (Paul Lamb). - Добавлена поддержка оконных функций
lagиlead. Закрывает #9887. #82108 (Dmitry Novik). - Добавлены функции
colorSRGBToOkLCHиcolorOkLCHToSRGBдля преобразования цветов между пространствами sRGB и OkLCH. #83679 (Fgrtue). - Теперь можно выполнять регистронезависимый поиск по ключам JSON с помощью
JSONExtractCaseInsensitive(и других вариантовJSONExtract). #83770 (Alistair Evans). - Добавлена новая функция
nowInBlock64. #84178 (Halersson Paris). - Добавлена функция
dateTimeToUUIDv7, преобразующая значение DateTime в UUIDv7. Пример использования:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))возвращает0198af18-8320-7a7d-abd3-358db23b9d5c. #84319 (samradovich). - Добавлены агрегатные функции
timeSeriesDerivToGridиtimeSeriesPredictLinearToGridдля ресемплирования данных на временную сетку, заданную указанными начальной временной меткой, конечной временной меткой и шагом; они вычисляютderivиpredict_linearсоответственно, в стиле PromQL. #84328 (Stephen Chi). - Добавлены функции
timeSeriesRangeиtimeSeriesFromGrid. #85435 (Vitaly Baranov).
Системные таблицы
- Добавлена таблица
system.dead_letter_queueдля хранения ошибочных входящих сообщений из таких движков, как Kafka. #68873 (Ilya Golshtein). - Добавлена системная таблица
system.zookeeper_connection_logдля хранения исторической информации о соединениях с ZooKeeper. #79494 (János Benjamin Antal). - Добавлена новая системная таблица
system.codecsдля просмотра доступных кодеков. (issue #81525). #81600 (Jimmy Aguilar Mena). - Добавлена таблица
system.completions. Закрывает #81889. #83833 (|2ustam).
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/INNERJOIN будут автоматически преобразовываться в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).
Планирование и анализ запросов
- Ускорение QueryTreeHash. #82617 (Nikolai Kochetov).
Улучшения в логировании
- Добавлено асинхронное логирование. #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и совместимый со STLJemallocNodumpSTLAllocator. Оба представляют собой обертки над аллокатором 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 есть APIExpressionVisitor, реализованное в этом 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
- Добавлен ручной подсчёт потреблённых сообщений, чтобы не зависеть от ранее зафиксированного смещения в StorageKafka2. #81662 (János Benjamin Antal).
- Добавлена интеграция
StorageKafka2сsystem.kafka_consumers. #82652 (János Benjamin Antal).
Улучшения 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и его aliasREGEXP_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).