Релиз ClickHouse 26.8 LTS, 2026-08-27, FIXME (в процессе)
Обратно несовместимое изменение
- Заголовок HTTP-запроса
X-ClickHouse-Formatтеперь явно задаёт формат ответа: это псевдоним настройкиoutput_format, поэтому он переопределяет предложениеFORMATзапроса и расширение пути. В предыдущих версиях он задавал значение по умолчанию, только если выходной формат не был указан, как параметрdefault_format. Это предоставляет “внеполосный” способ запросить данные в нужном формате. Он никогда не изменяет способ разбора тела запросаINSERT— для этого используйтеinput_formatилиformat. #105249 (Alexey Milovidov). - Числа JSON без кавычек для столбцов
DateTimeиDateTime64вJSONEachRowи аналогичных форматах теперь интерпретируются как Unix-временные метки с необязательной субсекундной точностью — как и вValues,CASTиtoDateTime64. Ранее дробное число, например1703363853.035, отклонялось, а целое число без кавычек, например1703363853, считывалось как исходное масштабированное значениеDateTime64, что приводило к временной метке1970-.... Строки в кавычках и собственный JSON-вывод ClickHouse не затронуты. #108091 (Alexey Milovidov). - Значение по умолчанию для
max_insert_threadsизменено с1наauto, что соответствует числу ядер ЦП, доступных серверу. ТеперьINSERT SELECTпо умолчанию выполняется параллельно, аmax_insert_threadsтакже может распараллеливать запись при обычномINSERT, если путь записи в пункт назначения допускает безопасное разветвление. Это может изменить количество частей, создаваемых такими запросами, и порядок вставляемых строк. Чтобы восстановить прежнее поведение, установитеmax_insert_threadsв1или задайте дляcompatibilityверсию ниже26.8. #109000 (Alexey Milovidov). #109006 (Alexey Milovidov). - Движки баз данных
PostgreSQLиMaterializedPostgreSQLтеперь учитываютremote_url_allow_hosts, как это уже делают движок таблицыPostgreSQL, табличная функцияpostgresqlи словари, созданные с помощью DDL. Если настроенremote_url_allow_hosts, командыCREATE DATABASEи выполняемые пользователемATTACH DATABASEтеперь отклоняют базы данныхPostgreSQLиMaterializedPostgreSQL, указывающие на недопустимые хосты, с ошибкойUNACCEPTABLE_URL. Существующие базы данных по-прежнему загружаются при запуске сервера. #111135 (Alexey Milovidov). - Экспериментальный кодек
ALP(STD)теперь выполняет арифметические операции масштабированияFloat32вFloat64. Это улучшает коэффициенты сжатия и устраняет сжатие десятичных данных с большим количеством исключений, но значенияFloat32, записанные более ранними версиями, теперь могут декодироваться с отличием в 1 ULP. #111627 (Raufs Dunamalijevs). - Удалён источник словаря
library.SOURCE(LIBRARY(...))теперь завершается ошибкойUNKNOWN_ELEMENT_IN_CONFIG, а настройка сервераdictionaries_lib_pathустарела и не оказывает никакого влияния. #111980 (Alexey Milovidov). - Удалены reader и writer на основе библиотеки Apache Arrow для форматов
ArrowиArrowStream. Нативная реализация ClickHouse, используемая по умолчанию с версии 26.7, теперь является единственной. Настройкиinput_format_arrow_use_native_readerиoutput_format_arrow_use_native_writerустарели: они по-прежнему принимаются, но не оказывают никакого влияния, поэтому запрос, устанавливавший их в0для принудительного использования реализации Apache Arrow, теперь использует нативную реализацию. #111996 (Alexey Milovidov). - Отклонять значения настроек временных интервалов (миллисекунды/секунды), вызывающие переполнение микросекунд Int64. #112757 (Azat Khuzhin). Это может быть несовместимостью только при использовании абсурдно больших значений, вызывавших переполнение.
- TLS-учётные данные источника
MySQL(ssl_ca,ssl_cert,ssl_key) больше нельзя указывать в SQL в виде путей к файлам — например, вCREATE NAMED COLLECTION, аргументах запроса илиCREATE DICTIONARY, — поскольку сервер открывает эти файлы от своего имени. Пути по-прежнему поддерживаются в файле конфигурации сервера. В остальных случаях передавайте содержимое сертификата или ключа в новых параметрахssl_ca_pem,ssl_cert_pemиssl_key_pem, которые маскируются в логах иSHOW-запросах, как пароли. #112070 (Alexey Milovidov). - При проверке привилегий для команд
SYSTEM ... CACHE ON CLUSTERтеперь используется привилегия конкретной команды, а не группа привилегийSYSTEM DROP CACHE. Это позволяет обладателям отдельной детализированной привилегии кэша выполнять соответствующую команду и не позволяет обладателю группы выполнятьSYSTEM SYNC FILESYSTEM CACHE ON CLUSTERбез привилегииSYSTEM SYNC FILESYSTEM CACHE. #114042 (Groene AI). - Для представлений, тело которых представляет собой простой
SELECTпо одной таблицеDistributed, весь внешний запрос теперь отправляется на сегменты (новая настройкаoptimize_trivial_view_pushdown_to_distributed, включена по умолчанию). Это изменяет наблюдаемое поведение таких представлений:FINALиSAMPLE, указанные в ссылке на представление, теперь передаются в локальную таблицу сегмента, а не игнорируются, аextremesне выводится в кластерах с одним сегментом. Установитеoptimize_trivial_view_pushdown_to_distributed = 0, чтобы восстановить прежнее поведение. #101791 (simonmichal). - Патч-части легковесного
UPDATEтеперь используют новый дисковый формат v2, отсортированный по (sorting_key..., _block_number, _block_offset), и применяются с помощью нового алгоритма слияния. Пиковое потребление памяти ограничено максимальной последовательностью строк с одинаковым ключом сортировки, а не размером всего патча, и обновления, пересекающие границы слияния, больше не обрабатываются с помощью Join в памяти. Патч-части старого формата по-прежнему доступны для чтения. При поэтапном обновлении с версии до 26.8 сохраняйтеpatch_parts_version = 'v1'или используйте настройкуcompatibility, пока не будут обновлены все реплики. #103182 (Anton Popov). - В
CREATE USERиALTER USERдобавлено предложениеVALID FOR <interval>как сокращённая формаVALID UNTIL. Срок действия вычисляется как текущее время плюс указанный интервал в момент выполнения запроса и сохраняется в формеVALID UNTIL. Столбецvalid_untilтаблицыsystem.usersтеперь имеет типArray(DateTime64(0))вместоArray(DateTime), чтобы сроки после 2106 года представлялись точно; инструменты, считывающие этот столбец, должны поддерживать новый тип. #110171 (Alexey Milovidov). EXPLAIN SYNTAXтеперь возвращает переформатированный запрос в виде одной записи типаString(со встроенными переводами строк), а не по одной записи на строку, поэтому результат представляет собой одну восстанавливаемую строку, пригодную для непосредственного использования (например,SELECT count() FROM (EXPLAIN SYNTAX ...)возвращает1). Это регулируется новой опциейsingle_record, значение которой по умолчанию равно1; установитеsingle_record = 0, чтобы восстановить прежний вывод с одной записью на строку. Другие видыEXPLAIN(PLAN/PIPELINE/AST) сохраняют построчный вывод дерева. #110479 (Alexey Milovidov).- Поддерживаемый диапазон
Date32расширен с[1900-01-01, 2299-12-31]до[0000-01-01, 9999-12-31], как уDateTime64. Парсинг и преобразования теперь поддерживают расширенный диапазон вместо неявного ограничения прежними границами. Примечания по обратной совместимости: при числовом преобразованииtoDate32(N)значения в диапазоне[120530, 2932896]теперь интерпретируются как номера дней (даты от2300-01-01до9999-12-31), а не как Unix-временные метки начала 1970 года, в соответствии с правилом, по которому число, попадающее в диапазон номеров дней, считается номером дня; числа меньше номера дня для0000-01-01и временные метки после9999-12-31ограничиваются новыми границами. #111534 (Alexey Milovidov). arrayIntersectиarraySymmetricDifferenceбольше не считают значение, повторяющееся в одном аргументе, присутствующим в нескольких аргументах. Запросы, зависящие от прежнего поведения, теперь могут возвращать другие результаты:arrayIntersect([1], [2], [1, 1])возвращает[]вместо[1],arrayIntersect([1, 2], [2], [1, 1, 2])возвращает[2]вместо[1, 2], аarraySymmetricDifference([1], [2], [1, 1])возвращает[2, 1]вместо[2]. ДляarraySymmetricDifferenceдостаточно уже двух аргументов:arraySymmetricDifference([1], [2, 2])возвращает[2, 1]вместо[1]. Теперь значение учитывается в аргументе только если оно присутствовало во всех предшествующих аргументах, поэтому результат содержит ровно значения, присутствующие во всех аргументах. В рамках того же измененияarrayIntersectстроит хеш-таблицу по наименьшему аргументу, а не по всем аргументам, что делает функцию до 1,85 раза быстрее и сокращает потребление памяти на треть при существенно различающихся размерах аргументов.arrayUnionне затронута. #113021 (Alexey Milovidov).disable_insertion_and_mutationтеперь предотвращает фоновое чтение из таблицKafka,RabbitMQиNATS, при этом по-прежнему разрешая прямую запись во внешнее хранилище. ТаблицыKafka2,NATSиRabbitMQ, ограниченные этой настройкой, не инициализируют потребителей при прямомSELECT. Недавно добавленная настройкаmessage_queue_disable_insertionтеперь требует перезапуска сервера. #113660 (Christoph Wurm).- Оконные
PARTITION BYилиORDER BYпо столбцуAggregateFunctionтеперь отклоняются с ошибкойILLEGAL_COLUMN, как ранее уже отклонялосьORDER BYверхнего уровня по такому столбцу. Ранее такой запрос принимался как минимум одним анализатором, а оконноеPARTITION BYвыполняло партиционирование по-разному в зависимости отmax_threads. Отклонение также распространяется на состояние, вложенное вArray,Tuple,Map,VariantилиSimpleAggregateFunction.SimpleAggregateFunctionпо обычному типу,QBit, а такжеGROUP BYиDISTINCTпо состоянию не затронуты. #113878 (Groene AI). - Настройка
include_fromбольше не использует/etc/metrika.xmlпо умолчанию. Ранее этот файл использовался для подстановок конфигурации, если он существовал, даже если на него ничто не ссылалось в конфигурации ClickHouse. Если вы использовали этот неявный файл подстановок, явно добавьте<include_from>/etc/metrika.xml</include_from>в каждый затронутый файл конфигурации; отдельно загружаемыеusers.xmlи XML-конфигурации словарей требуют собственного элементаinclude_from. #114161 (Alexey Milovidov). - Движок таблицы
NATSподдерживает встроенные учетные данные в новой настройкеnats_credentials(та же полезная нагрузка, что и в файле.creds), но больше не принимаетnats_credential_fileиз SQL: путь ссылается на файл в файловой системе сервера, который сервер открывает с собственными привилегиями, поэтому его можно указать только в именованной коллекции, определенной в файле конфигурации сервера, или какnats.credential_fileв самой конфигурации сервера. Запрос может заменить такой настроенный путь встроенным значениемnats_credentials, если оператор не закрепил его с помощью<nats_credential_file overridable="false">. Таблицы, созданные до введения этого ограничения, продолжают работать после обновления. #114644 (Alexey Milovidov). - Асинхронные метрики теперь могут иметь тип данных
Map, а метрики для каждого ядра CPU и устройства преобразованы в единые метрики ключ-значение:OSUserTimeCPU0,OSUserTimeCPU1, … стали одной метрикойOSUserTimeCPUс отображением номера ядра CPU на значение (аналогично другим метрикамOS*TimeCPU*,CPUFrequencyMHz_*,Temperature*,EDAC*,Block*_*,Network(Receive|Send)*_*,Disk*_*,*BlobsQueueEstimateиAsyncLogging*QueueSize). Вsystem.asynchronous_metricsпоявился новый столбецkey_values Map(LowCardinality(String), Float64)(для таких метрик значение в столбцеvalueравноNaN),system.asynchronous_metric_logзаписывает их по одной строке на ключ, используя новый столбецkey, конечная точка Prometheus экспортирует их с меткой (например,ClickHouseAsyncMetrics_BlockReadBytes{device="sda"}), а GraphiteMetricsTransmitterотправляет их в формате<prefix>.<Metric>.<key>. Если ваша система мониторинга считывает прежние имена метрик, установите для новой настройки сервераasynchronous_metrics_key_values_modeзначениеlegacy_names, чтобы снова публиковать каждый ключ как отдельную скалярную метрику под прежним именем, илиboth, чтобы публиковать обе формы одновременно во время миграции системы мониторинга; настройка применяется командойSYSTEM RELOAD CONFIGбез перезапуска. #115333 (Alexey Milovidov). #116791 (Alexey Milovidov).
Новая возможность
- Добавлены команды
CREATE HANDLER,ALTER HANDLERиDROP HANDLERдля определения пользовательских HTTP-обработчиков из SQL с хранением в локальном хранилище или Keeper. Добавлены функцииcurrentHandlerиcurrentRequestURL, таблицаsystem.handlers, а также столбцыhttp_handler_name/http_request_urlвsystem.query_log. #106231 (Alexey Milovidov). - Добавлена возможность обращаться к таблицам и базам данных через URL-пути в HTTP-интерфейсе (например, `/database/table.format.gz?filter=a>0`), а также новые настройки (`http_allow_database_as_path`, `http_allow_table_as_file`, `http_allow_filters_as_path`, `http_allow_filters_as_unrecognized_url_parameters`, `select`, `order`, `sort`, `filter`, `page`, `compression`, `format`, `input_format`, `output_format`, `default_format`, `database`), которые можно комбинировать друг с другом и с существующим URL-параметром `query`. #105249 (Alexey Milovidov).
- Добавлены форматы кадрирования, выбираемые новой настройкой
framing_output_format: они мультиплексируют различные части ответа на запрос в едином потоке HTTP-ответа — блоки данных, итоги и экстремумы, пакеты прогресса, события профилирования, серверные журналы и исключения. Реализованы следующие форматы кадрирования:None(по умолчанию, всё работает как раньше),EventStream(события, отправляемые HTTP-сервером),JSONEachPacketBase64иJSONEachPacketString(по одному объекту JSON на пакет с данными в Base64 или строковом виде). #110127 (Alexey Milovidov). - Добавлена настройка сервера
default_session_user: пользователь, от имени которого выполняется аутентификация, если клиент подключается без указания имени пользователя (ранее было жёстко задано значениеdefault; протоколы native, MySQL и PostgreSQL теперь принимают пустое имя пользователя, а не отклоняют его, а Arrow Flight учитывает эту настройку вместо собственного жёстко заданногоdefault). Конечные точки составных протоколов в разделеprotocolsмогут переопределять её для каждой конечной точки с помощью ключаdefault_session_user, поэтому разные порты прослушивания могут обслуживать разных анонимных пользователей. Установка пустой строки запрещает подключения без имени пользователя. Межсерверные подключения никогда не используют пользователя сеанса по умолчанию. #110179 (Alexey Milovidov). - Добавлена поддержка пайп-операторов в SQL-запросах:
FROM t |> WHERE x > 1 |> AGGREGATE count() AS c GROUP BY y |> ORDER BY c DESC |> LIMIT 10, аналогично пайп-синтаксису GoogleSQL. За любымSELECT-запросом может следовать цепочка операторов|>, при этом каждый оператор оборачивает предшествующий запрос в подзапрос, поэтому результирующий AST совпадает с AST эквивалентного запроса с вложенными подзапросами. В запросе, начинающемся с предложенияFROM, предложениеSELECTтеперь необязательно и по умолчанию имеет видSELECT *. #111151 (Alexey Milovidov). - Добавлены функции
parseQueryToJSONиformatQueryFromJSONдля сериализации и десериализации AST в JSON, а также экспериментальный диалектclickhouse_json, включаемый настройкойenable_json_ast_dialect. #100412 (Alexey Milovidov). #113480 (Nikita Fomichev). - Новая настройка
run_query_in_background. Сервер принимает запрос, сразу возвращает пустой результат и выполняет запрос до завершения независимо от состояния соединения. Результат отбрасывается. Отслеживайте запрос по егоquery_idвsystem.processesиsystem.query_log. Предназначено для длительных запросов, таких какINSERT ... SELECT,CREATE TABLE … AS SELECTилиCREATE MATERIALIZED VIEW … POPULATE, которые не должны прерываться при разрыве соединения. #112816 (Miсhael Stetsyuk). - Добавлена новая системная таблица
system.user_query_log, которая позволяет каждому пользователю просматривать собственные записи журнала запросов без доступа к таблице журнала запросов. Первоначальная реализация и идея принадлежат Yue Ni (@niyue), #104462. #110156 (Alexey Milovidov). - Реализованы оставшиеся элементы унификации URL (issue #59617). Новая настройка
s3_baseразрешает относительные URL в табличной функцииs3и движке таблицыS3, а также в функциях с общей конфигурацией:s3Cluster,gcs,oss, — аналогичноurl_base. Новый движок базы данныхURLинтерпретирует имена таблиц как URL, разрешает их относительно необязательного базового URL и направляет к соответствующему backend по схеме URL, благодаря чему файлы, веб- и объектные хранилища обрабатываются единообразно. Он заменяетFilesystemв базе данных по умолчанию (Overlay)clickhouse-localна базовый URLfile://, поэтому обычные имена файлов продолжают работать; также можно написатьSELECT * FROM 'https://example.com/data.csv'. #111512 (Alexey Milovidov). - Добавлены табличная функция
bigqueryи движок таблицыBigQueryдля чтения из таблиц Google BigQuery и записи в них, включая общедоступные наборы данных. Структура таблицы определяется по схеме таблицы BigQuery. Аутентификация поддерживает токен доступа OAuth, ключ service account в форматеJSONи OAuth-клиент с токеном обновления. #110166 (Alexey Milovidov). - Обычный
CREATE MATERIALIZED VIEW ... POPULATEтеперь локально атомарен: представление подписывается на новые вставки в исходную таблицу, а для существующих данных совместно создаётся снимок при кратковременной эксклюзивной блокировке источника. Поэтому строки, вставленные через тот же сервер одновременно с заполнением, больше не пропускаются и не дублируются (новая настройкаmaterialized_views_populate_atomically, включена по умолчанию). Гарантия распространяется только на локальный путь вставки; вставки, поступающие на другую реплику или через распределённый путь записи, не охватываются. Также требуется источник, способный предоставить закреплённый снимок (семействоMergeTreeиMemory); для других источников, а также при использованииCREATE OR REPLACE/REPLACEи для представлений, созданных в базах данныхReplicated, сохраняется прежнее неатомарное заполнение.POPULATEтеперь также можно использовать вместе сTOдля заполнения целевой таблицы. #108715 (Alexey Milovidov). - Keeper теперь может хранить данные на диске в пользовательском LSM-дереве. Производительность сопоставима с предыдущим хранилищем. Чтобы включить его, используйте настройку координации
use_lsmt_storage = true; чтобы хранить файлы на диске —storage_memory_only = false. Добавьте в конфигурациюdata_storage_pathилиdata_storage_disk, чтобы указать расположение файлов. Для записи в S3 укажите дляdata_storage_diskдиск типаs3_plain. #113903 (Michael Kolupaev). - Каталог движков “S3 tables” для озёр данных — как в #103220, но с работающей операцией
INSERT. #113505 (Konstantin Vedernikov). - Добавлена поддержка Snowflake Horizon. Теперь можно запрашивать таблицы Iceberg в каталоге Iceberg Horizon, а также записывать данные в эти таблицы через каталог. #114547 (Melvyn Peignon).
- Добавлена поддержка формата файлов
Puffin. Его можно использовать с табличными функциямиfile,url,s3и аналогичными. #103936 (Konstantin Vedernikov). - Добавлена поддержка режима рамки
GROUPSдля оконных функций (SQL:2011), например:any(price) OVER (PARTITION BY symbol ORDER BY ts GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING). В рамкеGROUPSграницы определяются целыми группами равных строк — наборами строк с одинаковым ключомORDER BY. ПоэтомуN PRECEDING/N FOLLOWINGозначаютNгрупп равных строк до/после группы текущей строки, а не физические строки (ROWS) или расстояния между значениямиORDER BY(RANGE). #108653 (Nihal Z. Miaji). - Добавлена табличная функция
mergeTreeCodecBlockCounts, которая показывает, сколько сжатых блоков использует каждый кодек для каждой части, столбца и подпотока таблицыMergeTree. #109623 (Raufs Dunamalijevs). - Добавлен геотип данных
MultiPoint, хранимый какArray(Point)и включённый в типGeometry. #109951 (David Meng). - Добавлен виртуальный столбец
_etagдля хранилищаHDFS. #108255 (Zhang Yifan). - Нативный модуль чтения и формат вывода
ORCтеперь поддерживаютuniontype, сопоставляя его с типом ClickHouseVariant. Ранее чтение таких столбцов завершалось ошибкойUnsupported ORC type, а запись — ошибкойILLEGAL_COLUMN. #110078 (Alexey Milovidov). #110085 (Alexey Milovidov). - Добавлен токенизатор
japaneseдля текстовых индексов и функцийtokens,hasAnyTokensиhasAllTokens, использующий морфологический анализатор MeCab. Словарь загружается во время выполнения из расположения, заданного в конфигурации сервера, и перед использованием проверяется по контрольной сумме SHA-256. #111420 (Jimmy Aguilar Mena). - Добавлен токенизатор
chineseдля функцииtokensи текстовых индексовMergeTree. Он сегментирует китайский текст на слова с помощью словаря и скрытой марковской модели (алгоритм основан на jieba) и поддерживает уровни детализацииcoarse_grained(по умолчанию) иfine_grained. Продолжение #80174. #89945 (Amos Bird). - Добавлен новый токенизатор
icuдля текстовых индексов и функцийtokens,hasAnyTokensиhasAllTokens, обеспечивающий сегментацию слов Unicode с учётом локали, включая сегментацию на основе словаря для таких языков, как китайский, японский и тайский. #109940 (Jimmy Aguilar Mena). - Добавлен токенизатор
splitByRegexpдля текстовых индексов и функцииtokens. Он разбивает входные данные на токены, используя регулярное выражение в качестве разделителя, напримерtokenizer = splitByRegexp('[^\p{L}\p{N}#+]+'). Это позволяет сохранять токены со специальными символами, такими какC++илиC#, которые другие токенизаторы разбили бы на части. #110002 (Jimmy Aguilar Mena). - Панель мониторинга Keeper HTTP теперь включает вкладку Cluster, которая отображает участников Raft в виде топологического графа с цветовой индикацией состояния, задержкой и приоритетом. Это позволяет увидеть, какие узлы работоспособны, отстают или недоступны, а также напрямую открыть панель мониторинга лидера. #111655 (yanglongwei).
- Новый раздел конфигурации сервера
create_union_system_log_tablesсоздаёт и автоматически обслуживает таблицыall_...(например,system.all_query_log), выполняющие запросы к объединению таблицы системного лога, её ротированных версий и/или таких же таблиц на всех репликах кластера. Табличные функцииremote,remoteSecure,clusterиclusterAllReplicasтеперь принимают завершающий разделSETTINGSс настройками создаваемого ими хранилищаDistributed, напримерclusterAllReplicas('default', system.query_log, SETTINGS skip_unavailable_shards = 1). #112670 (Alexey Milovidov). - В движок таблицы NATS добавлена настройка
nats_credentials, позволяющая пользователям указывать учётные данные NATS непосредственно в виде строки (соответствующей содержимому файла.creds). #110733 (addshore). - Добавлен алгоритм
IEJoin, основанный на сортировке, для JOIN, в предложенииONкоторых присутствуют два сравнения неравенства (<,<=,>,>=) между объединяемыми таблицами. Он включается добавлениемie_joinв настройкуjoin_algorithm. Поддерживаются видыALL INNER/LEFT/RIGHT/FULL JOINиSEMI/ANTI LEFT/RIGHT JOIN. Ранее такие запросы выполнялись какCROSS JOINс фильтром (толькоINNER), что значительно медленнее на больших таблицах. #109920 (Vladimir Cherkasov). - Добавлена агрегатная функция
gini, вычисляющая коэффициент Джини для конечных неотрицательных числовых значений, включая групповые и распределённые агрегации. #112280 (Amirreza Akhondi). #114643 (Groene AI). - Добавлен выходной формат
HiveText, записывающий текст Apache HiveLazySimpleSerDe. Поля разделяются символом\x01, строки — значением настройкиformat_hive_text_rows_delimiter(по умолчанию\n), а вложенные значенияArray,MapиTupleиспользуют список разделителей Hive. Выходные данные предназначены для стандартногоLazySimpleSerDeHive и не симметричны входному форматуHiveTextClickHouse для вложенных значений или пользовательских разделителей строк. #107582 (Alexey Milovidov). - Добавлена поддержка постоянных меток на конечной точке метрик Prometheus: новый раздел
<labels>внутри<prometheus>добавляет настроенные метки к каждой предоставляемой метрике, что помогает различать несколько кластеров, собираемых одним Prometheus. Значения меток поддерживают стандартные подстановки конфигурации, такие какfrom_env. Закрывает #85969. #111672 (Valery Petrov). - Добавлена настройка
always_fetch_mutated_part. Если она включена, реплика может скачивать мутированные части с другой реплики вместо локального выполнения мутаций. #113020 (Rory Shanks). - Добавлена агрегатная функция
mergedJSONPatchдля агрегации merge-patch по RFC 7396 над значениямиJSON, включая поддержку слияния состояний и использования вAggregatingMergeTree. Пользователи могут агрегировать столбецJSON, используя временную метку или другой столбец упорядочивания в качестве ключа сортировки, чтобы вычислить актуальное состояние. #108349 (larryluogit). - Добавлена функция
aiSimilarity, которая вычисляет семантическое сходство двух текстов с помощью модели эмбеддингов. Она возвращаетNullable(Float32)в диапазоне[-1, 1], где1означает, что тексты идентичны, илиNULL, если операнд имеет значениеNULL, пуст или не удалось получить его эмбеддинг. #110777 (David Meng). - Добавлены настройки восстановления
restore_table_data,restore_access_entitiesиrestore_functionsдля детального управления восстанавливаемыми объектами. Они могут переопределятьstructure_onlyдля отдельных категорий — например,structure_only=true, restore_access_entities=trueвосстанавливает определения таблиц и объекты управления доступом без данных таблиц. #102402 (Nikita Fomichev). - Оператор индексации массива поддерживает массив целых чисел в качестве индекса:
arr[indexes]возвращает элементы по всем указанным позициям, аналогичноarrayMap(i -> arr[i], indexes). #108371 (folly). - Добавлена функция
notHas— отрицаниеhasдля массивов, map и JSON. Если просматриваемый набор представляет собой константный массив,notHas(constant_array, x)переписывается вx NOT IN constant_arrayс помощьюoptimize_rewrite_has_to_in(включенной по умолчанию), поэтому выполняется через поиск в множестве и может отсекать данные по индексу первичного ключа, какNOT IN. #109926 (Nihal Z. Miaji). - Функции
arrayElement(операторvec[n]) иarraySliceтеперь работают с типом данныхQBit:qbit[n]возвращает n-й элемент вектора с полной точностью, аarraySlice(qbit, offset, length)— проекцию на подмножество измерений. Обе функции считывают только битовые плоскости необходимых групп stride, а срезы, выровненные по границам групп stride, повторно используют сохраненные потоки без копирования. Это закрывает #109942. #109953 (Utkal Singh). - Добавлена поддержка анимированных PNG в формате вывода
PNG. Столбецtпревращает результат запроса в анимацию; временная шкалаtзадается параметрамиoutput_format_image_time_multiplier_secondsиoutput_format_image_time_divisor_seconds, аoutput_format_image_streaming_animationпозволяет записывать кадры по мере их формирования запросом вместо буферизации в памяти. #112846 (Alexey Milovidov). - Добавлена функция
aiRedact, которая обнаруживает и маскирует в тексте персональные данные (PII) с помощью провайдера LLM. Укажите категории для маскирования (например,['email', 'name']) или передайте пустой массив, чтобы использовать набор категорий PII по умолчанию. Найденные значения заменяются токеном ([REDACTED]по умолчанию). #110464 (David Meng). - Добавлена функция
aiFilter, которая с помощью LLM проверяет, соответствует ли текст условию, заданному на естественном языке, и возвращаетUInt8для использования вWHERE,PREWHEREиJOIN ... ON. #110594 (yanglongwei). - Добавлена поддержка TLS/SSL-соединений с PostgreSQL для движка таблицы
PostgreSQL, табличной функцииpostgresql, движков баз данныхPostgreSQLиMaterializedPostgreSQL, а также словарейPostgreSQL:sslmode, сертификаты и ключ, задаваемые либо в виде содержимого (sslrootcert_pem,sslcert_pem,sslkey_pem; маскируются как пароли), либо в виде путей (sslrootcert,sslcert,sslkey; принимаются только из именованной коллекции, определённой в файле конфигурации сервера). #110615 (Alexey Milovidov). - У сервера ClickHouse теперь есть порт интроспекции. Это TCP-приёмник собственного протокола, который запускается до подключения таблиц сервером и останавливается только после завершения их отключения. В эти периоды оператор может подключиться к нему с помощью
clickhouse clientи выполнить такие запросы, какSHOW PROCESSLIST,SELECT * FROM system.stack_traceилиSYSTEM INSTRUMENT ADD 'QueryMetricLog::startQuery' SLEEP ENTRY 0.5. Кроме того, значение по умолчанию настройки сервераshutdown_wait_unfinishedувеличено с 5 до 120 секунд. Предыдущее значение по умолчанию было меньше интервала опроса соединений, поэтому сервер мог принудительно завершить работу во время выключения, не дожидаясь завершения активных соединений. #110838 (Miсhael Stetsyuk). - В команду Keeper
mntrдобавлены эмулируемые метрики ZooKeeper:zk_leader_uptime,zk_sum_election_time,zk_cnt_election_time,zk_sum_leader_unavailable_time,zk_cnt_leader_unavailable_time; также добавлены связанные с лидером метрики, доступные только в Keeper:KeeperLastLeaderElectionTime,KeeperLastLeaderUnavailableTime. #113334 (Maxim Orlovsky). - Добавлена поддержка ALTER TABLE … MODIFY PROJECTION для изменения настроек уровня проекции (например, index_granularity) существующей проекции без её перестроения. Новые настройки применяются отложенно через слияния. #113343 (Diego Gomes Tomé).
- В
system.mutationsдобавлен столбецfinish_time, в котором фиксируется время завершения мутации. Для незавершённых мутаций и мутаций с неизвестным временем завершения возвращается ноль. #113474 (Nikita Mikhaylov). - Добавлен новый уровень возможностей
private previewмеждуexperimentalиbeta, поэтому порядок уровней возможностей теперь такой:experimental < private preview < beta < production. Настройка сервераallow_feature_tierполучила новый уровень:0разрешает все уровни,1исключает экспериментальные,2дополнительно исключает закрытую предварительную версию, а3разрешает только настройки продакшна. В конфигурациях, где ранее для разрешения только настроек продакшна было заданоallow_feature_tier = 2, теперь следует использовать3. Закрывает #113481. #113581 (Groene AI). - Встроенный веб-интерфейс SQL (
/play) теперь позволяет сортировать результат по столбцам, фильтровать по их значениям и разбивать на страницы без изменения запроса. В заголовке каждого столбца отображаются стрелки сортировки и поле ввода для фильтра, при выборе ячейки предлагаются сравнения, подходящие для её значения, а под результатом, не помещающимся на одном экране, отображается пейджер с настраиваемым размером страницы. Всё это выполняется сервером с помощью настроек формирования запросаorder,filter,limitиpage: формируется весь результат, а не только отображаемые строки. Выбранные сортировка, фильтры и страница передаются в URL страницы, поэтому ссылка с общим доступом воспроизводит результат. #115540 (Alexey Milovidov). chdigv26.8.1: ratatui, панели tmux, сеансы tmuxinator, общий доступ к журналам с цветовым выделением, обзор возможностей. #115216 (Azat Khuzhin).
Экспериментальные возможности
- Добавлен экспериментальный оптимизатор Cascades на основе оценочной стоимости для распределённых планов запросов, включаемый с помощью
enable_cascades_optimizer = 1вместе сmake_distributed_plan = 1. Он выбирает на основе оценочной стоимости между стратегиями shuffle, broadcast, replicated и local для JOIN, двухфазной, shuffle и local агрегацией, двухэтапным распределённым top-N, а также параллельным и реплицируемым чтением, добавляя при необходимости операторы exchange. #86353 (Alexander Gololobov). - Добавлена экспериментальная настройка
MergeTreeenable_adaptive_codec_selection. При её включении слияния и мутации выбирают для каждого блока кодек, обеспечивающий наименьший размер данных, для столбцов, использующих кодек по умолчанию. #111834 (Raufs Dunamalijevs). * Адаптивный выбор кодека теперь сжимает данные каждым кодеком-кандидатом не более одного раза на блок вместо проверки всех кандидатов с последующим повторным сжатием выбранным кодеком. #113511 (Raufs Dunamalijevs). - Бинарный файл
clickhouseсобирается для WebAssembly (wasm64через Emscripten), аclickhouse localвыполняет запросы, включая запросы к таблицамMergeTree, в Node.js ≥ 24 и в браузере. Новая CI-задачаBuild (wasm64)закрепляет путь сборки и выполнения в Node.js (путь для браузера пока не покрывается CI) и предоставляет модуль WebAssembly в качестве артефакта. #113404 (Alexey Milovidov). parallel_replicas_plan_basedтеперь определяет границу между локальной и удалённой частями путём оптимизации плана запроса, может распараллеливать запросы к представлениям сUNIONбезparallel_replicas_allow_view_over_mergetree, переключается на локальный план для запросовIN (subquery)вместо завершения с ошибкой, а также распределяет подходящиеJOIN(INNER,LEFT,RIGHT, включаяSEMI/ANTI). #111063 (Igor Nikonov). #112268 (Igor Nikonov). #112443 (Igor Nikonov).- Распределённые планы запросов (
make_distributed_plan) теперь также поддерживают запросы, для которых на этапе планирования известно, что источник не вернёт ни одной строки, например чтение из пустой таблицыMergeTree. #111941 (Groene AI). - Добавлена настройка
use_projection_index_in_read_pools, отключённая по умолчанию. При её включении диапазоны, полностью отфильтрованные проекцией или индексом пропуска данных, исключаются из пулов чтенияMergeTreeдо создания для них задач чтения, вместо того чтобы пропускаться по гранулам во время чтения. Это позволяет избежать создания задач чтения и настройки средств чтения для данных, которые не будут прочитаны. #110291 (Nikolai Kochetov). #112296 (Anton Popov). - PromQL: исправлены операции над мгновенными векторами без тегов, например
vector(1) + vector(2),topk(1, vector(1)),label_replace(vector(1), ...)и бинарные операторы сon(), которые ранее завершались ошибкой типа. #111872 (Valery Petrov). - PromQL: реализованы функции
changesиresets. #112352 (Valery Petrov). - Сообщать ошибку, вызвавшую отмену распределённого запроса (
make_distributed_plan = 1), вместо простогоQUERY_WAS_CANCELLED. Ранее фактическая ошибка сбойной задачи worker была видна только в логе сервера. #112590 (Alexander Gololobov). - При
make_distributed_plan = 1ClickHouse теперь отключает возможности, которые распределённые планы запросов пока не поддерживают, вместо того чтобы допускать их сбой позже. Закрывает #109476. #112463 (alesapin). - Распределённые планы запросов (
make_distributed_plan) теперь используют отложенную материализацию для запросовORDER BY ... LIMIT k. #113111 (Shankar Iyer). - Добавлена поддержка оконных функций без партиционирования (
OVER (ORDER BY ...)) в распределённых планах запросов (make_distributed_plan). Ранее любой запрос с оконной функцией завершался с ошибкой, посколькуWindowStepнельзя было сериализовать для удалённого выполнения; окна сPARTITION BYпока по-прежнему отклоняются. #109802 (Vighnesh Pathrikar). - Добавлена настройка
use_query_condition_cache_for_top_k, управляющая использованием кэша условий запроса для запросовORDER BY ... LIMIT n(TopK). #111492 (Alexey Milovidov). Кэш условий запроса теперь включён по умолчанию для запросов, использующих оптимизациюORDER BY <column> LIMIT n(TopK). Его можно отключить с помощью настройкиuse_query_condition_cache_for_top_k. #114539 (Alexey Milovidov). - Добавлена статическая привязка партиций к сегментам для
StorageKafka2с помощью настроекkafka_partition_shard_numиkafka_shard_count, позволяющая нескольким сегментам ClickHouse детерминированно потреблять непересекающиеся подмножества партиций Kafka. #108886 (johnjing). - Повышена безопасность экспериментальных функций ИИ: по умолчанию запрещены небезопасные (
http) конечные точки на удалённых хостах (новая настройкаai_function_allow_insecure_endpoint), ограничено количество исходящих вызовов API на запрос (ai_function_max_api_calls_per_queryтеперь по умолчанию равна1000), а ответы провайдера с ошибками, записываемые в логи, очищаются. #111286 (George Larionov). - PromQL:
quantileс уровнем квантиля вне диапазона [0, 1] теперь возвращает -Inf/+Inf/NaN, как Prometheus, вместо ошибки, аhistogram_quantileтеперь, как Prometheus, игнорирует входные серии без меткиleили с неразбираемым значением этой метки. #111871 (Valery Petrov). - Разрешены многокомпонентные идентификаторы в таблицах TimeSeries. #112799 (Vitaly Baranov).
- Добавлены настройки
TimeSeriessamples_index_granularityиtags_inner_granularityдля управления гранулярностью индекса внутренних таблиц. #113075 (Vitaly Baranov). - PromQL: добавлена функция
derivи исправлена ошибка, из-за которой её базовая агрегатная функция возвращала значения в 1000 раз меньше при временных метках с миллисекундным разрешением. #112360 (Valery Petrov). - PromQL: отклонять недопустимые экранированные последовательности, пересекающие разделители, в строках, а также недопустимые суррогатные кодовые точки Unicode. #113587 (Minh Vu). #113203 (Minh Vu).
- PromQL: сохранять конечные значения при вычислении остатка по модулю с бесконечным делителем. #113746 (Minh Vu).
- PromQL: функции даты и времени
hour,minute,month,year,day_of_week,day_of_month,day_of_yearиdays_in_monthтеперь можно вызывать без аргументов; по умолчанию используетсяvector(time()), как в Prometheus. #111869 (Valery Petrov). - PromQL теперь поддерживает параметр
lookback_deltaPrometheus HTTP API для мгновенных и интервальных запросов. #113971 (Minh Vu). - Распределённые планы запросов (
make_distributed_plan) теперь поддерживаютIN (subquery)без преобразования вJOIN: набор создаётся один раз на инициаторе, а его значения передаются задачам-исполнителям. Принудительное переопределениеrewrite_in_to_joinудалено; преобразование по-прежнему доступно как явная настройка. #113826 (Alexander Gololobov). - Потоковые запросы поддерживают водяные метки. #106169 (Mikhail Artemenko).
- В экспериментальный путь чтения
ReaderExecutorдобавлен файловый кэш со сквозным чтением (use_reader_executor, по умолчанию отключён). #110029 (Sema Checherinda). - PromQL: реализованы функции
clamp,clamp_min,clamp_maxиround. #111870 (Valery Petrov). - Корректно собирать статистику вставок и запросов через конечную точку Prometheus remote-write. #112825 (James Cunningham).
- Операторы агрегации PromQL теперь допускают смешанный регистр, как в Prometheus. #114076 (Minh Vu).
- TimeSeries: хранить все теги в столбце
tags. #114300 (Vitaly Baranov). - Применять оптимизацию чтения в порядке сортировки к запросам с
ORDER BY, когда включёнparallel_replicas_plan_based: сортировка теперь передаётся репликам и объединяется на инициаторе, поэтому каждая реплика читает данные в порядке ключа сортировки. Также исправлена ошибкаUnknown function __topKFilterдляORDER BYпо столбцу, не входящему в первичный ключ, при включённой этой настройке. #114315 (Igor Nikonov). - Отклонять буквальные переводы строки в обычных строках PromQL в кавычках. #114381 (Minh Vu).
- Исправить дублирующиеся ключи
GROUP BYв стратегии частичной агрегацииmake_distributed_planи разрешить эту стратегию для агрегаций при распределённом чтении. #114523 (Alexander Gololobov). - Выдавать исключение при нарушении списка разрешённых типов гипотетических индексов для WHATIF. #114646 (Yarik Briukhovetskyi).
- Восстановлено чтение квантованного подстолбца для векторного поиска (добавленного в версии 26.7). #114763 (Shankar Iyer).
- Экспериментальный движок таблицы
TimeSeriesбольше не применяет кодекGorillaк автоматически создаваемым столбцамvalueвнутренней таблицы samples; теперь по умолчанию для них используетсяCODEC(ZSTD(1)). Явно объявленные столбцы сохраняют кодеки, указанные пользователем. Значение по умолчанию для столбцаtimestampне изменилось (CODEC(DoubleDelta, ZSTD(1))). #114790 (Nikita Mikhaylov). - Запрос распределённого плана (
make_distributed_plan) теперь останавливает предшествующие этапы после достиженияLIMIT, вместо того чтобы вычислять полный результат и отбрасывать его. #114806 (Alexander Gololobov). - В путь чтения экспериментального
ReaderExecutorдобавлен уровень кэша страниц в пространстве пользователя (use_reader_executor, по умолчанию отключён). При промахе исполнитель теперь заполняет кэш страниц в пространстве пользователя и обслуживает из него последующие чтения без копирования данных. #114890 (Sema Checherinda). - Добавлена поддержка
ROLLUP,CUBE,GROUPING SETSи функцииgroupingв запросах, выполняемых сmake_distributed_plan = 1. #114950 (Alexander Gololobov). - Исправлена ошибка
Illegal type Decimal(18, 0) of argument of function toIntervalNanosecond, возникающая, когда запрос PromQL используетoffsetвнутри селектора диапазона, напримерrate(m[2m] offset 5m). #114997 (Nikita Mikhaylov). - Очень большое значение
distributed_plan_workers_numбольше не приводит к аварийному завершению работы сервера сstd::length_error, когда включены экспериментальныеmake_distributed_planиenable_cascades_optimizer. Такое количество узлов теперь отклоняется с ошибкойINVALID_SETTING_VALUE. #115398 (Groene AI). - Добавлена поддержка агрегации
GROUPING SETSв распределённых планах, построенных оптимизатором Cascades (make_distributed_plan = 1, enable_cascades_optimizer = 1). #115426 (Alexander Gololobov). - Таблицы
TimeSeriesтеперь могут хранить таблицу “недавних образцов”: если новый параметр движкаrecent_samples_ttl_secondsне равен нулю, движок создаёт копию таблицы samples с TTL (разбитую на партиции поrecent_samples_partition_by, по умолчанию — по дням), в которую выполняется запись при каждой вставке. Запросы PromQL, диапазон времени которых укладывается в окно TTL, автоматически читают из неё, что в несколько раз ускоряет правила оповещений и записи, а также панели мониторинга с коротким диапазоном времени на больших таблицах. Это предпочтение можно отключить новым параметром уровня запросаtime_series_prefer_recent_samples_table. #115441 (Nikita Mikhaylov). - Реализован SELECT-запрос из TimeSeries. #115622 (Vitaly Baranov).
- Реализована конечная точка
/api/v1/seriesPrometheus HTTP API для таблицTimeSeries: селекторы серийmatch[](повторяющиеся значения объединяются), необязательный диапазон времениstart/endи необязательный параметрlimit. #115676 (Nikita Mikhaylov). - Планы распределенных запросов (
make_distributed_plan) теперь сразу останавливают бездействующие вышестоящие стадии после достиженияLIMIT: бездействующий приемник exchange считываетNoMoreDataNeededсразу по поступлении, а бездействующий источник exchange обнаруживает закрытый выход и передает сигнал остановки вышестоящей стадии. Ранее такие стадии продолжали читать и обрабатывать данные, которые никто не потребляет. #115690 (Alexander Gololobov). - Автоматические параллельные реплики теперь могут собирать статистику времени выполнения и включать параллельные реплики для поддерживаемых запросов при включенном
parallel_replicas_plan_based. #115788 (Igor Nikonov). - Внешняя таблица последних образцов таблицы TimeSeries теперь регистрируется как ссылочная зависимость. #115944 (Groene AI).
Повышение производительности
- Новый адаптивный алгоритм для параллельного
GROUP BY(управляется настройкойenable_adaptive_aggregator, включенной по умолчанию): каждый поток выполняет агрегацию в собственной хеш-таблице, пока в ней не накопитсяadaptive_aggregator_freeze_thresholdключей, после чего фиксирует её. Часто встречающиеся ключи продолжают обновлять небольшие таблицы, помещающиеся в кэше, без координации, а редкие ключи по хешу направляются в очереди соответствующих бакетов и агрегируются ровно один раз при параллельном слиянии по бакетам. #111459 (Nihal Z. Miaji). - Снижено использование памяти таблицами
MergeTreeс большим количеством частей данных благодаря совместному использованию метаданных частей, полученных из схемы (списка столбцов, описаний столбцов, сериализаций и подпотоков столбцов), между частями одной таблицы вместо копирования этих данных в каждую часть. Эффект наиболее заметен для широких таблиц с множеством небольших частей. #109816 (Raúl Marín). - Оптимизированы запросы
GROUP BY ... ORDER BY ... LIMITиGROUP BY ... LIMIT: во время агрегации поддерживается ограниченная куча, позволяющая отбрасывать группы, которые не могут попасть в результат. Это значительно снижает использование памяти и время выполнения при группировке с высокой мощностью. Управляется настройкойenable_group_by_top_k_optimization. Основано на первоначальной реализации Dmitriy Terenichev (#78553). #96630 (Konstantin Bogdanov). - Уменьшен размер ячейки хеш-таблицы для ключей агрегации из одного
String, что улучшает производительностьGROUP BYс преобладанием строковых ключей. Новая настройкаenable_packed_string_keys_in_aggregationвключена по умолчанию; её отключение либо установка значенияcompatibilityниже26.8возвращает прежний методStringHashTable, который всё ещё может быть быстрее при агрегации с очень низкой мощностью и ключами длиннее 11 байт. #110573 (Harikrishnan Prabakaran). #112089 (Harikrishnan Prabakaran). - Распараллелено финальное слияние одноуровневых хеш-таблиц агрегации с помощью новой настройки
enable_parallel_single_level_merge, включенной по умолчанию. Это ускоряет запросыGROUP BY, в которых хеш-таблицы отдельных потоков не достигают порога перехода на двухуровневую структуру, но их слияние занимает основную часть времени выполнения. #110395 (Nihal Z. Miaji). - Улучшена производительность
DISTINCT, когда входной поток отсортирован по префиксу столбцовDISTINCT, напримерSELECT DISTINCT a, b FROM table ORDER BY a. Такие запросы выполняются до 2,4 раза быстрее. #110170 (Nihal Z. Miaji). - Ускорены запросы
DISTINCTи снижено использование ими памяти в партиционированных таблицахMergeTree: строки каждой партиции сохраняются в одном потоке, поэтому предварительныйDISTINCTкаждого потока работает с непересекающимся набором ключей, а не с одним и тем же набором ключей, присутствующим в нескольких предварительныхDISTINCT. Это применяется, когда выражение партиционирования является детерминированной функцией столбцовDISTINCT, и определяется эвристикой стоимости, учитывающей число партиций и перекос данных (её можно включить или отключить настройкойforce_distinct_partitions_independently, отключенной по умолчанию). Та же непересекаемость наборов ключей по партициям распространяется через этапыExpression,FilterиARRAY JOINна конечных потребителейDISTINCT,LIMIT BYиGROUP BY, позволяя им также пропускать слияние. Управляется новыми настройкамиallow_distinct_partitions_independently(включена по умолчанию) иmax_number_of_partitions_for_independent_distinct, позволяющей настроить эвристику. #108326 (Nihal Z. Miaji). - Оптимизированы функции
uniq,uniqExactиuniqHLL12для агрегации без ключа. #110150 (Anton Popov). - Средство чтения
ParquetV3 теперь может пропускать целые группы строк по странице словаря в дополнение к статистике min/max и bloom-фильтрам для условий равенства иIN, если фрагмент столбца полностью закодирован словарём. Управляется новой настройкойinput_format_parquet_dictionary_filter_push_down. #106952 (Alexey Milovidov). #110567 (Alexey Milovidov). - Отложенная материализация при чтении файлов
Parquetиз объектного хранилища, включая таблицыIceberg: в запросахORDER BY ... LIMIT nстолбцы, не нужные для сортировки и фильтрации, считываются только дляnстрок, прошедших черезLIMIT. Для файлаParquetразмером 200 МБ вS3запросSELECT k, s ... ORDER BY k DESC LIMIT 10считывает 3,3 МБ вместо 171 МБ (в 51 раз меньше операций ввода-вывода и в 8 раз быстрее). Управляется новой настройкойquery_plan_optimize_lazy_materialization_for_object_storage(включена по умолчанию, также требуетсяquery_plan_optimize_lazy_materialization). #110970 (Alexey Milovidov). * Отложенная материализация для запросовORDER BY ... LIMIT n(#110970) теперь также применяется к локальным файлам Parquet, читаемым с помощью табличной функцииfileи движка таблицыFile: столбцы, не нужные для сортировки и фильтрации, считываются только дляnстрок, прошедших черезLIMIT. Повторное чтение сохранённого файла завершается новой ошибкойFILE_CHANGED_DURING_READ, если файл был изменён между двумя проходами. Управляется новой настройкойquery_plan_optimize_lazy_materialization_for_file(включена по умолчанию). Также исправлена ошибка отложенной материализации для объектного хранилища с сообщениемNot found column or subcolumn ... in block, возникавшая при откладывании запрошенного подстолбца (например, столбцаJSON). #114262 (Alexey Milovidov). - Статистика столбцов теперь по умолчанию материализуется при
INSERT, если текущий активный размер таблицы вместе с размером записываемого блока не превышает значение новой настройкиmaterialize_statistics_on_insert_max_table_size(по умолчанию 25 GiB); проверка выполняется для каждого записываемого блока, поэтому при первой массовой загрузке в пустую таблицу статистика всё равно может материализоваться для каждого блока. Это даёт оптимизатору JOIN на основе стоимости точные оценки для недавно загруженных таблиц измерений и помогает избежать неоптимальных порядков JOIN (например, TPC-H Q5 и Q8 больше не завершаются по тайм-ауту при scale factor 40), тогда как в крупных существующих таблицах фактов статистика продолжает материализоваться во время слияний. #109454 (Alexey Milovidov). - Ускорены оконные функции на партиционированных таблицах
MergeTree: каждая партиция читается через собственный поток, а окна вычисляются отдельно по каждой партиции, без хеш-распределения, которое обычно перераспределяет каждую строку между потоками перед сортировкой окна. Это применяется, когда выражение партиционирования таблицы является детерминированной функцией столбцовPARTITION BYокна, и использует ту же эвристику стоимости, что иGROUP BY/DISTINCTпо каждой партиции (достаточное количество партиций относительноmax_threads, отсутствие доминирующей партиции). Управляется новыми настройкамиallow_window_partitions_independently(включена по умолчанию),force_window_partitions_independentlyиmax_number_of_partitions_for_independent_window. #114783 (Nihal Z. Miaji). - Снижено использование памяти при записи упакованных частей за счёт потоковой записи итогового архива непосредственно в целевой файл вместо хранения второй полной копии в памяти во время фиксации части. #111995 (Alexey Milovidov).
- Добавлено новое значение
join_algorithmparallel_full_sorting_merge: для поддерживающих хеширование соединений по равенству оно разбивает полное сортирующее соединение слиянием по хешу ключей JOIN на независимые соединения слиянием для каждого сегмента, выполняемые во всех потоках. Оно сохраняет характерное для соединения слиянием низкое потоковое потребление памяти, одновременно распараллеливая его (в тесте производительность примерно в 2,4 раза выше, а использование памяти примерно в 3,3 раза ниже, чем уparallel_hash). Для JOINASOFиспользуется одинfull_sorting_merge; для несовместимых с хешированием типов ключей (с плавающей точкой,JSON,Object,Dynamic) пропускается только преобразование с хеш-распределением, при этом они по-прежнему могут разбиваться в источнике по диапазонам первичного ключа, если включёнquery_plan_join_shard_by_pk_ranges. Результат не упорядочен. #109005 (Alexey Milovidov). - Добавлено пространственное отсечение GeoParquet на уровне групп строк и страниц в средство чтения
Parquet. Отсечение групп строк пропускает целые группы строк, ограничивающий прямоугольник которых не пересекается с геометрией запроса. Отсечение на уровне страниц использует индекс столбцаcovering.bboxдля пропуска нерелевантных страниц внутри групп строк, а проталкивание пространственных предикатов теперь также применяется при чтении строк изParquet. #104435 (Vasily Chekalkin). - Проталкивание фильтров Parquet (отсечение групп строк и индекс столбца) поддерживает больше преобразований типов:
DateTime64(x) <-> DateTime64(y),Decimal(x) <-> Decimal(y),Float32 <-> Float64. #110457 (Michael Kolupaev). - Сокращено количество дублирующихся запросов на чтение с удалённых дисков при фрагментации диапазонов меток, например первичными индексами или индексами пропуска данных. #113584 (Anton Popov).
- Ускорено выполнение
INпо кластеризованным (например, отсортированным по первичному ключу) столбцам за счёт повторного использования результата предыдущей строки для следующих подряд одинаковых строк. #114853 (Nikita Mikhaylov). - Агрегация без ключей
GROUP BYбольше не распределяет свой однострочный результат поmax_threadsпотокам, поэтому запросы, план которых продолжается после такой агрегации, получают значительно меньший конвейер (меньше процессоров для создания, планирования и профилирования) без потери параллелизма. #115170 (Nikita Mikhaylov). - Keeper теперь читает записи журнала изменений с меньшей конкуренцией за блокировки: чтения при дозагрузке планируются под разделяемой блокировкой, а дисковый ввод-вывод выполняется без блокировок; как дозагрузка последователя, так и путь фиксации могут предварительно декодировать записи в фоновом пуле потоков, сокращая избыточные чтения с диска и декодирование на CPU у лидера. #108473 (Antonio Andelic).
- Ускорен запуск Keeper за счёт параллельного чтения нескольких файлов журнала изменений вместо последовательного; это управляется новыми настройками
log_startup_read_max_streamsиlog_startup_read_buffer_size. #109881 (Antonio Andelic). - Добавлен новый тип схемы
bucketedдляsystem.metric_log, который хранит все метрики в одном столбцеMap(Enum16(...), Int64), используя бакетную сериализациюMapс 128 бакетами, а также столбецALIASдля каждой метрики в целях совместимости: таблица состоит из нескольких столбцов вместо тысяч, нулевые значения не хранятся, а при чтении одной метрики считывается только один из 128 бакетов. Кроме того, кMapс ключамиEnumтеперь можно обращаться по строковому имени значения enum, напримерmap['name']. #115380 (Alexey Milovidov). - Добавлена оптимизация плана запроса, которая перемещает функции, уменьшающие объём данных (
length,lengthUTF8,empty,notEmpty), ниже этаповSortingиFilter, заменяя широкий аргументString/FixedStringрезультатом фиксированного размера. Благодаря этому аргумент не буферизуется при сортировке и не копируется фильтром. Управляется новой настройкойquery_plan_push_down_volume_reducing_functions, включённой по умолчанию. #106199 (Peng). - Настройка
read_in_order_use_virtual_rowтеперь включена по умолчанию. При чтении в порядке первичного ключа (например,ORDER BY primary_key LIMIT n) из таблицы с большим количеством частей читаются только те части, которые действительно могут повлиять на результат, а также окно упреждающего чтения не более чем изmax_threadsчастей для сохранения параллелизма. Это значительно снижает пиковое потребление памяти. #106215 (Alexey Milovidov). - Запросы с агрегацией без агрегатных функций теперь используют методы на основе
HashSetвместоHashMap(для поддерживаемых типов ключей). Наблюдалось ускорение до 1,8 раза. #108862 (Nikita Taranov). - Устранены накладные расходы runtime-фильтра
JOIN, когда ожидается, что сторона проверки будет небольшой. Порог задаётся новой настройкойjoin_runtime_filter_min_probe_rows(по умолчанию1000). #104860 (Vladimir Cherkasov). - Запросы с предикатами вида
nullIf(key, sentinel) = constтеперь могут использовать отсечение по первичному ключу, партициям и skip-index. #107308 (Aditya Kumar). - Добавлена настройка сервера
jemalloc_merge_tree_arenasдля управления выделенными аренами jemalloc для метаданных частей и таблицMergeTree. На серверах с большим числом ядер пул для каждого CPU может уменьшить конкуренцию за блокировки аллокатора между параллельными слияниями, а выделенная арена теперь содержит только долгоживущие метаданные. #109490 (Raúl Marín). - Ускорена распаковка ZSTD на
x86_64для столбцов с небольшими смещениями совпадений, например целочисленных столбцов фиксированной ширины, за счёт векторизации перекрывающихся копирований с короткими смещениями с помощью SSSE3pshufb. Например, распаковка столбцаUInt64на AMD Zen 5 выполняется до ~1,2 раза быстрее. #110909 (Konstantin Bogdanov). groupUniqArrayдля числовых типов ускорена до 3 раз благодаря использованию хеширования CRC32, как вuniqExact, и встраиванию вставки для каждой строки. #110917 (Manuel).- Ускорена
estimateCompressionRatioс кодекомNONE. #111107 (Raufs Dunamalijevs). - Значение по умолчанию для
max_snapshot_commit_thread_pool_sizeснижено до16в соответствии сbackup_threads, чтобы уменьшить ограничение CFS при коммите снимков таблиц с большим количеством частей. #111417 (Han Fei). - Снижено использование CPU при коммите снимков таблиц с огромным количеством файлов. #112297 (Han Fei).
- Предварительный прогрев хешей дедупликации async-insert пропускается, если дедупликация отключена. #111549 (Sema Checherinda).
JOIN, условиеONкоторого всегда ложно, напримерON 1 = 2,ON NULLилиa.t = 'A' AND a.t = 'B', больше не читает сторону, не влияющую на результат. Управляется настройкойquery_plan_short_circuit_constant_false_join(включена по умолчанию). #110234 (Groene AI).- Ускорено чтение таблиц
Icebergблагодаря предварительной загрузке следующего файла манифеста во время разбора текущего, что позволяет совмещать операции I/O с работой CPU. #108543 (Asya Shneerson). - Запросы с
FINAL, читающие данные в порядке первичного ключа с небольшимLIMIT, больше не используютsplit_intersecting_parts_ranges_into_layers_final. #110431 (Nikolai Kochetov). - Улучшена производительность
RIGHTиFULL JOINс алгоритмомparallel_hash, когда правая сторона содержит ключи JOIN со значениемNULLили строки, отфильтрованные выражениемON, за счёт отказа от повторного построения null-map. #111258 (Hechem Selmi). - Ускорена
countSubstringsCaseInsensitiveUTF8благодаря устранению квадратичной сложности, из-за которой выполнение функции могло занимать минуты при обработке исходной строки размером в несколько мегабайт с большим количеством совпадений. #112003 (Groene AI). - API запросов Prometheus (
/api/v1/query,/api/v1/query_range) экспериментального движкаTimeSeriesтеперь выполняет запросы параллельно, а не в одном потоке. #112108 (Nikita Mikhaylov). - Автоматически создаваемые столбцы
timestampиvalueвнутренней таблицы семпловTimeSeriesтеперь по умолчанию используютCODEC(DoubleDelta, ZSTD(1))иCODEC(Gorilla, ZSTD(1))соответственно. #112110 (Nikita Mikhaylov). - Исправлена регрессия производительности при ингестии
system.query_log. Построение столбцов типа MapSettingsиasynchronous_read_countersбыло примерно в шесть раз медленнее, чем раньше, из-за чегоSYSTEM FLUSH LOGS query_logмог превышать 180-секундное время ожидания на серверах, регистрирующих много запросов с большим количеством изменённых настроек. Закрывает #112191. #112210 (Groene AI). - Улучшена производительность хеш-JOIN RIGHT и FULL с несколькими дизъюнктами
ORв условии ON, а также JOIN RIGHT/FULL с остаточными условиями (неравенствами). #111590 (Hechem Selmi). - Снижено использование памяти командой
UNLOCK SNAPSHOTблагодаря отказу от загрузки метаданных отдельных частей данных, не используемых при разблокировке; это предотвращает нехватку памяти для снимков с очень большим количеством частей. #111849 (Julia Kartseva). - Восстановлено предварительное выделение памяти для динамических путей столбца
JSONпри асинхронном сбросе буферизованныхINSERT, что предотвращает повторное выделение памяти при добавлении строк пакетами. #112222 (Groene AI). - Повторно включена оптимизация последовательных ключей для агрегации
TTL ... GROUP BYво время слияний. Она была случайно отключена в этом сценарии, поэтому результаты оставались корректными, но слияния выполняли больше работы, чем необходимо. #112314 (Groene AI). - Ускорено чтение столбцов
Nestedиз двоично закодированных типов, таких какNativeиRowBinary, при включённом параметреinput_format_binary_decode_types_in_binary_format. Некорректно сформированные имена вложенных типовTupleтеперь вызывают синтаксическую ошибку вместо разбора с экспоненциальными затратами времени. #112560 (Alexey Milovidov). - Повышена производительность укрупнения и слияния столбцов
DynamicиObjectс большим количеством динамических вариантов или JSON-путей. #110583 (Christoph Viebig). - Ускорены
minиmaxдля 128- и 256-битных типов (Int128,UInt128,Int256,UInt256,Decimal128,Decimal256). До 1,8 раза быстрее для целых чисел большой разрядности и до 3,4 раза быстрее для десятичных чисел большой разрядности. #111965 (Manuel). - По умолчанию включены и переведены в бета-стадию две функции хранения на диске: 1)
packed_skip_index_max_bytes = '1M': подпотоки skip-index размером до 1 МиБ теперь записываются в единый архивskp_idx.packedдля каждой части, что сокращает количество объектов и запросов на запись в объектное хранилище. Совместимость: затрагиваются только вновь записанные части, и они остаются полностью читаемыми в старых версиях; версии до 26.6 просто не используют упакованные индексы для отсечения данных, считая их нематериализованными. Установитеpacked_skip_index_max_bytes = 0, чтобы сохранить автономную структуру с отдельными файлами. 2)compute_exact_num_defaults_for_sparse_columnsвместе сoptimize_trivial_count_with_sparsity_filter: точные счётчикиnum_defaultsдля каждого столбца сохраняются и используются для выполненияSELECT count() FROM t WHERE <pred>без сканирования данных, если предикат разделяет строки на значения по умолчанию и значения, отличные от них. Совместимость: флагexact_num_defaultsвserialization.jsonигнорируется старыми версиями, поэтому части остаются полностью читаемыми после понижения версии; оптимизацияcountприменяется только к частям с точными счётчиками, поэтому результаты остаются корректными для таблиц со смешанными частями. #111816 (Raúl Marín). - Добавлено необязательное кэширование токенов, отсутствующих в текстовых индексах. #112742 (Rory Shanks).
- Исправлено квадратичное перераспределение памяти при репликации
Array, элементы которого содержат значенияJSONв общих данных, например константногоArray(JSON), передаваемого в агрегатную функцию. В таких запросах количество копируемых байтов росло квадратично с числом строк. #112897 (Groene AI). - Индекс первичного ключа теперь используется для
pointInPolygon, если аргумент точки — это целый столбец ключа типаPoint(или другойTupleиз двух числовых элементов), напримерpointInPolygon(coord, [...])для таблицы, упорядоченной поcoord. Ранее анализировалась только формаpointInPolygon((x, y), [...])с двумя скалярными столбцами ключа. Закрывает #54805. #112956 (Alexey Milovidov). - Для слияний
TTLDropполностью пропускается этап чтения данных, что сокращает использование памяти, особенно буферов чтения и предварительной выборки. Закрывает #105639. #105859 (Pavel Kruglov). - Сокращено количество выделений памяти при чтении метаданных резервных копий: записи файлов перемещаются в отображения в памяти вместо копирования. #111718 (Julia Kartseva).
- Текстовый индекс теперь используется, когда его выражение содержит сравнение с пустой строкой, например
arrayFilter(s -> s != '', ...), даже еслиoptimize_empty_string_comparisons = 1преобразует его вnotEmpty. Закрывает #111788. #112115 (Jimmy Aguilar Mena). - Восечено отсечение по кэшу условий запроса после
lightweight DELETE: повторные выборочные запросы к таблице, затронутойlightweight DELETE, больше не переходят к чтению каждой метки. #112947 (Nikita Fomichev). - Функции высшего порядка больше не копируют физически захваченные столбцы для каждого элемента массива при включённом
enable_lazy_columns_replication, что сокращает использование памяти и время копирования для лямбда-функций, захватывающих большие столбцы. #111581 (Diego Gomes Tomé). - Исправлена регрессия производительности примерно в 1,5 раза, появившаяся в версии 26.5 при
GROUP BYпо ключамDynamicи подстолбцам путейJSON. #112316 (Utkal Singh). - Значение
lazyтеперь используется по умолчанию дляtext_index_posting_list_apply_mode, поэтому запросы текстовых индексов декодируют списки вхождений по требованию на уровне упакованных блоков с помощью курсора, вместо того чтобы заранее материализовать их в битмапы для текстовых индексов с заданнымposting_list_codec. #113521 (Anton Popov). - Ускорены запросы PromQL к таблицам
TimeSeries:timeSeriesIdToGroupтеперь повторно использует группу предыдущей строки, если последовательные строки имеют одинаковый ID серии, избегая сериализации ID и поиска по хешу для каждой строки. #113580 (Nikita Mikhaylov). - Операторы агрегации PromQL
topk,bottomkиlimitkтеперь используют потоковый параллельный Execution Plan с ограниченным использованием памяти вместо сбора всех серий в одну строку. Запросы к метрикам с высокой кардинальностью, которые ранее завершались ошибкойMEMORY_LIMIT_EXCEEDED, теперь выполняются с ограниченным использованием памяти. #113656 (Nikita Mikhaylov). #114409 (Alexey Milovidov). - Ускорено деление 256-битных целых чисел (
Int256,UInt256иDecimal256), в том числеintDiv,modulo, арифметикаDecimal256и преобразование этих типов в текст. #112477 (Konstantin Bogdanov). - Улучшена производительность чтения
MergeTreeдля подстолбцовJSONза счёт повторного использования разрешённых метаданных подстолбцов при необходимых преобразованиях. #113008 (Rory Shanks). - Ускорено построение текстовых индексов и индексов пропуска данных на основе фильтра Блума с токенизатором
sparseGrams. #110541 (UnamedRus). - Для создания снимков теперь используется выделенный пул потоков, поэтому ресурсоёмкий параллельный
BACKUPбольше не лишает его ресурсов. #113509 (Han Fei). - Вычислять общие для нескольких шагов плана подвыражения PromQL (операнд
topk/bottomk/limitk, левую частьor) один раз вместо двух: SQL, генерируемый из PromQL, теперь материализует общие подзапросы. Это устраняет дублирующее сканирование таблицы samples;topkнадrateвыполняется примерно в 2 раза быстрее при холодном кэше, а запросы правил kubernetes-mixin ускоряются на 10–29 %. #113772 (Nikita Mikhaylov). - Теперь можно включить раннее свёртывание с коротким замыканием для встроенных
andиorна этапе анализа с помощью настройкиenable_function_early_short_circuit. Это позволяет пропускать выполнение недостижимых однострочных скалярных подзапросовcount(), сохраняя обычный вывод типов и семантическую валидацию. Исправляет #83017. #83505 (fhw12345). - Учитывать стоимость I/O наряду с селективностью при упорядочивании условий
PREWHERE. Это исправляет регрессию производительности выполненияPREWHEREв некоторых случаях, появившуюся после #101275. Часть #110462. #110695 (Pavel Kruglov). - Улучшена производительность
levenshteinDistance(иeditDistance) для строк средней длины на ARM благодаря отказу от выделений в куче для каждой строки в ветви кода blocked Myers. #108185 (Groene AI). - Добавлена настройка
MergeTreemerge_use_batch_sorting_queue, позволяющая при необходимости использовать очередь пакетной сортировки для обычных слиянийMergeTree, сокращая загрузку CPU и реальное время выполнения задач слияния, в которых сортировка при слиянии требует значительных затрат. #108468 (Rory Shanks). - Добавлена настройка
merge_tree_min_bytes_per_read_stream, уменьшающая чрезмерное количество потоков чтения и накладные расходы конвейера при обычном локальном неупорядоченном сканированииMergeTreeпо узким столбцам на серверах с большим числом ядер. #109035 (Jiebin Sun). - Ускорена функция
toStartOfInterval(псевдонимыtime_bucket,date_bin) до 5 раз для интерваловSECOND,MINUTEиHOUR. #109729 (Manuel). - Собственный протокол теперь отправляет столбцы
Stringкак отдельный поток накопительных смещений в байтах (по той же схеме, которуюArrayиспользует для своих смещений), за которым следуют объединённые данные, вместо префикса длины varint для каждого значения, если оба участника используют ревизию протокола 54489 или новее. Благодаря этому клиент может считывать столбцыStringс точным предварительным выделением буфера и одной операцией пакетного копирования — примерно в 4 раза быстрее, чем при схеме для отдельных значений. Старые клиенты и серверы не затрагиваются: схема согласовывается через ревизию протокола. Та же схема доступна в форматахNativeиBuffersчерез новые настройкиoutput_format_native_write_string_with_size_stream/input_format_native_read_string_with_size_stream(по умолчанию выключены, поэтому форматы остаются переносимыми). #110320 (vahid-sohrabloo). - Избегать преждевременной JSON-сериализации записей манифеста Iceberg, когда iceberg_metadata_log_level ниже порогового значения места вызова. #110437 (Andy Bradshaw).
- Ускорено полное сортирующее соединение слиянием в 1,5–3 раза в разреженных сценариях. #111200 (Vladimir Cherkasov).
- Повышена эффективность minmax и базовой статистики столбцов с плавающей запятой. #111221 (Christoph Viebig).
join_runtime_filter_from_fixed_hash_tableтеперь включается, когда типы ключей JOIN на стороне проверки и построения различаются (например, ключ проверки Nullable и ключ построения non-Nullable). #111244 (Hechem Selmi).- Запросы
COUNT()теперь выполняются непосредственно по метаданным мощности текстового индекса. #111494 (Elmi Ahmadov). - Ускорено построчное хеширование значений JSON/столбца
Object, хранящихся в общих данных (используемое, например,uniq/uniqExactдля JSON-столбца и хешированными ключамиGROUP BY/DISTINCT), за счет отказа от реконструкцииColumnDynamicдля каждого значения. Хеш-значения не изменились. #111501 (Valery Petrov). - Функции
mapContainsKeyLike,mapContainsValueLike,mapExtractKeyLikeиmapExtractValueLikeс неконстантным шаблоном регулярного выражения используют меньше памяти и работают быстрее при включенной настройке enable_lazy_columns_replication. Шаблон больше не копируется заранее для каждой записи Map при захвате; копирование отложено до выполнения внутренней лямбды и освобождается раньше, поэтому при пиковом потреблении памяти существует на одну развернутую копию шаблона меньше. #111749 (Diego Gomes Tomé). - Ускорены сортировка и другие операции на основе сравнения для столбцов
JSON, пути которых хранятся в общих данных. Ранее при каждом сравнении значений материализовался временный столбецDynamicи выполнялась полная двоичная десериализация для обеих сторон, из-за чегоORDER BYпо таким столбцам работал патологически медленно. #111894 (Groene AI). clickhouse-clientбольше не отправляет Ping серверу перед каждым запросом, что исключает один сетевой обмен на каждый запрос. Он также больше не переустанавливает подключение — молча начиная новый сеанс и тем самым теряя временные таблицы, текущую базу данных и настройки сеанса — только потому, что сервер слишком медленно ответил на Ping. #111990 (Alexey Milovidov).- Оптимизация транзитивных условий теперь используется более разумно: дополнительный фильтр, созданный на основе транзитивности, применяется только для анализа индекса, если весь фильтр применить невозможно. См. настройку
optimize_and_compare_chain. #112076 (Yarik Briukhovetskyi). - Добавлены две настройки:
shrink_over_allocated_columns_min_waste_ratioиshrink_over_allocated_columns_min_waste_bytes, которые заставляют INSERT-операции уменьшать размер чрезмерно выделенных столбцов (зарезервированная память которых превышает используемую из-за роста столбцов переменной длины по степеням двойки) перед материализацией и записью части, снижая пиковое потребление памяти. По умолчанию отключено. #112161 (Pavel Kruglov). - Отложенная репликация столбцов для
ARRAY JOINбольше не теряется при сериализации плана запроса. Приserialize_query_plan = 1узел, выполняющий удалённый фрагмент плана, ранее игнорировалenable_lazy_columns_replicationи всегда материализовал все реплицированные копии, хотя эта настройка включена по умолчанию. #112330 (Groene AI). - Форматирование значений
Decimalв текст стало значительно быстрее — до 190 раз дляDecimal256с большим масштабом и примерно в 1,6 раза дляDecimal64. На процессорах с AVX-512 IFMA преобразование 64-битных целых чисел в текст выполняется примерно в 1,4 раза быстрее. Также исправлено округлениеtoDecimalString, при котором терялся перенос из дробной части:toDecimalString(toDecimal64('9.995', 3), 2)возвращал9.00, а теперь возвращает10.00. #112457 (Konstantin Bogdanov). - Условие равенства в
WHEREтеперь объединяется с условиемJOIN, если его операнды имеют разные типы, но общий супертип, напримерInt32иNullable(Int32). Это позволяет преобразовать CROSS JOIN в INNER JOIN. #112630 (Hechem Selmi). - Запросы к таблицам Iceberg с большим количеством файлов удалений теперь запускаются быстрее. ClickHouse читает и декодирует манифесты удалений параллельно, а не по одному, поэтому операции чтения из хранилища перекрываются. Новая настройка
iceberg_delete_manifest_decode_concurrency(по умолчанию4) определяет, сколько файлов декодируется одновременно. #112679 (Asya Shneerson). - Асинхронное логирование теперь использует ограниченную неблокирующую очередь: потоки, записывающие сообщения лога, никогда не блокируются на мьютексе и не пробуждают потоки логирования. #112803 (Alexey Milovidov).
randomHadamardTransformдля постоянного вектора теперь вычисляется один раз, а не для каждой строки. Это ускоряет запросы векторного поиска, в которых вектор запроса поворачивается с помощьюrandomHadamardTransformперед сравнением со столбцомQBit. #112921 (Alexey Milovidov).- Восстановлено совместное использование множеств между задачами обработки частей одной мутации при фильтрации по
IN (subquery)для столбца первичного ключа.enable_sharing_sets_for_mutationsвключена по умолчанию, но множество, созданное для анализа первичного ключа, перестало участвовать в общем кэше, поэтому таблица с N частями материализовала одно и то же множество N раз. #112941 (Groene AI). - Исправлена кубическая сложность планирования запроса для JOIN с таблицей
Merge, охватывающей множество таблиц с разными структурами. Ранее такие запросы могли тратить минуты на планирование, не реагируя наmax_execution_timeилиKILL QUERY. #113140 (Alexey Milovidov). - Кэш регионов бакетов клиента
S3теперь также работает для каталогов озёр данных; ранее каждый запрос к ним заново определял регион. #113330 (Konstantin Vedernikov). - Исправлена регрессия производительности, при которой агрегация без ключей
GROUP BYпри каждом выполнении сериализовала всё поддерево входного плана, включая полное содержимое свёрнутых в константы литералов, чтобы вычислить ключ кэша размера хеш-таблицы, который никогда не мог быть использован. Запрос вродеSELECT quantileMerge(arrayJoin(arrayMap(x -> state, range(5000000))))тратил около 63 мс на оптимизацию плана запроса при каждом выполнении, а теперь тратит 0,15 мс. #113333 (Groene AI). - Добавлена опциональная сериализация UInt128/UInt256/Int128/Int256 в Parquet в формате DECIMAL, позволяющая отсекать группы строк и страницы. #113347 (Ivan Babrou).
- Ускорено планирование запросов при использовании статистики столбцов
uniq_v2. Оценочное число уникальных значений теперь кешируется, а не пересчитывается для каждого из множества запросов, выполняемых при планировании одного запроса. (issue #113038). #113357 (Groene AI). - При чтении полного пути JSON из расширенных общих данных больше не выполняется предварительная выборка ненужных подчинённых потоков. #113380 (Pavel Kruglov).
- Проталкивание фильтров теперь работает для подобстолбцов
Tupleв файлах Parquet и ORC. Предикат видаWHERE tup.1 = 555555при работе сfile,s3илиurlтеперь отсекает группы строк и шаги индекса строк, используя статистику самого элемента кортежа вместо чтения всего файла. #113383 (Groene AI). - Хеш-карта для каждого бакета внутри агрегатных функций
timeSeries*ToGridзаменена плоским отсортированным массивом образцов: для упорядоченных входных данных, что является наиболее распространённым случаем, ингестия образцов теперь выполняется добавлением за O(1), а копирование и сортировка по бакетам на этапе финализации устранены. #113681 (Nikita Mikhaylov). - Повышена производительность запросов PromQL к движку TimeSeries: внутренний SQL селектора теперь напрямую читает столбцы первичного ключа таблицы образцов без холостых приведений типов и проверяет диапазон временных меток до набора ID серий, что ускоряет холодные запросы с интенсивным использованием селекторов на 30–44 %. #113768 (Nikita Mikhaylov).
- В коллекторе тегов временных рядов используются типизированные карты ID. #113839 (Vitaly Baranov).
- При записи частей MergeTree, у которых все ключи сортировки являются константами, пропускается избыточная проверка отсортированности. #113899 (Perfloop Agent).
- Селекторы PromQL, соответствующие всем сериям одной метрики, теперь при анализе индекса фильтруют таблицу образцов таблицы
TimeSeriesпо непрерывному диапазону первичного ключаidвместо большого условияid IN <set>, если схема ID представляет собой двухкомпонентный кортеж с каноническим генератором ID. Устранены основные однопоточные затраты на анализ индекса в запросах PromQL с интенсивным использованием селекторов: до −45 % холодной задержки для запросов панелей мониторинга и правил, −11 % холодного среднего геометрического по всему набору тестов на таблице с 62 миллиардами образцов. #114131 (Nikita Mikhaylov). - Ускорены векторизованные преобразования тегов TimeSeries за счёт замены переназначения на основе хеша прямым индексированием, когда ID групп тегов занимают компактный диапазон. #114244 (Minh Vu).
- Конечные точки Prometheus HTTP API
/api/v1/queryи/api/v1/query_rangeтеперь вычисляют общий для нескольких шагов плана подзапрос PromQL один раз, как уже делали табличные функцииprometheusQueryиprometheusQueryRange. Ранее запрос, выполненный сenable_analyzer = 0либо пользователем, в профиле которого задан этот параметр, повторно сканировал общий подзапрос для каждого шага, ссылающегося на него. #114261 (Groene AI). - Ограничены затраты на оценку селективности
col IN (...)по статистике столбцов, которая могла добавлять сотни миллисекунд к планированию одного запроса. Оценщик больше не выполняет подзапрос вcol IN (subquery), чтобы заполнить множество, от которого ему нужно лишь одно значение селективности: вместо этого пропускается ещё не построенное множество. Для множества, размер которого превышает значение новой настройкиstatistics_max_set_size_for_exact_selectivity_estimation(по умолчанию 10000), селективность теперь определяется по размеру множества и ограничивающему его диапазону. #114389 (Nikita Taranov). - Разбор HTTP-запроса, содержащего много параметров запроса или заголовков с одинаковым именем (например, тысячи повторяющихся параметров
role=), больше не выполняется за квадратичное время. #114410 (James). - Исправлена регрессия в 26.7: для таблицы
MergeTree, упорядоченной поtoUnixTimestamp(или другому целочисленному преобразованию) столбцаDateTime64, простой фильтр диапазона по этому столбцу больше не игнорирует первичный ключ и не считывает все гранулы соответствующих частей. Кроме того, фильтр видаtoInt64(ts) >= cдля таблицы, упорядоченной по исходному столбцуDateTime64, теперь использует первичный ключ. #114413 (Alexey Milovidov). - Ресурсоёмкая проверка согласованности в
ColumnArrayтеперь выполняется только в отладочных сборках. #114469 (Anton Popov). - Не выполнять сортировку слиянием при распределённом сборе данных, если описание сортировки состоит только из констант. #114626 (Groene AI).
- Ускорено построение множества для
IN (subquery)в партиционированных таблицахMergeTree: строки каждой партиции остаются в одном потоке, а каждый поток дедуплицируется независимо, благодаря чему единственное преобразование, заполняющее множество и ранее последовательно хешировавшее каждую строку, получает только уникальные строки. Это применяется, когда выражение партиционирования является детерминированной функцией выходных столбцов подзапроса. Оптимизация не применяется, если наибольшая партиция содержит более чем вдвое больше строк, чем средняя партиция; новая настройкаforce_creating_set_partitions_independently(по умолчанию отключена) позволяет обойти эту проверку. Управляется новой настройкойallow_creating_set_partitions_independently(по умолчанию включена). #114645 (Nihal Z. Miaji). - Распараллелено преобразование состояний агрегации каждого потока из одноуровневых в двухуровневые перед слиянием. Это исправляет 2–3-кратную регрессию производительности коротких запросов
GROUP BYс ресурсоёмкими состояниями агрегатных функций (например,COUNT(DISTINCT ...), ClickBench Q10/Q11) на машинах с очень большим числом ядер, появившуюся в сборках разработки 26.7 после повышения точности учёта памяти агрегации. #114691 (Alexey Milovidov). - Ускорены агрегатные функции
timeSeries*ToGrid: вычисления бакетов для каждого образца теперь обходятся без деления Int128, а для последовательных образцов в одном бакете пропускается поиск в хеш-таблице. #114889 (Nikita Mikhaylov). - Добавление элементов в очередь системного журнала больше не приводит к глубокому копированию всей очереди при её увеличении. #115030 (Groene AI).
- Образцы агрегатных функций
timeSeries*ToGridтеперь обрабатываются группами последовательных образцов, попадающих в один бакет сетки, что ускоряет этап приёма образцов вtimeSeriesRateToGridи связанных функциях в 1,2–2 раза на отсортированных данных временных рядов. #115041 (Nikita Mikhaylov). - Используйте компактные маски наличия для операторов множеств PromQL. #115224 (Minh Vu).
- Ускорено выполнение мгновенных запросов PromQL: агрегатные функции
timeSeries*ToGridиспользуют векторизованный путь классификации сэмплов для сеток из одной точки, аtimeSeriesIdToGroupнапрямую заполняет столбец результата. #115267 (Nikita Mikhaylov). JOIN, в секцииONкоторого несколько равенств объединены операторомOR, больше не материализует столбцы ключа правой части, не выбираемые запросом. #115465 (Nikita Taranov).- Указание типа
DateTimeилиDateTime64больше не создаёт таблицу поиска часового пояса UTC, которая нигде не используется, что ускоряет создание этих типов и, следовательно, запускclickhouse localиclickhouse client. #115488 (Konstantin Bogdanov). - При подключении системных таблиц больше не выполняется двукратное копирование метаданных каждой таблицы, включая полное описание столбцов, только для установки комментария к таблице. #115490 (Konstantin Bogdanov).
- Имя хоста клиента теперь разрешается при первом его получении, а не при каждом запуске
clickhouse clientиclickhouse local. #115491 (Konstantin Bogdanov). - Исправлена квадратичная сложность при формировании результата функциями
h3kRing,h3ToChildren,h3PolygonToCellsиh3PolygonToCellsWithContainmentдля большого числа строк. В стрессовом прогоне CI запрос по 196 000 строк тратил 838 секунд на копирование памяти; теперь он выполняется примерно за 5 секунд. #115773 (Groene AI). - Ускорены проверки дублирующихся серий для полностью нулевых векторов условий PromQL. #115822 (Minh Vu).
- Ускорен
GROUP BYбез агрегатных функций по ключамString,FixedStringиLowCardinality: запрос больше не записывает неиспользуемый заполнитель в хеш-таблицу для каждой строки, а только для строк, добавляющих новый ключ. #115834 (Nikita Taranov). - Ускорены
toUTCTimestamp/to_utc_timestampиfromUTCTimestamp/from_utc_timestampдля аргументовDateTime64, восстановлена пропускная способность, существовавшая до исправления переполнения в #109738. Результаты не изменились. Закрывает #115802. #115838 (Groene AI). - Снижены использование памяти и время оптимизации плана запроса для агрегаций по ключам с большими литералами, свёрнутыми в константы. Ключ кэша статистики хеш-таблицы агрегации теперь хешируется по мере сериализации, вместо того чтобы сначала полностью накапливаться в памяти, поэтому план с большим литералом больше не хранит его копию во время оптимизации. Для литерала размером 80 МБ пиковое потребление памяти уменьшается примерно на 250 МБ, а время оптимизации — примерно в 2,5 раза. Вычисленный ключ не изменился. #115847 (Groene AI).
Улучшения
- Исходящие HTTP-запросы в формате OpenAI теперь помечаются SQL-именем вызывающей функции ИИ, чтобы идентифицировать вышестоящую конечную точку. #110449 (George Larionov).
- Уменьшена задержка отмены для положительных форм
LIMIT BY:KILL QUERYи Ctrl+C теперь прерывают выполнение в пределах одного блока, не дожидаясь завершения всего этапа. #106070 (Roman Vasin). - Если
INSERTзавершается ошибкой, потому что целевая таблицаTOmaterialized view отклоняет запись при построении конвейера вставки, сообщение об ошибке теперь содержит имена materialized view и её целевой таблицы, а не только ошибку хранилища. #107234 (Groene AI). - При использовании
input_format_protobuf_oneof_presenceClickHouse больше не требует, чтобы enum наличияoneofсодержал в точности теги, объявленные в схеме Protobuf: теперь разрешены дополнительные теги без соответствующих столбцов в целевой таблице, что упрощает изменения схемы. #109174 (Ilya Golshtein). - Транспонированные функции расстояния для
QBit(L2DistanceTransposed,cosineDistanceTransposed,dotProductTransposedи их квантованные варианты) теперь принимают эталонный вектор, длина которого превышает число искомых размерностей, игнорируя лишние конечные элементы. Это позволяет повторно использовать полноразмерный вектор запроса для поиска Matryoshka с уменьшенной размерностью без предварительного разбиения. #109388 (Alexey Milovidov). - Подстатистика
NullCountстатистикиbasicпереименована вDefaultCountи теперь подсчитывает строки со значением по умолчанию для типа столбца, а не только строки со значениемNULLв столбцахNullable. #109977 (Han Fei). - Добавлена поддержка одновременной записи в таблицы
Icebergна локальном диске:LocalObjectStorageтеперь реализует условные записи, поэтому операция compare-and-swap, публикующая новый снимок черезversion-hint.text, работает и там, а параллельные процессы записи не могут потерять обновления друг друга. #112556 (Alexey Milovidov). ALTER TABLE ... MOVE/REPLACE PARTITIONмежду двумя таблицамиMergeTreeс несовместимой гранулярностью теперь выдаётBAD_ARGUMENTSвместоLOGICAL_ERROR. #110535 (Groene AI).- Формат
Valuesбольше не регистрирует ложные ошибки разбора вsystem.errorsиsystem.error_log, когда потоковый разбор успешно переключается на разбор SQL-выражений. #111141 (Pablo Marcos). - Добавлен
ProfileEventDuplicationDataHashComputations, подсчитывающий по-столбцовые вычисления хеша данных при дедупликации блоковINSERTв таблицы семейства*MergeTree. #111173 (Valery Petrov). - Команды
./clickhouseиsudo ./clickhouse installвыделены в выводе универсального скрипта установки. #111514 (Alexey Milovidov). - Декартовы JOIN и JOIN с константными предикатами, планируемые анализатором, больше не завершаются ошибкой из-за несовместимой настройки
join_algorithmпри использовании анализатора. #108289 (János Benjamin Antal). bitmaskToArrayиbitmaskToListтеперь поддерживают аргументыInt128,UInt128,Int256иUInt256.bitPositionsToArrayтакже работает быстрее с аргументами больших целых чисел, поскольку теперь его сложность зависит от количества установленных битов, а не от позиции старшего установленного бита. #110743 (Manuel).- Исправлен сбой в JIT-компилированных выражениях в нативных сборках macOS/aarch64 из исходного кода: теперь используется корректный LLVM host triple для ОС хоста. #111591 (Raúl Marín).
- Исправлена работа
JSON_EXISTS,JSON_VALUEиJSON_QUERYс входными даннымиDynamic, когда аргументы пути типаTupleсодержат элементыLowCardinality; это позволяет избежать исключенийLOGICAL_ERROR. Закрывает #110345. #109944 (Groene AI). - Повреждённые файлы
ORC, в дереве типов которых объявлено больше столбцов, чем в нижнем колонтитуле stripe, теперь завершают вывод схемы ошибкойCANNOT_EXTRACT_TABLE_STRUCTUREвместо аварийного завершения в отладочных сборках и сборках с санитайзерами. #110967 (Groene AI). - Ротируемые системные таблицы логов, такие как
system.metric_log, теперь можно помечать какtable_readonly, даже если размер их метаданных превышаетmax_query_size. Поэтому при ротации больше не записываетсяQUERY_IS_TOO_LARGE, и она продолжается в штатном режиме. #111703 (Alexey Milovidov). - В Play добавлена кнопка для закрытия всех вкладок, кроме текущей. #111835 (Mikhail Artemenko). Исправлен фокус клавиатуры после её активации клавишей Enter или Space, когда кнопка скрывается. #111899 (Alexey Milovidov).
- В Play при удерживании
Ctrl(Cmdна Mac) и наведении курсора на ячейку таблицы со значением в виде URL изображения теперь отображается его предпросмотр. #109347 (Alexey Milovidov). - В Linux ClickHouse теперь при запуске добавляет запись в
system.warnings, еслиrseqнедоступен, поскольку счётчики профиля для каждого CPU в этом случае переключаются на более медленный путьsched_getcpu. #109283 (Azat Khuzhin). COUNT(*)для табличной функцииfileбольше не генерирует исключение, когда при выводе схемы столбцы оборачиваются вNullable. Закрывает #102044. #102509 (Rory Shanks).- Функции
L1Normalize,L2Normalize,LinfNormalizeиLpNormalize(а также их псевдонимы) теперь работают с аргументамиArray, а не толькоTuple, как иL2Normи функции расстояния. #110052 (Alexey Milovidov). - Удалён устаревший считыватель
ORCна базе Apache Arrow. Формат вводаORCтеперь всегда использует нативный декодер ClickHouse, который уже был декодером по умолчанию. Настройкаinput_format_orc_use_fast_decoderустарела и не влияет на работу. #110074 (Alexey Milovidov). - Часто используемые аргументы
clickhouse-clientтеперь можно настраивать из XML (<hints/>,<highlight/>,<echo/>,<echo_query_id/>,<echo_formatted/>,<print-profile-events/>). Также сохраняются значения из конфигурации клиента, если не указаны соответствующие CLI-флаги со значениями по умолчанию, для таких настроек, какhistory_max_entries,suggestion_limit,progress,progress-table,enable_progress_table_toggle,print-memory-to-stderr,chime-threshold-secondsиprofile-events-delay-ms. #110607 (Larry Snizek). - Добавлена настройка
analyzer_compatibility_apply_final_to_all_joined_tablesдля восстановления прежнего поведения, при которомFINALдля крайней левой таблицы вJOINтакже применяется к другим присоединённым таблицам. Настройка зарегистрирована в истории изменений настроек, поэтомуcompatibilityс версиями до 26.6 автоматически восстанавливает прежнюю семантику. #111589 (Nikita Fomichev). - В Play кнопка
+(новая вкладка) теперь отображается в Firefox с правильной высотой. #109524 (Alexey Milovidov). - Вложенный коррелированный подзапрос
EXISTS, который ссылается на столбец из области видимости, находящейся за пределами непосредственного внешнего запроса, теперь завершается сNOT_IMPLEMENTEDвместо внутреннего исключенияNOT_FOUND_COLUMN_IN_BLOCK. #110310 (Groene AI). - Форматирование запроса
EXECUTE ASпосле переписывания AST больше не вызывает исключение на стороне клиента, например в AST-фаззере. #111725 (Groene AI). - Улучшена поддержка запроса
DESCRIBEдля параметризованных представлений, а также поддержка параметризованных представлений в скалярных выражениях нового анализатора. Закрывает #66307. Закрывает #69598. #68978 (Dmitry Novik). - Некорректные выражения
CREATE INDEXиCREATE HYPOTHETICAL INDEX, которые не могут пройти цикл «форматирование — разбор — форматирование», теперь вызывают исключение вместо логической ошибкиInconsistent AST formattingв отладочных сборках и сборках с санитайзерами. #109175 (Groene AI). - Web UI: исправлена проблема, из-за которой поле имени пользователя/пароля оставалось красным даже при корректных учётных данных и доступном сервере. Также добавлена повторная проверка учётных данных после редактирования подключения, чтобы корректное значение отображалось зелёным. #109414 (Alexey Milovidov).
- Добавлены настройки
text_index_max_processed_tokens_before_flushиtext_index_max_memory_usage_before_flush, определяющие, когда построители текстовых индексов сбрасывают временные сегменты. #111573 (Rory Shanks). - Добавлена настройка
system_cache_extensions, определяющая, какие расширения файлов сохраняются в системном кэше при включённомuse_split_cache. #111575 (Kirill). - Сообщения об ошибках в сборках на основе musl теперь содержат понятный текст
strerrorвместо пустого или числового значения, напримерstrerror: 0. #111620 (Konstantin Bogdanov). - Фактически используемый тип хранилища именованных коллекций теперь доступен как
named_collections_storage.typeвsystem.server_settingsи черезgetServerSetting('named_collections_storage_type'). #111806 (Pablo Marcos). - Ослаблена чрезмерно строгая проверка размера перестановки в
ColumnReplicated::permute, чтобы она соответствовала общему контрактуIColumn::permute, допускающему перестановку короче столбца при заданном ограничении. #109897 (Groene AI). - Улучшено планирование потоковых запросов за счёт унификации внутреннего плана потокового чтения, что исключает двойную оптимизацию прямого чтения текстового индекса. #111821 (Mikhail Artemenko).
- Веб-интерфейс: расстояние между кнопками
Run oneиRun allтеперь равно левому отступу перед первой кнопкой. #111988 (Alexey Milovidov). - Планировщик резервирования памяти (экспериментальный) больше не вытесняет выделение памяти, если ожидающее освобождение памяти высвободит место, необходимое для увеличения резервирования сверх лимита: решение о вытеснении теперь принимается после применения выполняющихся уменьшений, что предотвращает ненужное завершение запросов при нехватке памяти. #112299 (Sergei Trifonov).
- Iceberg v2 требует
sequence_numberв файлах манифеста, однако другие движки, такие как BigQuery, могут записывать файлы манифеста без него. ClickHouse теперь может читать такие таблицы. #112431 (Konstantin Vedernikov). - Добавлено предупреждение при отсутствии статистики для изменения порядка JOIN. #107666 (Vladimir Cherkasov).
- В представления
INFORMATION_SCHEMAдобавлены столбцы для совместимости с MySQL:SCHEMATA.DEFAULT_COLLATION_NAMEиDEFAULT_ENCRYPTION;TABLES.ENGINEи связанные с MySQL столбцы; а такжеCOLUMNS.COLUMN_KEY,PRIVILEGES,GENERATION_EXPRESSION,SRS_ID. Это позволяет клиентам с поддержкой MySQL выполнять запросы интроспекции каталога без ошибкиUNKNOWN_IDENTIFIER. #109351 (Alexey Milovidov). - Неквалифицированная ссылка на ключ
INNER JOIN, приравненный в условииON(например,SELECT id FROM a INNER JOIN b ON a.id = b.id), больше не считается неоднозначным идентификатором, поскольку обе стороны гарантированно содержат одно и то же значение. #109366 (Alexey Milovidov). - Для исключений
ACCESS_DENIEDчерез HTTP-интерфейс теперь возвращается HTTP-код403 Forbiddenвместо500 Internal Server Error. #111043 (Schum). - Индекс SST UNIQUE KEY теперь записывается непосредственно в хранилище части вместо промежуточного сохранения в локальном временном файле, что устраняет зависимость от локального временного тома и исключает дополнительное копирование. #111189 (johnjing).
UTMToGeoтеперь принимает букву широтной зоны MGRS, возвращаемуюgeoToUTM, в качестве четвёртого аргумента (помимо целочисленного флага полушария), поэтому результатgeoToUTMможно напрямую передать вUTMToGeo. #111521 (Alexey Milovidov).- Исправлена ошибка
LOGICAL_ERROR(“Part level Min-Max index was constructed from unexpected columns set”), которая могла прервать фоновое слияние в отладочных сборках или сборках с sanitizer после уменьшенияpart_minmax_index_columns(например, сwith_block_number_offsetобратно доpartition_key_only). #111511 (Groene AI). - Исправлено занижение размера результата
JOINс выгрузкой на диск вProfileEvents['JoinResultRowCount']. Строки из отложенных бакетов учитывались только вJoinDelayedJoinedTransformRowCountи не включались в общее количество. Результаты запроса всегда были корректными; неверным было только событие профиля. #112673 (Groene AI). SYSTEM DISABLE FAILPOINTтеперь отклоняет несуществующее имя failpoint, генерируяBAD_ARGUMENTS, как это уже делалSYSTEM ENABLE FAILPOINT. Ранее опечатка в имени приводила к сообщению об успехе, при этом нужный failpoint оставался включённым без указания на то, что ничего не было отключено. #112680 (Groene AI).- В таблицу
system.tablesдобавлен новый столбецskipping_indices_types. Он содержит уникальные типы индексов пропуска данных, определённых для каждой таблицы. #106388 (Anton Popov). - Добавлена проверка, гарантирующая, что распределённый запрос всегда содержит известную версию клиента: теперь вместо молчаливой передачи нулевой версии на удалённые сегменты генерируется логическая ошибка. Запросы, инициируемые сервером (фоновые операции flush, стриминговые consumers, перезагрузки словарей, операции flush асинхронных вставок), теперь указывают собственную версию сервера как версию инициатора. #109408 (Alexey Milovidov).
- Снижена подробность диагностических сообщений о бинарном поиске по первичному ключу для каждой части в
MergeTree: их уровень понижен с трассировочного до тестового логирования. #110324 (Alexey Milovidov). - Пример пути для hive-партиционирования таблиц в объектном хранилище (например,
S3) теперь определяется при первом использовании таблицы, а не во времяCREATE/ATTACH, поэтому недоступная конечная точка больше не блокирует создание таблицы и запуск сервера. #111842 (Nikolay Degterinsky). - Исправлено применение аргумента
ReadBufferFromPocoSocketBase::setReceiveTimeoutв качестве секунд вместо микросекунд, а также исправлены сборки с-DENABLE_LIBFIU=OFF, которые не компилировались. В сборках без libfiuSYSTEM ENABLE FAILPOINTи связанные команды теперь генерируют исключение вместо молчаливого бездействия. #112767 (Alexey Milovidov). - Исправлено занижение
clickhouse-localзначенийrows_readи других счётчиков прогресса вstatisticsвыводаJSON/XMLи в индикаторе прогресса: приращение прогресса, поступившее во время формирования пакета прогресса, отбрасывалось. #112958 (Alexey Milovidov). - Исправлена ошибка, возникавшая, когда для асинхронной
INSERTв таблицуDistributedтребовался каталог очереди с именем, превышающим ограничение файловой системы в 255 байт (это возможно приuse_compact_format_in_distributed_parts_names = 0). Для сегмента сinternal_replicationэто былаLOGICAL_ERROR, а в остальных случаях — неатрибутированнаяCode: 1001. std::exception; теперь в обоих случаях сообщаетсяARGUMENT_OUT_OF_BOUNDс указанием таблицы, кластера и ограничения. #113083 (Groene AI). - Значения лимита квоты
execution_time, выходящие за допустимый диапазон, теперь отклоняются сBAD_ARGUMENTSвместо использования неопределённого поведения при их преобразовании во внутренние наносекунды. #113178 (Alexey Milovidov). - Автоматические параллельные реплики теперь поддерживают запросы
JOIN. #106073 (Nikita Taranov). - Добавлена поддержка аутентификации по refresh token для каталога
OneLake. #110413 (alesapin). - Настройка Keeper
write_snapshot_versionтеперь поддерживает горячую перезагрузку. #112150 (alesapin). - Команда
SYSTEM DROP FILESYSTEM CACHEтеперь выполняется параллельно. #112532 (Kseniia Sumarokova). - Неподдерживаемая вложенность представления
SQL SECURITY DEFINERилиSQL SECURITY NONEповерхs3Cluster,urlClusterилиfileClusterтеперь отклоняется с обычной ошибкой запроса вместоLOGICAL_ERRORв отладочных сборках и сборках с санитайзерами. #113371 (Groene AI). - Добавлена настройка
analyzer_compatibility_multiple_joins_qualify_column_names(по умолчаниюfalse). Когда она включена и предложениеFROMзапроса содержит два или болееJOIN, имена столбцов результата, формируемые analyzer, имитируют обработку нескольких JOIN старым analyzer: столбцы, раскрытые из*, получают имена<alias-or-table>.<column>, а ссылка на столбец без псевдонима в спискеSELECTсохраняет имя в точности в записанном виде. Благодаря этому внешние запросы, ссылающиеся на такие квалифицированные имена, напримерSELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), работают так же, как со старым analyzer. Также исправлена потеря analyzer квалифицированных имён результирующих столбцов, раскрытых из*, при использованииgroup_by_use_nullsвместе сROLLUP,CUBEилиGROUPING SETS. Ранее это приводило к дублированию имён результирующих столбцов и нарушало внешние ссылки на них. #110746 (Dmitry Novik). - Настройка
allow_experimental_delta_kernel_rsпереименована вallow_delta_kernel_rs. Старое имя сохранено как псевдоним. #113476 (Kseniia Sumarokova). - Если табличным функциям
remote/remoteSecureили движкам таблицRemote/RemoteSecureпередать отсутствующую именованную коллекцию вместе с переопределениемkey = value, ClickHouse теперь сообщает об отсутствующей именованной коллекции вместо повторного позиционного разбора вызова и вывода не связанной с ней ошибки. #113510 (Groene AI). - При запуске оболочки с автодополнением
clickhouse-bootstrapпеременные окружения больше не выводятся, если автодополнение загружается из пользовательского хука автодополнения. #113694 (Azat Khuzhin). - Для
shared_merge_tree_merge_coordinator_distribution_algorithmдобавлено значениеsainte_lague, которое стало значением по умолчанию вместоwater_filling. #113442 (Mikhail Artemenko). - Добавлена настройка
filesystem_cache_wait_for_concurrent_download_timeout_milliseconds, ограничивающая время ожидания чтением загрузки другого запроса в файловый кэш одного фрагмента (около 1 МиБ), а не целого сегмента файла. #113322 (Kseniia Sumarokova). - Добавлена настройка Keeper
min_time_between_fsyncs_ms(по умолчанию5мс), которая объединяет записи в журнал изменений, поступившие вскоре после предыдущего сброса, вместо немедленного запуска нового сброса. #113749 (Michael Kolupaev). - Таблицы Kafka со смещениями, хранящимися в Keeper (
kafka_keeper_path), теперь выдаютABORTEDвместоLOGICAL_ERROR, когда таблица становится неактивной после потери сеанса Keeper, например при прямом чтении или стриминге материализованного представления. #113913 (Alexey Milovidov). - Исправлено неконсистентное форматирование AST для
viewIfPermitted: форма табличной функции больше не некорректно форматирует операторnotв ветвиELSE, а к форме выраженияviewIfPermitted(...)больше не добавляется лишнийELSE. #113652 (Alexey Milovidov). - Исправлена ложная ошибка
Failed to drop temporary table after refresh. Table ... is left behind and requires manual cleanup., которая регистрировалась при отмене обновления refreshable materialized view (например, при остановке сервера), если включен параметрdatabase_atomic_wait_for_drop_and_detach_synchronously. Временная таблица фактически удалялась, поэтому ручная очистка не требовалась. #113957 (Groene AI). - Теперь сервер выдает
UNKNOWN_ELEMENT_IN_CONFIGпри обнаружении неизвестных параметров в конфигурации сервера, что помогает своевременно выявлять опечатки и неправильно заданные параметры. Проверку можно отключить с помощью<skip_check_for_incorrect_settings>. #100332 (Alexey Milovidov). - В Web UI история браузера и URL больше не обновляются при каждом нажатии клавиши; они сохраняются при успешном выполнении запроса или смене вкладки. #113596 (Alexey Milovidov).
- Теперь ClickHouse сообщает о переполнении стека вместо тихого завершения работы: обработчики фатальных сигналов выполняются в альтернативном стеке сигналов, поэтому
SIGSEGV,SIGABRT,SIGILL,SIGBUS,SIGSYS,SIGFPEиSIGTRAPсоздают трассировку стека, даже если стек потока, вызвавшего ошибку, исчерпан. #113927 (Groene AI). - Операция
ALTER TABLE ... MODIFY COLUMN <col> Tuple(...)для именованногоTupleтеперь изменяет только metadata, если добавляются лишь подполя, и выполняется с той же скоростью, что иADD COLUMNверхнего уровня. Доступно приSETallow_metadata_only_named_tuple_alter= 1. #107305 (Amos Bird). - Добавлен параметр
input_format_json_max_object_sizeдля ограничения размера объекта JSON при разборе. Закрывает #106704. #107669 (Pavel Kruglov). - Исключено логирование сообщения
sasl.kerberos.kinit.cmd configuration parameter is ignored.для конфигураций движкаKafka, не использующих аутентификацию Kerberos с keytab-файлом. #108235 (Ivan Shelestov). - Добавлена system.s3(azure)_queue_metadata. #108522 (Kseniia Sumarokova).
- Допустимые сбои подключения к удаленным базам данных MySQL/PostgreSQL теперь регистрируются как предупреждения, а не как ошибки. #109472 (Shaohua Wang).
- Если не указаны ни
port, ниsecure,clickhouse-clientпараллельно пробует порт по умолчанию 9000 и защищенный порт 9440 и использует тот, который ответит первым. Поэтомуclickhouse-client --host play.clickhouse.com --user playподключается по TLS без--secure, хотя обычный порт этого сервера молча отбрасывает соединения, а не отклоняет их. Если ответивший порт оказывается непригодным — например, это защищенный порт с недоверенным сертификатом, — клиент переключается на другой, поскольку протокол не был явно указан. #110130 (Alexey Milovidov). - Нажатие на логотип облака в Песочнице ClickHouse теперь открывает сайт ClickHouse в новой вкладке, поэтому ход выполнения запросов не будет потерян. #110422 (William Hatcher).
- Добавлен модификатор STREAM BOUNDED, который читает только первый снимок потокового запроса, а затем завершает выполнение вместо подписки на обновления. #110653 (Smita Kulkarni).
- В
EXPLAIN ANALYZEдобавлена информация о внутреннем состоянии JOIN. #110892 (Kirill Kopnev). - При срабатывании проверки реентерабельности
RWLockImpl::getLock()(RWLock is already locked in exclusive mode/Cannot acquire exclusive lock while RWLock is already locked) сообщение об ошибке теперь содержит идентификаторы другихquery_id, которые в данный момент удерживают блокировку, а также количество блокировок, уже удерживаемых запрашивающимquery_id, что упрощает диагностику таких ошибок порядка блокировок. #110971 (Groene AI). - ClickHouse Keeper теперь регистрирует событие “Client has not sent any data” на уровне
InformationвместоWarning, как и обработчик TCP сервера. Это позволяет избежать ложных предупреждений от проверок работоспособности TCP (например, Kubernetes-проверок живостиtcpSocket), которые открывают и сразу закрывают соединение с клиентским портом Keeper. #111217 (Zeynel). MaterializedPostgreSQLтеперь сохраняет неизменённые значения PostgreSQLTOASTпри обновлениях вместо замены их значениями по умолчанию. #111552 (OrpheusAgent).- keeper: значение по умолчанию для
write_snapshot_versionувеличено до 8, а сам параметр теперь поддерживает горячую перезагрузку. #111715 (Michael Kolupaev). - Добавлен модификатор STREAM UNORDERED: пропускает сортировку по порядку фиксации для каждого снимка. #111794 (Smita Kulkarni).
- Добавлена новая настройка MergeTree
text_index_version, управляющая версией формата текстовых индексов на диске:v0_initial,v1_with_codecилиv2_with_positions. Во время поэтапного обновления или перед понижением версии установите более старую версию, чтобы новые серверы продолжали записывать части текстового индекса в формате, который старые серверы всё ещё могут читать; настройка совместимости корректирует её автоматически. #111803 (Anton Popov). - Текстовые AI-функции (
aiGenerate,aiClassify,aiExtract,aiTranslate) теперь отклоняют усечённые или иным образом неполные ответы провайдера (например, когда модель достигает ограниченияmax_tokens) вместо молчаливого возврата частичного результата. Поведение определяется настройкойai_function_throw_on_error. #111830 (George Larionov). - Улучшены квантованные с пониженной точностью
L2DistanceTransposedQuantized,cosineDistanceTransposedQuantizedиdotProductTransposedQuantizedза счёт реконструкции кодовQBit(Int8)приp < 8с использованием префиксных центроидов условного среднего Гаусса. Полная точность (p = 8) остаётся побитово точной; приблизительные расстояния с пониженной точностью могут измениться, а прирост полноты и задержки зависит от рабочей нагрузки. #111867 (Sergey Kuznetsov). - Исправлено незаполнение кэша условий запроса для гранул, исключённых любым конъюнктом, кроме последнего, в предложении
WHEREс несколькими условиямиAND. #112083 (Shankar Iyer). - Добавлена новая настройка
input_format_json_max_string_column_growth_step, ограничивающая рост внутренних буферов String степенями двойки при построении JSON-столбца, что снижает пиковое потребление памяти при вставке больших JSON-документов. По умолчанию отключена. #112159 (Pavel Kruglov). - Снижено пиковое потребление памяти при записи JSON-столбцов с бакетной сериализацией общих данных (
map_with_bucketsи advanced): теперь общие данные при записи разделяются на бакеты по одному, вместо одновременной материализации всех бакетов. Это особенно полезно для столбцов Array(JSON): для скалярного JSON общие данные разделяются по гранулам (с ограничениемindex_granularity_bytes), поэтому экономия невелика, тогда как одна гранула Array(JSON) может содержать множество вложенных строк и, соответственно, большой объём общих данных, поэтому разделение по одному бакету существенно снижает пиковое потребление памяти. #112172 (Pavel Kruglov). - Документация настройки в
system.documentation, отображаемая встроенной страницей/docsи командойhelp, теперь включает историю изменений значения по умолчанию: версию, в которой настройка была добавлена, а также все последующие изменения значения по умолчанию с указанием предыдущего и нового значений и причины изменения. #112177 (Alexey Milovidov). EXPLAIN ANALYZEтеперь работает для потоковых запросов. #112445 (Kirill Kopnev).- Модификаторы объявления столбца —
COMMENT,CODEC,STATISTICS,TTL,COLLATE,PRIMARY KEYиSETTINGSдля отдельных столбцов — теперь можно указывать вCREATE TABLEв любом порядке, причём каждый не более одного раза. Ранее допускался только один фиксированный порядок, и, например,x UInt64 CODEC(ZSTD) COMMENT 'text'вызывал синтаксическую ошибку. ВALTER TABLE ... ADD COLUMN/MODIFY COLUMNподдерживаемые модификаторы —COMMENT,CODEC,STATISTICS,TTLиSETTINGSдля отдельных столбцов — также можно указывать в любом порядке;SETTINGSдля отдельных столбцов вADD COLUMNи объявленныйSTATISTICSвADD COLUMN/MODIFY COLUMNтеперь применяются, а не молча отбрасываются, аCOLLATEиPRIMARY KEYв этих командахALTERтеперь генерируют исключение, а не молча игнорируются. #112788 (Alexey Milovidov). - Для метода чтения
pread_threadpoolнеобходим системный вызовpreadv2с флагомRWF_NOWAIT, чтобы читать данные, уже находящиеся в кэше страниц, без передачи операции чтения в пул потоков. Теперь при запуске проверяется, можно ли использовать этот системный вызов; если нельзя — из-за версии ядра Linux ниже 5.11 или профиляseccompсреды выполнения контейнеров, отклоняющего системный вызов, — значение по умолчанию дляlocal_filesystem_read_methodпереключается наpread, а причина записывается в журнал сервера. Ранее на таких системах каждая операция чтения требовала передачи в пул потоков, а профильseccomp, возвращающийEPERM, приводил к сбоям запросов сCANNOT_READ_FROM_FILE_DESCRIPTOR. #112945 (Alexey Milovidov). - Некорректные thrift-метаданные Parquet теперь регистрируются как INCORRECT_DATA. #113311 (Groene AI).
- Исправлена обработка кодеком GCD знаковых значений фиксированной ширины с отрицательными числами. Ранее он вычислял делитель непосредственно по знаковым значениям, из-за чего мог не обнаружить общий делитель и существенно снизить эффективность сжатия для знаковых целочисленных и десятичных столбцов. Теперь для знаковых типов делитель вычисляется по модулям с сохранением существующего поведения для беззнаковых типов и распаковки. #113798 (Kirill Shcherbatov).
- Добавлены настройки
enable_alp_codec,enable_sz3_codec,enable_zxc_codecиenable_quantized_codec, позволяющие отдельно включать каждый экспериментальный кодек сжатия. #113824 (Raufs Dunamalijevs). - Разрешён
ALTER TABLE ... MODIFY COLUMNдля столбца, подстолбцы которого используются в первичном ключе или ключе партиционирования, при условии, что используемые в ключе подстолбцы сохраняют совместимый на диске тип. Ранее любой такой ALTER был запрещён. #113862 (Pavel Kruglov). - В
system.dashboardsдобавлена панель мониторингаFilesystem cache. #113884 (Kseniia Sumarokova). - Подробные журналы кэша при каждом пополнении буфера теперь включаются настройкой
filesystem_cache_verbose_logging. #113885 (Groene AI). - Если при чтении
MergeTreeобъявленный тип столбца расходится с его данными (смешанное происхождение типов, например послеALTER TABLE ... MODIFY COLUMN, мутация которого ещё не завершилась), сервер теперь выдаёт понятное исключение с указанием столбца и обеих структур вместо непроверяемого приведения типов: ранее отладочные сборки и сборки с санитайзерами аварийно завершались с простымBad cast from type A to Bбез указания столбца, а релизные сборки молча обращались к несовместимой памяти. #114087 (Alexey Milovidov). - Оконная функция с
PARTITION BYтеперь работает при использованииmake_distributed_plan. Если структура плана это позволяет, окно выполняется параллельно по бакетам, каждый из которых получает полные партиции. #114111 (Vighnesh Pathrikar). - Веб-интерфейс: индикатор загрузки в виде песочных часов на панели баз данных снова анимирован. #114187 (Alexey Milovidov).
- Для внешних Nullable-методов агрегации фиксированной ширины теперь используется 64-битная хеш-функция, что позволяет избежать катастрофических коллизий при агрегации с очень высокой мощностью. #114210 (Nikita Taranov).
- Таблицы
DistributedиBuffer, в которых не указан список столбцов, теперь всегда определяют структуру с учётом прав доступа пользователя, создавшего таблицу. #114211 (Pedro Ferreira). x IN (subquery)для столбцаLowCardinalityтеперь возвращаетLowCardinality(UInt8)— тот же тип, что иx IN (literal list). Ранее эти две формы возвращали разные типы, а распределённые планы с такимINтребовали специальной обработки при проверке типов плана. #114229 (Alexander Gololobov).ie_joinвключён по умолчанию: значение по умолчанию настройкиjoin_algorithmтеперь —direct,parallel_hash,hash,ie_join.JOIN, в секцииONкоторого есть только условия неравенства (два сравнения<,<=,>,>=между выражениями объединяемых таблиц), теперь выполняется с помощью алгоритма IEJoin на основе сортировки вместоCROSS JOINс фильтром; также поддерживаются соединенияLEFT/RIGHT/FULL/SEMI/ANTIс такими условиями. Посколькуie_joinуказан последним в списке, он используется только тогда, когда другие алгоритмы неприменимы. #114327 (Vladimir Cherkasov).- Исправлено отображение на графиках в веб-интерфейсе данных зеркальной точки во всплывающей подсказке для результатов, упорядоченных по
xв порядке убывания. Теперь можно строить графики по столбцамDate,Date32,DateTimeиDateTime64; ранее поддерживались только целочисленные Unix-временные метки. Даты на осях и во всплывающих подсказках отображаются в формате ISO 8601, а числовые значения — с суффиксамиK/M/G/… , как на расширенной панели мониторинга. #114349 (Alexey Milovidov). - Добавлена поддержка разбора целых чисел, выходящих за пределы 64-битного диапазона, в типе данных
JSON,JSONExtractиisValidJSON. Такие значения считываются в широкие целочисленные типы, напримерInt128/UInt256, вместо отклонения всего документа. #114379 (Pavel Kruglov). - Таблицы QueryRunner теперь запускают рабочие потоки по требованию и освобождают их при простое, вместо того чтобы занимать потоки в течение всего срока жизни таблицы. #114522 (Miсhael Stetsyuk).
- Добавлена обсервабилити стеков файберов, используемых для асинхронного взаимодействия с удалёнными репликами: события профилирования
FiberStackAllocs,FiberStackAllocBytes,FiberStackAllocNanoseconds,FiberStackFreeNanosecondsи метрикиFiberStacks,FiberStackBytes. #114541 (Alexey Milovidov). - PromQL: добавлена поддержка модификаторов временной метки
@ start()и@ end(). #114558 (Minh Vu). - Контекст трассировки OpenTelemetry теперь распространяется в файберы, используемые для асинхронного установления соединений и выполнения удалённых запросов (запросы с хеджированием,
async_socket_for_remote,async_query_sending_for_remote). Спаны удалённых запросов в распределённом запросе теперь корректно являются дочерними по отношению к спануConnection::sendQueryинициатора, а не присоединяются напрямую к предоставленному клиентом контексту трассировки; каждое выполнение асинхронной задачи создаёт собственный спан. #114813 (Diego Gomes Tomé). - Благодаря этому изменению при использовании индексов WHATIF базовый вариант, обслуживаемый проекцией, сообщает
not_applicableдля каждого кандидата вместо ошибки при выполнении оператора. #114846 (Yarik Briukhovetskyi). DROP DATABASEтеперь удаляет таблицы в обратном топологическом порядке как по зависимостям загрузки, так и по ссылочным зависимостям (ранее — только по зависимостям загрузки), поэтому сбой в серединеDROP DATABASEне может оставить таблицу, зависимости которой уже были удалены. #114952 (Alexey Milovidov).- На панелях мониторинга веб-интерфейса глобальный экран ошибки заменён уведомлением над панелями мониторинга, поэтому сбой одного графика больше не скрывает всю страницу. #115019 (Mikhail Artemenko).
- Добавлена выгрузка на диск таблиц фазы обучения адаптивного агрегатора при нехватке памяти. #115038 (Groene AI).
clickhouse-localтеперь отвечает на предварительные CORS-запросы теми же разрешающими заголовками, что иclickhouse-server, поэтому HTTP-интерфейс, открытый командойSYSTEM START LISTEN HTTP, можно использовать из браузера без дополнительной настройки, включая веб-интерфейс, открытый по URLfile://. #115045 (Alexey Milovidov).- Добавлена поддержка операторов сопоставления с регулярными выражениями в стиле PostgreSQL:
~(псевдоним функцииmatch),~*(регистронезависимое сопоставление),!~и!~*(отрицания). Команды\d,\dt,\dvвpsqlтеперь работают при подключении к ClickHouse по протоколу совместимости PostgreSQL, а неудачный запрос больше не разрывает соединение. #115066 (Alexey Milovidov). clickhouse-clientбольше не выводит сообщениеConnecting to ...дважды при интерактивном запросе пароля. #115081 (Alexey Milovidov).EXPLAIN WHATIFтеперь указывает причину пропуска эмпирической оценки в новой строкеempirical_reason, которая отображается, когдаempirical_statusимеет значениеunsupported. #115140 (Yarik Briukhovetskyi).- Если ни один алгоритм JOIN, включенный настройкой
join_algorithm, не может выполнитьJOIN, сообщение об ошибке теперь содержит названия испробованных алгоритмов, а также строгость и тип неудавшегося JOIN вместо того, чтобы лишь сообщать, что ни один из них не сработал. #115226 (Alexey Elkin). - Запросы векторного поиска теперь могут использовать индекс векторного сходства, если эталонный вектор задан целочисленным литералом массива, например
ORDER BY L2Distance(vec, [1, 2]). Ранее такие запросы незаметно переключались на полный перебор. #115255 (Robert Schulze). - Сетевые сбои на стороне клиента Azure (сброс или отказ в соединении, ошибки DNS и TLS) теперь повторно обрабатываются как транспортные ошибки вместо отображения в виде синтетической ошибки
500, как и в клиенте S3. #115269 (Arsen Muk). - Документацию по всем SQL-командам (например, имя, синтаксис, описание и примеры) теперь можно получить из системной таблицы
system.statements. #115341 (Robert Schulze). BACKUPбольше не оставляет файл блокировки в пункте назначения, если попытка, создавшая его, завершается ошибкой до записи каких-либо данных — как при резервировании пункта назначения, так и при открытии архива. Последующая резервная копия не могла распознать такую блокировку, поэтому каждая повторная попытка создать резервную копию в том же пункте назначения завершалась ошибкой, пока файл не удаляли вручную. Резервные копии вS3иAzureтакже создают блокировку эксклюзивно, а блокировка, принадлежащая другой резервной копии, теперь указывается как параллельно выполняющаяся резервная копия, а не как ошибка, возвращенная хранилищем. #115387 (Julia Kartseva).- Добавлена поддержка аутентификации с помощью bearer-токенов в BuilderRWBufferFromHTTP (попытка 2). #115400 (Sergei Trifonov).
- Добавлены размерные метрики для S3Queue. #115422 (Bharat Nallan).
keywordдобавлен как псевдоним токенизатора текстового индексаarrayдля улучшения совместимости с OpenSearch, Elasticsearch, SolR и Lucene. #115507 (Robert Schulze).- Разрешено создавать собственные таблицы S3. #115652 (Konstantin Vedernikov).
- Не записывать в журнал неотслеживаемое потребление памяти по потокам при ошибках MEMORY_LIMIT_EXCEEDED, не относящихся ко всему серверу. #115658 (Azat Khuzhin).
- Протокол Prometheus remote-write теперь поддерживает асинхронные вставки: данные из нескольких параллельных запросов remote-write объединяются в батч перед формированием частей в соответствии с настройкой
async_insert(включена по умолчанию; добавьтеasync_insert=0в URL обработчика, чтобы сохранить синхронное поведение). Запрос подтверждается только после сброса данных на диск во все внутренние таблицы целевой таблицыTimeSeries. #115688 (Nikita Mikhaylov). - Все агрегатные функции
timeSeries*теперь обрабатывают дублирующиеся временные метки по единому правилу (выбирается наибольшее значение, а NaN уступает любому другому значению), что устраняет зависимость результатовtimeSeriesInstantRateToGrid,timeSeriesInstantDeltaToGrid,timeSeriesLastTwoSamplesиtimeSeriesResampleToGridWithStalenessот порядка значений, если некоторые значения с одинаковой временной меткой равны NaN. Это правило теперь задокументировано и протестировано. #115920 (Vitaly Baranov).
Исправление ошибки (некорректное поведение, заметное пользователям, в официальном стабильном релизе)
- Исправлены повреждение имён столбцов и исключения
BAD_ARGUMENTSпри использованииinject_random_order_for_select_without_order_by: запросыSELECTс несколькими столбцами больше не завершаются ошибкой, а имена выходных столбцов вCREATE TABLE AS SELECT,CREATE VIEW AS SELECTи именованных форматах, таких какJSONEachRow, сохраняются и не заменяются внутренними псевдонимами__subquery_column_<UUID>. Закрывает #102812. Закрывает #101107. #105896 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKв нативном считывателеParquetV3, когдаPREWHEREсодержит конъюнкты с общим промежуточным выражением. #107059 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKдля запросов, использующих виртуальные столбцы_part_starting_offsetили_part_offsetвWHEREвместе с отложенной материализацией. #108287 (Vladimir Cherkasov). - Исправлена ошибка
Not found column or subcolumn c.null in blockпри выполненииWHERE col IS NULLилиIS NOT NULLдля столбцаIceberg, добавленного после записи старых файлов данных в ходе эволюции схемы, сoptimize_functions_to_subcolumns = 1(значение по умолчанию). #109515 (Groene AI). - Исправлены ложные ошибки
ICEBERG_SPECIFICATION_VIOLATIONпри чтении таблицыIceberg, если десятичный или другой параметризованный примитивный тип сериализован с различными пробелами в файлах метаданных, напримерdecimal(20,0)в метаданных таблицы иdecimal(20, 0)в манифесте. #109676 (Groene AI). - Исправлена обработка отложенного
PREWHEREсoptimize_move_to_prewhere = 1, когдаPREWHEREприменяется послеFINAL: условияWHEREбольше не перемещаются перед отложенной политикой строк, что могло изменить результаты запроса. #109703 (Yarik Briukhovetskyi). - Исправлена ошибка
BAD_GETпри сравнении столбцаArray(String)с литералом массива, таким какarr = ['x'], если столбец имеет индекс пропуска данныхtext,tokenbf_v1илиngrambf_v1. Такие сравнения теперь выполняются с полным сканированием вместо завершения запроса ошибкой. #110057 (Groene AI). - Исправлены неверные результаты функций
has,mapContainsKeyиmapContainsValueс пустым искомым значением при наличии текстового индекса. #110246 (Robert Schulze). - Исправлена ошибка
Host is empty in S3 URI, возникавшая, когда скалярный подзапрос используется в качестве аргумента URL табличной функцииs3или аргумента любой другой табличной функции в запросахCREATE TABLE ... AS SELECT. #110254 (Sema Checherinda). - Исправлены проверки привилегий для
ON CLUSTERпри использованииSYSTEM STOP/START CLEANUPиSYSTEM STOP/START VIRTUAL PARTS UPDATE: они больше не требуютSYSTEM PULLING REPLICATION LOGи теперь используютSYSTEM CLEANUPилиSYSTEM VIRTUAL PARTS UPDATE. #110289 (Groene AI). - Исправлена проблема, из-за которой реплика объектного хранилища, доступная только для чтения с
read_only = true, не обнаруживала новые части черезrefresh_parts_interval, аtable_disk = trueзавершался ошибкой на таком диске:table_disk is not supported for non-ObjectStorage disks. #110460 (Julia Kartseva). - Исправлена проблема, из-за которой запись через табличные функции озера данных, такие как
INSERT INTO FUNCTION icebergS3(...), создавала файлыParquet, в строковых столбцах которых отсутствовала аннотация типаString, из-за чего записанные данные не могли быть прочитаны внешними системами, такими как Spark. #110465 (Shaohua Wang). - Исправлена ошибка определения схемы
Map cannot have a key of type LowCardinality(Nullable(String))при чтении файловORCс ключами Map, закодированными словарём, включая файлы, записанные Spark, и файлы, записанные самим ClickHouse при включённой настройкеoutput_format_orc_dictionary_key_size_threshold. #110492 (Shaohua Wang). - Исправлены неверные результаты
IS NULL/IS NOT NULL/count()при использованииoptimize_functions_to_subcolumnsдля столбца, преобразованного вNullableоперацией изменения только метаданныхALTER MODIFY COLUMN TвNullable(T). Для частей, записанных до преобразования, подстолбец.nullтеперь определяется по физически присутствующему родительскому столбцу, а не по значению по умолчанию для типа хранилища. #110584 (Groene AI). - Исправлены неверные результаты запросов из-за оптимизации
optimize_and_compare_chain, когда транзитивные условия комбинируют типы с различной семантикой сравнения, напримерEnumиString,DecimalиFloat64либо значенияFixedStringразной ширины. #110621 (Yarik Briukhovetskyi). - Исправлены неверные результаты некоторых запросов с чтением в порядке сортировки, когда оптимизатор расширяет префикс ключа сортировки. #110725 (Groene AI).
- Исправлено поведение команд
CREATEс предложениемCOMMENT: теперь при отсутствии строкового литерала комментария возникает синтаксическая ошибка вместо молчаливого принятия неверно разобранного запроса. Например,CREATE VIEW v COMMENT AS SELECT 1больше не создаёт представление без комментария. #111159 (Shaohua Wang). - Исправлены неверные результаты
SummingMergeTreeиCoalescingMergeTreeсFINAL, когдаoptimize_move_to_prewhere_if_final = 1, а предложениеWHEREсодержит неявное булево условие для столбца ключа сортировки, напримерWHERE k. #111342 (Groene AI). - Исправлены ложные исключения
Directory '...' was created concurrently with remote path '...'при операциях, затрагивающих только метаданные, в базах данных и таблицах на основе объектного хранилища, таких какDROP DATABASE. #111353 (Mikhail Artemenko). - REST-каталоги озёр данных теперь корректно сообщают об устаревших учётных данных, не интерпретируя их молча как отсутствующую таблицу и не возвращая
UNKNOWN_TABLE. #111379 (alesapin). - Исправлено игнорирование
SQL SECURITY DEFINERиSQL SECURITY NONEдля параметризованных представлений при отключённом analyzer (enable_analyzer = 0). Ранее выборка из такого представления пользователем без привилегий на базовую таблицу завершалась ошибкойACCESS_DENIED, хотя то же представление работает при включённом analyzer. #111458 (Groene AI). - Отклонять столбец
Nullable(Nothing)и другие типы, недопустимые в таблицах, на этапеCREATE TABLE, если схема выводится из хранилища, например в бесстолбцовой таблицеremote,RemoteилиDistributedповерх представления сSELECT NULL, вместо сохранения метаданных, которые не удаётся загрузить при следующем перезапуске сервера и которые блокируют загрузку несвязанных таблиц. #111487 (Groene AI). - Исправлены
std::bad_variant_accessи некорректное изменение схемыIcebergдля вложенных столбцовArray(Map(...)), внутреннийStructкоторых был изменён. #111489 (Konstantin Vedernikov). - Исправлен сбой
ALTER MODIFY COLUMNпри преобразовании столбцаNullableв другой тип сDEFAULT, например изNullable(UInt8)вString,LowCardinality(String)илиArray(UInt8). #102156 (DQ). - Исправлена ошибка
BAD_ARGUMENTS(Dictionary not found) при вызовеdictGetпосле отклоненияDETACH DICTIONARY ... PERMANENTLYсHAVE_DEPENDENT_OBJECTS; теперь словарь остаётся доступным, если отсоединение отклонено. #105259 (Groene AI). - Файлы данных для таблиц
Iceberg, записываемые ClickHouse, теперь содержат идентификаторы полейIcebergвAvroиORC; столбцыStringвORCзаписываются какstring, а не как binary; необязательные сложные поляORC(Array,Map,Tuple) теперь сохраняют корректные метаданныеiceberg.required. Это исправляет незаметное появление результатовNULLпосле переименования столбцов и восстанавливает совместимость со средствами чтения, соответствующими спецификации, такими как Spark иiceberg-java. #109994 (Groene AI). #111775 (Groene AI). - Исправлено чтение файлов на дисках
plain_rewritableпосле перезаписи существующего пути содержимым другого размера: устаревшие метаданные в памяти могли приводить кUNEXPECTED_END_OF_FILE. #110304 (Konstantin Bogdanov). - Исправлено рассогласование трекера памяти для каждого пользователя, вызываемое записями системных журналов, такими как
query_logиquery_views_log, которое могло приводить к ложному срабатыванию ограниченияmax_memory_usage_for_userу пользователей с постоянными рабочими нагрузками. #110708 (Raúl Marín). - Исправлена редкая гонка, при которой
ALTER, изменяющий только комментарий или настройки таблицыReplicatedMergeTree, мог незаметно удалить столбец, добавленный параллельнымALTER ... ADD COLUMN, оставляя реплику с устаревшими метаданными таблицы. #111029 (Shaohua Wang). - Исправлено некорректное отсечение по первичному ключу в таблицах с суффиксом ключа сортировки по убыванию, например
ORDER BY (g, r DESC), которое могло исключать подходящие строки. #111059 (Nihal Z. Miaji). - Исправлена утечка памяти сертификата удалённого узла при каждом TLS-рукопожатии, когда включена проверка сертификата. #111425 (Konstantin Bogdanov).
- Исправлены мутации с параметром запроса в качестве партиции в
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}: сериализованное значение партиции теперь можно корректно разобрать обратно, поэтомуALTERбольше не записывает записи мутаций, нарушающие загрузку таблицы. #111518 (Michael Kolupaev). - Исправлен сбой на macOS/aarch64 при захвате трассировки стека в стеке сопрограммы или fiber, например профилировщиком памяти. #111656 (Raúl Marín).
- Исправлен сбой сервера при чтении данных
Protobufсinput_format_allow_errors_num > 0, если корректному сообщению в том же блоке предшествует некорректное, но пропускаемое сообщение. #107739 (Andrey Tsarevskiy | Андрей Царевский ). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когда запрос к таблицеDistributedиспользует_shard_numилиshardNum, становящийсяNullable, например приFULL JOINсjoin_use_nulls = 1,ORDER BYи analyzer. #109798 (Groene AI). - Исправлены неверные результаты и исключения
UNKNOWN_ELEMENT_OF_ENUMвLEFT/RIGHT/FULL/ASOF JOINсjoin_algorithm = 'full_sorting_merge', при которых несоединённые строки могли заполняться значением0вместо значения по умолчанию для типа столбца. #111197 (Groene AI). - Исправлено исключение
LOGICAL_ERROR, возникавшее, когда тело лямбда-выражения функции высшего порядка содержитifилиmultiIfс постоянным условием, где ветвь с литераломBoolсочетается с ветвью со сравнениемUInt8, напримерarrayFilter(p -> multiIf(false, true, p = 'ALL'), ['ALL']). #111245 (Groene AI). - Заполнитель
{_partition_id}в пути движковS3,AzureBlobStorage,URLи аналогичных файловых движков без явно заданногоpartition_strategyтеперь снова подразумевает стратегиюwildcard, восстанавливая совместимость с DDL до версии 26.6, которые начали завершаться ошибкойBAD_ARGUMENTS. #111279 (Nikita Fomichev). - Исправлена ошибка
NUMBER_OF_COLUMNS_DOESNT_MATCHв запросах сGROUP BYк таблицеMerge, оборачивающей таблицуDistributed, когда ключ группировки является функцией от столбца, а агрегатная функция читает тот же столбец. #111334 (Groene AI). GRANT role TO roleдля одной и той же роли теперь отклоняется сBAD_ARGUMENTS, а не молча создаёт самоссылочную запись вsystem.role_grants. #103315 (zxuhan7).- Исправлена запись в таблицы
Iceberg, когда в файле метаданных отсутствует разделrefs. #106896 (Aleksandr Musorin). - Исправлена проблема, из-за которой
system.session_logстановился нечитаемым после входа через Arrow Flight: столбецinterfaceимеет типEnum8, но значениеArrowFlightотсутствовало в перечислении, поэтому вход по протоколу Arrow Flight записывал необработанное значение10, а любойSELECT, читавший такую строку, вызывал исключениеUnexpected value 10 in enum. #110758 (Alexey Milovidov). - Исправлено переполнение знакового целого числа в
toStartOfIntervalс интервалами менее секунды: для значенийDateTime64, находящихся в пределах одного интервала от нижней границыInt64, округлённый результат молча переполнялся и становился положительным некорректным значением; теперь функция вызывает исключениеDECIMAL_OVERFLOW. #111370 (Alexey Milovidov). - Исправлено поведение
readWKTPointиreadWKT, при котором для пустой точки с тегом размерности, напримерPOINT M EMPTY, возвращались неинициализированные координаты (в скалярном режиме) или координаты предыдущей строки (в векторизованном режиме). Такие входные данные теперь отклоняются сCANNOT_PARSE_TEXT, как иPOINT EMPTY. #111517 (Groene AI). - Исправлены исключения
Unexpected number of columns in result sample blockдляRIGHTиFULL JOIN, когда в левой части есть повторяющийся одноимённый столбец, например1 AS b, 1 AS b, сохраняющийся послеUNION ALL. #111554 (Groene AI). - Исправлены исключения
CANNOT_CONVERT_TYPEиLOGICAL_ERRORв распределённых запросах, использующих комбинатор-Tupleс модификаторомRESPECT NULLSилиIGNORE NULLSво вложенных комбинаторах, напримерanyRespectNullsStateTuple(...) IGNORE NULLS. #111570 (Alexey Milovidov). - Исправлена подсветка синтаксиса SQL в Play на iPhone: автоматическое увеличение текста в iOS Safari могло смещать оверлей подсветки. #111683 (Alexey Milovidov).
- Исправлена ошибка
UNKNOWN_QUERY_PARAMETER, возникавшая при вызове параметризованного представления с аргументом в виде подзапроса типаArray,TupleилиLowCardinality, напримерSELECT * FROM v(param = (SELECT groupArray(x) FROM t)). #111790 (Groene AI). - Исправлена ошибка
TYPE_MISMATCH(Key type for complex key ... does not match), возникавшая, когдаJOINсо словарём использует ключ JOIN типаNullable,LowCardinalityилиLowCardinality(Nullable), а ключ словаря не обёрнут. Поиск в словаре при прямом JOIN теперь приводит ключ к объявленному типу ключа словаря, как уже делаютdictGetиdictHas; ключNULLникогда не совпадает. #111857 (Groene AI). - При
fsync_part_directory = 1переименование каталога части из временного имени в окончательное теперь также гарантированно сохраняется на диске благодаря fsync родительского каталога, а при перемещении между разными родительскими каталогами — и исходного родительского каталога. Ранее fsync выполнялся только для перемещаемого каталога, поэтому сбой питания сразу после коммита части мог привести к отсутствию части на диске и потере строк, несмотря на включённую настройку. #111861 (Groene AI). - Исправлены зависания в
randChiSquared,randStudentT,randFisherFиrandBinomialпри экстремальных значениях параметров. Такие запросы нельзя было прервать с помощьюmax_execution_timeилиKILL QUERY. Теперь такие значения параметров отклоняются даже при значенииmax_rand_distribution_parameterилиmax_rand_distribution_trials, равном0, а значениеmax_rand_distribution_trialsдляrandBinomialбольше нельзя увеличить выше значения по умолчанию10^9. #111909 (Alexey Milovidov). - Исправлены неверные результаты, возникавшие, когда анализатор переписывал цепочки сравнений, такие как
x = c1 OR x = c2 OR ...,x != c1 AND x != c2 AND ...илиhas(const_array, x), вINиNOT IN. Также исправлены исключенияIllegal type ... of argument of function inдля выражений со структуройDynamic,Array(Dynamic)илиJSON. #111924 (Groene AI). - Исправлены неверные результаты и
LOGICAL_ERRORпри выборе из таблицыMergeTreeстолбцаNullable(Tuple(...))вместе с одним из его подстолбцов элементов, содержащих null (Variant,DynamicилиLowCardinality). #111949 (Groene AI). - Отклоняются рукопожатия нативного протокола, использующие
USER_INTERSERVER_MARKERдля неизвестного кластера или кластера, настроенного без элемента<secret>. Ранее такие рукопожатия могли переходить в межсерверный режим до аутентификации и получать сведения о локальных таблицах. #99675 (Dan Anderson). - Исправлен
JOINс таблицамиEmbeddedRocksDB,RedisиKeeperMap, который при использованииDirectKeyValueJoinс ключамиStringилиNullable(String)мог незаметно возвращать ноль строк. #105253 (Vladimir Cherkasov). - Исправлено зависание координируемых refreshable materialized views в базе данных
Replicatedпосле повторного подключения к Keeper без флага функцииMULTI_READ; теперь представление корректно останавливается со статусомDisabled, а не бесконечно записывает в журналUnexpected exception in refresh scheduling. #108890 (Groene AI). - Исправлена отправка клиентом ZooKeeper переполненного префикса длины
int32для запросов размером болееINT32_MAXбайт. Слишком большие запросы теперь отклоняются на стороне клиента. Лимит настраивается черезmax_request_sizeв разделе<zookeeper>; в противном случае он определяется из Keeper. Закрывает #109165. #109190 (Arsen Muk). - Исправлен Ordered mode
S3Queue/AzureQueueс постоянными узлами обработки: блокировки бакета теперь обновляются во время стриминга, поэтому очистка по TTL, управляемаяpersistent_processing_node_ttl_seconds, не удаляет блокировки активного обработчика. Если владение блокировкой всё же утрачено, это обнаруживается и сообщается, а стриминг возобновляется с новым итератором файлов. #110292 (Kseniia Sumarokova). - Исправлены неверные данные и возможное чтение за границами при чтении столбцов
Stringсstring_serialization_version = 'with_size_stream'после пропуска начальных строк, а также при чтении вложенных объектов столбцовJSON, хранящихся сobject_shared_data_serialization_version = 'map'. #110471 (Alexey Milovidov). - Исправлены
CREATE TABLEиALTER TABLE: анализатор допускал выраженияDEFAULTилиMATERIALIZED, ссылающиеся на виртуальный столбец, например_tableили_database. Теперь такие выражения отклоняются при определении, а не вызывают позднее сбой при вставке сNOT_FOUND_COLUMN_IN_BLOCK. #111776 (Groene AI). - Исправлено состояние гонки в исполняемых UDF, движке таблицы
Executableи исполняемых словарях, при которомfcntlдля уже закрытого файлового дескриптора мог повредить несвязанный дескриптор параллельного запроса и привести к бесконечному зависанию запросов. #111779 (Raúl Marín). - Создание устаревшей статистики
minmaxтеперь выводит предупреждение вместо генерации исключения. #111785 (Han Fei). - Исправлена проблема, из-за которой таблицы
Iceberg, записанные ClickHouse, не читались внешними средствами чтения, такими как PyIceberg и Spark. СхемыAvroсписка манифестов и самого манифеста теперь включают требуемые свойстваfield-idдляIceberg. #111786 (Groene AI). - Повторно генерировать материализованные в part столбцы
block_numberиblock_offsetпри операциях присоединения, отсоединения, перемещения и клонирования part, чтобы они не устаревали после манипуляций с part. #111801 (Mikhail Artemenko). - Исправлена оптимизация
query_plan_split_filter, из-за которой внутренний столбец__split_filterоставался в одной из ветвейINTERSECTилиUNION, что могло вызывать исключениеBlock structure mismatch in IntersectOrExceptStep stream: different number of columns. #111930 (Groene AI). - Исправлена ошибка
AMBIGUOUS_COLUMN_NAMEдля запросов, в которых условиеJOIN ONповторяется вWHEREприjoin_use_nulls = 1; теперь такие запросы возвращают результат вместо ошибки. #112007 (Groene AI). - Исправлена аутентификация DLF в REST-каталоге
Paimon: все запросы после первого больше не завершаются с HTTP 401, а проверки существования таблицы теперь корректно распознают HTTP 404. #112015 (JIaQi Tang). - Исправлена ошибка
LOGICAL_ERRORпри одновременной очистке таблицKafkaв Keeper; создание или удаление больше не завершается ошибкой, если Keeper path таблицы исчезает после истечения сессии. #112078 (Groene AI). - Исправлены слияния и мутации при включенном min-max индексе на уровне part для столбцов
_block_numberи_block_offset. #109281 (Mikhail Artemenko). - Исправлена ситуация, при которой неудачный
INSERTв таблицыDeltaLakeLocalилиdeltaLakeоставлял незавершенный файл данных после начала записи. #109328 (Groene AI). - Исправлены утечки учетных данных в выводе
SHOW CREATE,system.query_log, серверных журналах иEXPLAINдляs3/s3Cluster, движков на основеS3,BACKUP ... TO S3, а также секретных аргументов функцийencrypt,decryptи HMAC, формируемых выражениями или SQL UDF. #109768 (Raúl Marín). - Исправлено чтение больших файлов
Parquetиз несжатых записейSTOREDв zip-архивах черезs3иfile. #110495 (Eva Wuuu). - Исправлено зависание
EXPLAIN ANALYZEна запросах с потоковым чтениемFROM ... STREAM, скрытым в подзапросе, CTE или представлении. Такие запросы теперь отклоняются сNOT_IMPLEMENTED, как и потоковые чтения верхнего уровня. #110935 (Groene AI). - Отклонять векторы, квадрат модуля которых переполняется до бесконечности, при использовании индекса
vector_similarityс квантованиемi8. Ранее такие векторы незаметно приводили к некорректным результатам. #111085 (Groene AI). - Выполнять fsync для файлов текстового индекса объединенной или материализованной part, когда заданы
min_rows_to_fsync_after_merge,min_compressed_bytes_to_fsync_after_mergeилиfsync_part_directory. Ранее эти файлы были единственными в part, которые оставались несинхронизированными, поэтому отключение питания сразу после слияния могло оставить зафиксированную, но поврежденную part и привести к потере данных. #111335 (Groene AI). - Исправлена проверка пути относительно
user_files. #111442 (Alexander Tokmakov). - Исправлена проблема, из-за которой
SYSTEM REFRESHдля остановленной таблицыRabbitMQиногда не обрабатывал накопившиеся в очереди сообщения. Теперь операция обновления ожидает запуска цикла доставки AMQP, прежде чем использовать свой единственный цикл неупорядоченного стриминга. #111480 (Groene AI). - Локальный доступ к объектам ограничен путём
user_files. #111483 (Konstantin Vedernikov). - Исправлен сбой сегментации из-за выхода за границы памяти при десериализации некорректного состояния агрегатной функции, содержащего значение
String. Такие состояния теперь проверяются и отклоняются. #111606 (Miсhael Stetsyuk). - Исправлено целочисленное переполнение при разборе
system.zookeeper_info. #111629 (Kseniia Sumarokova). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когда запрос сFINALфильтрует по столбцу ключа сортировки, отсутствующему в спискеSELECT, а фильтр перемещается вPREWHERE, напримерSELECT s FROM t FINAL WHERE k GROUP BY sприoptimize_move_to_prewhere_if_final = 1. #111721 (Groene AI). - Исправлена партиционированная операция
INSERTвDeltaLakeсallow_experimental_delta_lake_writes = 1, которая повреждала значения партиций, содержащие символы пути, и отклоняла значения партицийNULL. Значения партиций теперь кодируются в процентах в одном сегменте пути, а значенияNULLили пустые строки записываются как__HIVE_DEFAULT_PARTITION__с нулевой записьюpartitionValues. #111793 (Groene AI). - Исправлены исключение и незаметный пропуск данных при чтении динамического подстолбца через таблицу
Buffer. #111948 (Alexey Milovidov). - Исправлена потеря текущей базы данных клиентом
clickhouse-clientпослеUSE {db:Identifier}. Если позднее клиенту требовалось переподключиться, он молча переключал сессию на базу данныхdefault. #111982 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR(Type mismatch when building statistics for column) во время мутацийMergeTree, возникавшее после изменения типа столбца со статистикой командойALTER MODIFY COLUMN, изменяющей только метаданные. Для столбцов, фактически перезаписанных мутацией, статистика теперь пересчитывается, а нетронутые столбцы сохраняют существующую статистику. #112009 (Groene AI). - Исправлено чтение таблиц
Paimon, которое могло завершаться сбоем при одновременной замене изменяемой подсказкиsnapshot/LATEST. Недопустимые или устаревшие подсказки теперь игнорируются, а снимок загружается из каталога. #112010 (JIaQi Tang). - Исправлено чтение файлов
GeoParquet,ArrowиArrowStream, в которых столбец геометрии в кодировке WKT использует ключевое слово типа не в верхнем регистре, напримерpoint(1 2), или пустой контейнер, напримерLINESTRING EMPTYлибоPOLYGON(). Также исправлено чтение файлов, содержащих результатwktдля пустой геометрии. #112020 (Groene AI). - Исправлено, что переопределения настроек на уровне запроса не применялись к нативному копированию Azure. #112037 (Smita Kulkarni).
- Исправлена проблема, при которой
query_masking_rulesпереписывал типEPHEMERAL-столбца, из-за чегоCREATE TABLEмог сохранять неверный тип или завершаться с ошибкой. #112048 (Alexey Milovidov). - Параметры табличных функций больше не принимают состояния агрегатных функций, которые ранее вызывали логическую ошибку, поскольку такие параметры не поддерживаются. Закрывает #112085. #112087 (Pedro Ferreira).
- Исправлены неверные результаты для
JOIN, в выраженииONкоторого присутствует константная конъюнкция, напримерON l.id = r.id AND CAST(NULL AS Nullable(UInt8)). #112155 (Vladimir Cherkasov). - Исправлены неверные результаты для
hasAllTokensи других многотокеновых поисков по текстовому индексу в сборках безsimdcomp, напримерaarch64, приtext_index_posting_list_apply_mode = 'lazy'. #112178 (Groene AI). - Исправлены неверные результаты при вызове параметризованного представления с аргументом, не являющимся присваиванием
parameter = value. Теперь такие вызовы отклоняются с ошибкойUNKNOWN_QUERY_PARAMETERв обоих путях выполнения. #112194 (Groene AI). - Исправлена ошибочная классификация параметризованных представлений, тело
SELECTкоторых используетINTERSECT,EXCEPTили цепочкуUNION, сочетающуюUNION DISTINCTиUNION ALL, как обычных представлений, из-за чего их метаданные не удавалось выгрузить. #112211 (Groene AI). - Исправлено определение схемы для семейства форматов
TSV: десятичные значения с ведущим нулём, такие как0.0или0.5, больше не определяются какStringи не воспринимаются в первой строке как заголовок. Также исправлено определениеTSKVчислового типа для значений с экранированной последовательностью, таких какx=1\x2E5. Закрывает #112105. #112226 (Groene AI). - Исправлено отображение некорректных значений
bucketing_mode,partitioning_mode,partition_regexиpartition_componentвsystem.s3_queue_settings. #112300 (Bharat Nallan). - Исправлены неверные результаты, неверный порядок строк в выводе
ORDER BYи исключенияBAD_TYPE_OF_FIELD, когда первичный ключ имеет типArrayилиTuple, а запрос применяет к немуplus,minus,multiply,divideилиintDiv. #112339 (Groene AI). - Исправлено удалённое выполнение запросов, содержащих
PASTE JOIN, например через таблицуDistributedили табличную функцию*Cluster. ClickHouse больше не форматирует запрос с недопустимым синтаксисомALL PASTE JOIN. #112404 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(Invalid number of rows in Chunk) вJoiningTransformдляLEFT JOINс уникальными ключами правой таблицы, смешанным условиемONи малым значениемmax_joined_block_size_rows. #106928 (Groene AI). - Исправлен виртуальный столбец
_tagsдвижка таблицыS3Queue: он был объявлен, но никогда не заполнялся, поэтомуSELECT _tagsвсегда возвращал пустую карту. Теперь он возвращает теги объекта, как движокS3и табличная функцияs3. #108676 (Groene AI). - Исправлена потеря данных в столбце без выражения по умолчанию, возникавшая, когда слияние выполнялось одновременно с
ALTER TABLE... RENAME COLUMNили когда единственными значениями столбца были значения из легковесногоUPDATE. Столбец мог быть удалён из слитой части, из-за чего при чтении все его значения становились NULL. #109356 (Groene AI). - Исправлено удаление индексов пропуска из части данных (либо сбой
CHECK TABLEсUNEXPECTED_FILE_IN_DATA_PART) после мутации с полной перезаписью части, напримерALTER TABLE... DROP COLUMNдля столбцаMATERIALIZED, в частиWide. #109616 (Groene AI). - Исправлены две ошибки при обработке
DateTime64функциямиtoUTCTimestamp/fromUTCTimestamp(и их псевдонимамиto_utc_timestamp/from_utc_timestamp), а такжеtoTime64. Во-первых, переполнение знакового целого числа вблизи границыInt64(теперь вычисления выполняются вInt128и ограничиваются представимым диапазоном). Во-вторых, неверный результат для отрицательных дробных значений вблизи границы смещения часового пояса: секунды разделялись с усечением к нулю, поэтомуtimezoneOffset()проверяла следующую секунду и могла выбрать неверную сторону перехода на летнее время или изменения смещения. #109738 (Groene AI). - Исправлена логическая ошибка (“Cannot determine row level filter; 0 columns deleted, 0 columns added”) при чтении из таблицы
Merge, дочерняя таблица которой имеет политику строк с фильтром в виде отдельного существующего столбца (например,CREATE ROW POLICY... USING flag). #109843 (Groene AI). - Исправлены две ошибки, возникавшие при выполнении запроса с
GROUP BY GROUPING SETS(или содержащего его скалярного подзапроса либо подзапроса мутации) сforce_aggregation_in_order = 1:Trying to get name of not a column: ExpressionListпри использовании старого анализатора (enable_analyzer = 0) иMemory bound merging of aggregated results is not supported for grouping sets.для распределённого запроса сenable_memory_bound_merging_of_aggregation_results = 1при использовании анализатора. #109862 (Groene AI). - Исправлен разбор числовых
1/0как значенийBoolвнутри контейнерных типов (например,Array(Bool),Tuple(Bool,...)). Ранее[1,0]завершался ошибкойCANNOT_READ_ARRAY_FROM_TEXT, тогда как[true,false]работал. #109976 (Groene AI). - Исправлена ложная ошибка
ILLEGAL_COLUMNпри выполненииALTER TABLE... ADD COLUMN IF NOT EXISTS, когда на этапе применения столбец уже существовал. Это происходило, когда один и тот же столбец дважды добавлялся сIF NOT EXISTSв одном операторе либо когда параллельныйALTERдобавлял столбец между этапами подготовки и применения. #110080 (Groene AI). - Исправлен неверный результат, при котором
length(и размерность QBit) для столбцаFixedStringвозвращал0вместо фиксированного размераNпри использовании параллельных реплик, если запрос содержал селективный фильтр. #110427 (Groene AI). - Исправлена потеря типа
Geometryв функцииflipCoordinates: для аргументаGeometryрезультат теперь снова имеет типGeometry, а не базовыйVariant(...), поэтому его можно напрямую передавать таким функциям, какareaCartesian. #110694 (Groene AI). - Исправлено изменение результатов запроса настройкой
optimize_injective_functions_in_group_byдляGROUP BY GROUPING SETSиGROUP BY... WITH TOTALS. Настройка документирована как сохраняющая результаты, однако исключение инъективной функции от ключа группировки приводило к неверному значению (или удалению строки) для строк, в которых этот ключ отсутствует в агрегированном наборе (в наборе, не входящем вGROUPING SETS), либо для строкиWITH TOTALS. Неверное значение могло совпадать с фактическим значением ключа, из-за чего строку суперагрегации было невозможно отличить от реальной группы в том же результирующем наборе. #110721 (Groene AI). - Числовые значения
1/0при разборе JSON какBoolтеперь учитывают настройкуallow_special_bool_values. Ранее JSON-ввод, такой как{"v":1}, дляVariant(Bool, UInt32)считывался какBoolдаже приallow_special_bool_values_inside_variant = 0, поскольку JSON-парсерыBoolигнорировали эту настройку, аBoolимеет более высокий приоритет десериализации вVariant, чем целочисленные типы. #110835 (Groene AI). - Исправлена логическая ошибка
block.rows() == getRows()(чтение за пределами массива и нарушение дедупликации вставок в релизных сборках), возникавшая, когдаINSERTпроходит через зависимое materialized view, целевая таблица которого являетсяAlias, а его внутренний запрос изменяет число строк, при этом за псевдонимом доступна таблица с дедупликацией. #111103 (Alexey Milovidov). - Исправлены логическая ошибка
Block structure mismatch(в отладочных сборках и сборках с санитайзерами) и ошибкаIllegal types of argumentsпри операциях над множествами с совместимыми столбцами состояний агрегатных функций (например,quantileStateиquantilesState(0.9)), вложенными в столбцы-контейнеры, такие какTuple,Array,Map,NullableилиVariant. #111191 (Alexey Milovidov). - Исправлен возврат неверных строк при использовании
DISTINCTс упорядоченнымиLIMIT/OFFSET, когда ограничение для ранней остановки DISTINCT не могло ограничить начало результата: при отрицательномLIMIT(возвращалось начало вместо конца), дробномLIMIT/OFFSET(дробная часть определяется только после полного чтения) иOFFSETбезLIMIT(отбрасывался конец после смещения). Например,SELECT DISTINCT intDiv(x, 100) FROM t ORDER BY intDiv(x, 100) LIMIT -1для таблицы из нескольких частей возвращал наименьшее уникальное значение вместо наибольшего. #111326 (Groene AI). - Исправлены неверные результаты, когда в запросе используется индекс пропуска данных
setи предикат вида(x AND <null-value>) OR y, где NULL создаётся функцией (например,toInt64OrNull('x'),nullIf(1, 1),CAST(NULL AS Nullable(Int64))). Такое значение оборачивалось в__bitWrapperFuncи распространялоNULLвместо маски “unknown”, поэтому индексsetмог отсеивать гранулы, которые фактически соответствуют условию, и запрос возвращал меньше строк, чем должен. #111604 (Groene AI). - Исправлено тихое удаление неверных строк (или возникновение
NOT_FOUND_COLUMN_IN_BLOCK) приDELETE/UPDATEв Iceberg table, если таблица содержит файлы данных, записанные как до, так и послеALTER TABLE... ADD COLUMN, и включена настройкаoptimize_move_to_prewhere. #111693 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(“Invalid number of rows in Chunk”) и связанное с ней аварийное завершение из-за выхода за границы в усиленных сборках при использованииORDER BY ... WITH FILL ... INTERPOLATEс таблицейDistributed, содержащей два или более сегмента, сclusterAllReplicasили с параллельными репликами с пользовательским ключом, в том числе при пустом результате.WITH FILLтеперь применяется только на узле, формирующем итоговый результат, что также устраняет дублирование сгенерированных строк заполнения между сегментами и репликами. #111919 (Yakov Olkhovskiy). - Сохранена возможность использования
randBinomialс вырожденными вероятностями0и1при любом числе испытаний. #112021 (Alexey Milovidov). - Исправлены неверные результаты, вызванные тем, что запрос векторного поиска загрязнял кэш условий запроса. Запрос
SELECT... WHERE <condition> ORDER BY <distance function> LIMIT nк таблице с индексомvector_similarityмог помечать гранулы как не соответствующие<condition>, из-за чего последующий обычный запросSELECT... WHERE <condition>к той же таблице молча возвращал меньше строк. Чтение при векторном поиске больше не записывает данные в кэш условий запроса. #112086 (Groene AI). - Исправлена ошибка, при которой
CREATE VIEWилиCREATE FUNCTION, определение которых вызываетsubstr,midилиbyteSliceв форме, не поддерживаемой при повторном разборе грамматикойsubstring, принимается, но записываемые ClickHouse метаданные не являются допустимым SQL. Последующее чтение такого определения завершается ошибкойSYNTAX_ERROR, а при запуске сервера прерывает загрузку метаданных, из-за чего сервер вообще не может запуститься. Такие определения теперь корректно записываются и считываются, а существующие файлы метаданных видаsubstring(x, a, b, c)снова можно читать, поэтому затронутый сервер запускается без ручного вмешательства. #112195 (Groene AI). - Исправлена проблема, при которой расхождение локальных метаданных таблицы
TimeSeriesс Keeper приводило к бесконечному зависанию восстановления реплики в базе данныхReplicated: реплика больше не обслуживала базу данных и оставалась неисправной после перезапусков. Внутренние таблицы такой таблицы теперь удаляются, пока ещё доступна транзакция метаданных восстановления, а не откладываются в фоновую задачу, которая вообще не могла выполнитьDROP. #112218 (Groene AI). - Исправлено чтение подстолбца столбца
Nullable(Tuple(...)), элемент которого имеет необнуляемый типLowCardinality(T), если тот же запрос также читает родительский подстолбец. В компактной части родительский подстолбец возвращал неверные значения, либо запрос завершался ошибкойUnexpected return type from assumeNotNull, либо сервер аварийно завершался из-за усиленной проверкиstring_view, поскольку извлечённый подстолбец десериализовался в буферLowCardinality(Nullable(T)), подпотоки которого затем совместно использовались при чтении родительского подстолбца. #112232 (Groene AI). - Исправлено постоянное зависание сервера в macOS, вызванное потерей пробуждений в
pthread_rwlockпри включённом выборочном профилировщике запросов (ошибка Apple FB24027930): в Darwinpthread_rwlockтеперь заменён реализацией, устойчивой к сигналам. #112267 (Raúl Marín). - Исправлено игнорирование
max_execution_timeиKILL QUERYво время вычисления запросомgeohashesInBox,arrayFold,sleep,base58Decode,h3PolygonToCellsилиh3PolygonToCellsWithContainment. Такие запросы могли продолжать выполняться несколько минут после отмены. Теперь это также относится к вычислениям внутри выражений, сохранённых в метаданных таблицы, например ключей сортировки, индексов пропуска данных и ключейPARTITION BY. #112273 (Groene AI). #113456 (Groene AI). - Исправлена логическая ошибка
Cannot add step Expression to QueryPlan because it has incompatible header with root step JoinLazyColumnsStep, возникавшая в запросах сFINAL, фильтромPREWHERE, небольшим значениемLIMITиmake_distributed_plan = 1, если выбранные столбцы перечислены в порядке, отличающемся от порядка столбцов таблицы. Отложенная материализация заменяла узел плана, не сохраняя его выходной заголовок, из-за чего план запроса становился несогласованным. #112303 (Groene AI). - Исправлена запись таблиц Iceberg, схема которых содержит кортеж, вложенный в другой кортеж. В опубликованных метаданных таблицы имена полей внутреннего кортежа заменялись позиционными именами
1,2,…, поэтому при использовании форматаParquetпо умолчанию операцияINSERTзавершалась ошибкойINCORRECT_DATA, а при использованииAvroстолбец нельзя было прочитать. #112480 (Groene AI). - Исправлена ошибка
ATTEMPT_TO_READ_AFTER_EOFпри слиянии частей с текстовым индексом, если одна из сливаемых частей была пустой, например после мутации, удалившей все строки из части. #112490 (Anton Popov). - Исправлены неверные результаты и логическая ошибка, возникавшие, когда аргумент, который должен быть константой, например масштаб
toDecimal32или часовой поясtoDateTime, поступал из скалярного подзапроса при использовании старого анализатора. Такой аргумент анализировался так, будто его значение было нулевым или пустым, поэтому объявленный тип результата не соответствовал вычисленному значению, аCREATE VIEWиCREATE MATERIALIZED VIEWсохраняли неверный тип столбца. #112492 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(“Part… contains column… that is absent in table…”), возникавшая, когда репликаReplicatedMergeTreeмутировала часть, полученную от другой реплики, до применения собственного ожидающегоALTER... ADD COLUMN. Теперь такая мутация откладывается до применения изменения метаданных. #112510 (Groene AI). - Исправлены неверные результаты запроса при использовании GROUP BY с ORDER BY и
arrayJoinв проекции. #101775 (Yash ). - Исправлено аварийное завершение сервера из-за выхода за границы массива в
S3Queue/AzureQueueприenable_hash_ring_filtering = 1, когда батч содержал файл, не подлежащий обработке, и одновременно завершался ошибкой запрос Keeper, устанавливающий для батча состояние processing. #108977 (Groene AI). - Исправлена логическая ошибка
Stream <col>.variant_discr... is not found(аварийное завершение сервера в отладочных сборках и сборках с санитайзерами), возникавшая, когдаALTER TABLE... MODIFY COLUMNизменял столбец на тип с динамическими подстолбцами (например,VariantнаDynamic) в таблице с частями Wide, а затем часть читалась или сливалась. #110204 (Groene AI). - Исправлено переполнение знакового целого числа (UBSan) при преобразовании экстремального значения
DateTime64(например,INT64_MIN) вTime/Time64в часовом поясе с отрицательным смещением. #110451 (Groene AI). - Исправлена ситуация, при которой таблица семейства MergeTree с проекцией
_part_offsetили проекцией порядка коммитов становилась навсегда неприсоединяемой после отключенияallow_part_offset_column_in_projectionsилиallow_commit_order_projectionи отсоединения таблицы либо перезапуска сервера. Эти две настройки применяются при CREATE, поэтому при ATTACH они больше не проверяются повторно. #110570 (Groene AI). - При
analyzer_compatibility_join_using_top_level_identifier = 1идентификатор вJOIN... USINGтеперь может разрешаться через псевдоним, определённый для подвыражения внутри списка SELECT (например,SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), как это было в старом анализаторе. Ранее учитывались только псевдонимы проекций верхнего уровня, поэтому такие запросы завершались исключениемUNKNOWN_IDENTIFIERдаже при включённой настройке. Подсказка об ошибке, рекомендующая включить эту настройку, теперь также выводится, если соответствующий псевдоним вложен. #110739 (Dmitry Novik). - Исправлена проблема, из-за которой неаутентифицированные запросы могли заставить ClickHouse разрешать имена хостов, передаваемые в заголовках с адресом клиента. Теперь ClickHouse принимает из этих заголовков только числовые IP-адреса. Недопустимые значения игнорируются при учёте квот по передаваемому адресу без выполнения DNS-разрешения. Если включён
auth_use_forwarded_address, недопустимые передаваемые адреса отклоняются при аутентификации. Отклонения записываются в журнал на уровне отладки. #111060 (Dmitriy Borisenko). - Исправлен
NOT_FOUND_COLUMN_IN_BLOCK, возникающий, когда политика строк иadditional_table_filtersссылаются на один и тот же столбец, который иначе не выбирается запросом. #111099 (Groene AI). - Исправлена ошибка
UNKNOWN_IDENTIFIERдля столбцов с квалификацией по имени CTE (cte_name.column) в запросах, сохранённых в представлениях, при включённом анализаторе. #111386 (Dmitry Novik). - Исправлена ошибка
LOGICAL_ERROR(Got read request from replica N for unknown stream...), которая могла привести к аварийному завершению работы сервера при чтении с параллельными репликами, если ответ на запрос полностью формировался на инициаторе благодаря оптимизации проекцией (exact-count, minmax-count либо сохранённая агрегатная/обычная проекция без выбора диапазонов). #111689 (Groene AI). - Исправлено переполнение знакового целого числа в трёхаргументной перегрузке
toStartOfInterval: при аргументеorigin, близком к нижней границеInt64, функция возвращала значение с переполнением вместо сообщения об ошибке. #112045 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR(Block structure mismatch in joined block stream) при JOIN нескольких таблиц, когда оба под-JOIN не создают выходных столбцов, напримерSELECT count() FROM t1, t2, t3, t4 WHERE (t1.b = t2.b) AND (t3.a = t4.a)при значенииquery_plan_optimize_join_order_limit, равном0или1. #112205 (Groene AI). - Исправлена функция таблицы
values, которая представляла нелитеральную константуBool(например,CAST(true, 'Nullable(Bool)')), вставленную вString/текстовый столбец, как1/0вместоtrue/false. #112308 (Yakov Olkhovskiy). - Исправлена ошибка
LOGICAL_ERROR(partitions_count > 0) при партиционировании фрагментов данныхIceberg, очищенных удалениями по позиции, например во время компактации партиционированной таблицыIcebergс полностью удалёнными файлами данных. #112432 (Pedro Ferreira). - Исправлен вывод схемы, который предлагал числовой тип для текстовых значений, не распознаваемых анализатором значений. Вывод схемы принимал незавершённую экспоненту (
1e+), отсутствующую мантиссу (.) или повторяющийся знак (++inf), но затемreadFloatTextPreciseотклонял их с ошибкойCANNOT_PARSE_NUMBERпри чтении выведенной схемы; для столбцаDynamicэто приводило к ошибке при INSERT. Теперь вывод схемы проверяет число тем же анализатором, который фактически используется при чтении. Это также устраняет случай, когда выведенный тип зависел отmax_read_buffer_size, и позволяет корректным формам экспоненты с ведущим нулём, таким как0e5, выводитьFloat64в TSV, как это уже происходит в CSV. Следует #112226 и закрывает часть #112105, связанную с экспонентой. #112453 (Groene AI). - Исправлено определение позиции ошибок в запросах PromQL. #112494 (Minh Vu).
- Исправлена ошибка
LOGICAL_ERROR(Cannot add transform Resize to Pipes because it has no outputs), возникавшая при выполнении запроса с агрегацией по кластеру сserialize_query_plan = 1и параллельными репликами на основе плана: на этапе слияния размер конвейера изменялся до нуля потоков. #112506 (Groene AI). - Исправлен выход беззнакового значения за нижнюю границу диапазона при проверке длины имени таблицы, который позволял создавать таблицы, которые невозможно удалить. Когда экранированное имя базы данных достигало 214 байт, вычисленный лимит для имени файла
metadata_droppedпереполнялся, поэтомуCREATE TABLEвыполнялся успешно, а последующийDROP TABLEилиDROP DATABASEзавершался ошибкойFile name too long. Теперь такое имя отклоняется сARGUMENT_OUT_OF_BOUND— той же ошибкой, которая уже возвращалась непосредственно ниже этой границы. #112527 (Groene AI). - Исправлено исключение
Context has expired, возникавшее при использованииgetClientHTTPHeaderвнутри подзапроса. #112533 (Alexey Milovidov). - Исправлена ошибка, из-за которой
s3_allow_server_credentials_in_user_queriesнекорректно отклонял указанные в запросеextra_credentials(role_arn = '...'). Принятие роли STS с явно указанной ролью теперь всегда разрешено: оно не раскрывает запросу собственные учётные данные сервера и является документированным способом предоставить доступ к приватному S3 бакету. #112603 (Raúl Marín). - Исправлены счётчики чтения (
read_rows,read_bytes,ProfileEvents['SelectedRows'],ProfileEvents['SelectedBytes']) и квотыREAD_ROWSиREAD_BYTES, для которых избыточно учитывалось использование в запросах, выполняющихORDER BYсо сбросом данных на диск. Строки, повторно прочитанные из временных файлов внешней сортировки, снова учитывались как чтения из источника, поэтому запрос со сбросом на диск завышал объём прочитанных данных и мог быть отклонён сQUOTA_EXCEEDED, даже если оставался в пределах квоты. #112645 (Groene AI). - Исправлена запись таблиц Iceberg с форматом
Avro: поле типаlist,mapилиstruct, объявленное с"required": false, сериализировалось как обязательное, без union["null", T]. Из-за этого схема самого файла данных расходилась с метаданными таблицы, и другие средства чтения Iceberg считали поле обязательным. Теперь такое поле записывается как union["null", T], используемый спецификацией Iceberg для необязательных полей. #112648 (Groene AI). - Исправляет ошибку, из-за которой таблицы
DeltaLakeвозвращали слишком мало строк, если предикатWHEREсодержал подвыражение внутриNOT, которое транслятор предикатов delta-kernel не мог обработать. Теперь такое подвыражение передаётся в delta-kernel как явно неизвестный предикат, а не как конец дочернего итератора, что ранее могло незаметно усекать внешнюю конъюнкцию. #112652 (Groene AI). - Исправляет повреждение кучи, которое могло привести к аварийному завершению сервера при остановке: метод
constAccessRights::getFiltersизменял дерево прав доступа, совместно используемое параллельными запросами. #112692 (Groene AI). - Исправляет логическую ошибку при форматировании запроса, когда предложение
ARRAY JOINне содержит выражений. Теперь такое предложение отклоняется при разборе сSYNTAX_ERROR, как и пустоеUSING, вместо того чтобы приниматься и форматироваться в текст, который невозможно разобрать повторно. #112699 (Groene AI). - Исправляет зависание запроса при локальном выполнении распределённых планов запросов (
distributed_plan_execute_locally = 1): считыватель обмена данными в памяти мог заблокировать единственный поток конвейера до запуска источников, формирующих данные. #111762 (Alexander Gololobov). - Исправляет ошибку, из-за которой поля
Iceberg, объявленные с"required": falseи имеющие типlist,mapилиstruct, записывались какREQUIREDв футереParquet. Теперь такие поля записываются какOPTIONAL, в соответствии с опубликованной схемойIcebergи ожиданиями других считывателей. #112669 (Groene AI). - Исправлено использование кучи после освобождения в исполнителе конвейера, которое могло привести к аварийному завершению сервера, если запрос удалял процессоры во время выполнения (например,
FINALс ленивым чтением или внешней сортировкой); ошибка обнаружена AST-фаззером. #111017 (Groene AI). - Исправляет использование после освобождения (ошибку сегментации), возникавшее, когда запрос с общим снимком хранилища (настройка
enable_shared_storage_snapshot_in_query) исключал части данных из снимка — например, когда потоковый подзапрос читает ту же таблицуMergeTree, которую другая часть запроса читает параллельно. #111192 (Alexey Milovidov). - Отклоняет неподдерживаемое использование столбцов
AggregateFunctionв TTL-выражениях при выполненииCREATE TABLE(например,TTL toDateTime(state)) вместо последующего сбоя при выполнении TTL сILLEGAL_TYPE_OF_ARGUMENT. Это также относится к состояниям внутри альтернативVariantи значенийDynamic. Допустимые функции, работающие с состояниями, такие какfinalizeAggregation, по-прежнему принимаются. #107366 (Ria Khatoniar). - Исправляет
LOGICAL_ERROR(CTE '...' does not have query tree, but was not planned yet), возникавшую, когда наMATERIALIZEDCTE ссылались из нескольких позиций дерева JOIN (например, из двух соединяемых подзапросов либо из соединяемого подзапроса и скалярного подзапроса вWHERE) в запросе к таблицеDistributed. Теперь запрос выполняется вместо генерации исключения (в отладочных сборках и сборках с санитайзерами оно приводило к аварийному завершению сервера). #108924 (Groene AI). - Сохраняет исходный порядок ключей при сериализации Map по бакетам, чтобы исправить зависящие от него операции сравнения. #109178 (Pavel Kruglov).
- Исправлено значение
made_current_at, становившееся1970-01-01для сохранённого снимка вsystem.iceberg_historyпосле выполненияALTER TABLE... EXECUTE expire_snapshotsдля таблицы Iceberg. Также исправлено отсутствие строк в результатеsystem.iceberg_historyдля таблицы, в метаданных которой нетsnapshot-log. #111781 (Groene AI). - Исправлен пробный разбор текста
FixedString, который при ошибке разбора оставлял в столбце частично добавленные байты. Это могло вызывать логическую ошибкуSizes of nested column and null map of Nullable column are not equalпри сериализации столбцовVariant/Array/Nullableлибо незаметное смещение байтов результата. #111908 (Groene AI). - Исправлено игнорирование
max_execution_timeиKILL QUERYфункциямиreplaceOne,replaceAll,replaceRegexpOneиreplaceRegexpAll. Теперь один вызов проверяет отмену во время работы, поэтому длительная замена в большом значении или для большого числа строк останавливается, а не удерживает поток сервера до завершения. У такого вызова нет частичного результата, который можно вернуть, поэтому приtimeout_overflow_mode = 'break'превышение дедлайна вызывает ошибку: всегда при свёртке констант и в конвейере, если эта контрольная точка достигается до межблочной проверки исполнителя, которая по-прежнему останавливает запрос без сообщения. #112483 (Groene AI). - Исправлены логическая ошибка и неверная запись зависимости, возникавшие, когда тело обычного
VIEWссылалось на таблицу или словарь через параметр запроса, как вCREATE VIEW v AS SELECT x FROM {db:Identifier}.t. Такое представление больше не регистрирует ссылочную зависимость от одноимённой таблицы в текущей базе данных, поэтому несвязанные таблицы снова можно удалять. #112704 (Groene AI). - Исправлено чтение с неверным типом подстолбца элемента
Nested, столбец которого был удалён и затем добавлен снова. Выборка такого подстолбца вместе с его родительским столбцом возвращала весь элемент на месте подстолбца, хотя блок по-прежнему объявлял тип элемента. Это приводило к произвольным значениям в релизных сборках и логической ошибке в отладочных сборках и сборках с санитайзерами. #112769 (Groene AI). - Исправлена ошибка
Cannot read all data of type FixedStringпри чтении подстолбцаproduct_quantization_codebookстолбца с кодекомQuantized('product',...). Кодовая книга для каждой части записывается после данных всех гранул, поэтому она не ограничена метками, и чтение, диапазон меток которого заканчивался до последней метки части, могло прочитать её не полностью. #112818 (Alexey Milovidov). - Исправлены segfault и незаметное повреждение данных, возникавшие, когда
INSERTв движокFileили табличную функциюfileдобавлял данные в непустой файл в формате, не поддерживающем добавление, напримерAvro. Запись через файловый дескриптор или путь с партициями обходила существующую проверку, поэтому префикс формата не записывался, а после существующих байтов добавлялся второй заголовок, делая файл нечитаемым. ТакойINSERTтеперь отклоняется сCANNOT_APPEND_TO_FILE, как это уже происходит для обычного пути. #112839 (Groene AI). - Исправлено возникновение
Context has expiredуconnectionIdпри использовании внутри подзапроса: ID подключения клиента теперь сохраняется при создании функции. Закрывает #112533. #112870 (ClickGap AI Bot). - Исправлен разбор целых чисел, не помещающихся в целевой тип, в
Poco::NumberParser, используемом для чтения чисел JSON. Ранее такое число без каких-либо сообщений разбиралось как неверное значение (например,18446744073709551617становилось1) вместо отклонения, а числоUInt64, превышающее максимумInt64, не сохранялось при преобразовании AST в JSON и обратно. #112904 (Alexey Milovidov). - Исправлена работа
IS DISTINCT FROMдля значенийArrayиMapпри сравнении сNULL. Закрывает #103042. #103162 (yanglongwei). - Предотвращена ситуация, при которой исчерпание повторных попыток для выполняемого лидером реплицируемого распределенного DDL навсегда блокировало последующие DDL-запросы с
ON CLUSTER. #108505 (Ahaan Limaye). - Исправлена ошибка
LOGICAL_ERROR(“Trying to extract chunk from ChunkBuffer before all inputs are finished”), возникавшая, когда операция над множествами (INTERSECT/UNION ALL/EXCEPT) объединяла ветви с коррелированными подзапросами иcorrelated_subqueries_default_join_kind = 'left'. #108554 (Groene AI). - Преобразование выходящих за пределы диапазона значений с плавающей точкой (
BFloat16,Float32,Float64) и значенийUInt64, превышающихInt64::max(), вDateTimeиTimeтеперь на всех архитектурах надежно ограничивается границами диапазона (ранее результат такого преобразования зависел от архитектуры и на x86-64 мог происходить циклический переход), а не конечные значения (NaN,inf) теперь генерируют исключение вместо произвольного результата. То же исправление применено к преобразованию float вDateв функцииtoDate, а также к преобразованиямUInt64и широких целых чисел ((U)Int128,(U)Int256) вDateиDate32, которые могли возвращать день до эпохи вместо ограничения значением границы диапазона. Преобразование числа вTimeтеперь ограничивается диапазоном типа для любого исходного числового типа (ранее значения из узких беззнаковых или широких целочисленных типов сохранялись без ограничения и ограничивались только при выводе), а точное приведение кTimeбольше не отклоняет поддерживаемыеTimeотрицательные значения и не ограничивает молча значения, не помещающиеся в этот тип. Точное приведение числа кDate32(accurateCast,accurateCastOrNull) больше не ограничивает молча выходящее за диапазон или не конечное значение, а генерирует исключение или возвращаетNULL, как уже происходило дляDateиDateTime; вариантыOrDefaultвозвращают для такого входного значения значениеDate32по умолчанию. Точное приведение нецелого числа с плавающей точкой кDate,Date32,DateTimeилиTimeтеперь отклоняется вместо молчалого усечения. Также исправлена документация функцииtoDateTime32, в которой по ошибке приводились примерыtoDateTime64и описывался диапазон значенийDateTime64. #110459 (Alexey Milovidov). ALTER TABLE... DETACH PARTITION/PARTтеперь выполняет fsync созданного клона вdetached/(поддерева части и цепочки каталогов до корня диска), когда включена настройка таблицыfsync_part_directory, как для хранилища частей Full (каталог), так и Packed. Ранее fsync для клона никогда не выполнялся, тогда как для пустой покрывающей части, удаляющей строки из активного набора, он выполнялся, поэтому потеря питания сразу после подтверждения могла уничтожить отсоединенные данные на btrfs (несинхронизированные записи каталога клона откатываются, оставляяdetached/пустым и без данных дляATTACH). Управляется существующей настройкойfsync_part_directory; поведение по умолчанию не изменилось. #111426 (Groene AI).- Исправлена ошибка, из-за которой
CREATE OR REPLACEоставлял заменённый объект под внутренним именем, если у вызывающей стороны не было прав на его удаление. #111466 (Nikolay Degterinsky). - Исправлен сбой при выполнении чтения
STREAM(enable_streaming_queries = 1) из таблицы с несколькими партициями и заданной для неё политикой строк. В отладочных сборках и сборках с санитайзерами возникала логическая ошибкаFilter column... not found in DAG outputs; в релизных сборках мог происходить segfault. #111572 (Groene AI). - Исправлена работа
count()для таблиц Iceberg, сводка снимка которых неточна или повреждена: тривиальная оптимизация подсчёта теперь определяет точное число строк по файлам манифестов и выполняет полное сканирование, если удаления на уровне строк делают подсчёты в метаданных неточными. Также исправлены некорректные количество записей в списке манифестов и происхождение данных, записываемые командой IcebergOPTIMIZE TABLE, а метаданныеtotalBytesсделаны устойчивыми к повреждённым сводкам. #111617 (Melvyn Peignon). - Исправлена ошибка, из-за которой отсутствующий в части DEFAULT-столбец заполнялся значением по умолчанию для типа вместо выражения DEFAULT, когда условие PREWHERE разбивалось на несколько шагов чтения. Закрывает #111757. #111795 (Yarik Briukhovetskyi).
- Исправлены логические ошибки
Expected UInt64 column for __grouping_set, got BLOBиColumnBLOB should be converted to a regular column before usageв distributed запросе, выполняемом на шарде сenable_parallel_blocks_marshalling(включено по умолчанию), например при использованииGROUP BY GROUPING SETSв кластере с локальной репликой или при чтении таблицыMerge, охватывающей локальную и distributed таблицу.BlocksMarshallingStepбольше не добавляется в планы, блоки которых потребляются в том же процессе. #111997 (Groene AI). - Операции теперь завершаются ошибкой при загрузке повреждённой статистики MergeTree вместо игнорирования этой ошибки. #112201 (Sergey Kuznetsov).
- Исправлена логическая ошибка при использовании PREWHERE для таблицы Merge поверх другой таблицы Merge или materialized view с отличающимся типом столбца. Также исправлено молчаливое игнорирование политики строк в таблицах, читающих с удалённых серверов (таблица Distributed или таблица, оборачивающая её), из-за которого могли быть доступны строки, которые политика должна была скрывать; теперь такие запросы отклоняются с ошибкой ILLEGAL_PREWHERE. Вместо этого задавайте эти политики в базовых локальных таблицах на каждом удалённом сервере; обратите внимание, что такая политика по-прежнему не применяется к чтениям, отправляемым с
serialize_query_plan = 1, — это отдельная, ранее существовавшая ошибка. #112326 (Pedro Ferreira). - Исправлена настройка
connection_pool_max_wait_ms: её документированное значение по умолчанию0теперь означает бесконечный тайм-аут. Ранее запрос, обнаруживший, что пул соединений заполнен, повторял попытки в плотном цикле, потребляя CPU и записываяNo free connections in pool. Waiting 0 ms.на каждой итерации. Теперь он ожидает, пока соединение не будет возвращено в пул. Закрывает #112053. #112380 (Groene AI). - Исправлена незаметная потеря подтверждённых записей Iceberg в HDFS: коммит Iceberg публикует каждый новый файл метаданных с условной записью, но
HDFSObjectStorageотбрасывал это условие и выполнял обычную перезапись, поэтому записи всех параллельных авторов подтверждались, хотя снимок одного из них становился недостижимым. Теперь HDFS отклоняет условную запись, поэтому управляемые хранилищем записи Iceberg в HDFS, включаяCREATE TABLE... ENGINE = IcebergHDFS(...)с явным списком столбцов, завершаются ошибкой. Чтения не затронуты. #112437 (Groene AI). - Исправлено чтение за границами массива (сбой в релизных сборках) при дедупликации вставок, когда
INSERTпроходит через materialized view, внутренний запрос которого изменяет количество строк, а целевая таблица дедупликации разбита на партиции.DeduplicationInfo::filterToPartitionсопоставлял каждый токен дедупликации с партициями, проходя диапазон исходных строк токена по селектору партиций размером с (меньший) выходной блок представления, что приводило к чтению за его границами. Теперь для любой целевой materialized view каждый токен сохраняется в каждой партиции, поскольку после изменения количества строк сопоставление исходных строк с партициями больше невозможно, — вместо выхода за границы массива (и вместоNOT_IMPLEMENTED, который поздняя проверка выдавала для той же вставки). #112649 (Sema Checherinda). - Исправлена логическая ошибка (приводившая к прерыванию выполнения в отладочных сборках и сборках с sanitizer), возникающая, когда
finalizeAggregationприменяется к столбцу, состояния агрегатных функций которого получены от разных функций с одинаковым представлением состояния, но завершаются разными типами — например,quantileStateиquantilesState(0.9), объединённые черезUNIONили созданные с помощьюarrayReduce. Теперь такие запросы выдают обычную ошибку вместо сбоя. #112662 (Zain Ul Abidin). - Исправлено, что
DELETEв таблицахKeeperMapудалял только первыеmax_block_sizeсовпавших строк, при этом мутация отмечалась как успешно завершённая. Также исправлено, чтоDELETEсkeeper_map_strict_mode = 1не был атомарным: он мог переходить к удалениям без контроля версий и удалять строки, одновременно обновлённые другим процессом, а также обрабатывал совпавшие строки блок за блоком, поэтому конфликт мог привести к частично выполненному удалению. #112777 (Alexey Milovidov). - Исправлено применение
ALTERк таблицамMergeTree, пока незавершённая alter-мутацияRENAME COLUMNещё выполняется. Это могло привести к несовместимому обновлению метаданных хранилища и полностью заблокировать последующие мутации. #112783 (Mikhail Artemenko). - Исправлены сбой запуска сервера и ошибка
ATTACHс сообщениемWITH RECURSIVE is not supported with the old analyzerдля представления с рекурсивным CTE, когдаenable_analyzer = 0задано на сервере по умолчанию. #112784 (Nikolay Degterinsky). - Исправлена логическая ошибка, возникающая, когда движок таблицы
Joinиспользуется в правой части JOIN, а секцияONсодержит условие, ссылающееся на столбцы обеих таблиц, напримерON (t.key = j.key) AND (t.a < j.a). Теперь такой запрос отклоняется с понятным исключением вместоrequired columns:... but not found any in left tableилиstd::bad_variant_access. #112815 (Groene AI). - Исправлены неверные результаты для
JOIN, вONclause которого содержится смешанное условие, то есть межстороннее остаточное неэквивалентное условие, напримерON (t1.key = t2.key) AND (t1.a * 10 < t2.a). Такие условия вычисляет только семейство hash, однакоfull_sorting_merge,partial_mergeи прямой JOIN ключ-значение заявляли, что могут выполнять такие JOIN, а затем молча игнорировали остаточное условие, возвращая лишние строки. Теперь они отказываются от выполнения, поэтому вместо них используется алгоритм hash. #112831 (Groene AI). - Исправлена логическая ошибка
ReadBufferFromEncryptedFile: Wrong file positionпри чтении частиCompactсencryptedдиска с прямым I/O, из-за которой слияния зависали вsystem.replication_queue. #112943 (Alexey Milovidov). - Устранено квадратичное замедление при разборе запроса PromQL с длинным хвостом нераспознанных символов (например, значения
FixedString, дополненного NUL-байтами): разбор некорректных входных данных размером в мегабайт мог занимать поток на десятки минут и не поддавался отмене, поскольку происходил на этапе анализа запроса. Теперь парсер останавливается на первой ошибке. #112944 (Alexey Milovidov). - Отклоняются длительности PromQL, в которых единицы измерения повторяются или расположены не в порядке от наибольшей к наименьшей. #112954 (Minh Vu).
- Устранено зависание при записи в
Parquetс включеннымoutput_format_parquet_parallel_encoding(по умолчанию) и значениемmax_threadsбольше 1. Если кодировщику не удавалось запланировать дополнительный поток, счётчик активных потоков выходил за нижнюю границу диапазона, и запись могла навсегда перестать выполняться вместо завершения или сообщения об ошибке. #112959 (Groene AI). #113170 (Alexey Milovidov). - Исправлена ситуация, при которой
geohashesInBoxмог выполнять неограниченно долго для области нулевой площади, напримерgeohashesInBox(0., 0., 180., 0., 12). Такой запрос возвращал правильный единственный geohash, но выполнял примерно 5e8 пустых итераций цикла на строку и игнорировал какmax_execution_time, так иKILL QUERY. #112976 (Groene AI). - Исправлено неопределённое поведение (нулевой указатель передавался в
memcpy) вreplaceRegexpOne/replaceRegexpAll, когда строка замены подставляет захватывающую группу, не участвовавшую в совпадении, напримерreplaceRegexpAll('abc', '(a)|(b)', '\\2'). #113012 (Alexey Milovidov). - Отклоняется изменение
SETTINGS, помеченное как записанное без значения, если оно содержит значение, отличное отtrue; при форматировании запроса значение такого изменения больше не опускается. Ранее специально сформированная JSON-полезная нагрузка AST могла выполнить настройкуBoolсо значениемfalse, тогда какsystem.query_logиformatQueryFromJSONпоказывали форму без значения. #113025 (Alexey Milovidov). - Исправлены неопределённое поведение и незаметная ошибка планирования при запуске фоновой задачи с очень большой задержкой, например refreshable materialized view с огромным периодом
REFRESH AFTER. Теперь задержки ограничиваются наибольшим представимым значением вместо переполнения. #113041 (Groene AI). - Исправлена запись за границы буфера при чтении столбца
DECIMALизParquet, физический тип которого шире типа, которому соответствует заявленная точность, напримерDECIMAL(9, 2), сохранённого с физическим типомINT64. Такие файлы допустимы вParquet, и другие средства записи их создают, однако средство чтения определяло размер целевого столбца по заявленной точности, тогда как декодер записывал данные физической ширины, повреждая память. При чтении такого файла теперь также возникаетDECIMAL_OVERFLOW, если значение не помещается в заявленную точность, вместо возврата повреждённых данных; чтение без потерь также возможно при подсказке типа, ширина которого не меньше физического типа. #113046 (Groene AI). - Исправлено молчаливое переполнение при делении минимального знакового числа (например,
intDiv(-9223372036854775808, -1)) функциейintDivдля неконстантного столбца на константный делитель -1 вместо генерации исключенияILLEGAL_DIVISION, как в других путях выполнения. Молчаливое переполнение также могло приводить к неверным результатамORDER BY/DISTINCT, поскольку оптимизация чтения в порядке сортировки корректно считаетintDivс отрицательной константой монотонной, а переполненное значение нарушало результирующий порядок сортировки. #113048 (Alexey Milovidov). - Исправлена несовместимость, из-за которой текстовые индексы, созданные в ClickHouse 26.3 с токенизатором
unicode_word, не загружались в более поздних версиях. #113061 (Robert Schulze). - Исправлена логическая ошибка
Pipeline stuckв запросах, распределяющих данные по партициям, например в оконных функциях сPARTITION BYили JOIN сjoin_algorithm = 'parallel_full_sorting_merge', когда обработка данных на одном шарде завершалась, пока блок был распределён лишь частично. #113190 (Groene AI). - Исправлены неверные результаты хеш-JOIN с единственным ключом
LowCardinalityтипа шире 8 байт (UInt128,Int128,UInt256,Int256и их вариантыNullable). Такой JOIN молчаливо возвращал строки с неравными значениями ключей. #113230 (Groene AI). - Исправлено выполнение
ALTER TABLE ... ADD PROJECTIONдля столбцаALIASуровня таблицы, из-за которого таблица становилась непригодной к использованию, а последующийINSERTзавершался сUNKNOWN_IDENTIFIER(Missing columns), если в сеансе было заданоoptimize_respect_aliases = 0. #109091 (Groene AI). - Исправлены исключения
NOT_FOUND_COLUMN_IN_BLOCKиLOGICAL_ERRORприdirectJOINс правой таблицейMergeTree, а также связанные с ними аварийные завершения в отладочных сборках и сборках с санитайзерами. #109932 (Groene AI). - Исправлены сравнения, ранее вызывавшие
ILLEGAL_TYPE_OF_ARGUMENT, когда операнды не имеют наименьшего общего супертипа. Теперь массивы, такие какArray(Int64)иArray(UInt64), а такжеArray(Int256)иArray(UInt256), можно лексикографически сравнивать с помощью=,!=,<,<=,>,>=,IS DISTINCT FROMиIS NOT DISTINCT FROM.isDistinctFromиisNotDistinctFromтеперь также сравнивают по значению поддерживаемые пары немассивных числовых и десятичных типов вместо генерации исключения; также исправлено сравнение на равенство массивов, вложенных вTuple(Nullable(...)). Закрывает #33897. #110245 (Diego Gomes Tomé). - Исправлена ошибка
LOGICAL_ERROR(Bad cast from ColumnString to ColumnLowCardinality) при анализе индекса первичного ключа, когда ключевой столбецLowCardinalityобёрнут во вложенную цепочкуCAST, повторно вводящуюLowCardinality, напримерWHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. В отладочных сборках и сборках с санитайзерами это приводило к аварийному завершению сервера, а в релизных сборках — к ошибке запроса. #111050 (Groene AI). - Исправлены неверные результаты для
FULL JOINс таблицей движкаJoinсUSING, когда левый ключ имеет типNullable, а ключ хранилища — нет: несовпавшая строка левой таблицы с ключомNULLвозвращала0вместоNULL. #111371 (Groene AI). - Исправлено отображение устаревших и удалённых версий строк при чтении базы данных
MaterializedPostgreSQLчерез таблицуMerge. Теперь такие чтения выполняются через обёрткуMaterializedPostgreSQLс той же фильтрациейFINALи_sign = 1, что и при прямом чтении. #112382 (Alexey Milovidov). - Исправлена ошибка
Bad cast from ColumnNullable to ColumnString, возникающая, когда мутация, переписывающая всю часть, выполняется над частью, тип столбца которой устарел относительно типа в метаданных таблицы, например послеALTER TABLE ... MODIFY COLUMN, за которым следуетALTER TABLE ... MATERIALIZE PROJECTION. #112501 (Alexey Milovidov). - Исправлено игнорирование построчными входными форматами
KILL QUERYиmax_execution_timeв течение нескольких минут при разборе блока. Теперь отмена проверяется каждые 8192 строки, поэтому принудительно завершённая командаINSERT(включая фоновую выгрузку async insert) оперативно останавливается, а не выполняется до конца блока. #112646 (Groene AI). - Исправлена проверка
RENAME TABLEмаксимальной длины имени таблицы по исходной базе данных вместо целевой. Переименование таблицы в базу данных с длинным именем могло создать таблицу, которую нельзя было удалить с помощьюDROP TABLE, а переименование таблицы из такой базы данных ошибочно отклонялось. #113019 (Groene AI). - Исправлена ошибка
UNKNOWN_IDENTIFIERпри выборке изVIEW, объявленные типы столбцов которого отличаются от типов, возвращаемых его внутренним запросом, напримерSELECT sum(length(arr)) FROM v, гдеvобъявляетarr Array(UInt8)поверх столбцаString. При стандартном значенииoptimize_functions_to_subcolumns = 1оптимизатор переписывалlength(arr)в чтение подстолбцаarr.size0и передавал это имя во внутренний запрос, где такого подстолбца нет. #113057 (Groene AI). - Исправлено исключение (в релизных сборках — ошибка, препятствующая запуску сервера), возникавшее, когда предикат мутации использует табличную функцию
mergeбез явного имени базы данных. Теперь используется база данных изменяемой таблицы, как и для имён таблиц. #113185 (Alexey Milovidov). - Исправлены неверные результаты и
LOGICAL_ERRORпри чтении подстолбца удалённого и повторно добавленного элементаNestedвместе с существующим элементом той же группы в таблицеMergeTreeсshare_nested_offsets = 1. Существующие элементы возвращали значения из более позднего блока, когда чтение охватывало более одного блока. #113225 (Groene AI). - Исправлено зависание операторов
ALTER,OPTIMIZE,TRUNCATEи операторов управления партициями сalter_sync = 2вReplicatedMergeTree, когда таблица начинает завершать работу, пока оператор ожидает другую реплику, например из-за параллельногоDROP DATABASE ... SYNC. Теперь такой оператор завершается ошибкойUNFINISHEDи также учитываетmax_execution_timeиKILL QUERY. #113228 (Groene AI). - ANSI-последовательности экранирования не записываются в
INTO OUTFILE, еслиstdoutявляется TTY. #113252 (Azat Khuzhin). - Исправлено редкое обращение к освобождённой памяти в очереди асинхронной вставки, когда разные записи имеют одинаковые сроки выполнения. #113363 (Miсhael Stetsyuk).
- Исправлена проблема с незаметно пустыми таблицами при создании нескольких баз данных
ENGINE = Backupиз одной резервной копии или при повторном создании такой базы данных под другим именем. Политика хранения, обеспечивающая работу базы данныхBackup, теперь идентифицируется именем, включающим также имя локальной базы данных, поэтому каждая база данных получает диск, созданный для её собственного пути к данным. #113378 (Groene AI). - Исправлена проблема, из-за которой строки никогда не удалялись, если таблица
MergeTreeимела два или более правилаTTL ... DELETE WHEREс одинаковым выражением времени, различающихся только условиемWHERE. После merge удаления по TTL значениеrows_where_ttl_infoчасти сбрасывалось до нуля, поэтому для неё больше не планировался merge по TTL, а устаревшие строки сохранялись неограниченно долго без ошибок и сообщений в журнале. Закрывает #113116. #113384 (Groene AI). - Запрос к таблице
Merge(или табличной функцииmerge), охватывающий множество таблиц, теперь реагирует наKILL QUERYиmax_execution_timeво время построения планов запросов для отдельных таблиц, а не только после завершения планирования всех дочерних таблиц. Приtimeout_overflow_mode = 'break'он также прекращает строить планы запросов для оставшихся подходящих таблиц и возвращает частичный результат без ошибки, как предусмотрено этим режимом. #113415 (Alexey Milovidov). #113642 (Groene AI). - Исправлено завершение
clickhouse-clientс кодом139вместо0после отмены запроса с помощью Ctrl+C или послеINSERT, читающего данные из stdin. #113431 (Groene AI). - Выражениям
preprocessorиpostprocessorтекстового индекса теперь разрешено ссылаться на столбцыALIAS. #110014 (Jimmy Aguilar Mena). - Исправлено несколько случаев, когда параллельные реплики возвращали дублирующиеся строки:
distributed_aggregation_memory_efficientигнорировался параллельными репликами на основе плана, поэтому бакеты merge с эффективным использованием памяти поступали не по порядку и объединялись дважды; кроме того, шард читался со всех своих реплик, хотя данные не были распределены между ними, если параллельные реплики были неприменимы к запросу илиparallel_replicas_modeзапрашивал фильтрацию по пользовательскому ключу безparallel_replicas_custom_key. #112942 (Nikita Taranov). - Исправлена проблема, из-за которой
CREATE TABLE ... AS SELECTнельзя было завершить, если заполняющий егоSELECTзавершался с ошибкой и был включён параметрdatabase_atomic_wait_for_drop_and_detach_synchronously: внутреннийDROPвременной таблицы при очистке ожидал фоновую очередь удаления и игнорировал какKILL QUERY, так иmax_execution_time. #113504 (Groene AI). - Исправлено удаление действующего файла
metadata/version-hint.textтаблицыIcebergкомандойALTER TABLE ... EXECUTE remove_orphan_files. Его запись в наборе достижимых файлов строилась конкатенацией строк в предположении, что значение оканчивается слешем, хотя этого никогда не происходит; поэтому фактический файл подсказки не распознавался как достижимый и удалялся по истечении порогаolder_than. Приiceberg_use_version_hint = 1после этого таблицу вообще не удавалось читать. #113548 (Groene AI). - Исправлена потеря базы данных параметризованным представлением, когда запрос, ссылающийся на него без полного имени, отправлялся на сегмент, из-за чего сегмент разрешал имя относительно собственной базы данных по умолчанию. В зависимости от содержимого этой базы данных запрос либо завершался ошибкой
UNKNOWN_FUNCTION, либо молча возвращал строки из другого представления. ЗатрагиваетIN,JOINиremoteчерез таблицуDistributed. #113550 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR, возникавшая, когда запрос фильтруетsystem.databasesпо столбцуnameс подзапросом внутриindexHint, напримерSELECT count() FROM system.databases WHERE indexHint(name IN (SELECT 'foo')). #113556 (Groene AI). - Исправлен бесконечный цикл в фоновых слияниях и
OPTIMIZE, когда значениеmerge_max_block_size_bytesбыло меньшеbyteSize()пустого столбца. Пустой столбецLowCardinalityвсё равно содержит свой словарь, поэтому лимит в байтах мог быть достигнут до слияния хотя бы одной строки; после этого слияние бесконечно создавало пустые блоки, загружая 100 % одного ядра CPU и не освобождая слот в фоновом пуле. #113585 (Groene AI). - Исправлено игнорирование
max_execution_timeиKILL QUERYзапросом к столбцуVariant. При вызове функции с несколькими аргументамиVariantфункция разрешалась по одному разу для каждой альтернативы каждого аргумента, и ни один из двух циклов, выполнявших эту работу, не проверял отмену, поэтому такой запрос нельзя было остановить до его завершения. #113612 (Groene AI). - Исправлена ошибка
Unknown compression methodдля подсказок сжатияautoиnone, если они записывались не полностью в нижнем регистре, напримерfile('data.csv.gz', 'CSV', 'x String', 'AUTO'). Имена кодеков, такие какGZIP, уже принимались без учёта регистра; теперь две специальные подсказки работают так же. #113631 (Groene AI). - Исправлено изменение типа постоянного значения
Geometryпри свёртке констант новым анализатором.Geometry— именованныйVariant, альтернативы которого могут иметь одинаковое представление в хранилище (LineString/Ring,MultiLineString/Polygonи пустые значения), поэтому две свёрнутые константы, отличавшиеся только альтернативой, могли объединиться в одну: например,MULTIPOLYGON EMPTYстановилсяLINESTRING(). #110709 (Groene AI). - Исправлено исключение (
Cannot calculate columns sizes when columns or checksums are not initialized) при слиянии одностолбцовой таблицыMergeTree, единственный столбец которой имеет полностью истекающий столбцовыйTTL, приmin_bytes_for_wide_part = 1. #111169 (Groene AI). - Сбой запуска фонового пула планировщика (например, пула
icebergпри исчерпании глобального пула потоков) больше не прерывает работу сервера: теперь ошибка является восстанавливаемым исключением. Чтениеsystem.background_schedule_poolтакже больше не создаёт эти пулы как побочный эффект. #111209 (Groene AI). - Исправлено чтение за пределами буфера в собственном протоколе при повреждённых данных индекса. #112331 (Pavel Kruglov).
- Исправлена взаимная блокировка, из-за которой база данных
FilesystemилиHDFSнавсегда зависала, если два запроса одновременно разрешали одно и то же имя таблицы. Каждый последующий запрос к этой базе данных блокировался навсегда и не мог быть прерван, поэтому для восстановления требовался перезапуск сервера. #112495 (Groene AI). - Исправлено незаметное игнорирование
max_execution_timeиKILL QUERYраспределённым запросом, устанавливающим соединения с репликами. Теперь такой запрос останавливается при следующей попытке подключения вместо перебора всех оставшихся реплик и повторных попыток. #112689 (Groene AI). - Исправлено зависание
DROP TABLEиSYSTEM STOP VIEW, когда refreshable materialized view блокируется на этапе планирования запроса на обновление. #113188 (Nikolay Degterinsky). - Исправлено раскрытие структуры таблицы, которую создающий пользователь не имеет права просматривать, при выполнении
CREATE TABLEсENGINE = Distributed(...)илиENGINE = Buffer(...)без списка столбцов. При локальномCREATEструктура теперь определяется в контексте самого пользователя, поэтому для указанной таблицы требуется правоSHOW COLUMNS. Это не относится кCREATE, воспроизводимому из очереди DDL (ON CLUSTERили внутри базы данныхReplicated). #113220 (Groene AI). #113372 (Groene AI). - Исправлено чтение внутренней базы данных
_temporary_and_external_tablesчерез табличную функциюmergeи движок таблицыMerge, позволявшее одному сеансу читать временные таблицы других сеансов и пользователей. Теперь регулярное выражение для базы данных пропускает эту базу, а её явное указание запрещено, как и прямой доступ к ней. #113224 (Alexey Milovidov). - Исправлено игнорирование
KILL QUERYиmax_execution_timeфункциямиcountSubstrings,countSubstringsCaseInsensitive,countSubstringsCaseInsensitiveUTF8,countMatchesиcountMatchesCaseInsensitive: вызов для множества строк, множества совпадений или одного большого значения мог выполняться несколько минут после отмены запроса. #113369 (Groene AI). #113886 (Groene AI). - Исправлена мутация Compact part, дававшая разный результат в зависимости от того, оставалась ли информация о сериализации части в памяти или повторно загружалась из
serialization.json, когда таблица используетserialization_info_version = 'basic'. ВReplicatedMergeTreeэто приводило к тому, что две реплики с байт-в-байт идентичной исходной частью записывали разные изменённые части, а мутация завершалась ошибкойCHECKSUM_DOESNT_MATCH. Закрывает #113500. #113588 (Groene AI). - Исправлено, что
made_current_atвsystem.iceberg_historyуказывал самое раннее, а не последнее время, когда снимок становился текущим, если один и тот жеsnapshot-idвстречается вsnapshot-logIcebergболее одного раза, как бывает после отката. #113598 (Groene AI). - Исправлены неверные значения виртуальных столбцов, таких как
_tableили_database, выбираемых из правой частиJOINс источником ключ-значение, напримерEmbeddedRocksDB,KeeperMap,Redisили словарём. Вместо них запрос мог вернуть значение столбца данных или завершиться исключениемLOGICAL_ERROR. #113698 (Groene AI). - Исправлено завершение с ошибкой
EXPLAIN ANALYZEдля таблицыMergeс несколькими дочерними таблицами,PREWHEREс простым столбцом и отдельнымWHERE:Required output position N is out of range for pass-through inputs. Закрывает #113621. #113725 (Groene AI). - Исправлен сбой команды
clickhouse-disks moveпри перемещении каталога с ошибкойDIRECTORY_ALREADY_EXISTSна дисках сmetadata_type = plain_rewritable(например,s3_plain_rewritable), после которого также оставался пустой каталог назначения. #113727 (Groene AI). - Исправлен сбой чтения таблицы
Mergeс ошибкойNo set is registered for key ..., возникавший, когда дочерняя таблица объявляет столбецALIAS, содержащийIN, а дочерние таблицы имеют разные значения по умолчанию для этого столбца. #113757 (Groene AI). - Исправлена ошибка
UNKNOWN_IDENTIFIERприenable_analyzer = 0, когдаWHEREссылается на столбец, создаваемыйuntupleвнутри подзапроса, напримерSELECT t.keys FROM (SELECT untuple(arrayJoin(m)) AS t FROM ...) WHERE t.values > 0. Преобразованиеenable_optimize_predicate_expressionпереносило такой предикат в подзапрос в видеHAVING, где это имя ещё не существует. #113760 (Groene AI). - Исправлен сбой
ALTER TABLE ... MODIFY COLUMNс ошибкойCannot specify codec for column type ALIAS, когда один оператор одновременно преобразует столбецALIASв физический (DEFAULTилиMATERIALIZED) и задаётCODEC. Закрывает #113693. #113853 (Groene AI). - Исправлена работа
ORDER BY ALLиGROUP BY ALLдля объединённой таблицыMergeпри использовании старого analyzer (allow_experimental_analyzer = 0). Запрос больше не завершается внутренним исключением, а отладочные сборки и сборки с sanitizer больше не аварийно завершаются. #109139 (Groene AI). - Исправлено периодически возникавшее исключение
Cannot parse string ... as UInt64 ... While executing ValuesBlockInputFormat, которое могло возникать при вставке значений, выражения которых содержат числовое приведение типов, напримерinitializeAggregation('sumState', 0::UInt64). #110637 (Groene AI). - Исправлена периодическая проверка локального диска, сообщавшая об ошибках для исправного диска. Когда server запускает встроенный Keeper вместе с диском
local, два потока проверки могли обращаться к одному файлу, временно записывать в журналFILE_DOESNT_EXIST,CANNOT_READ_ALL_DATAилиCANNOT_UNLINKи временно учитывать диск в метрикеBrokenDisks. #110773 (Groene AI). - Исправлены неверные результаты и логическая ошибка
Cannot serialize FutureSetFromSubquery with no query planдля запросов к таблицамMergeи табличной функцииmerge, когда были включены параллельные реплики на основе плана. #112849 (Alexey Milovidov). - Таблица в движке базы данных
URLбольше не раскрывает пользователю без привилегии на чтение источника, существует ли локальный файл. ИEXISTS TABLE, для которого требуется только привилегияSHOW TABLES, и разрешение имени таблицы теперь выполняют проверку привилегий до обращения к файловой системе. #113029 (Alexey Milovidov). - Исправлена проблема, при которой TTL-выражение становилось непригодным к использованию, если свёртка констант исключала столбцы, на которые оно ссылается, например
TTL d + INTERVAL 1 DAY DELETE WHERE isNull(x)для не-Nullablex, из-за чего каждая операцияINSERTв таблицу завершалась ошибкойMissing columns. Также исправлен сбой запуска server, когда таблица содержала TTL-выражение для столбцаVariant, созданного сvariant_throw_on_type_mismatch = 0. #113042 (Alexey Milovidov). - Исправлена отмена чтения с помощью табличной функции
postgresqlи движка таблицыPostgreSQL. Если отмена происходила во время запуска чтения, возникала гонка за указатель транзакции, из-за чего отмена могла быть потеряна, а запрос продолжал выполняться до завершения в PostgreSQL. #113150 (Groene AI). - Теперь оператор
UNDROP TABLEможно прервать с помощьюKILL QUERY, пока он ожидает, когда выполняющиеся запросы освободят удалённую таблицу. #113263 (Alexey Milovidov). - Исправлена утечка памяти всего XML-парсера, возникавшая, когда обработчик XML
Pocoгенерировал исключение во время разбора, например при переполненииPoco::XML::NamePoolпри разборе документа с большим числом уникальных имён элементов. #113348 (Alexey Milovidov). - Исправлена запись на диск
HDFS: теперь она не завершается ошибкойParent directory doesn't exist, если сгенерированный ключ объекта содержит префиксы вложенных каталогов, так как теперь создаются отсутствующие родительские каталоги. #113396 (Alexey Milovidov). - Исправлены неверные результаты и сбой проверки утверждения в сборках с включёнными проверками при выполнении
JOINсо словарём, если условиеONсодержит неэквивалентное условие, затрагивающее обе таблицы, напримерON (t.key = d.key) AND (t.a * 10 < d.a), при включённой настройкеjoin_use_nulls. #113534 (Alexey Milovidov). - Исправлено зависание запроса на срок до
receive_timeoutсекунд, если он очень быстро завершался на инициаторе. #113551 (Nikita Taranov). - Исправлено чтение
UPDATEи легковеснымDELETEданных из неправильных таблиц, когда база данных обновляемой таблицы отличается от базы данных сеанса. Неквалифицированные имена таблиц и табличная функцияmergeтеперь разрешаются относительно базы данных обновляемой таблицы, поэтому оператор больше не обновляет и не удаляет без предупреждения строки, выбранные из другой таблицы. #113748 (Groene AI). - Исправлено ложное отклонение параллельного
INSERTс ошибкойTOO_MANY_PARTS: когдаmax_insert_threadsраспараллеливает обычныйINSERT, запрос больше не учитывает части, зафиксированные другими собственными приёмниками. Закрывает #114015. #114016 (Alexey Milovidov). - Исправлены ошибки
NO_SUCH_COLUMN_IN_TABLE, возникавшая, когда запрос с параллельными репликами выбирал столбецALIASтаблицы, переданной как временная таблицаGLOBAL JOIN,MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшая, когда обе стороны распределённогоJOINобъявляли столбецALIASс одинаковым именем, а такжеUNKNOWN_IDENTIFIER, возникавшая, когда таблицаDistributedобъявляла столбецALIASповерх другого столбцаALIAS, в том числе в качестве ключаJOIN USING. #107700 (Yakov Olkhovskiy). - Исправлено чтение CSV с
Tuple, первый элемент которого равенNULL. При включённыхinput_format_csv_deserialize_separate_columns_into_tupleиinput_format_null_as_defaultначальный\Nв строке вида\N,1воспринимался какNULLдля всего столбца, поэтому строка заменялась значением по умолчанию, а ячейки остальных элементов вызывали ошибку разбора. Теперь начальныйNULLсчитается значением первого элемента, иinput_format_null_as_defaultприменяется к этому элементу. Строка с единственным полем\N, представляющим весь обычныйTuple, теперь считается неполной из-за отсутствующих остальных элементов и отклоняется; установитеinput_format_csv_deserialize_separate_columns_into_tuple = 0, чтобы снова читать такое поле как весь столбец. #109744 (Groene AI). - Исправлена редкая ошибка
Logical error: 'No more packets are available.'при корректном распределённом запросе сLIMIT. В отладочных сборках и сборках с санитайзерами она также приводила к аварийному завершению работы сервера. #110334 (Groene AI). - Исправлена логическая ошибка (
!part.empty()) при использовании вJOINсdistributed_product_mode = 'local'таблицыDistributed, заданной с пустым именем удалённой базы данных. #110677 (Groene AI). - Исправлено разрешение полных имён столбцов, таких как
db.table.column, в анализаторе для таблиц, имя которых совпадает с именем базы данных. Закрывает #82084. #110976 (Alexey Milovidov). - Исправлена потеря хеш-JOIN оптимизаций после построения (преобразования в фиксированную хеш-таблицу, общего фильтра времени выполнения, повторного ранжирования правой таблицы), если был настроен порог автоматического сброса на диск, используемый по умолчанию начиная с версии 26.5. #111972 (Alexey Milovidov).
- Исправлена ошибка, при которой
ALTER TABLE ... MODIFY COLUMN, изменяющий подсказку типаJSON(при включённомallow_experimental_json_lazy_type_hints) для столбца, чей подстолбец используется в первичном ключе, ключе сортировки, ключе партиционирования или явном индексе пропуска данных, мог повредить ключ или индекс на диске. Обычное чтение скрывало проблему благодаря кэшированной структуре, но после её перезагрузки (например, при перезапуске сервера) запросы завершались сCANNOT_READ_ALL_DATAили возвращали неверные результаты. Такие операцииALTERтеперь отклоняются, если они изменяют тип на диске используемого подстолбцаJSON. Изменения подсказок типов в столбцах вне этих структур или изменения, не меняющие тип на диске используемых подстолбцов (например, добавление несвязанного типизированного пути), по-прежнему затрагивают только метаданные. #112302 (Pavel Kruglov). - Исправлены неверные результаты, когда
query_plan_join_swap_tableменяет местами таблицы вANY JOINприjoin_any_take_last_row = 1: ClickHouse теперь сохраняет исходный порядок сторон JOIN, поэтомуANY JOINпо-прежнему возвращает последнюю совпадающую строку. Закрывает #111645. #112458 (Vladimir Cherkasov). - Исправлена ошибка, при которой
listObjectsна дискеAzureBlobStorageс конечной точкой, содержащей префикс, возвращал неверные имена blob на каждой странице после первой, поскольку пагинация обходила обёртку клиента, удаляющую префикс конечной точки. Теперь пагинация снова проходит через обёртку с помощью токена продолжения, поэтому имена blob на всех страницах корректны. #112872 (Arsen Muk). - Исправлено неограниченное выделение памяти при чтении файла
Parquet, метаданные Thrift которого содержат объявленную длину контейнера или строки, превышающую размер самих метаданных. Теперь такая длина отклоняется вместо выделения памяти под неё. #113212 (Groene AI). - Исправлена ошибка
Cannot insert element into Set(NOT_IMPLEMENTED), возникавшая при включённой настройкеread_in_order_use_virtual_row, когда запрос кMergeTreeс чтением в порядке сочетаетWITH FILL ... INTERPOLATEс фильтромINилиhas. #113264 (Groene AI). - Исправлено молчаливое отключение
optimize_read_in_orderдля некоторых запросов сORDER BY, включая запросы с виртуальной строкой илиtoString/CAST(..., 'Nullable(String)')для ключа сортировки типаString. Также исправлены некорректные результаты фильтрации илиORDER BYпоtoStringзначенийTime,Time64илиDateTimeв часовых поясах с переходом на летнее время. #113291 (Vladimir Cherkasov). - Некорректные выражения
parallel_replicas_custom_key, такие какtuple()или(x, y), теперь отклоняются с ошибкойILLEGAL_TYPE_OF_COLUMN_FOR_FILTERвместо чтения за пределами списка типов пользовательского ключа. #113359 (Nikita Taranov). - Исправлен сбой перезапуска сервера после его принудительного завершения во время выполнения
DROP TABLEдля таблицы, использующей именованную коллекцию: последующийDROP NAMED COLLECTIONмог успешно выполниться, оставив метаданные таблицы со ссылкой на отсутствующую именованную коллекцию, из-за чего следующий запуск завершался ошибкойNAMED_COLLECTION_DOESNT_EXIST. #113524 (Alexey Milovidov). - Исправлены два случая, когда база данных AWS Glue
DataLakeCatalogсообщала об отсутствии таблицы вместо ошибки.SHOW TABLESиsystem.tablesбольше не завершаются с ошибкойDATALAKE_DATABASE_ERROR(“Exception calling GetTables … not found”), если база данных Glue отсутствует при перечислении её таблиц, например потому, что одновременно была удалена несвязанная база данных в той же учётной записи AWS; теперь такая база данных просто не добавляет таблиц, не прерывая перечисление.EXISTS TABLEбольше не возвращает0для существующей таблицы, если базовый вызовGetTableзавершается ошибкой по иной причине, например из-за ошибки аутентификации, DNS или 5xx. Все остальные ошибки Glue по-прежнему распространяются в обоих случаях. #113591 (Groene AI). - Исправлена ошибка надёжности Keeper: сбой во время сохранения файла состояния Raft (с
termиvoted_for) мог оставить узел без действительного состояния и резервной копии. После перезапуска узел мог сброситьtermдо0и повторно предоставить голос, уже отданный в этом терме, что могло привести к появлению двух лидеров и потере зафиксированных данных. Предыдущее состояние теперь сохраняется до тех пор, пока новый файл состояния не будет полностью записан и синхронизирован. #113654 (Alexey Bakharew). - Исправлена гонка данных при удалении таблицы
MergeTree, если её фоновые задачи обновления статистики, обновления частей или загрузки устаревших/неожиданных частей всё ещё выполняются. #113722 (Alexey Milovidov). - Исправлены
ORDER BY ALLвWINDOW VIEWи ошибкиUNKNOWN_IDENTIFIERдляINTERPOLATE,WINDOWиLIMIT BYв запросах к таблицамMergeилиDistributedс соединением при использовании старого analyzer. #113759 (Alexey Milovidov). - Исправлена утечка памяти в экспериментальном кодеке сжатия
SZ3: если сжатие плохо сжимаемых или повреждённых данных завершалось исключением, временные рабочие буферы оставались выделенными. #113916 (Alexey Milovidov). - Устранена квадратичная сложность разбора адресного аргумента табличных функций
remote,mysqlи аналогичных: очень длинный адрес (например, дополненная нулямиFixedStringразмером в мегабайт) приводил к зависанию запроса на этапе анализа, когда его уже нельзя было отменить. #113918 (Alexey Milovidov). - Исправлено аварийное завершение
OPTIMIZE TABLEдля таблицыIcebergс ошибкойUnsupported snapshot's operation type OVERWRITE, если история таблицы содержала удаление строк, затрагивавшее более одной строки на файл позиционного удаления. Закрывает #113745. #113964 (Groene AI). - Больше не реплицируется
ALTER TABLE ATTACH PARTITION FROMдля реплицируемых БД. #94835 (MikhailBurdukov). - Недопустимые настройки размера загрузки в Azure (например,
azure_min_upload_part_size = 0илиazure_max_blocks_in_multipart_upload = 0) теперь отклоняются на раннем этапе с понятной ошибкой вместо внутреннего исключения (second_size > 0), возникавшего глубоко в процессе записи. Это относится как к настройкам запроса, так и к конфигурации диска Azure. #103394 (Statxc). - Исправлено некорректное экранирование SQL-литералов в
StorageSQLiteи табличной функцииsqlite()при проталкивании предикатовWHEREв SQLite: одинарные кавычки и управляющие символы (\n,\r,\t,\) экранировались обратной косой чертой, которую SQLite не интерпретирует, что приводило к синтаксическим ошибкам или неверным результатам запроса. Также исправлено экранирование строковых литералов, проталкиваемых в PostgreSQL: строки, вложенные в спискиIN, сохраняли экранирование ClickHouse, а управляющие символы передавались как последовательности с обратной косой чертой, которые PostgreSQL воспринимает как другие байты. #104217 (Shaohua Wang). - Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCKв запросахINNER JOIN ... ON arrayJoin(...) = ..., когда включёнquery_plan_convert_join_to_in, а SELECT ссылается на исходный столбец типа Array. #104809 (Shaohua Wang). - Исправлены выражения IN и NOT IN с неконстантными операндами в правой части, ссылающимися на столбцы текущей строки, а обработка кортежей в правой части новым analyzer приведена в соответствие с существующей семантикой ClickHouse IN. В старом analyzer исходный столбец без дополнительной обработки в правой части (
x IN (arr)) по-прежнему разрешается как имя таблицы и остаётся вне области видимости. #104993 (Yue Ni). - Исправлена ошибка
Cannot add column ...: column with this name already existsприINSERT SELECTиз табличной функции, такой какfile,s3илиinput, когда один и тот же исходный столбец выбирается более одного раза. #105982 (etienne). - Отклоняется
max_replication_lag_to_enqueue = 0в базах данныхReplicated. Это значение делало проверку несинхронизированности после восстановления тривиально истинной и приводило к аварийному завершению сервера сLOGICAL_ERRORв отладочных сборках и сборках с санитайзерами. Теперь0отклоняется на этапе разбора сBAD_ARGUMENTSиз любого источника (CREATE DATABASE ... SETTINGS, блок конфигурации сервера<database_replicated>, воспроизведениеATTACHи воспроизведение существующих метаданных при обновлении). Наименьшее допустимое значение —1. Закрывает #98823. #106006 (Groene AI). - Исправлена ошибка
Logical error: 'Pipeline stuck'в запросах, использующихenable_sharding_aggregator = 1совместно сUNION ALLи значениемmax_streams_for_union_step, меньшим ширины конвейера.BufferedShardByHashTransformтеперь завершает выходные порты с пустыми очередями сразу после исчерпания входных данных и продолжает считывать входные данные, если требуемый пустой порт не содержит данных для выгрузки, даже когда соседняя очередь достигла предела обратного давления. #106251 (Groene AI). - Исправлено переполнение знакового целого числа, возникавшее, когда для настройки тайм-аута ожидания, такой как
interactive_delay, задавалось огромное значение: ожидание могло немедленно завершаться по тайм-ауту вместо ожидания, а сервер мог аварийно завершиться при использовании Undefined Behavior Sanitizer. #106961 (Groene AI). - Экспорт в формат
ArrowзначенийTime/Time64, выходящих за допустимый диапазон времени суток (отрицательных или>= 24h), теперь отклоняется с понятной ошибкой вместо записи некорректных данных Arrowtime32/time64. #107179 (Shaohua Wang). - Исправлены неверные результаты
GROUP BYдля таблицыDistributedс дублирующимися столбцамиALIAS, разворачивающимися в одно и то же выражение (например, если два столбца определены какtoString(x)), при двухуровневой или экономичной по памяти распределённой агрегации. Дублирующиеся ключи сворачивались в один на сегментах, но объединялись по полному набору ключей на инициаторе, поэтому при двухуровневой агрегации одинаковые группы из разных сегментов попадали в разные корзины и не объединялись: группа возвращалась по одному разу для каждого сегмента с разделённымcount(). #108855 (Groene AI). - Исправлена ложная ошибка
Inconsistent AST formattingдляALTER TABLE ... MOVE PART ... TO SHARD '<path>'. Форматтер запроса удалял ключевое словоSHARD, поэтому отформатированный запрос нельзя было разобрать повторно, что приводило кLOGICAL_ERROR(обрабатываемому исключению в релизных сборках и аварийному завершению в отладочных сборках и сборках с санитайзерами). #109060 (Groene AI). - Немонотонные смещения
Arrayтеперь отклоняются на всех путях чтения, где они декодируются как абсолютные значения, а не только в форматеNative. Повреждённая гранула индекса пропуска данныхsetранее проходила без проверки, после чего чтение выходило за допустимые границы. #109212 (Groene AI). JSONExtractтеперь учитываетcast_string_to_date_time_modeпри преобразовании строковых значений JSON вDateTime/DateTime64, как иCAST. Закрывает #109126. #109252 (Utkal Singh).- Исправлена возможная логическая ошибка “Unexpected substream … for column …” при обновлении настройки совместимости. #109496 (Pavel Kruglov).
- Установлен отсутствующий компонент координации при расчёте размера system.detached_parts. #109553 (Den Kalantaevskii).
- Исправлена проблема, при которой тайм-аут ожидания блока для стриминговых вставок (
input_format_max_block_wait_ms) мог не истекать при активном профилировщике запросов: опрос файлового дескриптора перезапускался с полным тайм-аутом после каждого сигнала профилировщика, поэтому зависший источник входных данных мог бесконечно откладывать сброс частичного блока вместо его сброса при достижении лимита ожидания. #109602 (Shaohua Wang). - Свёртка констант при планировании запроса больше не выполняет функцию, если тип её аргумента отличается от типа, для которого функция была определена при анализе. Ранее такое несоответствие вызывало
LOGICAL_ERRORпри вычислении заголовка вывода — ошибку утверждения в отладочных сборках и сборках с санитайзерами. Теперь свёртка пропускается, а действительно некорректный запрос по-прежнему сообщает о восстанавливаемой ошибкеILLEGAL_TYPE_OF_ARGUMENTв обычном пути выполнения. #109747 (Groene AI). - Исправлена ошибка, из-за которой мутация, ссылающаяся на виртуальный столбец
_sample_factor, завершалась сбоем в процессе выполнения с сообщениемUnexpected const virtual column: _sample_factorи оставалась зависшей. Теперь мутация считывает его как1— то же значение, которое возвращает запрос безSAMPLE. #109813 (Groene AI). - Исправлены три проблемы с
use_constant_folding_in_index_analysis: логическая ошибкаInvalid partition key size, которая могла прерватьSELECT, использующий обычную проекцию, если для таблицы заданоpart_minmax_index_columns = 'with_block_number_offset'; неверные результаты (строки незаметно отбрасывались) при фильтрации по ключу партиционирования по модулю, напримерPARTITION BY id % 200; а также сбой (гонка данных), возникавший при запросе к индексуtextс токенизаторомsparseGramsи предикатомLIKEпо множеству партиций приmax_threads > 1. #109896 (Groene AI). - Исправлена гонка данных (и редкий сбой), возникавшая при сообщении об ошибке разбора или анализа во время чтения таблицы из файла или объектного хранилища. Ошибка разбора, возникшая при ленивой инициализации
KeyCondition, передавалась потокам чтения как единый объект исключения, и два потока могли одновременно добавлять(in file/uri ...)к её сообщению, вызывая гонку данных в строке сообщения исключения. #109911 (Groene AI). - Исправлена передача настроек запроса в
accurateCastOrDefault, а также сохранение исходныхNULL, закодированных вDynamicиVariant. Закрывает #109943. #109946 (Pavel Kruglov). #114912 (Alexey Milovidov). - Исправлены неверные результаты
subBitmap,bitmapSubsetInRangeиbitmapSubsetLimitдля битмапов, всё ещё хранившихся в малом представлении, включая значения элементовUInt64иInt64больше2^32, которые усекались до 32 бит. Сравнения в функциях битмапов для знаковых типов элементов теперь последовательно используют беззнаковое значение типа элемента, поэтому в битмапеInt8элемент-1сравнивается как255, а не как знаково расширенное значение4294967295; это также исправляетbitmapMin,bitmapMax,bitmapContainsиbitmapTransformдля битмапов, выросших за пределы малого представления. Запросы, передававшие знаково расширенные пороговые значения, необходимо скорректировать: для битмапаInt8выражениеbitmapSubsetInRange(bm, 4294967168, 4294967296)следует заменить наbitmapSubsetInRange(bm, 128, 256). Также исправленыgroupNumericIndexedVector, возвращавшая разные результаты для индексных столбцовInt8иInt16по сравнению с более широкими типами индексов, иnumericIndexedVectorGetValue, возвращавшая0для отрицательных индексов. Исправлена документация по функциям битмапов, включая функции подмножеств, которые были описаны как использующие индексацию с 1, и поддержку знаковых типов вbitmapBuild/bitmapToArray. #110072 (Rami Darwiche). - Исправлено игнорирование отмены запроса при включённом
optimize_aggregation_in_order. ТеперьAggregatingInOrderTransformпроверяет отмену во время агрегации фрагмента, поэтому запрос, остановленный черезKILL QUERYили поmax_execution_time(при значении по умолчаниюtimeout_overflow_mode = 'throw'), завершается незамедлительно, а не обрабатывает весь фрагмент до конца. #110104 (Groene AI). - Исправлено состояние гонки между
KILL TRANSACTIONиALTER TABLE ... UPDATE/DELETE, выполняемым внутри транзакции: откат, произошедший между регистрацией мутации в транзакции и её регистрацией в таблице, оставлял осиротевшую запись о мутации, что вызывало логическую ошибку (Cannot find transaction ... that has started mutation ...) в фоновых задачах и блокировало все последующие мутации затронутых частей до перезапуска сервера. #110226 (Shaohua Wang). - Исправлена ошибка
LOGICAL_ERROR(Left and right columns have same names) в оптимизаторе порядка JOIN, которая могла возникать при JOIN через запятую с представлением из нескольких таблиц, если включёнquery_plan_merge_expression_into_join. #110227 (Groene AI). - Оценка мощности для порядка JOIN теперь формирует статистику столбцов по частям, оставшимся после отсечения по партициям и первичному ключу, а не по всем активным частям. Ранее запрос, отсечённый до небольшой партиции, планировался на основе статистики по всей таблице (наблюдалась переоценка количества строк в 2500 раз, менявшая сторону построения hash JOIN), а отключение статистики парадоксальным образом давало лучший план. Также исправлено: ленивый FINAL молча отключался для отношений MergeTree при JOIN, поскольку кэшированный результат анализа индекса оптимизатора порядка JOIN ошибочно принимался за применённую проекцию. #110283 (Sergey Kuznetsov).
- Исправлены неверные результаты коррелированных скалярных подзапросов, когда внешний запрос содержит повторяющиеся значения коррелированного столбца, а корреляция подзапроса устраняется через путь CROSS JOIN. Ранее агрегаты, такие как
count()иsum(), умножались на число повторов. Это затрагивает экспериментальную функциюallow_experimental_correlated_subqueries. #110311 (Groene AI). - Исправлена логическая ошибка (
Function node with name '...' is not resolved as ordinary function), которая могла возникать при включённомoptimize_or_like_chain, если агрегатная или оконная функция находилась слева отLIKE/ILIKE/matchв цепочкеOR. #110641 (Groene AI). - Исправлена проблема, при которой
TTL ... DELETE WHERE <cond>никогда не удалял строки, начавшие соответствовать<cond>после выполненияALTER TABLE ... UPDATEдля столбца, используемого вWHERE. Теперь мутация пересчитывает TTL строк, поэтому вновь соответствующие условию истёкшие строки удаляются, а не молча сохраняются. #110648 (Groene AI). - Исправлена ошибка учёта при отслеживании памяти: если выделение памяти отклонялось родительским трекером памяти (например, из-за общего ограничения памяти сервера), трекеры уровня потока, запроса и пользователя сохраняли отклонённый объём. Ошибка накапливалась со временем, завышая
MemoryTrackingи использование памяти для каждого запроса и пользователя, и могла приводить к ложным ошибкамMEMORY_LIMIT_EXCEEDED. #110784 (Seva Potapov). - Исправлена неканоническая WKB-сериализация пустого полигона:
wkb(POLYGON EMPTY)теперь выводитnumRings = 0вместо ложного единственного кольца с нулевым числом точек, поэтому WKB round-trip стандартного пустого полигона теперь сохраняет его без изменений. #110796 (Groene AI). - Исправлена ошибка, из-за которой при использовании псевдонимов столбцов CTE в запросах с
INTERSECTилиEXCEPT, напримерWITH t (a, b) AS (SELECT 1, 2 INTERSECT SELECT 1, 2) SELECT a, b FROM t, запрос завершался ошибкой UNKNOWN_IDENTIFIER. Закрывает #104770. #110885 (Yarik Briukhovetskyi). - Исправлена ошибка
std::length_error(LOGICAL_ERROR), возникавшая при чтении таблицы семейства MergeTree с патологическим значениемmax_streams_for_merge_tree_reading(близким к максимальному значениюUInt64) и параметромallow_asynchronous_read_from_io_pool_for_merge_tree = 1. Теперь значение настройки ограничивается тем же максимумом, что иmax_threads. #110936 (Groene AI). - Исправлен сбой (разыменование нулевого указателя во время анализа запроса), возникавший при вызове
getSubcolumnдля аргументаJSONс именем подстолбца внутренней подсказки типа, начинающимся с маркера типа в виде обратной кавычки. #110940 (Groene AI). - Исправлена ошибка
Nested type LineString cannot be inside Nullable type (ILLEGAL_TYPE_OF_ARGUMENT), возникавшая при чтении допускающего NULL пространственного столбца MySQL (LINESTRING,POLYGON,MULTILINESTRING,MULTIPOLYGON,MULTIPOINTили универсальногоGEOMETRY) через табличную функциюmysqlлибо табличные движки и движки баз данныхMySQL. Теперь для таких столбцов используетсяNullable(String), содержащее значение в том виде, в каком его возвращает MySQL (4-байтовый префикс SRID, за которым следует полезная нагрузка WKB). ДляPOINTсохраняется сопоставление сNullable(Point). #110943 (Groene AI). - Исправлена сериализация
NativeобёртокSimpleAggregateFunction, содержащих версионированные состояния агрегатных функций, для старых узлов. #110997 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR: ReadBuffer is canceled. Can't read from it., которая могла возникать в JOINgrace_hash, если чтение сброшенных на диск блоков завершалось ошибкой в процессе чтения, когда средство чтения совместно использовалось несколькими потоками. #111056 (Groene AI). - Теперь каждый SSH-ключ отдельно учитывается в ограничении
max_authentication_methods_per_user, поэтому ограничение применяется единообразно независимо от синтаксиса. Ранее несколько ключей в одном методеssh_keyучитывались как один. #111181 (Yecine Megdiche). - Исправлена ошибка
LOGICAL_ERROR(Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan), возникавшая при чтении повторно используемого материализованного CTE (enable_materialized_cte) в ветви, где отбрасывается выводWITH TOTALSилиextremes, в том числе при внешней агрегации,INSERT ... SELECT, операциях над множествами иEXPLAIN ANALYZE. #111194 (Groene AI). - Исправлено поведение
map[key], при котором возвращалось значение более позднего дублирующегося ключа вместо первого. Если столбецMapсодержал повторяющиеся ключи, результатmap[key]мог зависеть от предшествующих строк в том же блоке и настройкиoptimize_functions_to_subcolumns, поэтомуSELECTиWHEREдля одной и той же строки могли давать разные результаты. #111246 (Groene AI). - Исправлена логическая ошибка
!rhs_literal->getValue().isNull()в оптимизаторе логических выражений, возникавшая, когда цепочкаANDсравнивала столбец с константой со значением NULL не-Nullableтипа (например,Variantсо значением NULL) приuse_variant_default_implementation_for_comparisons = 0. #111292 (Groene AI). - Исправлены ошибки
NOT_FOUND_COLUMN_IN_BLOCK/THERE_IS_NO_COLUMN(а в некоторых релизах — незаметно неверные результаты) приRIGHT JOIN, если задан параметрparallel_replicas_min_number_of_rows_per_replicaи выбирается столбец левой таблицы. #111332 (Groene AI). - Теперь
RESTOREвыполняет fsync файлов восстановленной части, если для целевой таблицы включёнfsync_after_insert, поэтому восстановленная часть так же устойчива к потере питания, как и вставленная. Ранее восстановленные файлы только записывались и закрывались (без fsync), поэтому потеря питания сразу после возвратаRESTOREзначенияRESTOREDмогла привести к повреждению частей и пустой таблице. #111378 (Groene AI). - Исправлено редкое окно потери данных Keeper на локальных дисках снимков: теперь при записи снимка выполняется fsync каталога снимка после удаления маркера
tmp_, поэтому при потере питания больше нельзя потерять удаление маркера при сохранении содержимого снимка. Ранее такой сбой приводил к тому, что Keeper считал корректный полностью синхронизированный снимок незавершённым и удалял его при перезапуске, теряя подтверждённые записи даже приforce_sync=true. Диски снимков на основе объектного хранилища не затронуты. #111397 (Groene AI). - Исправлены выход за границы при чтении (в релизной сборке) / логическая ошибка (в отладочной сборке) в оптимизации отложенной материализации, а также логическая ошибка в
Pipe::unitePipesдля таблицMerge, возникавшие, когда оптимизация прямого чтения из текстового индекса оставляла неиспользуемый виртуальный столбец индекса в заголовке чтения таблицыMergeTreeс несколькими индексамиtext. #111467 (Groene AI). - Исправлено, что виртуальный столбец
_timeтабличных функцийurl/urlClusterвсегда имел значениеNULLв сборках на основе musl из-за непереносимого разбора HTTP-заголовкаLast-Modified. #111619 (Konstantin Bogdanov). - Исправлена ошибка
LOGICAL_ERROR(Cannot create part with type Compact and storage type Full because table does not support polymorphic parts), возникавшая, когда таблицаMergeTreeзагружала уже существующую частьCompact, а её текущие настройки отключали полиморфные части (неадаптивная гранулярность). Это могло произойти, например, когда таблица только для чтения использовала общий путь на диске с другой таблицей и повторно загружала свои части черезSYSTEM RESTART DISKили при запуске сервера. В отладочных сборках и сборках с санитайзерами исключение аварийно завершало работу сервера. #111626 (Groene AI). - Исправлена ошибка при выполнении
CREATE TABLE ... ENGINE = KeeperMapс сообщениемCoordination error: No node, path .../metadata/drop_lock_version, возникавшая при одновременном удалении другой таблицы по тому же пути Keeper. Теперь создание таблицы считает исчезнувшее поддерево метаданных признаком завершённой очистки и повторяет попытку, как уже делает в аналогичной ситуации в следующем операторе. #111966 (Groene AI). - Исправлено состояние гонки между мутацией
ReplicatedMergeTreeи удалением старых временных каталогов, из-за которого могла публиковаться мутированная часть без некоторых файлов, а чтение этой части и все её последующие мутации завершались ошибкой. #111992 (Alexey Milovidov). - Исправлена ошибка, из-за которой
quantileDeterministic,quantilesDeterministicиmedianDeterministicпри каждом запуске возвращали разные результаты для одних и тех же данных, если запрос использовал параллельные реплики, distributed таблицу или внешнюю агрегацию либо состояния хранились в таблице (в том числе внутри значенияDynamic). Состояния, записанные до этой версии с использованием написания типа без версии, сохраняют прежнее поведение, поскольку их представление нельзя изменить. #112052 (Alexey Milovidov). - Исправлено исключение
serialize_string_in_memory_with_zero_byteиз сериализованного плана запроса. Приserialize_query_plan = 1строковое представление в памяти могло различаться у инициатора и узла, выполняющего десериализованный план, если в кластере эта настройка была отключена: при десериализации настройка считывалась, но при сериализации не записывалась, поэтому на выполняющем узле всегда использовалось её значение по умолчанию. #112131 (Groene AI). - Исправлено отображение кадра стека как
?вместо имени функции в фатальных сообщениях лога и в столбцеtrace_fullтаблицыsystem.crash_log. Проблема затрагивала кадры обычных функций, код которых был отнесён к заголовочному файлу libc++__functional, что часто встречается в release-сборках. #112152 (Alexey Milovidov). - Исправлены случаи, когда строки незаметно пропадали при фильтрации запроса по
intDiv(constant, key)илиdivide(constant, key). Анализ первичного ключа и партиций определял неверное направление монотонности для константы, делённой на ключевой столбец, из-за чего подходящие гранулы отбрасывались, а запрос без ошибки возвращал меньше строк. Также исправлена работаintDivс беззнаковым постоянным делимым, у которого установлен старший бит; анализ больше не считает выражение монотонным, когда операндDecimalприводит к выполнению деления в собственной разрядности decimal; также анализ ключа больше не вызывает ошибкуCannot compare DB::IPv4 with longдля корректного запроса, в котором константаIPv4/IPv6делится на ключевой столбец. #112156 (Groene AI). - Исправлено бесконечное зависание
DROP TABLE ... SYNC, когда запрос кsystem.replicasбыл остановлен до обработки его запросов состояния. #112164 (Nikolay Degterinsky). - Исправлено аварийное завершение сервера (
SIGABRT), когда WebAssembly UDFBUFFERED_V1возвращает пустой буфер результата; теперь запрос завершается с перехватываемой ошибкойWASM_ERROR, а сервер продолжает работать. #112182 (Nikolai Ovchinnikov). - Исправлено использование освобождённой памяти, возникавшее при
JOINсо словарём иjoin_algorithm = 'direct', если ключ JOIN хранился с разреженной сериализацией.getColumnVectorDataвозвращала ссылку на временный столбец, поэтому поиск в словаре обращался к освобождённой памяти: release-сборки могли возвращать неверные результаты, а debug-сборки или сборки с sanitizer аварийно завершались. #112327 (Groene AI). - Исправлены случаи, когда политики строк не применялись к проекциям MergeTree при выполнении запроса. #112329 (Yarik Briukhovetskyi).
- Исправлено повреждение данных при вставке в таблицу Iceberg через
MATERIALIZED VIEW. Файл данных записывался с типами столбцов целевой таблицы на моментCREATE, а не с её текущей схемой Iceberg, поэтому значениеDateTimeсохранялось как простой Avrointи при чтении интерпретировалось как микросекунды, а файлы сDateTime64(0)илиDateTime64(9)вообще не удавалось прочитать. ТеперьINSERT INTO <materialized view>для целевой таблицы, схема Iceberg которой шире объявленных столбцов представления, вызываетTYPE_MISMATCHвместо записи повреждённой строки. #112359 (Groene AI). - Keeper больше не отклоняет запрос
Setс пустыми данными при превышенииmax_memory_usage_soft_limit. Такой запрос не может увеличить объём хранимых данных, а его отклонение не позволяло клиентам повторно установить сеанс, из-за чего таблицы могли оставаться только для чтения на всё время нехватки памяти в Keeper. #112386 (Shaohua Wang). - Исправлена проблема, при которой follower Keeper после успешной установки большого снимка надолго выпадал из кворума, вызывая массовые ошибки
Session expired: лидер отбрасывал подтверждение follower, если применение снимка занимало больше тайм-аута его установки, а затем уменьшал индекс лога этого follower на одну запись за каждый обмен данными. Также добавлена настройка Keepernuraft_snapshot_sync_ctx_timeout_msдля управления этим тайм-аутом, который ранее можно было изменить только черезraft_limits_response_limit— и лишь ценой замедления обнаружения недоступных узлов. #112405 (Shaohua Wang). - Исправлены гонки данных в событиях профилирования и трекере памяти. #112466 (Miсhael Stetsyuk).
- Исправлена ошибка, связанная с безопасностью. #112479 (Kseniia Sumarokova).
- Исправлено чтение устаревшего вторичного (пропускающего) индекса после изменения типа через
ALTER TABLE ... MODIFY COLUMN, для которого мутация так и не выполнялась, например потому, что её удалилKILL MUTATION: гранулы на диске были записаны со старым типом, но декодировались с новым, что приводило кLOGICAL_ERROR, запросам на выделение нескольких эксабайт памяти или незаметному возврату неверного результата. Также исправлен неверный результат от индекса по выражению, смысл которого меняется, хотя все сохранённые байты остаются идентичными и поэтому мутация вообще не создаётся: например, приMODIFY COLUMN, изменяющем только часовой поясDateTimeили только пользовательское имя типа, например сUInt8наBool. Такой индекс теперь пропускается для затронутой части. Закрывает #112213. #112484 (Groene AI). - Исправлен сбой при чтении файла Parquet с несогласованными метаданными bloom filter. Такие файлы также могли незаметно возвращать меньше строк, чем должны. #112498 (Shaohua Wang).
- Исправлена гонка данных в readBigAt класса AsynchronousBoundedReadBuffer. Закрывает #109678. #112573 (Kseniia Sumarokova).
- Исправлено, что список псевдонимов столбцов, например
(SELECT 1) AS t(x)илиWITH t(x) AS (SELECT 1), не был доступен внутри табличной функцииview: ссылка наt.xприводила к ошибкеUNKNOWN_IDENTIFIER, хотя внеviewта же конструкция работает. #112690 (Groene AI). - Исправлена логическая ошибка
SortingAggregatedTransform already got bucket with number N, которая могла возникать в многоуровневых распределённых запросахGROUP BYс двухуровневой агрегацией. #112794 (Nikita Taranov). - Исправлена проблема, из-за которой таблица
NATSс заданнымnats_streamпосле перезапуска сервера NATS незаметно переставала получать данные. Теперь подпискаJetStreamавтоматически восстанавливается без необходимости выполнятьDETACH TABLEиATTACH TABLE. #112828 (Groene AI). - Исправлена ошибочная классификация временных ошибок Azure Blob Storage при чтении или слиянии —
403 Forbiddenиз-за задержки распространения разрешений RBAC, сбоя аутентификации учётных данных или тайм-аута подключения, отображаемого как408— как неповторяемых с сообщениемPOTENTIALLY_BROKEN_DATA_PART(код 740), что вызывало ложное критическое предупреждение для исправной части данных. Теперь такие временные сбои считаются повторяемыми, а действительно постоянный сбой отображается как обычная ошибка Azure вместо фиктивного сообщения о повреждённой части данных. #112871 (Arsen Muk). - Исправлено отсутствие событий Delete в
system.blob_storage_logпри пакетном удалении объектов Azure, если завершался сбоем сам пакетный запрос, из-за чего весь батч не попадал в журнал. Теперь при сбое на уровне батча для каждого объекта записывается событие Delete. #112873 (Arsen Muk). - Исправлена потеря индекса MinMax по
_block_numberи_block_offsetдля отдельных частей после перезагрузки таблицы, если часть была создана мутацией, не переписывающей её целиком. #112878 (Alexey Milovidov). - Исправлены логическая ошибка и неверные результаты, возникавшие, когда неэквивалентное условие
JOIN ON, вычисляемое во время JOIN, содержитarrayJoin. Теперь JOIN типаhash,parallel_hashилиgrace_hashотклоняет такое условие сINVALID_JOIN_ON_EXPRESSION. Если разворачивание зависит только от одной стороны, перенесите его вARRAY JOINв подзапросе перед JOIN; условие, аргументarrayJoinкоторого использует столбцы с обеих сторон, необходимо переработать. #112889 (Groene AI). - Исправлены неверные результаты
ORDER BYпри чтении из таблицыMergeповерх таблицDistributed: строки могли возвращаться не по порядку, а при использованииLIMITв результате могли отсутствовать нужные строки. #112931 (Alexey Milovidov). - Исправлено преобразование константы
Boolв правой частиINк типуStringлевой части как'1'/'0'вместо канонических'true'/'false'(теперь согласовано сCASTи табличной функциейvalues). #113051 (Yakov Olkhovskiy). - Исправлен всегда пустой столбец
viewsвquery_logдля вставок в таблицуAlias, целевая таблица которой запускает materialized views. #113076 (Enric Calabuig). - Исправлена ошибка
LOGICAL_ERRORпри чтении таблицы с индексом пропуска данныхset, определённым для выражения, если запрос повторяет это выражение с операндомNullable, напримерWHERE intDiv(id, (SELECT 1000)) = 3дляINDEX b_set intDiv(id, 1000) TYPE set(100). Для её возникновения достаточно скалярного подзапроса, поскольку он имеет типNullable. #113244 (George Larionov). - Исправлена логическая ошибка (исключение)
Chunk info was not set for chunk in MergingAggregatedTransform, возникавшая при включённой настройкеinject_random_order_for_select_without_order_by, если агрегирующий запрос читает из таблицыMerge, содержащей дочернюю таблицуDistributed: обёртка со случайнымORDER BY rand()больше не добавляется в запросы, спланированные лишь до промежуточного этапа. #113266 (Alexey Milovidov). - Исправлено зависание оптимизации плана запроса, когда предложение
WHEREсодержит большую строковую константу с множеством точек, а таблица имеет индекс пропуска данныхbloom_filter,tokenbf_v1,ngrambf_v1илиtext. При сопоставлении имени столбца фильтра с индексными столбцамиJSONAllPaths(...)перебирались все варианты разбиения имени по точкам, из-за чего построение условия индекса пропуска данных имело квадратичную сложность относительно длины константы. Закрывает #113003. #113289 (Groene AI). - Исправлено выполнение
ATTACHтаблицыKafka, когдаkafka_num_consumersпревышает ограничение, определяемое числом ядер CPU. #113390 (Nikolay Degterinsky). - Исправлены постоянное зависание
DROP TABLEи утечка памяти после сбоя запроса, использующего материализованный CTE. Таблица оставалась в очереди удаления до перезапуска сервера. #113397 (Shaohua Wang). - Исправлена логическая ошибка
IDENTIFIER is not a table expression, возникавшая, когда табличная функция семейства remote с аргументомview(...)используется в левой частиJOIN ... USING, ключом которого является псевдоним из спискаSELECT, приanalyzer_compatibility_join_using_top_level_identifier = 1. #113400 (Groene AI). - Исправлено чтение таблиц
Paimon, разбитых на партиции по столбцуTIMESTAMPс точностью выше миллисекунд, которое завершалось ошибкойscale 6 is not supported, only support scale <= 3. Закрывает #112768. #113401 (JIaQi Tang). - Исправлены segfault и
LOGICAL_ERROR(No host found for exchange stream final_result__0_0), возникавшие, когда подзапрос задаётdistributed_plan_execute_locallyв собственном предложенииSETTINGSпри использованииmake_distributed_plan. Распределённый план и код, выполняющий его, считывали настройку из двух разных контекстов и могли использовать разные значения, из-за чего инициатор строил внутренне противоречивый конвейер. #113422 (Groene AI). - Исправлено чтение таблиц Paimon, содержащих допускающий NULL столбец
ARRAYилиMAP. Такую таблицу нельзя было прочитать, поскольку средство сопоставления схемы оборачивало составной тип вNullable, что запрещено в ClickHouse, поэтому иDESC, иSELECTзавершались ошибкойNested type Array(Nullable(Int32)) cannot be inside Nullable type. Допускающий NULL составной столбец теперь сопоставляется с составным типом безNullable, а значениеNULLчитается как пустое. Закрывает #113337. #113450 (Groene AI). - Исправлено отсечение частей и гранул для условия
JOIN ON, включающего константные столбцы другой стороны. #113484 (Vladimir Cherkasov). - Предотвращена запись части со структурой
Map, противоречащей её собственным метаданным, для значенияMapвнутри столбцаDynamic. Таблицы, различавшиеся только значениемmap_serialization_version, совместно использовали один кэшированный объект сериализации, поэтому часть могла получить базовую структуруMapbasic, хотя в её метаданных была указанаwith_buckets; последующее чтение завершалось ошибкойLOGICAL_ERROR: Stream ...buckets_info ... is not found. Части, уже записанные таким образом более ранней версией, остаются нечитаемыми и должны быть удалены. #113514 (Groene AI). - Исправлена зависимость выведенного типа столбца от порядка предыдущих запросов для источника с кэшированной схемой. Настройки, изменяющие выведенный тип, отсутствовали в ключе кэша вывода схемы, поэтому значение первого запроса определяло тип, используемый всеми последующими запросами:
input_format_try_infer_exponent_floats,max_parser_depth,input_format_json_infer_array_of_dynamic_from_array_of_different_types, а дляParquetтакжеinput_format_parquet_local_time_as_utc,input_format_parquet_allow_geoparquet_parser,input_format_parquet_skip_columns_with_unsupported_types_in_schema_inferenceиschema_inference_make_json_columns_nullable. Также добавлен отсутствующий геттер ключа кэша дляForm, а геттерTemplateтеперь использует правило экранирования собственного формата строк. #113533 (Groene AI). - Исправлена теоретически возможная гонка данных в событиях профилирования при использовании настройки
trace_profile_events_listдля записи трассировок стека определённых событий профилирования вsystem.trace_log. #113553 (Miсhael Stetsyuk). - Исправлена возможность указать в
RENAME DATABASEцелевое имя, достаточно длинное, чтобы таблицы базы данных стало невозможно удалить. Проверка длины имени таблицы теперь выполняется независимо отcheck_table_dependenciesи также охватывает отсоединённые таблицы, которые ранее вообще не проверялись и потому были затронуты даже при настройках по умолчанию. Закрывает #101747. #113557 (Groene AI). - Исправлена ошибка
LOGICAL_ERRORReading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan, возникавшая, когда таблицаMergeс более чем одним дочерним элементом читала материализованный CTE, на который ссылался внешний запрос. #113558 (Alexey Milovidov). - Исправлена ситуация, при которой политика строк, содержащая скалярный подзапрос, вычислялась только один раз, а затем постоянно повторно использовалась после чтения таблицы через таблицу
Merge. Разобранное условие политики кэшируется и используется всеми запросами совместно, а чтение черезMergeизменяло кэшированное выражение на месте, что также вызывало гонку данных между параллельными запросами, использующими одну и ту же политику. #113563 (Alexey Milovidov). - Исправлена ошибка
Unsupported JOIN keys of type keys256 in StorageJoinпри чтении таблицы на движкеJoin, ключ которой является составным (из нескольких столбцов) или представляет собой одиночное значение размером 16 или 32 байта, напримерUUID,Int256илиFixedString(4). Такую таблицу можно было создать, записать в неё данные и использовать в JOIN, но нельзя было прочитать с помощьюSELECT. Закрывает #74362 и #77394. #113578 (Groene AI). - В веб-интерфейсе открытие ссылки с
run=1больше не приводит к автоматическому запуску запросов из URL-адресов других вкладок при следующей перезагрузке страницы. #113595 (Alexey Milovidov). - Исправлена логическая ошибка при сравнении массивов с типом элементов
Nothing. #113609 (Groene AI). - Резервные копии теперь сообщают о фактической ошибке доступа к файлу блокировки вместо ошибочного сообщения об одновременном резервном копировании, если хранилище назначения не может прочитать файл .lock. #113637 (Kirill Shokhin).
- Исправлена логическая ошибка
Sending a distributed query with unknown (zero) client version, возникавшая, когда таблицаDistributedбез структуры над удалённым сегментом присоединялась или загружалась из метаданных, записанных более старой версией сервера. #113675 (Alexey Milovidov). - Байт NUL теперь обрабатывается как обычный литерал в шаблонах match(). #113690 (Vitaly Baranov).
- Исправлена ошибка, из-за которой
theilsUв рамке окна возвращала произвольное значение вместо 0, если первый аргумент был константным в пределах рамки. #113691 (Alexey Milovidov). - Исправлена ошибка
Logical error: Duplicate announcement received for replica number N, возникавшая, когда автоматические параллельные реплики (automatic_parallel_replicas_mode) принимали план, одноузловой вариант которого был разбит на сегменты с помощьюquery_plan_join_shard_by_pk_ranges. #113730 (Alexey Milovidov). - Исправлены
CANNOT_CONVERT_TYPEи исключение вGroupingAggregatedTransformпри чтении таблицыMerge, одним из дочерних элементов которой была таблицаDistributed, с параллельными репликами на основе пользовательского ключа (parallel_replicas_mode = 'custom_key_sampling'или'custom_key_range'). Закрывает #113741. #113742 (Alexey Milovidov). - Исправлена ошибка
LOGICAL_ERROR, возникавшая, когдаSELECTиспользовал модификаторSTREAMдля именованной таблицы вместе с параллельными репликами в режиме задач чтения. При использовании материализованного CTE как множестваINвPREWHEREсервер выдавалReading from materialized CTE ... DelayedPortsProcessor gate is missing in the query plan(аварийно завершался в отладочных сборках и сборках с sanitizer). Таблицы сSTREAMтеперь отклоняются при запросе параллельных реплик: приenable_parallel_replicas = 2запрос завершается сSUPPORT_IS_DISABLED, при1выполняется без них — так же, как уже происходит дляFINAL. #113754 (Groene AI). - Исправлено аварийное завершение сервера при JOIN с константным выражением
ONи правой стороной, содержащейARRAY JOIN. При чтении лениво реплицированного столбца правой стороны использовался уже освобождённыйColumnReplicated. Закрывает #113859. #113901 (Groene AI). - Исправлены неопределённое поведение и неверные результаты
avgдляDate/DateTime/DateTime64/Time/Time64: среднее теперь точно вычисляется в целочисленной арифметике, что устраняет как переполнение на границеInt64(UB, неверный результат на x86), так и потерю точностиFloat64выше 2^53 (заметную на наносекундном уровне). #113912 (Alexey Milovidov). - Исправлены неверные результаты в
JOINсjoin_algorithm = 'partial_merge', когда правая сторона содержала итоги: она могла остаться несведённой, из-за чегоLEFTJOIN подставляли значения по умолчанию вместо фактических совпадений, аINNER/RIGHTJOIN вообще не возвращали строк. В ветке необъединённых строкRIGHT/FULLэто же состояние приводило к разыменованию нулевого указателя и аварийному завершению сервера. #113936 (Groene AI). - Исправлен дефект в интеграциях
MySQL: переопределение TLS-учетных данных именованной коллекции пустым значениемssl_ca_pem/ssl_cert_pem/ssl_key_pemпринималось, если учетные данные в коллекции хранились в форме содержимого. При этом настроенный сертификат CA или клиентский сертификат молча отбрасывался вместо отклонения переопределения. #113947 (Alexey Milovidov). - Исправлено исключение
std::out_of_range(Logical error: 'std::exception. Code: 1001, type: std::out_of_range', также приводившее к аварийному завершению сервера в отладочных сборках и сборках с sanitizer) в средстве чтения Parquet v3. Оно возникало, когда столбец, необходимый только для вычисления фильтра, планировался для декодирования после удаления его выходного слота. #113956 (Groene AI). - Исправлена логическая ошибка (
Unexpected return type), возникавшая, когда фильтр по представлению, тип столбца которого отличается от типа в нижележащем хранилище (например,information_schema.tables, гдеengineимеет типNullable(String), надsystem.tables, где он имеет типString), переносится в хранилище. #113984 (Alexey Milovidov). - Исправлен отказ ClickHouse Keeper запускаться с
CORRUPTED_DATAпосле сбоя при межсегментном усечении журнала Raft (writeAt), из-за которого подтвержденная запись журнала могла остаться за устаревшими сегментами журнала изменений. #114003 (Nishant Agarwal). - Таблица или база данных, имя которой подставляется в путь ZooKeeper
ReplicatedMergeTreeчерез макрос{database}или{table}, теперь отклоняется, если это имя не является единым безопасным компонентом пути. Ранее имя, содержащее/, вставлялось без экранирования, поэтому таблица регистрировала свои znodes в поддереве Keeper другой таблицы и необратимо нарушала работуALTERиOPTIMIZEв нем. Также отклоняются компоненты.и.., управляющие символы и синтаксис макросов. Существующие таблицы по-прежнему загружаются и подключаются. #114006 (Groene AI). - Исправлена утечка памяти при
optimize_aggregation_in_order = 1, когда ключ сортировки таблицы является строгим префиксом ключаGROUP BYи используется агрегатная функция, состояние которой занимает память в куче, напримерquantileDD. Потребление памяти сервера росло с каждым таким запросом до перезапуска. #114010 (Groene AI). - Исправлена логическая ошибка, возникавшая, когда распределенный план запроса содержит оконную функцию, создающую состояние агрегатной функции, например
theilsUState(a, b) OVER (ORDER BY a)сmake_distributed_plan = 1. Затрагивает семействаcramersV,cramersVBiasCorrected,theilsUиcontingency. #114020 (Groene AI). - Исправлены неверные результаты для
SELECT DISTINCTсLIMIT, которому требуется прочитать весь входной поток:LIMIT n WITH TIESотбрасывал строки с одинаковыми значениями,exact_rows_before_limit = 1сообщал усеченное значениеrows_before_limit_at_least, аGROUP BY ... WITH TOTALSвычислял строку итогов по префиксу потока. #114025 (Groene AI). - Исправлено игнорирование
isProbablePrimeдляUInt128/UInt256параметраmax_execution_timeи командыKILL QUERY. Блок значений большой разрядности выполнялся полностью в рамках одного вызова функции без возможности отмены, поэтому запрос мог продолжать выполняться несколько минут после истечения времени ожидания. #114032 (Groene AI). - Исправлено отсутствие строки в
system.query_views_logдля materialized view, завершающегося с ошибкой при сборе зависимостей с включённымmaterialized_views_ignore_errors. В отладочных сборках и сборках с sanitizer это также приводило к аварийному завершению работы сервера сstd::out_of_rangeвместо записи view в журнал. #114064 (Groene AI). - Исправлена ошибка
Code: 46. DB::Exception: Unknown function exists. (UNKNOWN_FUNCTION), возникавшая, когда предложениеPREWHEREсодержало предикатIN (subquery)и был задан параметрrewrite_in_to_join = 1(илиmake_distributed_plan = 1, который принудительно включает его). Тот же запрос сWHEREработал корректно. #114067 (RohithPariki). - Исправлено поведение
ORDER BY ... LIMIT, при котором возвращалось меньше строк, чем запрошено, а иногда ни одной, если политика доступа на уровне строк была единственным фильтром запроса, а столбец сортировки имел индекс пропуска данныхminmax. Оптимизация top-K ограничивала чтение до применения политики доступа на уровне строк. #114073 (Alexey Milovidov). - Исправлено поведение
hasAny,hasAll,has,indexOf,mapContainsKey,mapContainsValueиmapContains, при котором они возвращали слишком мало строк или завершались с ошибкойTOO_LARGE_STRING_SIZE, когда для индексаbloom_filterиспользовалась константаFixedString. Индекс хешировал дополненную форму константы, тогда как функции сравнивают форму без дополнения, из-за чего пропускалась подходящая гранула. #114089 (Alexey Milovidov). - Исправлены ошибка
LOGICAL_ERROR“Not-ready Set is passed as the second argument for functionglobalNullIn” и потеря фактического сообщения об ошибке запроса, которые могли возникать, когда отсечение частей по статистике спекулятивно выполняло подзапросIN/GLOBAL INпри анализе индексов и этот подзапрос завершался с ошибкой. #114121 (Groene AI). - Параметр
allow_calculating_subcolumns_sizes_for_merge_tree_readingтеперь учитывается в оптимизации PREWHERE. #114146 (Pavel Kruglov). - Повреждённые или злонамеренно сформированные словари, в которых
lcpпревышает предыдущий токен илиlcp + data_sizeвызывает переполнение, теперь отклоняются до записи в буфер. #114155 (Elmi Ahmadov). - Исправлены
minиmaxдля столбцовDateTime64, возвращавшие неверные результаты после JIT-компиляции агрегатной функции, если данные содержали временные метки до 1970 года.is_signedне был специализирован дляDateTime64иTime64, которые наследуются отDecimal64, поэтому сгенерированный код сравнивал количество тиков как беззнаковые целые числа: временная метка до 1970 года выбиралась дляmaxи не выбиралась дляmin. #114168 (Groene AI). - Исправлено исключение при чтении таблицы
MergeTreeпо слоям диапазонов первичного ключа, когда слой формирует пустой pipe. #114177 (Alexey Milovidov). - Исправлен код ошибки для некоторых некорректно сформированных
Replicated-сериализованных столбцов, полученных по собственному протоколу: теперь они отклоняются сINCORRECT_DATAвместоLOGICAL_ERROR(который приводил к аварийному завершению работы сервера в отладочных сборках и сборках с sanitizer). #114186 (Pavel Kruglov). - Исправлены сбои при выполнении
ATTACH PARTITION FROM,REPLACE PARTITION,MOVE PARTITION TO TABLEи добавлении репликиReplicatedMergeTreeс ошибкамиTables have different ...,METADATA_MISMATCHилиINCOMPATIBLE_COLUMNSдля таблиц, определения которых содержали лишние скобки, напримерPARTITION BY (a),ORDER BY (b),INDEX ix (b * c) TYPE minmax,PROJECTION p (SELECT (b) ...),CONSTRAINT c CHECK (a > 0),TTL (d + INTERVAL 10 YEAR)илиDEFAULT (a + 1). #114188 (Alexey Milovidov). - Исправлено отсутствие в хеше кодека у
ALP,FPCиGCDпараметра, зависящего от типа. В компактной части средство записи использует один сжатый поток для каждого уникального хеша кодека, поэтому два столбца с разной шириной значений и одинаковым кодеком конфликтовали и использовали один объект кодека с неверной шириной. Из-за этого корректные вставки отклонялись с ошибкойCANNOT_COMPRESS, если ширина различалась, а в остальных случаях один из столбцов сжимался хуже, чем мог бы. #114189 (Groene AI). - Исправлена ошибка
std::out_of_range: map::at: key not found, возникавшая, когда ключевое выражениеMergeTreeсодержит вызовmortonEncodeилиhilbertEncode, который сам не является ключевым столбцом, напримерORDER BY mortonEncode(hilbertEncode(x, y), x, y)илиPARTITION BY mortonEncode(x, y) % 4. #114233 (Groene AI). - В исходном запросе дозагрузки оконного представления удалены обычные LIMIT/OFFSET. #114247 (Alexey Milovidov).
- Исправлена ошибка
LOGICAL_ERRORвarrayAutocorrelation, когда аргументом является непустой массив с типом элементовNothing, напримерSELECT arrayAutocorrelation([arrayMax([])]). Теперь такой аргумент отклоняется с ошибкойILLEGAL_COLUMN. Литерал пустого массива[]по-прежнему возвращает[]. #114249 (Groene AI). - Исправлена ситуация, при которой сервер Keeper не присоединялся к кластеру при включенном
nuraft_use_bg_thread_for_snapshot_io: пакет журнала, отправленный присоединяющемуся серверу, молча отбрасывался, поэтому изменение состава участников не завершалось. #114275 (Shaohua Wang). - Исправлено чтение
XDG_CACHE_HOMEизXDG_STATE_HOME. #114278 (Alexey Milovidov). - Пространство имен Iceberg теперь регистрируется в каталоге перед записью файлов таблицы (требуется для SeaweedFS). #114285 (Azat Khuzhin).
- Исправлены несогласованные результаты, когда фильтр по неключевому столбцу правой таблицы перемещался ниже ANY INNER JOIN. #114313 (Kirill Shokhin).
- Исправлено автодополнение bash в bash-completion 2.12+ (_comp_get_words). #114339 (Azat Khuzhin).
- Устранён сбой при чтении таблицы озера данных, в схеме которой объявлен столбец с пустым именем. Некорректные метаданные Iceberg отклоняются с
ICEBERG_SPECIFICATION_VIOLATION; схема, полученная из каталога, Delta Lake или Paimon, отклоняется сAMBIGUOUS_COLUMN_NAME. Проверка выполняется безусловно, поэтому таблица Iceberg, которая лишь содержит неиспользуемую историческую схему с пустым именем поля, также становится недоступной для чтения, вместо того чтобы аварийно завершаться при чтении этой схемы. #114394 (Groene AI). - Устранена ошибка, из-за которой клиент, подключающийся к ClickHouse Keeper во время смены лидера Raft, мог ожидать в течение всего
session_timeout_ms(30 секунд по умолчанию), прежде чем его подключение отклонялось, вместо того чтобы быть отклонённым сразу после сброса незавершённого запроса. Теперь подключающийся клиент может быстрее переподключиться к другой реплике. #114401 (Groene AI). BACKUP,RESTOREиENGINE = Backupтеперь проверяют права пользователя наSOURCESдля расположения резервной копии, так же какs3(),file()иazureBlobStorage(). Ранее пользователь с правомBACKUP, но безSOURCES, мог записывать резервную копию в любое доступное серверу расположение и читать её оттуда. Для записи резервной копии теперь требуется правоWRITEдля источника пункта назначения (WRITE ON S3,WRITE ON AZURE,WRITE ON FILE), а для чтения —READ; для пунктов назначенияDisk(...)по-прежнему действует только ограничениеbackups.allowed_disk. #114405 (Groene AI).- Устранена утечка внутренней таблицы
_tmp_replace_*приCREATE OR REPLACEи сбойCREATE OR REPLACE VIEWсNOT_IMPLEMENTED, когда заданignore_drop_queries_probability. Внутренне выполняемые операции DROP являются этапами одного пользовательского оператора, поэтому инъекция сбоев DROP к ним больше не применяется. #114420 (Groene AI). - Устранены
LOGICAL_ERROR(Bad cast from type DB::ASTLiteral to DB::ASTPartition) и невозможность разобрать форматированный SQL, возникавшие, когда командаALTER TABLE ... MOVE, десериализованная из JSON AST (dialect = clickhouse_json), сочетала формуPARTсTO TABLEлибо формуPARTITIONсTO SHARD. Такие полезные нагрузки теперь отклоняются сBAD_ARGUMENTS. #114429 (Groene AI). - Столбцы больше не удаляются, если на них ссылаются оба условия фильтрации
PREWHEREиWHERE, даже если они переписаны в виртуальный столбец текстового индекса. #114460 (Elmi Ahmadov). - Устранена ошибка
Not-ready Set is passed as the second argument for function 'in', возникавшая при отмене мутации, предикат которой содержитIN (subquery), например с помощьюKILL MUTATIONилиDETACH DATABASE, пока Set подзапроса ещё создаётся. Связано с: #107619. #114463 (Groene AI). ALTER TABLE ... DROP COLUMNдля столбца, используемого в ключе сортировки, первичном ключе или ключе партиционирования, теперь завершается сALTER_OF_COLUMN_IS_FORBIDDENи пояснением, как иALTER TABLE ... CLEAR COLUMN. Ранее операция завершалась сбивающей с толку ошибкойUNKNOWN_IDENTIFIER: Missing columns, возникавшей при пересчёте ключевых выражений. То же относится к удалению или очистке всей группыNestedпо общему префиксу, если столбец группы используется в ключе; ранее это могло незаметно уничтожить данные группы или оставить мутацию, которая никогда не завершается. При удалении столбца, используемого только в TTL-выражении, теперь также указывается, какое TTL-выражение при этом нарушается. #114468 (Maksim Dergousov).- Исправлено чтение столбца
Tuple, первый элемент которого равенNULL, в форматахCustomSeparated,RegexpиTemplateс правилом экранированияCSV. ОбычныйTupleзанимает в них по одному полю для каждого элемента, поэтому начальное поле\Nотносится к этому элементу, а не ко всему столбцу. Ранее оно воспринималось как весь столбец, из-за чего поля остальных элементов сдвигались в следующие столбцы иCustomSeparatedне мог прочитать собственный вывод. Закрывает #114402. #114471 (Groene AI). - Исправлено поведение
arrayExists(x -> x = needle, arr), которая возвращала неверный результат или завершалась с ошибкойTOO_LARGE_STRING_SIZE, если элемент массива и needle имели разные строковые типы (например, needle типаStringи элементArray(FixedString(N))). Включенная по умолчанию оптимизацияoptimize_rewrite_array_exists_to_hasпереписывала такой вызов вhas, которая сравнивает дополненные нулями значения иначе, чем=. #114496 (Groene AI). - Чтение таблицы Iceberg, метаданные которой описывают запрещенное спецификацией Iceberg изменение схемы, больше не аварийно завершает работу сервера. Четыре нарушения спецификации в
IcebergSchemaProcessorсообщались какLOGICAL_ERROR, что обрабатывается как неудачная проверка утверждения, либо приводили к непроверенному фатальному утверждению; теперь они вызываютICEBERG_SPECIFICATION_VIOLATION. #114518 (Groene AI). - Исправлено, что входной формат
Regexpмолча отбрасывал неразобранный остаток совпавшего поля, сохраняя усеченное или некорректно сформированное значение вместо сообщения об ошибке:v=-1вUInt64читалось как0, аv=2020-01-01junkвDate— как1975-07-14при правилеJSON. Некорректно сформированные поля теперь отклоняются при правилахEscaped,CSVиJSONв соответствии с поведением форматов, которым эти правила, согласно документации, соответствуют. ПриRawсовпавшее поле, содержащее символ табуляции, теперь читается целиком, а не усекается на нем. #114520 (Groene AI). - Исправлена ошибка
LOGICAL_ERRORпри фильтрации столбца Iceberg, который командаALTER TABLE ... MODIFY COLUMNсделалаNullable. Закрывает #85029. #114521 (Groene AI). CREATE TABLEиALTER TABLEтеперь отклоняют кодеки с потерями, такие какSZ3, для столбцов, используемых в ключе сортировки. #114531 (Groene AI).- Исправлена ошибка
LOGICAL_ERRORпри чтении таблицы Delta Lake, у которойmetaData.partitionColumnsсодержит имя столбца, не объявленного вmetaData.schemaString. Такие метаданные теперь отклоняются сBAD_ARGUMENTSв средстве чтения delta-kernel и сINCORRECT_DATAв устаревшем средстве чтения всякий раз, когда таблица или ее схема читаются из снимка, а не только когда запрос содержит предикат. #114538 (Groene AI). - Отклоняется Variant, ветви ORC которого при чтении имеют один и тот же тип. #114540 (Groene AI).
- Исправлена обработка операторов
LIKE/ILIKEтекстовым индексом для контейнеров Map или JSON. #114544 (Elmi Ahmadov). - Поддержка имен меток в кавычках в модификаторах группировки PromQL. #114545 (Minh Vu).
- Исправлены некорректные, зачастую со сменённым знаком, литералы
Time64и константы в спискахIN, возникавшие при масштабированииDecimal64с меньшим масштабом, приводившем к переполнениюInt64. Теперь при таком преобразовании сообщается ошибкаDECIMAL_OVERFLOW, как и в ветвиDateTime64и при явномCAST. #114546 (Groene AI). - Разрешены завершающие запятые в списках меток группировки PromQL.. #114548 (Minh Vu).
- Добавлена поддержка имён метрик и меток в кавычках в селекторах PromQL. #114551 (Minh Vu).
- Запрос мог быть отменён за 1 мс до истечения
max_execution_time, завершаясь противоречивой ошибкойTimeout exceeded: elapsed 999.672 ms, maximum: 1000 ms. #114559 (Alexey Milovidov). - Исправлено чтение таблицы во время выполнения мутации: столбец
MATERIALIZEDмог возвращать устаревшее значение, а его выборка вместе с обновлённым столбцом могла завершаться ошибкой. #114561 (Shaohua Wang). - Исправлено поведение
clickhouse-local, допускавшееCREATE TABLEс именем, слишком длинным для настроенной--default_database, что приводило к созданию таблицы, которую невозможно удалить. ТеперьDatabaseOverlayпроверяет длину имени таблицы так же, как база данных на диске, в которую он записывает. #114567 (Groene AI). - Исправлен обход RBAC в движке таблицы
Alias, позволявший пользователям без привилегий на целевую таблицу раскрывать её схему, число строк, размер и факт существования. #114596 (Kai Zhu). - Исправлено бесшумное и необратимое отключение статистики хеш-таблиц — а вместе с ней и предварительного выделения памяти для хеш-таблиц агрегации — для всего сервера, если запрос с отложенной оптимизацией
FINAL(query_plan_optimize_lazy_final) был первой агрегацией, выполненной после запуска сервера. #114597 (Alexey Milovidov). - Исправлено поведение столбца, который был переименован, удалён и снова добавлен в одном
ALTER: пока мутация ожидала выполнения, он мог возвращать значения удалённого столбца вместо собственного значения по умолчанию. #114601 (Shaohua Wang). - Исправлен бесконечный неотменяемый цикл в функциях
hopиwindowID, возникавший, когда длительность интервального аргумента в секундах была кратна 2^32 (например,toIntervalDay(2147483648)): вычитание с переполнением обходило проверку переполнения времени, а при постоянных аргументах цикл выполнялся во время анализа, когда запрос нельзя было даже остановить. Такой же интервал также мог бесконечно загружать фоновый потокWINDOW VIEW; теперь такое оконное представление отклоняется при создании. #114607 (Alexey Milovidov). - Исправлена ошибка, при которой объект управления доступом с настройкой типа
Map, например профиль настроек сhttp_response_headersилиadditional_table_filters, сохранялся в виде, который ClickHouse не мог прочитать, из-за чего после перезапуска объект становился навсегда недоступным для загрузки. #114620 (Groene AI). - Исправлена утечка заменённой целевой таблицы у refreshable materialized view, когда включён
ignore_drop_queries_probability. ОперацияDROP, выполняемая refresh для очистки предыдущей целевой таблицы, является этапом refresh, а не запрошенным пользователемDROP, поэтому инъекция сбоя к ней больше не применяется. #114622 (Groene AI). - Исправлено, что
has,indexOf,countEqual,mapContainsKey,mapContainsValueи обращение по индексу кMapвозвращали “not found” для константного значенияLowCardinality, равного значению по умолчанию для типа элемента, например пустойStringили нулевого числа. #114624 (Groene AI). - Исправлена логическая ошибка
Multi-block postings must be compressedв запросах к таблицам с текстовым индексом в режиме отложенного применения списка проводок, если запрос отменялся во время чтения. #114636 (Anton Popov). - Исправлено форматирование аргумента-подзапроса табличных функций
viewиviewIfPermitted, когда внешний запрос содержит завершающую секциюSETTINGS. Такой запрос форматировался какview((SELECT ...)), что не удавалось разобрать повторно, поэтому он не проходил внутреннюю проверку «форматирование—разбор—форматирование» и вызывал ошибкуInconsistent AST formatting. #114658 (Groene AI). - Исправлено повреждение памяти кучи при чтении Parquet через входной формат, владеющий собственным буфером чтения, например словарь с
SOURCE(FILE(... format 'Parquet')). Фоновые задачи предварительной выборки и декодирования могли продолжать читать из буфера и записывать в него после его освобождения конвейером, что могло привести к аварийному завершению сервера. #114668 (Groene AI). - Исправлено чтение подстолбца (
.size0,.null, элемента кортежа,String.size) через таблицуMerge, когда в базовой таблице родительский столбец объявлен какALIAS. Такое чтение возвращало значение по умолчанию для типа, а если родительский столбец выбирался в том же запросе — значение несвязанного столбца. #114673 (Groene AI). - Исправлены
ANY RIGHT JOINиSEMI RIGHT JOINс несколькими условиями, объединённымиOR, в секцииON: из-за них некоторые строки правой таблицы возвращались дважды, а совпадения для других терялись. Это также затрагивало явно указанныйANY LEFT JOIN, поскольку планировщик может поменять таблицы местами и выполнить его какANY RIGHT JOIN. #114676 (Vladimir Cherkasov). - Исправлены неверные результаты тривиальной оптимизации
GROUP BY ... LIMIT(настройкаoptimize_trivial_group_by_limit_query) для запросов сDISTINCT,QUALIFY, оконными функциями илиarrayJoinв проекции: они используют или фильтруют группы после агрегации, поэтому ограничение агрегации числом ключейLIMIT + OFFSETмогло возвращать слишком мало строк или неверные значения. Оптимизация больше не применяется к таким запросам. #114695 (Alexey Milovidov). - Исправлено отсутствие строк в результате
SELECT, отфильтрованного с помощьюpointInPolygonпо первичному ключу MergeTree, когда аргумент полигона представляет собой недопустимый константный литерал иvalidate_polygons = 0. При анализе первичного ключа выполнялось отсечение гранул на основе непроверенного полигона, из-за чего отбрасывались гранулы с совпадающими строками. #114710 (Groene AI). - Исправлено аварийное завершение сервера при объединении состояний агрегатных функций с комбинаторами
-OrNullили-OrDefaultприgroup_by_overflow_mode = 'any'и ненулевомmax_rows_to_group_by, например когда запрос читает через агрегатную проекцию. #114740 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(“Unexpected number of kept output positions after removing unused columns fromReadFromMergeTree”), возникавшая при выполненииSELECT ... FINAL, еслиPREWHEREиспользует столбец, необходимыйFINALдля слияния (ver,is_deleted,sign), но этот столбец не выбирается. #114746 (Groene AI). - Исправлена логическая ошибка (
Block structure mismatch) при чтении таблицыMergeс включеннымmake_distributed_planпо дочерним узлам с внутренними операциями над множествами. #114753 (Alexey Milovidov). - Чрезмерно большое значение
kafka_num_consumersтеперь отклоняется с понятной ошибкой вместо сбоя при выделении памяти внутри движка таблицыKafka. Ранее при включенномkafka_disable_num_consumers_limitтакое значение приводило к исключениюstd::length_error. #114764 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR: Context has expired, возникавшее, когда сохраненное выражение, содержащееaccurateCastOrDefaultили функциюto<Type>OrDefault, вычислялось после завершения создавшего его запроса, например значение по умолчанию для столбцаMATERIALIZEDприINSERTили выражение мутации. #114769 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(Cannot find input column ... on its position in inputs of expression actions DAG), возникавшая, когда в запросеJOINрасположен над таблицей, столбец с текстовым индексом которой используется и в предикате текстового поискаPREWHERE, и вWHERE. #114771 (Groene AI). - Исправлена потеря сигнала потоком перезапуска при запуске из потока attach. #114802 (Azat Khuzhin).
OPTIMIZE TABLEдля таблицы в объектном хранилище, движок которой не поддерживает compaction, сообщал об успехе, ничего не выполняя. Теперь он выдает ошибку, как и любой другой движок, не поддерживающий этот оператор. Это затрагиваетDeltaLake,Paimon,Hudiи обычные движки объектного хранилища (S3,GCS,COSN,OSS,AzureBlobStorage,HDFSи основанный на объектном хранилищеURL); дляIceberg, поддерживающего compaction, изменений нет. Закрывает #114765. #114805 (Groene AI).timeSeriesRangeиtimeSeriesFromGridвыдавали ложную ошибкуDECIMAL_OVERFLOWдля временных меток до 1970 года, поскольку начальная и конечная временные метки считывались как беззнаковые значения. Кроме того, для временных метокDateTime/UInt32шаг молча усекался до младших 32 бит. Теперь все вычисления выполняются вInt64. #114815 (Vitaly Baranov).- Исправлено аварийное завершение сервера (
Logical error: Part patch-... doesn't exist), возникавшее, когдаDROP TABLEвыполнялся одновременно с легковеснымUPDATEв таблицеReplicatedMergeTree. Теперь обновление удерживает общую блокировку таблицы до фиксации своей patch part, поэтомуDROPожидает вместо ее удаления. #114826 (Groene AI). - Исправлено несколько ошибок в async inserts: возможное аварийное завершение, если некоторые запросы завершались с
MEMORY_LIMIT_EXCEEDED, и неработающийasync_insert_queue_flush_on_shutdown. #114839 (Azat Khuzhin). - Исправлена ошибка
LOGICAL_ERROR: Unexpected return type from tuple. Expected Tuple(..., UInt8). Got Tuple(..., LowCardinality(UInt8)), возникавшая при чтении черезtuple(...)столбцаLowCardinality, сравниваемого сIN (subquery), через границу подзапроса приenable_analyzer = 0. В старом анализаторе выражениеx IN (subquery)для столбцаLowCardinalityтеперь возвращаетLowCardinality(UInt8)— тот же тип, что иx IN (literal list), а также приenable_analyzer = 1. #114856 (Nikita Fomichev). - Настройки квот AI-функций (
ai_function_max_api_calls_per_query,ai_function_max_input_tokens_per_query,ai_function_max_output_tokens_per_query) применялись к каждому блоку, а не ко всему запросу, что позволяло запросу превышать настроенное ограничение пропорционально числу обработанных блоков и потоков. Теперь они ограничивают весь запрос на каждом сервере: ограничение на API-вызовы является строгим пределом (атомарное резервирование), а ограничения на токены применяются по мере возможности. Распределённый запрос применяет ограничения независимо на каждом участвующем сервере / фрагменте. #114885 (George Larionov). - Исправлено аварийное завершение сервера, происходившее, когда глобальный пул потоков на мгновение был полностью занят, пока таблицы ещё загружались.
AsyncLoaderтеперь продолжает работу, если не может запустить дополнительный воркер загрузчика, но другой воркер всё ещё обработает задания из очереди, вместо вызоваstd::terminate. #114897 (Groene AI). - Исправлены неопределённое поведение и некорректные результаты на границах в
quantileиquantilesдля значенийDateTime64иDecimalбольшой разрядности. #114919 (Alexey Milovidov). - Исправлено аварийное завершение сервера при повреждённом футере ORC-страйпа. #114924 (Groene AI).
- Исправлено возможное падение из-за use-after-free в ThreadGroup (для асинхронных INSERT/MV/EXPLAIN ANALYZE). #114940 (Azat Khuzhin).
- Исправлено зависание при удалении таблицы
TimeSeries, имя которой лексикографически предшествует именам её внутренних таблиц, напримерDROP TABLE `-ts`, или при удалении materialized view, объявленного сENGINE = TimeSeries. Операция удаления приводила к взаимной блокировке на DDL-блокировке и не могла быть отменена с помощьюKILL QUERY. #114953 (Groene AI). - Исправлена ошибка
BAD_DATA_PART_NAME(“Trying to get part name in new format for old format version”) дляReplicatedMergeTree, созданного с устаревшим позиционным синтаксисом приallow_deprecated_syntax_for_merge_tree. Мутация могла быть отмечена как завершённая на реплике, которая не применила её, а таблица могла остаться в режиме только для чтения после перезапуска. #114980 (Groene AI). - Исправлена логическая ошибка
Not-ready Set is passed as the second argument for function 'in'для запроса с подзапросомIN, читающим из удалённого кластера: теперь запрос завершается с фактической ошибкой из подзапроса, например ошибкой соединения. #114983 (Alexey Milovidov). - Исправлена логическая ошибка для IN с идентичным неконстантным кортежем с обеих сторон в старом анализаторе. #114988 (Groene AI).
- Исправлено чтение элемента кортежа через позиционную подсказку структуры Tuple. #115000 (Groene AI).
- В arrayReduceInRanges больше не создаются псевдонимы для состояний предварительной агрегации агрегатной функции нулевого размера. #115008 (Groene AI).
- Исправлена ошибка выполнения
INSERTв таблицуLog,TinyLogилиStripeLogпри фиксации записанных размеров файлов. Такая вставка могла сохранять строки в таблице, несмотря на сообщение об ошибке, или оставлять файлы данных столбца типа Array в несогласованном состоянии. Чтение таблицыLogилиTinyLog, у которой столбец типа Array не содержит элементов, хотя его смещения указывают на их наличие, теперь вызывает ошибку с указанием столбца вместо чтения за пределами элементов. Частично записанный столбец элементов и ранее отклонялся. #115027 (Groene AI). - Исправлено аварийное завершение адаптивного агрегатора при работе с лениво реплицируемыми столбцами. #115034 (Groene AI).
- Исправлено чтение за границами массива в
pointInPolygonс константным полигоном, ограничивающий прямоугольник которого неограничен, например если координата достигает+-DBL_MAX. Такой полигон теперь отклоняется сBAD_ARGUMENTS, а полигон с пустым кольцом считается не имеющим внутренней области. Ранее запрос мог вернуть неверный результат или аварийно завершить работу сервера в сборках с включённой усиленной защитой или санитайзерами. #115035 (Groene AI). - Исправлено исключение
out_of_range, возникавшее как внутренняя ошибкаCode: 1001, когда шаблонsequenceMatch,sequenceCountилиsequenceMatchEventsсодержит номер события0, напримерsequenceMatch('(?0)'). Такой шаблон теперь отклоняется сBAD_ARGUMENTS. Временное условие с одиночным знаком, напримерsequenceMatch('(?1)(?t>+)(?2)'), ранее молча обрабатывалось как(?t>0), а теперь отклоняется сSYNTAX_ERROR. #115056 (Groene AI). - Исправлена ошибка
Found patch part ... that intersects mutation with version ...(LOGICAL_ERROR) в таблицах с легковесными обновлениями. Слияние патч-частей могло создать патч, диапазон версий данных которого охватывает версию данных существующей части; такой патч затем нельзя ни применить, ни пропустить, из-за чего каждая последующая операция с разделом завершалась ошибкой, а очередь репликации останавливалась. Такие слияния больше не назначаются. #115064 (Alexey Milovidov). - Исправлена ошибка
LOGICAL_ERROR(Cache file segment is in detached state) при чтении через файловый кэш с экспериментальной настройкойuse_reader_executor. Регрессия была внесена в #110029 и не вошла ни в один релиз, поэтому перенос исправления не требуется. #115070 (Groene AI). - Сервер Arrow Flight теперь принимает учётные данные аутентификации
Basic, закодированные в Base64 без заполнения, как их отправляют клиенты Flight на базе Go, например драйвер ADBC Flight SQL, а при некорректном заголовкеauthorizationвозвращает корректную ошибку аутентификации вместо общейUnexpected error in RPC handling. #115085 (Alexey Milovidov). - Исправлено автодополнение (подсказки и дополнение по TAB из
system.completions) во встроенном клиенте, используемом интерфейсом SSH и веб-терминалом: предложения загружались через отдельное подключение, которое проходило аутентификацию от имени пользователяdefaultс пустым паролем. На серверах, где дляdefaultзадан пароль, это приводило к ошибке, а в остальных случаях раскрывались имена сущностей, к которым у вошедшего пользователя нет доступа. Теперь предложения загружаются через собственное подключение сессии. #115086 (Alexey Milovidov). - Исправлен сбой запуска сервера после создания таблицы с
CREATE TABLE ... AS url('http://host/**/', ...)при включенной настройкеallow_experimental_url_wildcard_from_index_pages. При загрузке метаданных такой таблицы экспериментальная проверка выполнялась повторно и завершалась ошибкойSUPPORT_IS_DISABLED, что прерывало запуск. #115095 (Groene AI). - bucketIndexForTimestamp переписан с использованием 64-битной арифметики. #115097 (Vitaly Baranov).
- Исправлено форматирование
ALTER TABLE ... MATERIALIZE INDEX,MATERIALIZE STATISTICSиMATERIALIZE PROJECTION: из него пропадало предложениеIF EXISTS, из-за чего отформатированный запрос отличался от разобранного. Также отклоняются четыре JSON-представления AST дляALTER ... STATISTICS, которые SQL parser не может создать и которые форматируются в другую команду. #115099 (Groene AI). - Исправлено исключение (
Block structure mismatch in Expression for FilterSortedStreamByRange) в некоторых запросахSELECT ... FINALсPREWHEREк таблице, ключ сортировки которой является выражением. #115113 (Shaohua Wang). - Исправлены переопределения CORS через CLI в clickhouse-local. #115129 (Alexey Milovidov).
- Отключен распределенный анализ индексов с проекциями (давал неверные результаты). #115132 (Azat Khuzhin).
- Исправлен возврат
ifиmultiIfбольшого положительного значения вместо отрицательного, когда ветвьTimeсочетается сTime64,DateTimeилиDateTime64и выражение JIT-компилируется. #115146 (Groene AI). - Веб-терминал, встроенный в другую страницу, например консоль SQL или
play.html, получает учетные данные от этой страницы и больше не открывает собственное соединение до их получения. Ранее он подключался дважды: сначала с пустым паролем, затем с реальными учетными данными — и дважды выводилConnecting.... #115148 (Alexey Milovidov). - Исправлены неверные результаты, когда предложение
WHEREсодержало выражениеNULLвнутриNOT, напримерSELECT count() FROM t WHERE NOT (id >= 20 AND NULL). Анализ индексов считал такое условие заведомо истинным для всего диапазона, поэтому фильтр пропускался:count()возвращал строки, которые запрос должен был исключить, аALTER TABLE ... DELETEс этим условием удалял строки, которые должен был сохранить. #115152 (Groene AI). - Исправлена потеря статистики JOIN в
EXPLAIN ANALYZEдля представления, объявленного сSQL SECURITY DEFINERилиSQL SECURITY NONEи содержащего JOIN в теле. В отладочных сборках и сборках с sanitizer запрос прерывался с логической ошибкойJoinStep analyzed without the analyze mode. #115156 (Groene AI). - Исправлено чтение за границами массива при десериализации поврежденных списков вхождений текстового индекса. #115222 (Anton Popov).
- Исправлены неверные результаты для
SELECT count(arrayJoin(arr))со значением по умолчаниюoptimize_trivial_count_query = 1. Вместо количества элементов массива возвращалось сохраненное количество строк, а дляfile()иurl()запрос возвращал0. Закрывает #115123. #115227 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKпри каждомINSERTв таблицу, в которой для столбцаALIASилиEPHEMERALобъявленаSTATISTICS(...); из-за неё такие таблицы становились доступны только для чтения. #115231 (Groene AI). - Исправлено отображение итоговой статистики завершённого запроса (
N rows in result,Read ... rows) невидимым цветом в веб-интерфейсе. #115245 (Alexey Milovidov). - Исправлены незаметно возникавшие некорректные результаты и неопределённое поведение при чтении повреждённого состояния
AggregateFunction(uniq, ...). Полеskip_degreeсериализованного состояния использовалось в качестве показателя степени сдвига без проверки, поэтому значение вне допустимого диапазона приводило к произвольной мощности вместо ошибки. Такие состояния теперь отклоняются сINCORRECT_DATA. #115276 (Groene AI). - Исправлен обход политики строк, при котором табличная функция mergeTreeIndex раскрывала значения первичного ключа и индекса minmax для строк, скрытых политикой строк SELECT в исходной таблице; чтение mergeTreeIndex для таблицы с политикой строк теперь запрещено. #115304 (Yarik Briukhovetskyi).
- Исправлено молчаливое отбрасывание командами
CREATE QUOTAиALTER QUOTAвсех блоковFOR INTERVAL, кроме последнего, при отсутствии разделяющей интервалы запятой. Такой оператор выполнялся успешно, но не устанавливал ни одного из предыдущих ограничений. Интервалы теперь снова накапливаются, как и до 2020 года. Закрывает #115282. #115320 (Groene AI). - Исправлены некорректные результаты
if,multiIfиCASE, когда одна ветвь имеет типDateилиDate32, а тип результата —DateTimeилиDateTime64. Приcompile_expressions = 1(по умолчанию) скомпилированное выражение копировало количество дней, представленное датой, в столбец временной метки без преобразования дней в секунды, поэтомуif(cond, toDate32('1900-01-01'), toDateTime64('1970-01-01', 3))возвращало1969-12-31 23:59:34.433. Закрывает #115272. #115325 (Groene AI). - Метаданные больше не ссылаются на удалённую именованную коллекцию. #115326 (Groene AI).
- Исправлен
timezoneOffset(псевдонимtimeZoneOffset), возвращавший смещение с ошибкой ровно в один день для часовых поясов, у которых смещение относительно UTC отличается от смещения на 1970-01-01 на целый день, напримерPacific/KiritimatiиPacific/Apiaпосле пересечения ими международной линии перемены дат, а также для большинства поясов до 1970 года. Также исправлены использующие это смещениеparseDateTime,parseDateTimeOrNull,parseDateTime64,parseDateTimeInJodaSyntax,EXTRACT(TIMEZONE_HOUR / TIMEZONE_MINUTE ...),%zвformatDateTime,toUTCTimestampиfromUTCTimestamp. Закрывает #115281. #115332 (Groene AI). - Исправлен обход ограничений настроек:
SET <name> = DEFAULTсбрасывал настройку без проверки ограничений из профиля пользователя, поэтому ограниченияMIN/MAX/CONSTможно было обойти сбросом настройки вместо задания значения, а сеанс мог выйти из режима только для чтения с помощьюSET readonly = DEFAULT. #115334 (Alexey Milovidov). - Сервер Arrow Flight: отклоняются некорректные учетные данные Basic-аутентификации без разделителя между именем пользователя и паролем. #115347 (Alexey Milovidov).
- Исправлена ошибка
LOGICAL_ERROR(Join is supported only for pipelines with one output port) при выполнении JOINfull_sorting_mergeс включеннымquery_plan_join_shard_by_pk_ranges, когда одна из двух сторон полностью отсекается по первичному ключу, статистике столбцов или из-за пустой таблицы. #115352 (Alexey Milovidov). - Отключен кэш условий запроса для фильтров по _part_starting_offset. #115358 (Azat Khuzhin).
- Исправлена ситуация, когда
randConstantвозвращала два разных значения в одном запросе, если ее вызовам присваивались разные псевдонимы. Согласно документации,randConstantсохраняет одно значение на весь запрос, иSELECT randConstant() = randConstant()уже возвращал1, однако при добавлении псевдонимов, как вSELECT randConstant() AS a, randConstant() AS b, возвращались два несвязанных значения. #115384 (Alexey Milovidov). - Исправлено, что
uniq,uniqExact,uniqHLL12иuniqThetaвозвращали неверный результат для аргумента, обернутого инъективной функцией, скрывающей допускаемость NULL, напримерuniqExact(tuple(x))для столбцаNullable. Оптимизацияoptimize_injective_functions_inside_uniqудаляла оборачивающую функцию, после чего строки с NULL пропускались вместо подсчета. #115466 (Vladimir Cherkasov). - Исправлено, что
GroupingAggregatedTransformсоздавала дублирующиеся блоки для одного и того же сегмента. #115487 (Nikita Taranov). - Исправлено сообщение об ошибке
geoToH3, в котором для координаты типа, отличного отFloat64, указывались неверная позиция аргумента и неверный тип. При порядке аргументов по умолчаниюgeotoh3_argument_order = 'lat_lon'сообщение указывало на другой аргумент и выводило его тип. Закрывает #101813. #115503 (Groene AI). - Отклоняется одиночный символ возврата каретки (
\r), помимо перевода строки (\n), в именах и значениях HTTP-заголовков, проходящих через фильтр HTTP-заголовков. Это устраняет возможность внедрения HTTP-заголовков (разделения запросов/ответов) в функциях, передающих пользовательские заголовки, таких как табличная функция и движокurl, HTTP-словари и каталоги озер данных. #115510 (Sergei Trifonov). - Исправлено, что кэши, настроенные на максимальное количество записей (политика
SLRU), незаметно переставали принимать новые записи после того, как столько записей было обработано не менее двух раз. Затронуты кэши файлов метаданных Iceberg и Paimon, кэш метаданных Parquet, кэши текстовых индексов, кэш индекса векторного сходства, кэш скомпилированных выражений и кэш состояния файлов ObjectStorageQueue. #115517 (Groene AI). - Исправлено зависание продолжительностью до одного часа при использовании
BACKUP/RESTORE ... TO S3, дисков GCS и табличной функцииs3, когда именованная коллекция задаетhttp_client = 'gcp_oauth', а конечная точка выдачи токенов Google OAuth2 принимает соединение, но не отвечает. Запрос Bearer-токена больше не наследует тайм-аут запроса передачи данных вызывающей стороны; ожидание ответа ограничено 10 секундами, как и для запросов STSAssumeRole. #115531 (Groene AI). - Исправлена работа
dictGetи его вариантов в распределённых запросах: неквалифицированное имя словаря теперь привязывается к текущей базе данных инициатора, а не разрешается относительно текущей базы данных каждого шарда, где словарь либо не находился, либо разрешался в другой словарь с тем же именем. #115541 (Alexey Milovidov). - Исправлена гонка, из-за которой запрос
STREAM BOUNDEDмог возвращать меньше строк, чем было зафиксировано до его начала, а чаще всего — ни одной. #115543 (Alexey Milovidov). - Исправлена запись снимков Keeper в пустые файлы, когда отключён
compress_snapshots_with_zstd_format. Сервер записывал в журналCreated persistent snapshot, но размер файла снимка составлял 0 байт, после чего узел отказывался запускаться с ошибкойCORRUPTED_DATA. Закрывает #115388. #115553 (Groene AI). - Исправлено отображение
read_rows,read_bytes,written_rowsиwritten_bytesвsystem.query_thread_log: вместо значений для записанного запроса выводилась накопленная сумма за всё время жизни потока. Были затронуты записи долгоживущих потоков из пула, в частности потокHTTPHandler, инициирующий запрос. #115596 (Groene AI). - Исправлено чтение за границами массива кэшированных хешей словаря при агрегации или соединении по ключу
LowCardinality(String), словарь которого увеличивается во время агрегации; ошибка была достижима изTTL ... GROUP BY. Это могло приводить к неверному хешу и сообщению о heap-buffer-overflow в сборках с sanitizer. #115604 (Groene AI). CREATE TABLEиALTER TABLEтеперь отклоняют кодек с потерями, напримерSZ3, для столбца, используемого в ключе партиционирования. #115626 (Groene AI).- Исправлены недопустимые символы экранирования обратной косой чертой в индексах text, tokenbf_v1 и ngrambf_v1. #115634 (Elmi Ahmadov).
- Исправлена работа
removePartAndCoveredPartsпри вызове для части, присутствующей в наборе активных частей данных. #115640 (Mikhail Artemenko). - Читателям KeeperMap разрешено принимать общие метаданные, если эквивалентные первичные ключи различаются только избыточными внешними скобками. #115642 (Sergey Kuznetsov).
- Исправлена ошибка, при которой восстановление базы данных или таблицы под новым именем удаляло псевдонимы таблицы из определений сохранённых представлений, из-за чего чтение восстановленного представления завершалось ошибкой
UNKNOWN_IDENTIFIER. Закрывает #115479. #115645 (Groene AI). - Исправлена ошибка
Code: 349. Cannot convert NULL value to non-Nullable type, возникавшая, когда предикатhasилиnotHasсодержит элемент массива NULL, а первичный ключ имеет типString,Array(String)илиMap(String, String); также исправлены неверные результаты, когда этот элемент имеет типDynamicилиVariant, содержащий NULL. Теперь NULL удаляется из Set во время анализа ключа, как это уже происходило для других типов ключей. #115647 (Groene AI). - Исправлена ошибка в функции
formatRowNoNewline, которая могла приводить к некорректным результатам или логической ошибке при форматировании строки в пустой результат. #115669 (Alexey Milovidov). - Отклонять нулевые и отрицательные значения
stepв одноточечных диапазонных запросах Prometheus. #115679 (Minh Vu). - Отклонять временные метки и длительности PromQL, выходящие за пределы диапазона Int64. #115682 (Minh Vu).
- Исправить сбои сервера при обработке глубоко вложенных входных данных в
readWKB,JSONMergePatch, парсере адресов табличных функцийurl/remote/cluster/mysql/postgresql, парсере предложенияCURSORи парсере схемы CapnProto. Исправить сбой в парсере оператораEXECUTE, когда аргумент не является литералом. #115700 (Alexey Milovidov). - Не возвращать неинициализированную память как результат двоичного строкового литерала, длина которого не кратна восьми, а также из распаковщика LZ4, если сжатый блок не содержит тела. #115704 (Alexey Milovidov).
- Ограничить размер стартового сообщения PostgreSQL wire protocol, считываемого до аутентификации. #115708 (Alexey Milovidov).
- Исправить ошибку
MULTIPLE_EXPRESSIONS_FOR_ALIASв запросах, где псевдоним столбца совпадает с псевдонимом табличного выражения в секцииFROM(регрессия analyzer в версии 25.2). #115714 (Alexey Milovidov). - Исправлено завершение всего процесса
clickhouse-local, когда обработчик подключений слушателя, запущенного с помощьюSYSTEM START LISTEN, генерировал исключение, например если клиент отправлял некорректный пакет или сбрасывал keep-alive-сокет. Теперь процесс регистрирует ошибку и продолжает работу, какclickhouse-server. #115715 (Groene AI). - Исправить
LOGICAL_ERROR: No available columns, возникающую, когда запрос не читает столбцы из табличного выражения, в котором вообще нет столбцов, напримерSELECT count() FROM loop(db, tbl), гдеtbl— таблицаAlias, целевая таблица которой была удалена, или параметризованное представление. Теперь такой запрос завершается сUNSUPPORTED_METHODвместо аварийного завершения сервера в отладочных сборках и сборках с sanitizer. #115716 (Groene AI). - Исправить
LOGICAL_ERROR“Reading from materialized CTE ‘X’ before its materialization completed - DelayedPortsProcessor gate is missing in the query plan”, возникающую при чтенииMATERIALIZEDCTE внутри подзапросаINпо таблицеDistributed. Закрывает #113184. #115740 (Groene AI). - Отклонять недопустимые имена проекций и индексов. #115824 (Alexander Tokmakov).
- Отклонять модификаторы сопоставления векторов PromQL, если один из операндов является скаляром. #115828 (Minh Vu).
- Исправлено, что
cast_keep_nullableне сохранял допускаемость NULL, когда целевой тип —LowCardinality. Приведение значения, допускающего NULL, кLowCardinality(T)вызывалоCANNOT_INSERT_NULL_IN_ORDINARY_COLUMNвместо созданияLowCardinality(Nullable(T)). Закрывает #103485. #115851 (Groene AI). - Пути объектов добавлены в хеширование дедупликации, что предотвращает некорректную дедупликацию. #115866 (Mikhail f. Shiryaev).
- Исправлена ошибка
TYPE_MISMATCH(“CAST AS Array can only be performed between same-dimensional array types”) для запроса с константой типаArray(Map(...)), напримерhas([map('k', 'v')], m), выполняемого над таблицейDistributedили с параллельными репликами. #115883 (Alexey Milovidov). - Исправлена ошибка
Unknown identifier, возникавшая при оптимизации плана запроса сmake_distributed_plan = 1, когда столбец сортировки оконного запроса проходит через шагExpression, в котором он не упоминается. Закрывает #115737. #115890 (Groene AI). - Исправлено игнорирование функций
h3kRing,h3HexRing,h3Lineиh3ToChildrenпараметраmax_execution_timeи командыKILL QUERYпри разворачивании блока строк. #115893 (Alexey Milovidov). - Чтение через таблицу
Merge, сопоставляющуюся с таблицейAlias, целевым объектом которой является параметризованное представление, больше не вызывает ошибкуLOGICAL_ERROR: Table has no columns.(которая приводит к аварийному завершению сервера в отладочных сборках и сборках с sanitizer). Такая таблица теперь сообщает ошибкуSTORAGE_REQUIRES_PARAMETER— ту же, что и само параметризованное представление. Любая другая сопоставленная таблица, не способная предоставить столбцы, теперь сообщаетUNSUPPORTED_METHODвместо внутренней ошибки. #115896 (Groene AI). - Исправлен динамический предпросмотр ожидающей мутации, выражение которой ссылается на
_sample_factor. Приapply_mutations_on_fly = 1и предложенииSAMPLEвыражение вычислялось с коэффициентом выборки читающего запроса вместо значения, сохраняемого фоновой материализацией. В результате строки в предпросмотре не совпадали с итоговым материализованным результатом, а ожидающая командаALTER TABLE t DELETE WHERE _sample_factor > 1могла привести к тому, что чтение сSAMPLEвообще не возвращало строк. Собственный столбец_sample_factorзапроса не изменён. #115906 (Groene AI). - Исправлен случай, когда
ATTACH TABLEс определениемENGINE = URL(...)не проверял правоTABLE ENGINEдля движка, на который указывает схема URL. Пользователь, имеющий только правоTABLE ENGINE ON URL, мог подключить, а затем читать таблицу на базеFile,S3,AzureBlobStorageилиHDFS, хотяCREATE TABLEкорректно отклоняет такую операцию. #115914 (Groene AI). - Некорректно разбираемый узел метаданных KeeperMap больше не препятствует запуску сервера. #115941 (Groene AI).
- Исправлено аварийное завершение функции
showCertificateна сервере, получающем TLS-сертификат через ACME (Let’s Encrypt). Теперь функция сообщает о фактически обслуживаемом сертификате, в том числе после его перезагрузки. #115976 (Alexey Milovidov). - Исправлено аварийное завершение сервера в отладочных сборках и сборках с sanitizer при вставке в materialized view, целевым объектом
TOкоторого является другое materialized view. В выпущенных версиях такая вставка уже завершалась ошибкой с неинформативным сообщениемCode: 1001 STD_EXCEPTION; теперь сообщается ошибкаNOT_IMPLEMENTEDс указанием проблемного представления. #115985 (Groene AI). - Файлы статистики формата версии
V3теперь читаются, а не отклоняются с ошибкойILLEGAL_STATISTICS. Такие файлы создавались только сборкамиmasterза короткий период, однако части с ними были полностью нечитаемы, а на диске только для чтенияALTER TABLE ... MATERIALIZE STATISTICSне может сгенерировать их заново. #116030 (Alexey Milovidov). - Исправлена ошибка
LOGICAL_ERROR: Index with name auto_minmax_index_<column> already exists, возникавшая, когда один операторALTER TABLEобъединялRENAME COLUMNс другой командой, напримерMODIFY SETTING, для таблицы с неявными индексами minmax (add_minmax_index_for_numeric_columnsи подобными). Переименование обычного столбца также больше не приводит к сбою последующегоDROP COLUMNс ошибкойUNKNOWN_IDENTIFIERи к выполнению последующегоADD COLUMNбез создания неявного индекса. #116063 (Groene AI). - Исправлен сбой воркеров без сохранения состояния при работе с объектным хранилищем. #116067 (Konstantin Vedernikov).
Улучшения сборки/тестирования/упаковки
- Добавлены подписанные артефакты для macOS. #115169 (Konstantin Bogdanov).
- Исправлена сборка из исходного кода с clang 23. #112288 (Azat Khuzhin).
- Уменьшены зависимости и размер кода SQL-парсера, который теперь можно собирать отдельно — автономная сборка в WebAssembly доступна в
utils/wasm-parser. Таблицы ключевых слов SQL и типов доступа теперь создаются во время компиляции, а не при каждом запуске сервера. #112067 (Alexey Milovidov). - Сборка из исходного кода теперь завершается сбоем на этапе генерации CMake, а не повреждает
StorageSystemLicenses.generated.cppпри сбое генерации лицензий. #111222 (Mikhail Artemenko). - Встроенная библиотека Apache Thrift обновлена до версии 0.24.0. #111278 (Groene AI).
- Добавлен
libucontextдля сборок musl, что позволяет использовать бэкендucontextизboost::context, применяемый в сборках с sanitizer. #111437 (Konstantin Bogdanov). - Исправлены проблемы переносимости исходного кода при сборке с musl. #111631 (Konstantin Bogdanov).
- Редактирование
Core/ProtocolDefines.hбольше не вызывает почти полную пересборку при сборке из исходного кода: директива include удалена изBlockInfo.hи добавлена только в файлы, использующие его константы. #111650 (Alexander Gololobov). - Исправлено аварийное завершение при запуске отладочных сборок macOS: отключены отладочные проверки трекера памяти для выделений, выполняемых системными библиотеками. #112080 (Arsen Muk).
- Встроенный
libarchiveобновлён до версии 3.8.9. #112434 (Konstantin Bogdanov). StringZillaобновлён до версии 5.0.5. #112319 (Konstantin Bogdanov).jwt-cppобновлён до v0.7.2. #112595 (Konstantin Bogdanov).- Встроенная amalgamation SQLite обновлена с 3.41.2 до 3.53.4. #112599 (Konstantin Bogdanov).
aws-c-httpобновлён до версии 0.11.0. #112413 (Govind R Nair).libcotpобновлён до v4.2.1. #112596 (Konstantin Bogdanov).- OpenSSL теперь можно собирать из переносимого исходного кода C на архитектурах, для которых в описании сборки нет вручную написанного ассемблерного кода, вместо сбоя на заключительном этапе линковки из-за неопределённых символов. Новый параметр CMake
OPENSSL_NO_ASMпозволяет явно выбрать тот же вариант. #112863 (Alexey Milovidov). - Добавлена опция CMake
ENABLE_ORC(включена по умолчанию), позволяющая собирать Parquet без ORC, а также без поставляемых с ORC protobuf иprotoc. #112864 (Alexey Milovidov). - Для компиляции
Common/Exception.cppбольше не требуется пропатченная версия libc++ от ClickHouse, поэтому сборки с другой стандартной библиотекой C++ теперь поддерживают исключения без трассировки стека в месте генерации вместо ошибки компиляции. #112865 (Alexey Milovidov). - Развёртывание стека в сборках musl для aarch64 теперь продолжается через кадры сигналов и заблокированные системные вызовы, а не останавливается на кадре libc, что улучшает трассировки стека из обработчика фатальных ошибок и выборочного профилировщика запросов. #112592 (Konstantin Bogdanov).
- Обновлена встроенная
libexpatдо версии 2.8.2. #112593 (Konstantin Bogdanov). - Обновлён
simdjsonдо v4.6.5. #112594 (Konstantin Bogdanov). - Обновлены Apache Arrow до версии 25.0.0 и Apache ORC до версии 2.3.1. #112604 (Konstantin Bogdanov).
- Сборки с покрытием (
WITH_COVERAGE) теперь компонуют среду выполнения профилирования, собранную в дереве исходников из встроенных исходников LLVM, вместо архива из набора инструментов clang хоста. #112607 (Konstantin Bogdanov). - Обновлены Protocol Buffers до v35.1 и gRPC до v1.83.0. #112614 (Konstantin Bogdanov).
- Добавлена экспериментальная цель WebAssembly (
wasm64, через Emscripten):emcmake cmakeтеперь конфигурирует дерево исходников, а нижележащие слои собираются. Также исправлен параметр-DENABLE_LIBFIU=OFF, с которым сборка не выполнялась ни на одной платформе. #112911 (Alexey Milovidov). - Исправлены все случаи
-Wunique-object-duplication: изменяемые singleton-объекты, определённые в заголовочных файлах, могли иметь по одной копии в каждом разделяемом объекте вместо одной на процесс. В большинстве случаев определение перенесено в.cpp. #112995 (Alexey Milovidov). - Установка пакета
tgzповерх висячей символической ссылки теперь сохраняет цепочку ссылок и применяет права доступа и владельца целевого файла из пакета вместо прав, определяемыхumask. #112766 (Alexey Milovidov). - В сборках musl для
aarch64функцияmemmoveтеперь использует ассемблерную реализацию ARM optimized-routines (общую сmemcpy) вместо универсального цикла на C, обрабатывающего данные по одному слову. #113502 (Konstantin Bogdanov). - В сборках musl
getaddrinfoсAI_ADDRCONFIGтеперь соответствует семантике glibc: в средах только с IPv4localhostбольше не разрешается сначала в непригодный для использования::1, аsysconfвозвращает используемые в glibc подсказки по размеру буфера дляgetpwuid_r/getgrgid_rвместо -1, что устраняет проблему с libhdfs3. #113485 (Konstantin Bogdanov). - В сборках с musl
sched_getcpuтеперь выполняется как чтение rseq (~1 нс), а не syscall, как в glibc, что устраняет накладные расходы системного времениpercpu_arenaв jemalloc при рабочих нагрузках с интенсивным выделением памяти; musl также немедленно регистрирует rseq и экспортирует ABI glibc__rseq_*. #113501 (Konstantin Bogdanov). - Исправлены локальные сборки (не CI), при которых весь включённый Rust-код (кодек
PCO, чтение Delta Lake черезdelta-kernel-rs,prqlc,chdig,wasmtime, нечёткий поиск по истории клиента черезskim) компилировался сopt-level = 0. Переменная CMakeSANITIZEбыла объявлена с помощьюoption, поэтому её значением по умолчанию был BOOLOFF, не проходивший проверкуSTREQUAL ""для случая «без sanitizer». В результате каждая сборка, настроенная без явного-DSANITIZE=..., использовала обходной путь для sanitizer, отключающий оптимизацию Rust. #114083 (Alexey Milovidov). - Отправка слоёв Docker-образа в сжатом формате zstd. #114342 (Alexey Milovidov).
- Сборка Debian-пакетов только для релизных сборок. #114739 (Alexey Milovidov).
- Исправлена сборка
unit_tests_dbmsв конфигурациях без полного набора библиотек (ENABLE_LIBRARIES=0илиENABLE_ROCKSDB=0). #115655 (Alexey Milovidov).
Релиз ClickHouse 26.7, 2026-07-22. Презентация, Видео
обратно несовместимое изменение
- Доступ к S3 из пользовательских SQL-запросов теперь по умолчанию больше не использует собственные облачные учетные данные сервера (environment, IMDS/IRSA, instance profile, AWS config files, STS на основе
role_arn, GCP OAuth metadata); такой запрос должен использовать явные учетные данные илиNOSIGN. В именованных коллекциях значениеuse_environment_credentialsтеперь по умолчанию равно0. Прежнее поведение можно вернуть для отдельного запроса с помощьюuse_environment_credentials = 1(или глобально через конфигурацию<s3>) вместе с новой настройкойs3_allow_server_credentials_in_user_queries(по умолчанию отключена). Явно указанные учетные данные и учетные данные из конфигурации, подготовленной оператором, не затрагиваются. При запуске сервера илиRESTOREпостоянная таблицаS3/S3Queue, динамический диск S3 илиDataLakeCatalog, чье определение использует такие учетные данные, теперь загружается анонимно (и остается недоступной до повторной настройки учетных данных) вместо прерывания запуска; это поведение управляется новой настройкой сервераs3_load_table_anonymously_if_credentials_restricted(по умолчанию включена). #106855 (Raúl Marín). - Glob-шаблон
**/(любое количество каталогов) теперь также соответствует тому же каталогу. Ранее**/в glob-шаблонах не обрабатывался как особый случай, поэтомуdata/**/file.txtне соответствовалdata/file.txt(нулевой уровень каталогов). #97676 (Alexey Milovidov). - Формат архивов резервных копий
zip/zipxтеперь не допускается для резервных копий, хранящихся в объектном хранилище — прямые пункты назначенияS3(...)/AzureBlobStorage(...)и пункты назначенияDisk(...)на базе S3 или Azure — как дляBACKUP, так и дляRESTORE. Для чтения центрального каталога zip требуется произвольный доступ к файлу, что очень медленно в объектном хранилище. Вместо этого используйте формат на основе tar, напримерtar.gz. #101770 (Yash ). - Поддерживаемый диапазон
DateTime64расширен с[1900-01-01, 2299-12-31]до[0000-01-01, 9999-12-31]. Значения за пределами прежнего диапазона теперь вычисляются корректно (через cctz), а не ограничиваются граничными значениями. При precision 8 или 9 диапазон остается более узким, поскольку тики хранятся какInt64(при наносекундной точности максимум по-прежнему2262-04-11). Обратная совместимость: если вы раньше использовали дату и время вне диапазона, но полагались на очень специфические правила насыщения внутри старого диапазона, имейте в виду, что теперь результаты изменятся и станут более корректными. #107907 (Alexey Milovidov). AggregatingMergeTreeтеперь отклоняет при создании таблицы схемы, в которых столбец не является ни частью ключа сортировки, ни мерой состояния агрегации (AggregateFunction/SimpleAggregateFunction). Такие столбцы молча схлопываются до произвольного значения во время фоновых слияний, что приводит к неверным результатам для запросов, использующихGROUP BYили фильтрацию по этим столбцам. Установитеallow_dimensions_outside_sorting_key = 1, чтобы вернуть прежнее поведение. Закрывает #751. #108087 (Alexey Milovidov).- Удалена конфигурация планирования рабочих нагрузок на основе config (разделы конфигурации сервера
resourcesиworkload_classifiers). Вместо этого используйте запросыCREATE RESOURCEиCREATE WORKLOAD. Устаревшие разделы конфигурации игнорируются с предупреждением. #108286 (Sergei Trifonov). - ClickHouse теперь всегда использует единый хеш для дедупликации вставок — как для синхронных, так и для асинхронных вставок; прежние механизмы дедупликации для отдельных вставок удалены. Настройка сервера
insert_deduplication_versionсохранена как защитный механизм при миграции: сервер отказывается запускаться, если для неё задано устаревшее значение (old_separate_hashesилиcompatible_double_hashes). Чтобы обновиться с версии, где использовалось устаревшее значение, сначала запустите релиз с поддержкойcompatible_double_hashes(он записывает и устаревшие, и единые хеши). Для реплицируемых таблиц запускайте его как минимум в течениеreplicated_deduplication_window_seconds(по умолчанию один час; окна по умолчанию сохраняют единые хеши всех вставок за этот интервал, чего считается достаточно для цикла повторных попыток вставки). Для нереплицируемых таблиц сnon_replicated_deduplication_window> 0 это окно определяется количеством вставок, а не временем, поэтому используйтеcompatible_double_hashesкак минимум на протяжении такого количества вставок. Затем удалите эту настройку (или установите значениеnew_unified_hash) перед обновлением до этой версии. #108361 (Sema Checherinda). Если вы никогда не задавалиinsert_deduplication_version, этот пункт можно игнорировать. - Удалены давно устаревшие функции
snowflakeToDateTime,snowflakeToDateTime64,dateTimeToSnowflakeиdateTime64ToSnowflake. Они были объявлены устаревшими ещё в v24.6 в пользуsnowflakeIDToDateTime,snowflakeIDToDateTime64,dateTimeToSnowflakeIDиdateTime64ToSnowflakeID, которые теперь и следует использовать. Настройкаallow_deprecated_snowflake_conversion_functions(которая раньше снова включала их) теперь устарела и не оказывает никакого эффекта. #108711 (Alexey Milovidov). - Значение настройки
use_legacy_to_timeтеперь по умолчанию равно0, поэтомуtoTimeпреобразует значения в тип данныхTime, а не преобразует дату и время в фиксированную дату. Прежнее поведение по-прежнему доступно через функциюtoTimeWithFixedDateили при установкеuse_legacy_to_time = 1. #108729 (Alexey Milovidov). - Модели Naive Bayes (используемые
naiveBayesClassifier) теперь настраиваются как словарь с layoutNAIVE_BAYES, который при загрузке строится из таблицы с предварительно агрегированными по классам значениями n-gram counts, вместо прежней конфигурации на стороне сервера (XML-файл конфигурации со ссылками на сериализованные файлы моделей.bin), которая больше не поддерживается — существующие модели необходимо пересоздать в виде словарей. Вместе сnaiveBayesClassifierдобавлены три новые функции:naiveBayesClassifierWithProbвозвращает предсказанный класс вместе с его вероятностью,naiveBayesClassifierWithAllProbsвозвращает все классы с их вероятностями, аnaiveBayesNgramsразбивает текст на n-граммы так же, как это делает словарь, что позволяет строить обучающие данные из исходных размеченных текстов. Кроме того, было внесено несколько оптимизаций производительности: на языковой модели триграмм кодовых точек размером 9.7 MiB используется примерно в 49 раз меньше оперативной памяти (с 1.84 GiB до 38 MiB), загрузка происходит примерно в 11 раз быстрее, и классификация выполняется примерно в 11 раз быстрее. #108773 (Nihal Z. Miaji). - Функция
hasColumnInTableбольше не принимает необязательные аргументыhostname,usernameиpasswordдля проверки столбца на произвольном удалённом сервере; остаётся только формаhasColumnInTable(database, table, column). Удалённый режим создавал угрозу безопасности: он позволял любому пользователю инициировать исходящие подключения к произвольным хостам и приводил к утечке учётных данных в журнал запросов, при этом не был ограничен какой-либо привилегией. #110881 (Alexey Milovidov).
Новая возможность
- Добавлен
EXPLAIN ANALYZEдля анализа производительности запросов: запрос выполняется, а фактические метрики выполнения отображаются в привычном формате плана запроса. #106586 (Kirill Kopnev). #110668 (Kirill Kopnev). - Добавлена поддержка предложений
WHEREв определениях проекций. Проекции сWHEREматериализуют только строки, соответствующие предикату, и оптимизатор может использовать их (на основе стоимости), когдаWHEREзапроса подразумеваетWHEREпроекции. #102347 (S Bala Vignesh). - Добавлена настройка
skip_unavailable_shards_mode(также доступная как настройка движкаDistributed) для управления тем, какие исключения от удаленного сегмента будут незаметно игнорироваться при включенномskip_unavailable_shards. #79091 (cjw). - Добавлена агрегатная функция
groupFormat, которая форматирует строки в каждой группе в указанном формате вывода и возвращает результат в виде строки. #93201 (Yang Hu). - Добавлен
AWS_MSK_IAMкак поддерживаемое значение дляkafka_sasl_mechanism, что позволяет ClickHouse аутентифицироваться в Amazon MSK с использованием ролей IAM без необходимости управлять учетными данными SASL/SCRAM. #96100 (kalavt). - Добавлен комбинатор агрегатной функции
-Tuple, который независимо применяет базовую агрегатную функцию к каждому элементу столбцаTupleи возвращаетTupleс результатами, сохраняя имена элементов:sumTuple(t)дляt = (a, b)возвращает(sum(a), sum(b)). Агрегатные функции с несколькими аргументами принимают по одному кортежу на аргумент, сопоставляя элементы по позиции:corrTuple((a1, a2), (b1, b2))возвращает(corr(a1, b1), corr(a2, b2)). В отличие от-ForEachдля массивов, элементы могут иметь разные типы, при этом типы и имена результатов для каждого элемента сохраняются. #98190 (RinChanNOW). - Текстовые индексы теперь поддерживают аргумент
postprocessor— произвольное выражение, которое преобразует каждый токен после токенизации (например,lower). #98939 (Jimmy Aguilar Mena). #108606 (Jimmy Aguilar Mena). - Добавлена системная таблица
system.stemmers, в которой перечислены все языки, которые можно указать для функцииstem. #100611 (Jimmy Aguilar Mena). - Добавлена поддержка
WITH TIESдля отрицательногоLIMIT. #100930 (Nihal Z. Miaji). - Добавлена поддержка постфиксных операторов стандартного SQL
AT TIME ZONEиAT LOCALкак синтаксического сахара дляtoTimeZone. Выражениеexpr AT TIME ZONE zoneтеперь эквивалентноtoTimeZone(expr, zone), аexpr AT LOCAL—toTimeZone(expr, timeZone()). #106092 (lizepeng). - Движок таблицы
URLи табличная функцияurlтеперь направляются к соответствующему backend в зависимости от схемы URL:file://обрабатывается движкомFile,s3:///gs:///gcs:///oss://—S3,az:///azure:///abfss:///abfs://—AzureBlobStorage,hdfs://—HDFS, аhttp(s)://— как и раньше движкомURL. Настройкаurl_baseприменяется до выбора по схеме. Направляются только схемы S3, разрешаемыеurl_scheme_mappersпо умолчанию; другие S3-compatible схемы поставщиков (cos,obs, …) не поддерживаются таким образом и требуют прямого использования движка или функцииs3. #106093 (Alexey Milovidov). - Добавлены движки таблиц
RemoteиRemoteSecure— постоянные аналоги табличных функцийremoteиremoteSecure. Теперь помимоCREATE TABLE ... AS remote(...)работает иCREATE TABLE ... ENGINE = Remote('addresses', db, table, ...). #106189 (Alexey Milovidov). - Добавлены не зависящие от движка команды
SYSTEM STOP,SYSTEM START,SYSTEM PAUSE,SYSTEM CANCELиSYSTEM REFRESH, а также их общесерверные формы... ALL BACKGROUND, чтобы через единый интерфейс управлять фоновой активностью таблицKafka,RabbitMQ,NATS,S3Queue/AzureQueueи refreshable materialized views. Для refreshable materialized views они служат псевдонимами существующих командSYSTEM ... VIEW. В рамках поддержки этих механизмов управления для NATS таблицы JetStream теперь подтверждают сообщения только после успешной вставки (at-least-once; раньше сообщения автоматически подтверждались при доставке и могли теряться, если вставка завершалась ошибкой). Новая настройкаnats_wait_for_flush_interval(по умолчаниюfalse, что сохраняет прежнее поведение с низкой задержкой) позволяет удерживать цикл consumption открытым на весь интервал flush вместо выполнения flush сразу после опустошения queue. Новая настройкаnats_commit_on_selectзаставляет прямойSELECTиз таблицы JetStream потреблять (подтверждать) прочитанные сообщения. #107476 (Samuel Krempaský). - Добавлена поддержка передачи пользовательского запроса в табличные функции и движки таблиц
mysql,postgresqlиsqlite(вместо имени таблицы) с его отправкой во внешнюю СУБД как есть; запрос можно записать либо как подзапрос(SELECT ...), либо какquery('SELECT ...'). Структура результирующей таблицы выводится из query result, а сама такая таблица доступна только для чтения. Закрывает #46758. Основано на первоначальной реализации Denis Vidiaev (#79652). #107740 (Alexey Milovidov). - В ClickHouse Web интерфейс (Play) добавлены вкладки для одновременной работы с несколькими запросами. Вкладки, их заголовки, параметры, активное состояние и небольшие снимки результатов сохраняются между перезагрузками (крупные результаты и изображения не восстанавливаются), интегрированы с историей браузера и URL, а переключаться между ними можно колесом мыши. #107826 (Alexey Milovidov).
- Представлен движок таблицы
QueryRunner. Записи, вставленные в таблицуQueryRunner, представляют собой запросы, которые этот движок выполняет. Движок можно использовать для асинхронного выполнения запросов, пакетного выполнения сгенерированных запросов, направления запросов в удалённые кластеры, бенчмарков, фаззинга и тестирования с теневым трафиком. #107888 (Miсhael Stetsyuk). - Добавлен выходной формат
GeoJSONдля записи документов GeoJSONFeatureCollection, при этом для каждой строки создаётся один объектfeature. Единственный столбец с геотипом (Point,LineString,MultiLineString,Polygon,MultiPolygon,RingилиGeometry) становитсяgeometryэтогоfeature; столбец с именемidстановитсяidfeature; а все оставшиеся столбцы становятсяpropertiesfeature, при этом единственный столбец объектного типа с именемproperties(JSON,Mapили именованныйTuple) записывается напрямую как объектproperties.Ringзаписывается какPolygonс одним кольцом. Новая настройкаformat_geojson_validate_geometry(включена по умолчанию) определяет, будут ли геометрии, не являющиеся корректными фигурами GeoJSON, — например,Polygonменее чем с четырьмя точками или незамкнутое кольцоPolygon— отклоняться при чтении и записи. Кроме того, входной форматGeoJSONтеперь выводит столбецidкакNullable(String)вместоString, поэтомуfeatureс отсутствующим или явно заданным членом"id": nullчитается какNULLи остаётся отличимым от пустой строки"". Основано на первоначальной реализации Mark Needham (#98124). #108065 (Nihal Z. Miaji). - Добавлена функция
dotProductTransposed(псевдонимscalarProductTransposed), которая вычисляет приближённое скалярное произведение между столбцомQBitи опорным вектором, дополняя существующие функцииL2DistanceTransposedиcosineDistanceTransposed. #108100 (Alexey Milovidov). Также добавлены квантованные функции транспонированного расстоянияcosineDistanceTransposedQuantized,L2DistanceTransposedQuantizedиdotProductTransposedQuantized, которые работают сQBit(Int8)кодов Lloyd-Max изquantizeBFloat16ToInt8, деквантуя сохранённые коды на лету. Опорный вектор типа с плавающей точкой представляет собой полноточный запрос и сравнивается с точностьюFloat32(запросFloat64сужается); опорныйArray(Int8)деквантуется сам, что даёт симметричное расстояние quantized-vs-quantized. #109405 (Alexey Milovidov). - В тип данных
QBitдобавлен необязательный параметр stride (QBit(T, dimension, stride)), который сохраняет группы размерностей в отдельных потоках, чтобы векторный поиск мог эффективно читать только первые размерности (например, для Matryoshka embeddings). Функции транспонированного расстояния принимают необязательный четвёртый аргументused_dimsдля чтения уменьшенного числа размерностей. #108103 (Alexey Milovidov). - Добавлена поддержка типа элементов
Int8в типе данныхQBit, что позволяет хранить квантованные 8-битные целочисленные векторы и выполнять по ним векторный поиск с транспонированным расстоянием (L2DistanceTransposed,cosineDistanceTransposed). #108105 (Alexey Milovidov). - Новая функция
randomHadamardTransform(vector[, seed[, output_dims]]): детерминированное рандомизированное преобразование Адамара для вектора с плавающей точкой — ортогональный поворот с сохранением нормы, полезный для предварительной обработки embeddings перед квантованием, а также (в усечённом виде) как случайная проекция Джонсона–Линденштраусса / subsampled-randomized-Hadamard. #108227 (Alexey Milovidov). - Добавлена поддержка настройки отложенной загрузки словарей для каждого словаря отдельно с помощью параметра
dictionary_lazy_loadв определении словаря, который переопределяет глобальную настройку сервераdictionaries_lazy_load, так что одни словари могут загружаться отложенно, а другие — сразу. #108314 (Miсhael Stetsyuk). - Добавлена встроенная страница поиска по документации, доступная по пути
/docsHTTP interface, которая обеспечивает мгновенный поиск по таблицеsystem.documentationи отображает справочную документацию (с подсветкой синтаксиса, математическими формулами и перекрестными ссылками). #108345 (Alexey Milovidov). - Добавлена функция
xxHash64Spark, которая вычисляет совместимые со Spark значенияxxHash64для входных данныхStringиNULL, используя seed42, и возвращаетInt64. #108436 (Lalit Yadav). ALTER USER,ALTER ROLEиALTER SETTINGS PROFILEтеперь принимаютSET name = valueкак Alias forMODIFY SETTING name = value. Это изменяет отдельные настройки на месте, сохраняя остальные, в отличие от bareSETTINGS, который заменяет весь список настроек. Это снижает вероятность случайно стереть другие настройки пользователя. #108722 (Groene AI).- Добавлена поддержка
ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK expr, позволяющая изменять выражение существующего ограничения на месте. #108768 (Alexey Milovidov). - Web UI: добавлен переключатель цветового кодирования для каждого столбца (значок 🌈 в заголовке столбца), позволяющий переключаться между режимами bar, heatmap, categorical и без визуализации. Выбранные режимы сохраняются в URL и истории браузера. #108873 (Alexey Milovidov).
Keeperтеперь корректно обрабатывает opcodeCreateContainer(19) изZooKeeper, управляемый новым opt-in feature flagcreate_container(по умолчанию отключен, как иcreate_ttl). После включения, по завершении полного upgrade всего ensemble, внешние клиентыZooKeeper(например, JavaZooKeeper3.9+) могут создавать узлы-контейнеры вKeeperвместо полученияConnectionLoss; для узлов-контейнеров возвращается ожидаемое sentinel-значениеephemeralOwner, а фоновый поток GC на лидере автоматически удаляет контейнеры без дочерних узлов. Обычный requestCreate, содержащий флаг режима созданияCONTAINERбез opcode 19, по-прежнему отклоняется (ZBADARGUMENTS): ни один известный клиентZooKeeperне использует такую комбинацию. Это только server-side compatibility протокола: собственный клиентZooKeeperв ClickHouse (zkutil) не изменился и не имеет API для самостоятельного создания узлов-контейнеров. #108908 (unintended).- Добавлены функции
geoToUTM,UTMToGeo,geoToMGRSиMGRSToGeoдля преобразования между географическими координатами WGS84 и системами координат UTM и MGRS. #108939 (Alexey Milovidov). - Добавлена функция
digits(n, offset[, length]), которая возвращает цифры числаn, начиная с 1-based смещенияoffsetи охватываяlengthцифр, либо до конца числа, еслиlengthне указан. #109012 (Umang Agrawal). - Добавлена арифметическая функция
sqrдля вычисления квадрата числа. #109061 (Lalit Yadav). - Добавлена новая функция
dictGetRoot, которая возвращает самого верхнего предка (корень) ключа в иерархическом словаре. Это удобный эквивалентdictGetHierarchy(dict_name, key)[-1]. #109459 (Alexey Milovidov). - Добавлены команды
SYSTEM UNLOAD DICTIONARYиSYSTEM UNLOAD DICTIONARIES, позволяющие освобождать память, занимаемую словарём, без удаления его определения. Словари будут повторно загружаться по требованию при следующем обращении. #109639 (Matheus Nerone). - Добавлены функции
geometryIntersectCartesianиgeometryIntersectSpherical, которые определяют, пересекаются ли две геометрии. В отличие отpolygonsIntersectCartesian/polygonsIntersectSpherical, они принимают любой geometry data type (Point,LineString,MultiLineString,Ring,Polygon,MultiPolygon), включая общий типGeometry, при этом два аргумента могут быть разных типов. #110062 (Alexey Milovidov). - Параметры запроса (подстановки
{name:Type}) теперь можно использовать в качестве значений настроек — как в clauseSETTINGSзапроса (например,SELECTилиINSERT), так и в автономных запросахSET, например:SELECT ... SETTINGS max_threads = {threads:UInt64}иSET max_threads = {threads:UInt64}. #108760 (Alexey Milovidov).
Экспериментальные возможности
- Раскрытие подстановочных шаблонов для табличной функции
urlи движка таблицыURL: подстановочные шаблоны в пути URL раскрываются путём обхода HTTP-страниц индекса (HTML или списков каталогов в plaintext) и извлечения совпадающих URL, с ограничениями на размер страницы индекса и количество читаемых каталогов. Включается настройкойallow_experimental_url_wildcard_from_index_pages. #95181 (Yue Ni). - Текстовые индексы теперь могут хранить позиции токенов (аргумент индекса
support_phrase_search), чтобы поддерживать точное сопоставление фраз с прямым чтением для функцииhasPhrase. Требуется включить настройкуMergeTreeallow_experimental_text_index_phrase_search. #103172 (Elmi Ahmadov). Изначально этот аргумент был представлен под именемpositions. #109900 (Elmi Ahmadov). - Добавлена поддержка compaction файлов manifest для таблиц
IcebergчерезOPTIMIZE TABLE ... MANIFEST(под защитой настройкиallow_experimental_iceberg_compaction). Закрывает #95174. #98178 (Smita Kulkarni). ИсправленOPTIMIZE TABLE ... MANIFESTдля таблицIceberg, когда кортежи партиций в manifest не соответствуют их спецификации партиции. #111368 (Smita Kulkarni). - Добавлены вариант Real Doubles (RD) и необязательный аргумент
ALP(AUTO|STD|RD)для экспериментального кодекаALP.ALPбез параметров теперь автоматически выбирает между существующей схемойSTDиRD, а не всегда используетSTD. #99654 (Nazarii Piontko). - Добавлен SLRU-кеш в памяти для десериализованных файлов metadata
Paimon(manifest list и manifests). При включении через настройкуuse_paimon_metadata_files_cacheповторные запросы к одной и той же таблицеPaimonпропускают повторную загрузку и повторный разбор metadata из Объектного хранилища. #104657 (XiaoBinMu). - Добавлены “драйверы” для исполняемых пользовательских функций. Драйвер, объявленный в
<user_defined_executable_function_drivers_config>, можно использовать вCREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...', чтобы компилировать или иным образом обрабатывать пользовательский фрагмент кода во время создания функции и получать готовую к запуску исполняемую UDF. Полученная configuration сохраняется в<dynamic_user_defined_executable_functions_path>, а исходный запрос сохраняется какATTACH FUNCTION, чтобы функция переживала перезапуски сервера. Proof-of-concept-драйверc_function_bodyкомпилирует и запускает тела функций C внутри изолированных контейнеров Docker в режимеexecutable_pool. Основано на первоначальной реализации Daniil Timižev (#77128). #105131 (Alexey Milovidov). SELECT count(*) FROM t WHERE col <op> default(col)теперь может обслуживаться из статистики разреженности по столбцам вserialization.jsonбез какого-либо сканирования данных, когда predicate точно разделяет столбец на значения по умолчанию и отличные от значений по умолчанию (при новой экспериментальной настройкеoptimize_trivial_count_with_sparsity_filter, отключённой по умолчанию). #105890 (Raúl Marín).- API-запросы Prometheus Query API к
/api/v1/queryи/api/v1/query_rangeтеперь записываются вsystem.query_logс метрикамиread_rowsиread_bytes. #106611 (James Cunningham). - Экспериментальный путь чтения
ReaderExecutor(use_reader_executor, по умолчанию отключён) теперь может держать соединение с удалённым источником открытым и повторно использовать его при последовательных чтениях, уменьшая число запросов к объектному хранилищу при сканировании. #107735 (Sema Checherinda). Теперь он также поддерживает чтение зашифрованных файлов с глобальным кэшем заголовков шифрования, который настраивается через настройку сервераencryption_header_cache_sizeи очищается командойSYSTEM DROP ENCRYPTION HEADERS CACHE. #109702 (Sema Checherinda). - Добавлена поддержка чтения по распределённому плану запроса для
SELECT ... FINALна таблицах семействаMergeTree, если включёнmake_distributed_plan. #108148 (Alexander Gololobov). - Добавлено экспериментальное выполнение запросов
MergeTreeна основе плана с использованием параллельных реплик. #108504 (Igor Nikonov). - Добавлено экспериментальное семейство векторных кодеков
Quantize, а также включаемое по выбору двухэтапное приблизительное преобразование векторного поиска поверх квантованных сопутствующих потоков. #108565 (Shankar Iyer). - Возвращён экспериментальный кодек сжатия с потерями
SZ3с ограничением ошибки для столбцовFloat32/Float64(и их массивов), изначально реализованный Konstantin Vedernikov (#83088). Для него требуетсяallow_experimental_codecs. #108788 (Alexey Milovidov). Исправлено чтение данных, сжатых с помощьюSZ3('ALGO_LORENZO_REG', ...), которое ранее завершалось ошибкойCORRUPTED_DATA, а также устранено неопределённое поведение при сжатии нефинитных значений с плавающей точкой (NaNи бесконечностей). #110762 (Alexey Milovidov). - Добавлен экспериментальный кодек
ZXC— асимметричный LZ-кодек с медленным сжатием и очень быстрой распаковкой, с коэффициентом сжатия междуLZ4иZSTD. Для него требуетсяallow_experimental_codecs = 1, аsystem.compression_codecsпомечает его как экспериментальный. #110620 (Alexey Milovidov). #111007 (Alexey Milovidov). - Теперь вы можете аутентифицироваться в OneLake с помощью заранее полученного Bearer-токена через настройку
onelake_bearer_tokenвместоonelake_client_idиonelake_client_secret. Это позволяет избежать передачи долгоживущего секрета клиента. Токен не обновляется, поэтому после истечения срока его действия базу данных нужно пересоздать. #109104 (Asya Shneerson). - Функции ИИ больше не принимают именованную коллекцию как первый позиционный аргумент. Учётные данные берутся из настроек
ai_function_text_default_credentials/ai_function_embedding_default_credentialsили из ключаcredentialsв необязательном завершающем аргументеMap(String, String), который также содержит настраиваемые параметры (model,max_tokens,temperature,system_prompt,instructions,dimensions). #109232 (George Larionov). ФункцияaiEmbedтеперь принимаетmodelкак обязательный позиционный аргумент (aiEmbed(text, model[, params])) вместо чтения его из именованной коллекции, что обеспечивает воспроизводимость эмбеддингов. #110619 (George Larionov). - Исправлено значение
data_uncompressed_bytesдля skip-индексов, упакованных вskp_idx.packed(черезpacked_skip_index_max_bytes): сообщаемый несжатый размер был равен сжатому, что также могло мешать активацииdistributed_index_analysis. #109272 (Raúl Marín). - Добавлено экспериментальное packed-хранилище data part для таблиц
MergeTree, в котором большинство файлов part хранятся в одном архивеdata.packedвместо отдельного файла для каждого потока (проекции и несколько служебных файлов, таких какtxn_version.txt, по-прежнему записываются отдельно). Оно управляется настройкамиmin_bytes_for_full_part_storage,min_rows_for_full_part_storageиmin_level_for_full_part_storageи по умолчанию отключено. После того как таблица начинает записывать packed parts, старые версии server уже не могут их читать, поэтому включение этого формата делает невозможным понижение версии server. #108118 (Raúl Marín). - Добавлена экспериментальная table function
eval, которая вычисляет константное expression в строку запроса и выполняет получившийся запросSELECT. Возможность по умолчанию отключена и может быть включена с помощью настройкиallow_experimental_eval_table_function. Автор: Yue Ni. #110132 (Alexey Milovidov). - Добавлена поддержка сжатия
zstdв экспериментальный HTTP-handler Prometheus remote-write v1. #110907 (James Cunningham). - Запись в таблицы
DeltaLake(настройкаallow_experimental_delta_lake_writes) переведена в статус Beta. #107034 (Kseniia Sumarokova). - Добавлены
ProfileEventsDistributedPlanRemoteTasks,DistributedPlanLocalExecutionиDistributedPlanHostsUsedдля наблюдения за выполнением экспериментальных distributed query plans (make_distributed_plan). #107985 (Shankar Iyer). - Удалено экспериментальное хранилище на базе RocksDB в Keeper (
experimental_use_rocksdb). Скоро появится новое, более совершенное on-disk хранилище. #108000 (Michael Kolupaev). - Distributed index analysis (экспериментальная возможность, управляемая настройкой
distributed_index_analysis) теперь отправляет большие списки имен data part на remote server как скаляры, а не встраивает их в query text. Это позволяет избежать возможных сбоев из-за ограниченийmax_ast_elements/max_query_sizeи устраняет overhead на parsing AST. #110419 (Azat Khuzhin). - Оптимизированы экспериментальные aggregation functions
timeSeries*ToGrid: buckets теперь выровнены и по step, и по window, а финальная aggregation выполняется намного быстрее, когда window значительно больше step. Формат serialization aggregation state был изменен несовместимым образом (эти функции экспериментальные). #106724 (Vitaly Baranov). - External target tables таблицы
TimeSeriesтеперь регистрируются как ссылочные зависимости: аналогично materialized views, это запрещает dropping external target table до удаления таблицыTimeSeries, которая на нее ссылается (если включенcheck_referential_table_dependencies). #108388 (Vitaly Baranov). - Добавлена функция PromQL
increase. #111023 (Vitaly Baranov).
Повышение производительности
JOINтеперь может использовать индекс первичного ключа или индекс пропуска данных в левой таблице для отсечения гранул. Управляется настройкойenable_join_runtime_filters_index_analysis. #109085 (Shankar Iyer).- Сериализация и десериализация векторов тривиально сериализуемых типов теперь используют один вызов буферизованного ввода-вывода вместо обработки отдельных элементов. #89842 (Jimmy Aguilar Mena).
- Оптимизированы обратные обращения к словарю: предикат равенства с константой, такой как
WHERE dictGet(dict, attr, key_expr) = value, теперь напрямую сворачивается в фильтр по ключу (key_expr = const,key_expr IN [...]илиWHERE 0) вместо переписывания в подзапросIN (SELECT ... FROM dictionary(...)), а константный путьdictGetKeysтеперь выполняется параллельно. #91164 (Nihal Z. Miaji). - Добавлена новая настройка
merge_tree_generic_exclusion_search_max_steps, которая ограничивает число шагов, затрачиваемых универсальным алгоритмом поиска с исключением на анализ индекса первичного ключа каждой части данных. Бюджет сначала расходуется на самые большие оставшиеся диапазоны ключей, поэтому даже небольшой бюджет позволяет отсечь основную часть данных; диапазоны, которые не были полностью проанализированы, читаются целиком, поэтому результаты запроса остаются корректными, но может быть прочитано больше гранул. Ограничение применяется нестрого: оно может быть превышено максимум наmerge_tree_coarse_index_granularityшагов, плюс на один шаг для каждого диапазона, на которые эта часть уже разбита (например, кэшем условий запроса). Значение по умолчанию 0 означает неограниченное число шагов. #92779 (Michael Jarrett). - Запросы с
ORDER BYиLIMITк представлениям поверх таблицDistributedтеперь используют оптимизацию merge-sorted-streams: внешнийORDER BY/LIMITпроталкивается во внутренний запрос простого представления, поэтому каждый шард сортирует свои данные локально, а координатор объединяет заранее отсортированные потоки вместо полной сортировки. #94102 (matanper). optimize_or_like_chainтеперь включена по умолчанию. Закрывает #87779. #94517 (Alexey Milovidov).- Ротируемые нереплицируемые системные таблицы логов
MergeTreeбез TTL теперь помечаются какtable_readonly, чтобы избежать ненужных фоновых операций. Настройкаtable_readonlyдляMergeTreeтеперь также подавляет всю фоновую работу в обычной таблицеMergeTree— обычные слияния, TTL (DELETE/MOVE/recompression) и слияния с повторным сжатием, фоновые мутации и фоновые перемещения частей — и отклоняет команды изменения партиций (ATTACH/MOVE/DROP/DROP DETACHED/FETCH/REPLACE PARTITIONиMOVE PARTITION ... TO TABLEв эту таблицу), в дополнение к вставкам, мутациям иOPTIMIZE, которые уже отклонялись. В результате таблицаtable_readonlyс TTL больше не удаляет свои устаревшие данные, пока эта настройка включена. #95079 (Mathuranath Metivier). - Улучшена производительность получения одной записи пользователя из
system.users, когда на сервере много пользователей. #96699 (Alistair Evans). - Упорядоченное чтение с параллельными репликами теперь использует ту же логику разбиения таблицы на
max_threadsчастей, что и локальное чтение, для лучшего параллелизма. #101434 (Nikita Taranov). - Используются границы minmax-индекса партиций, чтобы отсеивать больше гранул при анализе primary key для таблиц
MergeTree, когда столбец primary key также входит в ключ партиционирования. Например, в таблицеMergeTreeсORDER BY (id, event_time)иPARTITION BY toYYYYMM(event_time)ClickHouse будет использовать minmax-индекс партиции поevent_timeпри анализе primary key index, чтобы точнее решать, какие гранулы можно отсечь. Это поведение управляется новой настройкойuse_partition_minmax_for_primary_key_pruning(включена по умолчанию). #103480 (UnamedRus). - Включён кэш условий запроса для запросов, использующих динамическую фильтрацию Top-K (
ORDER BY ... LIMIT n). Запись в кэше разделяется по параметрам плана Top-K, поэтому один и тот же запрос повторно использует закэшированные результаты фильтраWHERE, а другое значениеLIMIT, столбец сортировки или направление сортировки создаёт новую запись. #104478 (Alexey Milovidov). - Добавлена настройка
use_constant_folding_in_index_analysis(по умолчанию отключена). Когда она включена, анализ primary key,MinMaxи skip-index вMergeTreeподставляет константы уровня партиции в предикат фильтра отдельно для каждой части, улучшая pruning для фильтров, ветви которых зависят от значений партиции, например(a = 1 AND b >= 1) OR (a = 2 AND b > 10)сPARTITION BY a. #104582 (Mikhail Artemenko). LIMITтеперь проталкивается в aggregation-in-order, чтобы обеспечить раннее завершение, когда ключGROUP BYсовпадает с ключомORDER BYи ключом сортировки таблицы, что значительно сокращает число считываемых строк. #104859 (Konstantin Bogdanov).- Обновление profile events теперь выполняется до 30 раз быстрее благодаря per-CPU атомарным операциям для общесерверных и пользовательских счётчиков. Это поведение управляется настройкой сервера
user_profile_events_per_cpu(она использует около 640 КиБ на пользователя на 64 ядрах, поэтому при очень большом числе пользователей её может быть разумно оставить отключённой). #105056 (Azat Khuzhin). allow_aggregate_partitions_independentlyтеперь включена по умолчанию. Когда ключGROUP BYсоответствует ключу партиционирования, ClickHouse может агрегировать каждую партицию независимо и пропускать этап глобального слияния. Эвристики времени выполнения автоматически отключают эту оптимизацию, если структура партиций делает её невыгодной (слишком мало партиций, слишком много партиций или сильно неравномерные размеры партиций). #105128 (Alexey Milovidov).- Запросы векторного поиска с пересчётом оценок (
vector_search_with_rescoring = 1) теперь вычисляют точное расстояние только для строк, возвращённых векторным индексом, применяя точный фильтр по позиции строки вместо brute-force-пересчёта оценок для соседних строк из той же гранулыMergeTree. #105591 (Sergey Kuznetsov). #108846 (Sergey Kuznetsov). - Повышена производительность алгоритма join
partial_mergeна ключахFixedString: теперь он сравнивает серии значений сразу, а не выполняет отдельный вызов сравнения для каждого значения. #105737 (Artem Zuikov). SHOW TABLESиsystem.tablesдля каталогов озера данных (Iceberg REST, Glue, Unity, Hive, Paimon) теперь проталкивают в каталог предикаты, ограниченные пространством имен, что позволяет избежать полного сканирования каталога. Закрывает #105022. #106029 (Smita Kulkarni).- Ограничили объем неотслеживаемой памяти на CPU, чтобы избежать overcommit и ошибок нехватки памяти (лимиты задаются настройками сервера
max_per_cpu_untracked_memoryиper_cpu_untracked_memory_thread_buffer). #106055 (Azat Khuzhin). - Ускорили операторы, которые сканируют отсортированный поток в поисках серий одинаковых значений ключа —
DISTINCTin order,LIMIT BYin order, отрицательныйLIMIT BYin order,full_sorting_mergeиpartial_mergeJOIN. #106502 (Nihal Z. Miaji). - Реализовали нативные reader и writer для форматов
ArrowиArrowStream, не использующие библиотеку Apache Arrow, что позволяет избежать лишних копирований и преобразований данных. Теперь они используются по умолчанию (настройкиinput_format_arrow_use_native_readerиoutput_format_arrow_use_native_writer) и работают быстрее как при чтении, так и при записи. #106522 (Alexey Milovidov). - Снова включили LTO для jemalloc после исправления повреждения кэша потоков, возникавшего при LTO, что повышает производительность. #106898 (Azat Khuzhin).
- Снизили использование памяти и повысили производительность
JOIN. Правая сторона hash join теперь использует компактную 8-байтную ссылку на строку на основе индекса, поэтому элементы hash-таблицы дляALLJOIN стали такими же компактными, как и дляANYJOIN, при любом типе ключей. Бенчмарк проводился на крупных запросахparallel_hashJOIN —INNERиANYJOIN таблиц размером 100–300 миллионов строк по ключамUInt64иString, как с уникальными, так и с повторяющимися ключами: медианный запрос стал примерно на 12% быстрее и использовал примерно на 15% меньше пикового потребления памяти, при этом ни один запрос не стал медленнее.INNERJOIN по ключамUInt64дали наибольший прирост (медианно примерно на 21% быстрее при снижении использования памяти на 38%). #107189 (Harikrishnan Prabakaran). - Одноколоночные ключи JOIN типа
LowCardinality(String)безNullableтеперь нативно поддерживаются в hash join. #107264 (Nikita Taranov). - Добавили алгоритм перебора порядка JOIN
dpsub(dynamic programming over subsets), который строит оптимальные планы JOIN с меньшими накладными расходами на оптимизацию, чемdpsize, и поддерживает не толькоINNERJOIN. #107351 (Fisnik Kastrati). - Ускорили загрузку файлового кэша при запуске, кодируя размер каждого файла кэша в его имени (
<offset>_<size>), что позволяет избежать вызоваstatдля каждого файла. Поддержка загрузки файлов кэша, записанных старыми версиями, сохранена. #107415 (Alexey Milovidov). - Повысили производительность
arrayElementдляArray(LowCardinality(String))и map-функцийLIKEдляMapс ключами или значениями типаLowCardinality(String)за счет устранения ненужной материализации строк. #107450 (Michael Jarrett). - Исключили преобразование одноуровневой агрегации в двухуровневую при малом использовании памяти, отслеживая память самого состояния агрегации, а не память всего запроса. #107490 (Hechem Selmi).
- Ускорили анализ агрегирующих запросов: ключ кэша для статистики размера hash-таблицы агрегации теперь вычисляется по плану запроса вместо построения полного AST запроса. #107643 (Dmitry Novik).
- Производительность
INTERSECT ALLиEXCEPT ALL(режима по умолчанию дляINTERSECTиEXCEPT) повышена в несколько раз за счёт использования значения строки в качестве ключа мультимножества вместо хеширования каждой строки с помощью SipHash. #107649 (Raúl Marín). - Фильтры политик строк теперь перестраиваются без удержания блокировки кэша, что повышает масштабируемость запросов при одновременном выполнении
CREATE ROW POLICYиDROP ROW POLICY. #107917 (Azat Khuzhin). - Ускорены функции
match,extract,extractAll,replaceRegexpOneиreplaceRegexpAllдля простых регулярных выражений за счёт компиляции в нативный код с помощью LLVM. Это управляется новой настройкойcompile_regular_expressions(включена по умолчанию); шаблоны регулярных выражений вне поддерживаемого подмножества автоматически обрабатываются движком RE2. #108004 (Alexey Milovidov). - Ускорена распаковка ZSTD на AArch64 (ARM) для столбцов с небольшими смещениями совпадений, таких как целочисленные столбцы фиксированной ширины, за счёт векторизации перекрывающихся копирований с короткими смещениями с помощью NEON. Например, распаковка столбца
UInt64на AWS Graviton 4 теперь выполняется до ~2.3x быстрее. #108049 (Alexey Milovidov). - Для сжатия и распаковки gzip/zlib/deflate теперь используется библиотека
libdeflate, что повышает скорость (сжатие — ~1.15× при лучшем коэффициенте, распаковка — ~1.4–1.5×) для данных.gz/HTTP/url/s3и кодека Parquet GZIP. #108074 (Alexey Milovidov). - Улучшена производительность запросов текстового поиска в сочетании с фильтром по первичному ключу. #108114 (Anton Popov).
- Для оптимизации последующих запусков теперь используется runtime-статистика, собранная во время первого выполнения запроса: алгоритм
hashJOIN может автоматически переключаться наparallel_hashна основе собранной статистики. #108125 (Hechem Selmi). Размер runtime-фильтров JOIN теперь оптимизируется с использованием размера хеш-таблицы из runtime-статистики JOIN; это управляется новой настройкойjoin_runtime_filter_size_from_hash_table_stats. #108313 (Hechem Selmi). - Повышена скорость распаковки LZ4 для столбцов фиксированного размера с низкой мощностью. #108175 (Nikita Taranov).
- Ускорены функции
trimLeft/trimRight/trimBoth, удаляющие пробелы по умолчанию (и их псевдонимыltrim/rtrim/trim): последовательные строки, которым не требуется обрезка, копируются одним батчем, а посимвольная проверка пробелов выполняется только для строк, у которых действительно есть пробел в начале или в конце. #108177 (Groene AI). - Повышена производительность
replaceAllиreplaceRegexpAll, когда шаблон — один символ, а замена — тоже один символ (например,replaceRegexpAll(s, ' ', '_')). Такие замены больше не меняют структуру строки, поэтому теперь столбец копируется один раз, а совпадающие байты переписываются на месте вместо выполнения отдельного цикла поиска для каждого совпадения. #108178 (Groene AI). - Улучшена производительность функции
pointInPolygonпри работе с константным многоугольником. Кэш предварительно обработанных многоугольников теперь использует в качестве ключа исходные константные аргументы, поэтому константный многоугольник разбирается только один раз (при cache miss), а не заново для каждого входного блока. #108184 (Groene AI). - Ускорен разбор канонического представления даты и времени
YYYY-MM-DD hh:mm:ssв режиме best-effort (date_time_input_format = 'best_effort',cast_string_to_date_time_mode = 'best_effort'), который используется по умолчанию. Это устраняет регрессию производительности разбора, появившуюся после переключения этих значений по умолчанию сbasicнаbest_effort. #108187 (Groene AI). - Исключено ведение счётчиков селективности в
system.predicate_statistics_logна пути чтенияMergeTree, когда эта возможность отключена (predicate_statistics_sample_rate = 0, значение по умолчанию). Это убирает атомарное обновление на гранулу иO(rows)popcount фильтра при каждом чтении, устраняя регрессию производительности, наиболее заметную на AArch64. #108190 (Groene AI). - Ускорен разбор чисел с плавающей запятой из текста при
precise_float_parsing = 1, так что он стал не медленнее, а на большинстве входных данных даже быстрее парсера по умолчанию. Также обновлена включённая в поставку библиотекаfast_floatдо v8.2.10. #108205 (Raúl Marín). - Для функций кодирования и декодирования base64 теперь используется библиотека
simdutf, что повышает их производительность. #108333 (Konstantin Bogdanov). - Оптимизирован
DISTINCTдля дорогих ключей с высокой кардинальностью. #108366 (Nihal Z. Miaji). - В сборках не для Linux (macOS и FreeBSD) jemalloc больше не очищает грязные страницы слишком активно (один системный вызов
madviseна каждыйfree); теперь, как и в Linux, используется фоновый поток очистки с конечнымdirty_decay_ms. Это значительно ускоряет рабочие нагрузки с интенсивным выделением памяти, такие как рекурсивные CTE (~2x в бенчмарке рекурсивных CTE на macOS), при пренебрежимо малом влиянии на RSS. #108430 (Alexey Milovidov). - Ускорено планирование запросов в анализаторе для выражений, которые ссылаются на один и тот же алиас
WITHили многократно повторяют одно и то же подвыражение (например, глубоко вложенные цепочкиif/multiIf), за счёт отказа от повторной сборки общих подвыражений при построении DAG действий. #108523 (Dmitry Novik). - Runtime filters теперь строятся по ключам равенства, даже если предложение
ONтакже содержит предикаты неравенства, что уменьшает число строк, попадающих в hash join, для JOIN, сочетающих условия равенства и неравенства.LEFT ANTI JOINне затронут. #108579 (Antonio Álvarez Caballero). - Глобально включён
-fno-math-errnoво всей кодовой базе, что позволяет компилятору лучше оптимизировать математические функции. #108628 (Nikita Taranov). - Порог software-prefetch для hash tables агрегации и JOIN снижен с
4 * L2 cache sizeдоL2 cache size, чтобы prefetch включался, как только hash table перестаёт помещаться в L2. Это устраняет регрессию дляGROUP BYиJOINна hash tables среднего размера (~1-8 MiB) на платформах с большим заявленным L2 (например, AArch64 с L2 на 2 MiB). #108655 (Groene AI). - Повышена производительность оконных функций. Оконные запросы к широким таблицам с
SELECT *теперь потребляют значительно меньше памяти и выполняются быстрее. Оконные агрегатные функции, включаяquantile*,uniq*иgroupArray, работают быстрее сOVER ()иOVER (ORDER BY ... RANGE ...). Функцияcume_distтоже ускорена, а окна сPARTITION BYилиORDER BYтеперь лучше работают на столбцах с большим количеством повторяющихся значений. #108688 (Nihal Z. Miaji). - Ускорен анализ запросов с большим количеством или очень длинными цепочками сравнений через
AND: оптимизацияoptimize_and_compare_chainтеперь ограничивается бюджетом вычислений (новая настройкаoptimize_and_compare_chain_max_hash_work) вместо хеширования значительной части дерева запроса, а при разрешении lambda-выражений больше не пересчитываются хеши тел lambda для защиты от рекурсии. #108757 (Alexey Milovidov). - Исправлена регрессия производительности при многопоточном чтении столбцов
JSON/Dynamic: получение значения настройкиinput_format_binary_max_type_complexityдля каждого значения приводило к конкуренции за счётчик ссылок в общем контексте запроса, из-за чего параллельные чтения фактически сериализовались; теперь значение настройки кэшируется отдельно в каждом потоке. #108797 (Seva Potapov). - Исправлена регрессия производительности (появившаяся в #71781), из-за которой чтение множества небольших файлов из объектного хранилища через
s3и другие табличные функции переставало использовать prefetching и возвращалось к синхронным чтениям, что заметно замедляло однопоточные чтения и чтения с низким параллелизмом при работе с большим количеством мелких файлов. #108872 (Nikita Fomichev). Начальный prefetch для небольших объектов теперь также выполняется, когда чтение из объектного хранилища идёт через файловый кэш (filesystem_cache_name), поэтому чтение множества небольших файлов (например, при ингестииS3Queue) с включённым кэшем больше не является синхронным и ограниченным задержками. #109478 (Nikita Fomichev). - Разбор глубоко вложенных литералов массивов и кортежей теперь выполняется за линейное, а не за квадратичное время. #108892 (Alexey Milovidov).
- Снижены накладные расходы из-за конкуренции за блокировки в алгоритме JOIN
parallel_hash. #108938 (Hechem Selmi). - Ускорена работа
estimateCompressionRatioдля столбцов с кодированиемT64за счёт аналитического вычисления сжатого размера вместо фактического сжатия. #109054 (Raufs Dunamalijevs). - Устранено однопоточное узкое место на этапе shuffle в распределённых планах выполнения запросов: теперь каждый входящий stream независимо распределяет свои строки по бакетам назначения, вместо того чтобы пропускать весь поток данных через одно преобразование. #109206 (Alexander Gololobov).
- Снижено потребление CPU сервером Keeper в режиме простоя. #109255 (Michael Kolupaev).
- Ускорены сериализация и слияние столбцов
JSON, чьи общие данные содержат много разрежённых path: при flattening общих данных в отдельные столбцы по path устранено посрочное сканирование всех накопленных столбцов path, а пропуски теперь заполняются пакетно вместо вставки значений по умолчанию по одной ячейке за раз. #109341 (Groene AI). - Снижены накладные расходы CPU на вычисление выражений для queries с большим количеством столбцов (например, при векторном поиске по столбцу
QBitс малым stride, когда каждый вектор разворачивается в сотни битовых подстолбцов, которые затем передаются в один вызов*DistanceTransposed). #109380 (Alexey Milovidov). - Повышена производительность H3 Geo-функций (
h3ToGeoBoundary,h3ToGeo,h3CellAreaM2/h3CellAreaRads2,geoToH3) за счёт совместного вычисления пар sine/cosine и устранения избыточных тригонометрических вызовов при преобразовании координат. Результаты не изменились (побитово идентичны). #109399 (Alexey Milovidov). - До 7 раз повышена производительность сравнений (
<,>,<=,>=) для широких целочисленных типов (Int128,UInt128,Int256,UInt256и типов на их основе, таких какDecimal128), а также преобразования целых чисел со знаком вInt256(до 7 раз на данных со смешанными знаками) за счёт устранения ветвлений в коде сравнения и знакового расширения. #109474 (Manuel). - Оптимизированы
uniqCombined(включая случай aggregation без keys) иuniqHLL12. #109794 (Anton Popov). #109831 (Anton Popov). - Функции
arraySortиarrayReverseSortработают в несколько раз быстрее на числовых массивах (включаяDecimalиDateTime64) при вызове без lambda. #109832 (Manuel). - Ускорены
addDays,addWeeks,subtractDaysиsubtractWeeksдля значенийDateTimeиDateTime64в часовых поясах с фиксированным смещением (например, UTC) за счёт использования быстрого арифметического пути. #109836 (Manuel). - Оптимизирован анализ text index. #109886 (Anton Popov).
- Распараллелена обработка несоединённых строк в join algorithm
parallel_hashещё в двух случаях: при наличии остаточного filter и в случае малых join keys (одноуровневая хеш-таблица). #110008 (Hechem Selmi). - Ответы встроенного web UI (Play UI, панели мониторинга и обработчики статических файлов) теперь сжимаются в соответствии с header
Accept-Encodingклиента с использованием zstd, gzip, deflate, brotli, lz4, xz, snappy или bzip2. Например, страница/playуменьшается с ~350 КБ в несжатом виде до менее 120 КБ при использовании zstd, что сокращает время загрузки на медленных соединениях. Уже сжатые Response остаются без изменений, а для корректного разбиения CDN и cache по вариантам выдаётсяVary: Accept-Encoding. #110108 (Sayantanu Dey). - Теперь фильтр можно проталкивать ниже оконной функции или
LIMIT BY, когда это безопасно: предикат, заданный над ними (внешнийWHEREвокруг подзапроса или конъюнкт вQUALIFY), который ссылается только на столбцыPARTITION BYокна или только на столбцы ключаLIMIT BY(дляLIMIT n BYприn >= 1и безOFFSET), теперь опускается до уровня хранилища и позволяет задействовать отсечение по первичному ключу и партициям, индексы пропуска данных и проекции. Например,SELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x'больше не читает всю таблицу и не вычисляет оконную функцию для неё целиком. #110114 (Groene AI). #110116 (Groene AI). - При
join_use_nulls = 1WHERE, отбрасывающийNULLи ссылающийся на столбцы с обеих сторон внешнего JOIN (например,WHERE l.k = 42 AND r.k = 42), теперь преобразует JOIN вINNER(илиLEFT/RIGHT) и позволяет выполнять отсечение по первичному ключу, как и приjoin_use_nulls = 0. Ранее в этом случае такое преобразование не выполнялось, и обе таблицы читались целиком. #110121 (Groene AI). - Функции с одним неконстантным аргументом
Nullableтеперь используют общую с результатом null map аргумента вместо выделения и слияния новой. #110151 (Manuel). - Убрано одно выделение памяти в куче на каждую проверку гиперпрямоугольника при анализе индекса первичного ключа, что ускоряет фильтрацию по меткам на 5–26% в зависимости от структуры запроса. #110153 (Manuel).
- Повышена производительность функций
arrayMinиarrayMaxдля числовых массивов примерно в 1,3–1,5 раза за счёт векторизованной редукции вместо цикла посэлементного сравнения. #110163 (Manuel). - Векторизована декомпрессия кодека
Delta. Декодирование теперь выполняется в 1,5–5 раз быстрее для 8-/16-/32-битных типов данных, что ускоряет сканирование столбцов, сжатых кодекомDelta, до 20%. #110189 (Manuel). - Ускорены string search functions (
like,position,match,countSubstrings,hasTokenи т. д.) для столбцовEnumс константной искомой строкой: теперь поиск выполняется только по уникальным именам enum, а затем результаты сопоставляются со строками, вместо поиска по каждой строке отдельно. #110325 (Alexey Milovidov). - Ускорены агрегатные функции
groupBitOr/groupBitAnd/groupBitXorи семейство функций для дисперсии (varPop,varSamp,stddevPop,stddevSamp,skewPop,skewSamp,kurtPop,kurtSamp,covarPop,covarSamp,corr) за счёт векторизованной пакетной обработки: ускорение до 4 раз с комбинатором-Ifпри непредсказуемых условиях и до 3 раз для семейства дисперсии без него. #110461 (Manuel). - Ускорен анализ text index (этап, на котором выбирается, какие гранулы читать): теперь используется поиск по исключению вместо перебора всех гранул, а также исключено создание временного битового массива для каждой проверки диапазона. #110530 (Anton Popov).
- В автоматической оптимизации
PREWHEREтеперь учитывается размер подстолбцовMapна диске. Это исправляет регрессию производительности вPREWHERE, появившуюся в #99200. Часть #110462. #110623 (Pavel Kruglov). - Ускорен разбор значений
UUIDиз текста (например,JSONExtractвLowCardinality(UUID),toUUID,CAST AS UUID) за счет проверки и преобразования шестнадцатеричных цифр за один проход вместо двух. #110625 (Groene AI). - Значительно повышена производительность агрегатных функций
timeSeries*ToGridза счет более быстрых реализаций сортировки и хеш-таблиц. #110875 (Nikita Mikhaylov). - Запросы вида
SELECT * FROM t WHERE idтеперь используют пропуск данных по индексу для столбцаid. Закрывает #89222. #89603 (Aditya Chopra). - Добавлена настройка
query_plan_merge_expression_into_join(включена по умолчанию), которая позволяет объединять шаги вычисления выражений со шагамиJOINпри оптимизации переупорядочиванияJOIN. Это позволяет переупорядочиватьJOINмежду подзапросами, оборачивающимиJOIN(например, когдаJOINнаходится внутри подзапроса с вычисляемыми столбцами), что улучшает оптимизацию сложных деревьевJOIN. #98533 (Vladimir Cherkasov). - Оптимизированы цепочки
ANDс несколькими условиями сравнения для одного и того же выражения: обнаруживаются противоречия (например,a < 3 AND a > 5→false) и удаляются избыточные условия (например,a = 3 AND a < 5→a = 3). #99736 (Xiaozhe Yu). - Materialized CTEs, на которые ссылаются из нескольких ветвей запроса
UNION, теперь материализуются один раз и совместно используются всеми ветвями. Ранее каждая ветвь получала собственную копию CTE, которая встраивалась в запрос и вычислялась отдельно. #102107 (Dmitry Novik). - Потоки в
BackgroundSchedulePoolтеперь создаются лениво, по мере необходимости, а не все сразу при запуске сервера. Новая настройка сервераbackground_schedule_pool_initial_size(по умолчанию16) задает, сколько воркеров создается заранее; при необходимости пул увеличивается доbackground_schedule_pool_size. Это уменьшает число простаивающих потоков на серверах с низкой нагрузкой. Закрывает #85265. #105066 (Alexey Milovidov). - Пропускается ненужная загрузка файлов меток для расширенной сериализации общих данных типа
JSON. #107051 (Pavel Kruglov). - Кэш предварительно обработанных константных полигонов для функции
pointInPolygonтеперь общий для всех запросов и потоков и ограничен новой настройкой сервераpoint_in_polygon_cache_size(по умолчанию 256 MiB,0отключает кэш, настройку можно менять во время выполнения). Ранее кэш хранил доmax_threadsкопий каждого предварительно обработанного полигона, неограниченно разрастался при появлении разных полигонов и никогда не освобождался до перезапуска сервера. Его можно очистить командойSYSTEM DROP POINT IN POLYGON CACHE, а текущее использование отображается вsystem.metricsкакPointInPolygonCacheBytes,PointInPolygonCacheCellsиPointInPolygonCacheSizeLimit. Закрывает #106393. #107247 (Nihal Z. Miaji). - Keeper больше не удерживает внутреннюю блокировку снимков во время сериализации и записи снимка на диск или перемещения снимков между дисками, поэтому передача снимков другим узлам и обработка Raft больше не задерживаются из-за локального создания снимка. #107595 (Antonio Andelic).
- Распараллелено фоновое вытеснение файлового кэша (управляется настройками
keep_free_space_ratio). Добавлена новая настройкаkeep_free_space_eviction_threadsдля управления параллелизмом, а значение по умолчанию дляkeep_free_space_remove_batchувеличено со100до250. #108147 (Kseniia Sumarokova). - Число одновременно подготавливаемых частей при копировании в Azure Blob Storage по схеме read-then-write (используется резервными копиями, когда нативное копирование недоступно) ограничено значением
max_inflight_parts_for_one_file, что предотвращает чрезмерное использование памяти при параллельном копировании большого числа крупных файлов. #108232 (Smita Kulkarni). - Все три кэша текстового индекса теперь включены глобально — раньше они были включены только внутри запросов. Кроме того, размер кэша списков вхождений теперь равен нулю, что фактически снова его отключает, поскольку списки вхождений велики и их кэширование обходится слишком дорого. #108274 (Robert Schulze).
- Добавлено потоковое сжатие marks в памяти при их загрузке, чтобы уменьшить пиковое потребление памяти. Закрывает #108285. #108325 (Pavel Kruglov).
- Новая настройка файлового кэша
reserve_granularity(по умолчанию 4 MiB) заранее резервирует место более крупными гранулами, снижая конкуренцию за блокировки на горячем пути резервирования пространства файлового кэша. #108369 (Kseniia Sumarokova). - Уменьшен объём памяти, используемой метаданными файлового кэша (для каждого file segment и каждого ключа). #108477 (Kseniia Sumarokova).
- Запросы к
system.iceberg_historyс фильтрамиWHEREпо столбцамdatabaseиtableтеперь обращаются только к соответствующим базам данных, что может сэкономить время, если на сервере много несвязанных удалённых баз данных. #108492 (Den Kalantaevskii). - Из файлового кэша удалены лишние блокировки, чтобы снизить конкуренцию за них. #108932 (Kseniia Sumarokova).
- Снижено использование памяти при обработке метаданных
BACKUPиRESTORE. При открытии резервной копии (дляRESTOREили в качестве базы для инкрементальногоBACKUP) метаданные.backupтеперь разбираются как поток, а не загружаются в XML-дерево документа в памяти, что для больших (особенно инкрементальных) резервных копий позволяет избежать выделения многогигабайтного DOM-дерева. #109107 (Julia Kartseva). При завершенииBACKUPбольше не копируются метаданные всех файлов во временный вектор, что для резервных копий с миллионами файлов раньше временно требовало несколько гигабайт памяти. #109861 (Julia Kartseva). При записи записей резервной копии также больше не копируется список метаданных файлов текущего хоста. #111162 (Julia Kartseva). - Снижено потребление памяти в агрегаторе. #109224 (Konstantin Vedernikov).
- Добавлена поддержка кэша условий запроса для локальных файлов
Parquet, читаемых через движок таблицыFile(ранее это поддерживалось только для Объектного хранилища и озёр данных). #109247 (Alexey Milovidov). - Использование памяти кэшем заголовков текстового индекса снижено в 2–2,5 раза. В кэш помещается больше заголовков частей данных (настройка
text_index_header_cache_size), что уменьшает число чтений с диска для запросов текстового поиска. #109332 (Anton Popov). - Транспонированные функции расстояния для векторов
L2DistanceTransposed,cosineDistanceTransposedиdotProductTransposedтеперь применяют оптимизацию частичного чтения битовых плоскостей к столбцамNullable(QBit), считывая только запрошенные битовые плоскости вместо всего столбца. #109358 (Alexey Milovidov). IS NOT DISTINCT FROMиIS TRUEтеперь используют первичный ключ и MinMax-индексы для отсечения гранул, как и=. Ранееk IS NOT DISTINCT FROM 42и(k = 42) IS TRUEсканировали все гранулы. #110006 (Groene AI).- Соединения из пула больше не проверяются с помощью
Pingперед каждым использованием. Это убирает обменPing-Pong, который добавлялся к каждому повторно используемому соединению, уменьшая задержку распределённых запросов иclickhouse-benchmark. Неактуальное соединение в пуле обнаруживается с помощьюpollс нулевым тайм-аутом (неблокирующая проверка, не добавляющая лишнего сетевого обмена) и восстанавливается повторным подключением. #110068 (Alexey Milovidov). - Исправлены ложные переподключения HTTP keep-alive-соединений из пула поверх TLS (HTTPS, S3). Проверка неактуального соединения использовала
pollна сокете, из-за чего активное защищённое соединение с непрочитанной TLS-записью после рукопожатия (session ticket илиKeyUpdate) ошибочно определялось как закрытое; теперь используются неблокирующийMSG_PEEKдля обычных сокетов иSSL_peek/SSL_has_pendingдля TLS-сокетов, что также корректно определяет штатное завершение TLS и TLS-запись, пришедшую лишь частично. #110402 (Alexey Milovidov). - Запросы, ускоренные динамической фильтрацией TopK (
ORDER BY ... LIMIT k), теперь полнее используют кэш условий запроса: кэш заполняется даже тогда, когда к запросу применяется отложенная материализация, и такие запросы могут повторно использовать записи, ранее сохранённые обычным запросом с тем же предикатомWHERE. #110507 (Shankar Iyer). - Шаблон
LIKE/NOT LIKEбез подстановочных шаблонов (%,_) теперь использует точный диапазон первичного ключа, поэтому читает то же количество гранул, что и эквивалентный предикат=/!=, а не более широкий префиксный диапазон. #107077 (Groene AI). - Исправлено избыточное состязание за блокировки сегментов файлов (регрессия производительности, появившаяся в 26.1) при чтении данных через файловый кэш. #109577 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой индекс пропуска данных, определённый на подстолбцах
Tuple, не использовался, когда к полю обращались черезtupleElement(t, 'name'),tupleElement(t, N)илиt.N, а полный кортеж также читался в том же запросе (например,SELECT *). Теперь все эти формы отсекают гранулы так же, как и обращение к именованному подстолбцуt.name. #110056 (Groene AI). - Исправлены медленные запросы
ORDER BY ... LIMITна таблицахDistributed, когдаprefer_localhost_replicaвыбирает локальную реплику: из плана локального шарда был удалён предварительный limit, который мешал отложенной материализации и динамической top-K-фильтрации. #110136 (Michael Jarrett). - Исправлена проблема, из-за которой текстовый индекс не использовался для оператора
ILIKE, если индекс был определён по выражению, а не по обычному столбцу (например,assumeNotNull(col)с препроцессоромlower(...)): такие запросы читали все гранулы вместо использования индекса. Это закрывает #110350. #110595 (Elmi Ahmadov). - Снижено состязание за блокировки в файловом кэше: запросы, читающие из кэша, больше не блокируются на блокировке очереди с приоритетами при обновлении LRU-приоритета записи. #109065 (Antonio Andelic).
- Запросы к текстовому индексу, использующие выражение
postprocessorтолько для фильтрации (например,if(..., '', token)), теперь отбрасывают пустые токены заранее, вместо того чтобы материализовать их построчно, что повышает производительность. #109049 (Elmi Ahmadov). - Снижено состязание за блокировки в очередях системных логов, что уменьшает хвостовую задержку запросов в нагруженных кластерах. #110539 (Sean Haynes).
- Повышена производительность функций поиска подстроки (
position,countSubstrings,multiSearch*,replaceAll,replaceOneи их регистронезависимых и UTF-8-вариантов) с неконстантной искомой строкой — до 1.5x — за счёт использования SIMD-ускоренных поисковиков строк на пути построчной обработки вместо наивной реализации. #110580 (Raúl Marín). - Отложенная материализация теперь применяется к запросам
ReplacingMergeTreeсFINAL, фильтром и небольшимLIMITдаже безORDER BY. Столбцы, не нужные для фильтра и слиянияFINAL, извлекаются только для строк, оставшихся после limit, что делает такие запросы значительно быстрее, когда они выбирают широкие столбцы с селективным фильтром. Управляется параметрамиquery_plan_optimize_lazy_materializationиquery_plan_max_limit_for_lazy_materialization. #110722 (Nikolai Kochetov). - Улучшена производительность async insert, когда включена дедупликация и одна операция flush разбивается на несколько партиций: ClickHouse теперь повторно использует вычисленные хеши дедупликации между партициями вместо того, чтобы заново вычислять их для каждой из них. #111150 (Valery Petrov).
Улучшения
- Добавлена настройка
input_format_csv_missing_nullable_as_empty_string(по умолчанию отключена). Когда она включена, отсутствующее значение в столбцеNullable(String)во входных CSV-данных читается как пустойStringвместоNULL, независимо отinput_format_csv_empty_as_default. #58225 (kevinyhzou). #107577 (Alexey Milovidov). - Функции
toDateOrNull,toDateTimeOrNullиtoDateTime64OrNullтеперь принимают целочисленные аргументы всех встроенных целочисленных типов (они интерпретируются так же, как вtoDate,toDateTimeиtoDateTime64, с необязательным аргументом часового пояса) и возвращаютNULLдля значений вне диапазона результирующего типа. Например,toDateTimeOrNull(1583851242, 'Asia/Shanghai')возвращает2020-03-10 22:40:42, аtoDateTimeOrNull(4294967296)возвращаетNULL. #79791 (Jitendra). - В таблицу
system.grantsдобавлен столбецis_wildcard, который показывает, использует ли grant сопоставление по префиксу с подстановочным знаком (например,GRANT SELECT ON db*.*). Раньше вsystem.grantsнельзя было отличить grants с подстановочными знаками от точных grants с тем же именем. Закрывает #92835. #98577 (DQ). - Добавлена поддержка сжатия Snappy в HTTP-интерфейсе (
Accept-Encoding: snappy), а также настройкаsnappy_mode, позволяющая выбирать между блочным форматом Hadoop Snappy и форматом кадрирования Snappy для общего snappy I/Ofile/url. #100752 (Alexey Milovidov). - Добавлена поддержка совместимости со старым analyzer через настройку
analyzer_compatibility_allow_non_aggregate_in_having. Если она включена, неагрегатные условия переносятся изHAVINGвWHERE. #104232 (Dmitry Novik). - Добавлена новая настройка сервера
memory_worker_rss_speculative_reserve_ratio(по умолчанию1.0), из-за которой глобальный трекер памяти спекулятивно резервирует память сверх наблюдаемого RSS, если рост RSS между выборками опережает учёт трекера. Благодаря этомуMEMORY_LIMIT_EXCEEDEDдля выделений возникает раньше, а kernel OOM-killer срабатывает с меньшей вероятностью. Установите коэффициент в0, чтобы отключить эту спекуляцию. #104976 (Alexey Milovidov). - Добавлены опциональные метрики Prometheus для активности вытеснения файлового кэша (
filesystem_cache_evictions_total,filesystem_cache_evicted_bytes_total,filesystem_cache_evicted_segment_hits,filesystem_cache_evicted_segment_size_bytesи их варианты для каждого пользователя с меткойuser_id), доступные для каждого кэша черезsystem.dimensional_metrics,system.histogram_metricsи конечную точку Prometheus. Они управляются настройками конфигурации cache diskexpose_prometheus_eviction_metricsиexpose_prometheus_eviction_metrics_per_user(обе по умолчанию выключены), которые можно переключать во время выполнения черезSYSTEM RELOAD CONFIG. #105020 (Sacheendra Talluri). EXPLAIN [PLAN] actions=1, compact=1, pretty=1теперь используется по умолчанию. #105036 (Kirill Kopnev).- Обновлён
delta-kernel-rs(библиотека, лежащая в основе интеграцииDeltaLake) до v0.23.0. #105861 (Smita Kulkarni). - В
clickhouse-disksдобавлены командыduиwc. Первая выводит общий размер указанного файла или каталога в байтах, вторая — количество байтов, строк и слов в файле. #106268 (Asya Shneerson). - Добавлена новая асинхронная Метрика
UntrackedMemory(видна вsystem.asynchronous_metrics), которая показывает память, уже выделенную потоками, но еще не учтенную в глобальном счетчике отслеживания памяти: каждый поток локально накапливает небольшие выделения и затем сообщает о них одним пакетом. Это помогает объяснить расхождения междуMemoryTrackingи фактическим использованием памяти процессом. Сообщения об ошибкеMEMORY_LIMIT_EXCEEDEDтеперь также включают объем неотслеживаемой памяти, что упрощает понимание того, почему запрос или сервер достиг лимита памяти. #106386 (Miсhael Stetsyuk). - ClickStack (UI для обсервабилити) обновлен до версии 2.28.0. #106406 (Aaron Knudtson).
- Добавлена поддержка
BFloat16вdotProduct, а также повышена производительность за счет пакетной обработки SIMD-пути. #106569 (Nikita Taranov). - Настройки
max_named_collection_num_to_throw,max_table_num_to_throw,max_replicated_table_num_to_throw,max_view_num_to_throw,max_dictionary_num_to_throwиmax_database_num_to_throwтеперь можно изменять без перезапуска сервера. #106821 (Maxim Orlovsky). - Для настройки
s3_storage_class_nameдобавлена поддержка значенийREDUCED_REDUNDANCY,STANDARD_IA,ONEZONE_IA,GLACIER_IRиEXPRESS_ONEZONE(в дополнение кSTANDARDиINTELLIGENT_TIERING). #107251 (Aditya Kumar). - Для движка базы данных
MaterializedPostgreSQLдобавлена настройка времени созданияmaterialized_postgresql_use_extended_date_and_time_types. По умолчанию (если она включена) столбцы PostgreSQLdate/timestampопределяются какDate32/DateTime64; если задать ей значение0во времяCREATE DATABASE, будут определены более узкие типыDate/DateTime. Эта настройка не применяется к движку таблицыMaterializedPostgreSQL. #107428 (Alexey Milovidov). - Квантификатор массива
SOME/ALL(expr OP SOME(array)/expr OP ALL(array)) теперь также поддерживает предикаты сравнения по ключевым словамIS DISTINCT FROMиIS NOT DISTINCT FROM, а также строковые предикаты поискаLIKE,ILIKE,NOT LIKE,NOT ILIKEиREGEXP, которые переписываются вarrayExists/arrayAll. #107454 (Alexey Milovidov). - Исправлена утечка памяти, возникавшая при неудачном открытии базы данных SQLite (например, когда табличной функции
sqliteили движку базы данныхSQLiteпередается путь, который невозможно открыть). #107807 (Alexey Milovidov). - В Web UI (
play.html) подсказка с сочетанием клавиш для запуска теперь показываетCmd+Enterна Mac иCtrl+Enterна других платформах вместо постоянногоCtrl/Cmd+Enter, а часть, +Shift to run allотображается только при наличии нескольких запросов. #107817 (Alexey Milovidov). #108957 (Alexey Milovidov). - Движок таблицы
Aliasтеперь поддерживает чтение с параллельных реплик, если целевая таблица относится к семействуMergeTree. #107830 (Kai Zhu). - Добавлен тип статистики столбцов
uniq_v2— легковесная альтернатива статистикеuniq, основанная на скетчеuniqCombined64. #107863 (Han Fei). Тип статистики столбцовminmaxобъявлен устаревшим, а значение по умолчанию дляauto_statistics_typesизменено наbasic, uniq_v2. #108680 (Han Fei). - Функции ИИ (
aiGenerate,aiEmbed,aiClassify,aiExtract,aiTranslate) теперь повторяют попытки при временных сетевых сбоях (сбросе соединения, ошибках TLS-подключения, тайм-аутах, недоступности адресов), если задан параметрai_function_max_retries, что соответствует поведению повторных попыток у табличной функцииurl. Ранее повторные попытки выполнялись только для HTTP-ответов с ошибками со стороны провайдера. #107927 (Alexey Milovidov). INSERTв таблицуMergeTreeтеперь учитывает отмену запроса иmax_execution_timeпри записи большого числа частей, вместо того чтобы потенциально продолжать выполняться еще долго после принудительной остановки. #107929 (Michael Kolupaev).- В Web UI (
play.html) значок Web Terminal теперь можно открыть в новой вкладке браузера щелчком средней кнопкой мыши или Ctrl/Cmd/Shift+щелчком. #108006 (Alexey Milovidov). - Генерация SQL с помощью ИИ в клиенте больше не отправляет параметр
temperature, если он не задан явно черезai.temperatureв конфигурации. Это исправляет генерацию SQL с помощью ИИ для моделей, которые не принимают параметрtemperature. #108014 (Alexey Milovidov). - В сборки с открытым исходным кодом добавлены таблица
system.masking_policiesи интроспекцияSHOW MASKING POLICIES. Сами masking policies по-прежнему остаются возможностью ClickHouse Cloud, поэтому в сборках с открытым исходным кодом таблица пуста, но запросы интроспекции больше не завершаются ошибкой. #108030 (Alexey Milovidov). - Kafka consumer на базе Keeper теперь случайным образом меняет порядок захвата временных блокировок партиций между репликами, что улучшает равномерность распределения партиций и снижает конкуренцию за блокировки. Ранее это перемешивание фактически не работало. #108033 (Alexey Milovidov).
- В Web UI (
play.html) добавлено автодополнение на основеsystem.completionsи SQL-лексера на базе WASM. #108059 (Alexey Milovidov). clickhouse-clientиclickhouse-localтеперь показывают подсказки автодополнения по мере ввода (встроенный “призрачный” текст) с наиболее подходящим вариантом, когда курсор находится в конце строки ввода. Наиболее релевантные подсказки (недавно использованные и идентификаторы, уже присутствующие в запросе) показываются первыми. Перемещайтесь с помощью Up/Down (или Ctrl-Up/Ctrl-Down); принимайте одиночную или выбранную подсказку с помощью Tab или Right, а выбранную подсказку — с помощью Enter; Tab также открывает классический список дополнений. Управляется новой опцией--hints(включена по умолчанию; требует--highlight). #108070 (Alexey Milovidov).- Добавлена поддержка функции
lengthдля типа данныхQBit— она возвращает размерность вектора как константу. #108071 (Alexey Milovidov). Также поддерживаетсяCASTизQBitвArrayс восстановлением исходного вектора — это преобразование, обратное уже существующему преобразованию изArrayвQBit. #108072 (Alexey Milovidov). - Запросы к REST-каталогам озёр данных (например, OneLake) теперь включают заголовок ClickHouse
User-Agent. #108117 (Konstantin Vedernikov). arrayFoldтеперь корректно обрабатывает отмену запроса иmax_execution_time. Ранее свёртка по очень длинному массиву полностью выполнялась внутри одного вызова функции и не могла быть прервана, поэтомуKILL QUERYи ограничения по времени игнорировались до завершения свёртки. #108192 (Groene AI).MVTEncodeGeomтеперь привязывает геометрию к целочисленной пиксельной сетке перед обрезкой и обрезает полигоны с помощью библиотекиwagyu, поэтому обрезанный результат получается корректным (самопересекающиеся кольца исправляются) и выровненным по границам, как в PostGISST_AsMVTGeom. #108248 (Saarthak Gupta).- Добавлены
ProfileEventsдля отдельных фаз подготовки запроса к выполнению:QueryParseMicroseconds,QueryAnalysisMicroseconds,QueryPlanBuildMicrosecondsиQueryPipelineBuildMicroseconds. Они показывают, на что тратится время до выполнения запроса (разбор, анализ, построение плана запроса, построение конвейера), и доступны вsystem.query_logиsystem.events. #108282 (Jordi Villar). - Операции
ALTER TABLE, которые привели бы к созданию метаданных таблицы, превышающихmax_query_size, теперь отклоняются заранее, что предотвращает ситуации, при которых таблицу не смогут загрузить такие компоненты, как распределение DDL и восстановление реплики. #108283 (Andrew Kravchuk). - В
system.backupsиsystem.backup_logдобавлены столбцыsettingsиengine_settings.settingsпоказывает настройки резервного копирования/восстановления, запрошенные для операции (например,allow_s3_native_copy,deduplicate_files,structure_only), аengine_settings— настройки, фактически использованные модулями чтения и записи движка резервного копирования (например, настройки S3 request, такие какallow_native_copy, которые могут отличаться от запрошенных после слияния конфигурации конечной точки). Это позволяет увидеть, с какими именно настройками фактически выполнялась операцияBACKUP/RESTORE. #108334 (Julia Kartseva). - В
system.documentationдобавлен столбецsource, содержащий путь к исходному файлу, где определена документация для каждой сущности. Теперь в этой таблице также документируются кодеки сжатия, profile events, текущие метрики, асинхронные метрики и сами системные таблицы (вместе с их столбцами), а документация настроек теперь включает их тип и значение по умолчанию. #108346 (Alexey Milovidov). Пустое значение настройки по умолчанию теперь отображается как пустая строка, а не как пустые обратные кавычки. #108708 (Alexey Milovidov). - Добавлена поддержка асинхронного чтения с удалённых реплик (
async_socket_for_remote) в macOS за счёт реализации примитивов polling на основе epoll поверхkqueue. Это позволяет распределённым запросам читать шарды параллельно в macOS, а не последовательно. #108403 (Raúl Marín). - Добавлена поддержка
BFloat16в функциях бинарной математики. #108442 (Zhang Yifan). MergeTreeтеперь может читать сжатый поток, блоки которого используют разные кодеки. Это необходимая предпосылка на стороне чтения для адаптивного выбора кодека (#105404). #108592 (Raufs Dunamalijevs).- Автоматическое значение
max_threadsи аналогичных настроек теперь отображается вsystem.settingsкакauto(8), а не как'auto(8)'; окружающие одинарные кавычки были давним артефактом, встроенным в само значение. Совместимость между версиями сохранена: прежняя форма в кавычках по-прежнему принимается при разборе настроек, полученных от более старых серверов. #108657 (Alexey Milovidov). - Несколько улучшений удобства использования веб-интерфейса
/schema: загрузка схемы по Enter, полосы прокрутки с учётом темы, читаемые имена таблиц, согласованная группировка независимых таблиц по базам данных, отсутствие выделения текста при перетаскивании и форма аутентификации в стилеplay(Credential Management API, учётные данные, передаваемые через URL, с удалением пароля и проверкой учётных данных в реальном времени). #108724 (Alexey Milovidov). - Режим отложенного применения posting list для текстового индекса больше не является экспериментальным и может быть выбран с помощью
text_index_posting_list_apply_mode = 'lazy'безallow_experimental_text_index_lazy_apply. Настройка порога плотности была переименована изtext_index_density_thresholdвtext_index_lazy_intersection_density_threshold. #108814 (Anton Popov). - В
DataLakeCatalogдобавлен тип каталогаdelta_sharingдля Iceberg REST-конечной точки Databricks Delta Sharing, у которой плоские пространства имен и которая игнорирует фильтр спискаparent. Используйте его вместоcatalog_type = 'rest'для таких конечных точек, где иначеSHOW TABLESбудет зависать. #108865 (Seva Potapov). - Добавлена новая опция
clickhouse-client/clickhouse-local--echo-query-separator, которая выводит пользовательский разделитель перед отформатированным эхо запроса, благодаря чему проще отличить введённый запрос от его переформатированной версии. По умолчанию отключена. #108888 (David Meng). - Улучшения панели баз данных веб-интерфейса: количество таблиц теперь отображается в скобках рядом с именем базы данных, когда она раскрыта. #108891 (Alexey Milovidov). Кнопка обновления рядом с раскрытой базой данных перезагружает список её таблиц. #108958 (Alexey Milovidov). При повторном открытии панели ранее раскрытые базы данных восстанавливаются. #108964 (Alexey Milovidov).
- Теперь в
EXPLAIN WHATIFможно вычислять совокупный эффект skip-index: показывается доля данных для пересечения всех существующих подходящих гипотетических индексов. #108934 (Yarik Briukhovetskyi). - Исправлен сброс позиции горизонтальной прокрутки результирующей таблицы в веб-интерфейсе при переходе по ссылке в ячейке и возврате на страницу. #108941 (Alexey Milovidov).
MySQLdatabase engine, движок таблицы и table function теперь сопоставляют пространственные типы столбцов MySQL (LINESTRING,POLYGON,MULTILINESTRING,MULTIPOLYGONи обобщённыйGEOMETRY) с соответствующими геометрическими типами ClickHouse вместоString. Это поведение управляется новым флагомgeometryнастройкиmysql_datatypes_support_level, включённым по умолчанию.POINTпо-прежнему всегда преобразуется вPoint. Обобщённый столбецGEOMETRYсопоставляется с универсальным типомGeometry; чтение значения, чей подтип не имеет аналога в ClickHouse (MULTIPOINT,GEOMETRYCOLLECTION), генерирует исключение при чтении. #108944 (Alexey Milovidov).- Веб-интерфейс (
play.html): полная навигация с клавиатуры — перемещение клавишами со стрелками в панели баз данных и результирующей таблице, доступ с клавиатуры к кнопкам панели инструментов, переключателю темы и меню загрузки, а также видимые контуры фокуса. #108972 (Alexey Milovidov). - HTTP-интерфейс: если учётные данные переданы одновременно через URL-параметры (
user/password) и заголовокAuthorization, приоритет теперь имеют URL-параметры, а не отклоняется запрос. Это исправляет ошибку, из-за которой загрузка результатов из веб-интерфейса (play.html) завершалась сбоем сAUTHENTICATION_FAILED(ошибка 516), когда браузер запоминал Basic credentials. #108980 (Alexey Milovidov). - Восстановлена настройка
show_data_lake_catalogs_in_system_tables, которая теперь управляет только видимостьюDataLakeCatalogвsystem.tables,system.columnsиsystem.completions. Добавлена настройкаshow_remote_databases_in_system_tables, включённая по умолчанию, чтобы пользователи могли отдельно скрывать базы данныхMySQLиPostgreSQLиз этих системных таблиц. #109082 (Pablo Marcos). - По умолчанию теперь используется точный (максимально близкий к представимому) алгоритм разбора чисел с плавающей точкой, а настройка
precise_float_parsingприменяется к входным форматам (CSV,TSV,JSON,VALUES, …) и числовым литералам, а не только кtoFloat*/CAST. Установитеprecise_float_parsing = 0, чтобы вернуть прежнее поведение, которое в некоторых случаях быстрее, но менее точно. Закрывает #60146. Закрывает #74647. Закрывает #68914. #109086 (Raúl Marín). - Запрос с одним CTE теперь форматируется с теми же переносом строки и отступом, что и запрос с несколькими CTE. Ранее
WITH a AS (...)оставлял CTE на той же строке, что иWITH, тогда как при двух и более CTEWITHразмещался на отдельной строке, а каждый CTE — с отступом. #109092 (Groene AI). - Web UI: если выделенное автодополнение совпадает с уже введённым словом или с тем же словом в другом регистре (например, когда для введённого
hashпредлагаетсяHASH), нажатие Right/Tab/Enter больше не переписывает слово и не перехватывается автодополнением — клавиша, как и ожидается, перемещает курсор или вставляет новую строку. #109106 (Alexey Milovidov). #109384 (Alexey Milovidov). - В Web UI (
play.html) добавлены радужные скобки, подсветка парных скобок, совпадающих идентификаторов и групп цифр — как вclickhouse-client. #109108 (Alexey Milovidov). - В Web UI клавиши
TabиShift+Tabтеперь увеличивают и уменьшают отступ у выбранных строк на 4 пробела. #109110 (Alexey Milovidov). - Web UI: позиция синтаксической ошибки в редакторе запросов теперь подсвечивается красным фоном. Подсветка снимается, как только пользователь возвращает фокус в редактор. #109112 (Alexey Milovidov).
clickhouse-compressor --statи определение default-codec для старых частей теперь сообщают о повреждённых заголовках блоков как о повреждении, а не как о вводящей в заблуждение ошибке конца файла. #109157 (Raufs Dunamalijevs).- ClickHouse Keeper теперь учитывает настройку
os_collect_psi_metricsи пропускает сбор PSI-метрик, если она отключена. #109179 (Maxim Orlovsky). - В Web UI, когда отображаются вкладки запросов, параметры подключения (
host,user,password) теперь скрыты за кнопкой с ключом в правом верхнем углу и показываются по запросу в выпадающем меню. #109243 (Alexey Milovidov). - Web UI: результат из одного значения (одна строка, один столбец, например
SHOW CREATE TABLE) теперь показывается во всю высоту вместо ограничения тремя строками. #109245 (Alexey Milovidov). - В Web UI щелчок по таблице на панели баз данных средней кнопкой мыши, с Shift или с модификатором открытия новой вкладки платформы (Cmd в macOS, Ctrl в остальных случаях) теперь открывает запрос к ней в новой вкладке Web UI. #109246 (Alexey Milovidov).
- Для удалённых файлов
Parquetв объектном хранилище кэш условий запроса теперь использует в качестве ключа ETag в дополнение к пути, чтобы перезапись объекта на месте больше не приводила к выдаче устаревших кэшированных результатов. #109310 (Alexey Milovidov). - В Web UI пустые строки и NULL больше не раскрашиваются в режиме категориальной раскраски. #109342 (Alexey Milovidov).
- В веб-интерфейсе: при нажатии на значок таблицы на панели базы данных теперь отображается список её столбцов со значками типов, полосой размера, пропорциональной compressed size, и всплывающей подсказкой с compressed/uncompressed size и коэффициентом сжатия. #109346 (Alexey Milovidov).
- В веб-интерфейсе: если заголовок вкладки обрезан, при наведении теперь показывается всплывающая подсказка с его полным текстом. #109354 (Alexey Milovidov).
- В веб-интерфейсе: щелчок средней кнопкой мыши по заголовку вкладки (или Ctrl/Shift/Cmd+щелчок) теперь дублирует вкладку. #109357 (Alexey Milovidov).
- В веб-интерфейсе: области итогового прогресса и статистики запроса теперь изменяются равномерно, чтобы при узком окне браузера их содержимое не переносилось некрасиво. #109363 (Alexey Milovidov).
- В веб-интерфейсе: выбранная на панели базы данных теперь используется как база данных по умолчанию для запросов, запускаемых из редактора. #109372 (Alexey Milovidov).
- Добавлена поддержка
reinterpretизArrayэлементов фиксированного размера вString— обратного преобразования к уже существующемуreinterpretизString/FixedStringвArray. #109383 (Alexey Milovidov). - В веб-интерфейсе: переключатели цветового кодирования по столбцам больше не отображаются, если результат содержит не более одной строки. #109385 (Alexey Milovidov).
- Разрешён
CASTмежду типамиQBit, различающимися типом элемента и/или stride, при условии, что размерность остаётся той же (например,CAST(x AS QBit(Float64, N))изQBit(Float32, N)). Изменения только stride выполняются без потерь; при изменении типа элемента применяется семантика соответствующего преобразованияArray(например, при преобразованииFloat32вBFloat16возможна потеря точности, аaccurateCast/accurateCastOrNullотклоняют строки, которые нельзя представить точно). #109387 (Alexey Milovidov). - Functions
quantizeBFloat16ToInt8иdequantizeInt8ToBFloat16теперь также принимают аргументыArrayиQBit, применяя кодек Lloyd-Max ко всему вектору (и возвращаяArray/QBitс соответствующим типом элемента) в дополнение к уже существующим скалярным перегрузкам. #109398 (Alexey Milovidov). - В веб-интерфейсе: ссылка Documentation теперь передаёт в URL имя current user. #109419 (Alexey Milovidov).
- Добавлена поддержка
arraySum,arrayAvgиarrayProductдля массивовBFloat16. #109420 (Alexey Milovidov). - Спецификатор формата MySQL
%fвparseDateTime/parseDateTime64(и их вариантахOrZero/OrNull) теперь принимает от 1 до 6 дробных цифр, которые интерпретируются как микросекунды с выравниванием влево, как в MySQLSTR_TO_DATE, вместо прежнего требования ровно 6. Также исправлено неправильное выравнивание таблицPrettyCompactв примерах документации встроенных функций. #109421 (Alexey Milovidov). - Веб-интерфейс: вкладки запросов теперь сохраняются между переключениями — каждая вкладка хранит свой отрисованный результат (включая изображения и диаграммы) и выполняющийся запрос, когда вы переключаетесь на другую вкладку и обратно, а долгие запросы продолжают выполняться в фоне. В заголовках вкладок для запросов теперь показываются спиннер, шкала прогресса и галочка завершения. #109425 (Alexey Milovidov).
- Веб-интерфейс: теперь корректно отображается ошибка, если запрос завершается с ошибкой после того, как часть результата уже была передана потоком, вместо показа клиентской
SyntaxError: Unexpected end of JSON input(или, приhttp_write_exception_in_output_format, пометки завершившегося с ошибкой запроса как успешного). #109430 (Alexey Milovidov). - В веб-интерфейс добавлены закреплённые столбцы: столбец можно закрепить из его заголовка, чтобы он оставался видимым (у края экрана), пока таблица результатов прокручивается по горизонтали. #109439 (Alexey Milovidov).
- В расширенной панели мониторинга (
/dashboard) диаграммы для конкретных метрик теперь можно добавлять напрямую по имени метрики в том виде, в каком оно указано в исходном коде или документации, что упрощает добавление нескольких метрик во время сеансов отладки. #109449 (Mikhail Artemenko). - Веб-интерфейс: исправлено закрытие выпадающего списка настроек соединения при выделении текста мышью и перетаскивании курсора за его границу. #109451 (Alexey Milovidov).
- Веб-интерфейс: при наведении на заголовок столбца таблицы результатов теперь во всплывающей подсказке показываются полные имя столбца и тип, чтобы усечённые заголовки можно было прочитать целиком. #109463 (Alexey Milovidov). Исправлено усечение заголовков столбцов многоточием даже в случаях, когда столбец был достаточно широким, чтобы показать заголовок полностью. #110397 (Alexey Milovidov).
- Добавлена поддержка словарей с кэшем на SSD (layout
SSD_CACHE) и движка таблицыFileLogв сборках для macOS. #109493 (Raúl Marín). - Веб-интерфейс: при открытии страницы больше не восстанавливаются вкладки с пустыми запросами. #109529 (Alexey Milovidov).
- Исправлены нечитаемые подсказки автодополнения при вводе и слишком яркие цвета в интерактивном клиенте в терминалах, у которых
TERMне содержит256(например, Ghostty, kitty, Alacritty, foot): яркие цвета теперь всегда выводятся как коды ярких цветов aixterm вместо отката к полужирному + тёмному цвету, который современные терминалы отображают как тёмный, плохо читаемый цвет на тёмном фоне. #109622 (Alasdair Brown). - В сборках для macOS включены jemalloc per-CPU arenas и профилирование выделений памяти. #109684 (Raúl Marín).
- Разрешено изменять некоторые настройки аутентификации базы данных каталога озера данных
OneLakeс помощьюALTER DATABASE ... MODIFY SETTING. #110019 (alesapin). - Движок
Hiveтеперь читает метаданные файловORC(индексы min/max, количество строк) с помощью собственногоORC-ридера ClickHouse вместо адаптераORCиз Apache Arrow. #110086 (Alexey Milovidov). - Размер бинарного файла уменьшен примерно на 10.5 MB за счёт того, что операции сравнения и арифметические операции для редко используемых смешанных пар типов (
Decimalи целое число другой разрядности, а также пары сInt128/UInt128/Int256/UInt256) теперь выполняются через приведение к общему типу, а не через отдельный скомпилированный kernel для каждой комбинации типов. Для пар одинаковых типов, часто используемых пар и ограниченных памятьюplus/minus/multiplyотдельные kernel сохранены; результаты, типы результатов и исключительные случаи не изменились. #110131 (Alexey Milovidov). - Подзапрос в правой части
IN, единственный столбец которого представляет собой массив на одну размерность глубже, чем левый аргумент, теперь интерпретируется как множество элементов массива (как литерал массива или функция, возвращающая массив), а не завершается с запутанной ошибкой несоответствия типов. Например,x IN (SELECT groupArray(x) FROM ...)теперь работает. #110169 (Alexey Milovidov). - Чтение из движка таблицы
SQLiteили табличной функцииsqliteбольше не загружает впустую целое ядро CPU, когда база данных SQLite заблокирована другим соединением. Теперь чтение простаивает в ожидании снятия блокировки и остаётся доступным для отмены. #110248 (Groene AI). - Значения затраченного времени, скорости и отношения в сообщениях журнала и исключений теперь округляются до трёх цифр, поэтому числа вроде
1.345844286 sec.больше не выводятся с полной точностью. #110277 (Alexey Milovidov). - В веб-интерфейсе (Play)
BFloat16теперь распознаётся как число с плавающей запятой, и его столбцы выравниваются по правому краю и соответствующим образом раскрашиваются. #110433 (Alexey Milovidov). - Добавлена поддержка секции
SETTINGSдля движка таблицыPostgreSQLи табличной функцииpostgresql(например,SETTINGS postgresql_connection_pool_size = 50), что обеспечивает паритет возможностей с движкомMySQL. #110614 (Alexey Milovidov). SHOW CREATE TABLE(а такжеSHOW CREATE VIEW/SHOW CREATE DICTIONARY) теперь предлагает в сообщении об ошибке таблицу с похожим именем, если запрошенная таблица не существует, так же, как это делают запросыSELECT. #110633 (Alexey Milovidov).- Настройка
merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_onceтеперь включена по умолчанию: селектор слияний теперь автоматически уменьшает максимальное число частей, объединяемых за один раз, в зависимости от того, насколько заполнена партиция. См. #91163. #110726 (Mikhail Artemenko). - Команды очистки PostgreSQL
RESET,UNLISTENиDISCARDтеперь принимаются как операции без действия в PostgreSQL wire protocol, а не завершаются синтаксической ошибкой. Это улучшает совместимость с драйверами, такими как Skunk, которые отправляютRESET ALLиUNLISTEN *при установке и очистке соединения. #110780 (Alexey Milovidov). - Изменено значение по умолчанию настройки
auto_statistics_typesсbasic, uniqнаbasic, uniq_v2. #110878 (Han Fei). randomHadamardTransformтеперь вычисляет точное преобразование с сохранением длины для векторов любой длины, у которой наибольший нечётный множитель не превышает 64 (например,3584 = 512 * 7, что часто встречается в моделях эмбеддингов), расширяя прежние семейства2^N,2^k * {12, 20}и2^k * 9. Полное преобразование для длины, которую нельзя представить точно, теперь вызывает исключение вместо того, чтобы молча дополнять вектор нулями до большей длины; передайтеoutput_dims, чтобы вычислить усечённую проекцию произвольной длины. #111006 (Alexey Milovidov).- Исправлено исключение
LOGICAL_ERRORпри резервном копировании базы данныхReplicated, которая одновременно удаляется и создаётся заново; такие резервные копии теперь корректно завершаются ошибкойCANNOT_GET_REPLICATED_DATABASE_SNAPSHOT. #100651 (Alexey Milovidov). - Теперь, если zip-архив не удаётся распаковать, показывается реальная исходная ошибка (например, когда архив читается из S3, а буфер чтения не поддерживает
seek). Раньше фактическая ошибка скрывалась за общим сообщениемCouldn't unpack zip archive: Code = -100/Couldn't open zip archive. #105103 (Groene AI). - Исправлена сбивающая с толку подсказка “Maybe you meant X?” после перезапуска сервера (или
DETACH DATABASE/ATTACH DATABASE): при удалении уже удалённой таблицы в качестве альтернативы могло предлагаться только что удалённое имя. #106238 (Groene AI). - Исправлена логическая ошибка (
Logical error: 'removed', приводившая к аварийному завершению сервера в debug-сборках) в фоновой очереди удаления таблиц; она срабатывала, когда один и тот же явный UUID повторно использовался в нескольких запросахCREATE OR REPLACE TABLE, из-за чего в очередь попадало более одной удалённой таблицы с этим UUID. #107031 (Groene AI). - Исправлена логическая ошибка
Inconsistent AST formatting, которая могла аварийно завершить сервер в debug- и sanitizer-сборках, если лямбда-выражение с псевдонимом использовалось как операнд оператора доступа (элемент кортежа.Nили элемент массива[]) не на первой позиции в списке выражений, напримерSELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t. #107092 (Groene AI). - Табличная функция cluster (
urlCluster,fileCluster,s3Cluster, …), вложенная в другой распределённый запрос, напримерclusterAllReplicas(..., urlCluster(...)), теперь отклоняется с ошибкойBAD_ARGUMENTSвместо сбоя с логической ошибкой (Distributed task iterator is not initialized). #107107 (Groene AI). OPTIMIZE ... DRY RUN, прерванный из-за тайм-аута запроса (max_execution_timeсtimeout_overflow_mode = 'break'), теперь возвращаетTIMEOUT_EXCEEDEDвместо логической ошибки, связанной сrows_sources(которая приводила к аварийному завершению сервера в debug/sanitizer-сборках). #107114 (Groene AI).- Прекращено логирование безвредной ошибки
Net Exception: Socket is not connectedпри завершении сеансаZooKeeperна macOS.clickhouse keeper-clientбольше не выводит эту ложную ошибку в stderr при завершении работы. #107438 (Groene AI). - Исправлено переполнение знакового целого числа, когда refreshable materialized view повторно пытается выполнить неудавшееся обновление при
refresh_retries, установленном в очень большое значение (близкое к максимумуInt64). Это переполнение могло приводить к аварийному завершению сервера в сборках с sanitizer неопределённого поведения. #108005 (Groene AI). - Исправлен
LOGICAL_ERROR(аварийное завершение сервера в debug/sanitizer-сборках), возникавший, когдаJOINиспользует null-safe оператор сравнения (<=>/IS NOT DISTINCT FROM), а один из ключей — скалярный подзапрос, например... JOIN t2 ON (SELECT x FROM t1) <=> t2.k, при использовании старого анализатора (enable_analyzer = 0). Теперь такой запрос возвращает обычную ошибкуNOT_FOUND_COLUMN_IN_BLOCKвместо логической ошибки. #108123 (Groene AI). - Запросы векторного поиска, выбирающие столбец
_distance, теперь возвращают корректную ошибку вместо сбоя с логической ошибкой. #108423 (Robert Schulze). - Исправлен
std::future_error(The associated promise has been destructed prior to the associated state becoming ready), который мог возникать и приводить к аварийному завершению сервера в debug- и sanitizer-сборках, если не удавалось запланировать финальную асинхронную задачу завершения multipart upload для S3/Azure (например, при исчерпании пула потоков). Теперь вместо этого сообщается фактическая ошибка планирования. #108730 (Groene AI). - Устранены чрезмерный вывод логов сервера и слишком большое сообщение об ошибке при компиляции очень большого регулярного выражения (например, шаблона
LIKEилиmatchс сотнями тысяч подстановочных символов); теперь такие шаблоны завершаются с понятной ошибкойCANNOT_COMPILE_REGEXP. #108821 (Raúl Marín). - Исправлено неопределённое поведение при преобразовании в строку типа пакета протокола вне допустимого диапазона (например, в сообщениях об ошибках
Unexpected packet from server/Received ... packet) при рассинхронизированном или подвергнутом фаззингу соединении. #108885 (Groene AI). - Исправлена вводящая в заблуждение внутренняя ошибка (
Method getResultType is not supported for TABLE query tree node), возникавшая, когда табличное выражение использовалось как левый аргумент оператораIN; теперь такие запросы выдают понятное сообщение об ошибке. #109412 (Alexey Milovidov). - Исправлено чтение таблицы Iceberg с файлом метаданных, номер версии которого состоял только из цифр, но выходил за пределы диапазона 32-битного целого числа (например,
v99999999999999999999.metadata.json). Ранее такое имя приводило к неясномуstd::out_of_range(STD_EXCEPTION) вместо понятной ошибкиBAD_ARGUMENTS. #109619 (Groene AI). - Исправлена возможная ошибка
Logical error: 'ReadBuffer is canceled. Can't read from it.', возникавшая, когда построчный формат ввода (например,TSV/CSV) не мог разобрать входные данные, а базовое чтение уже было отменено (например, из-за некорректного HTTP-чанка или усечённого тела). Построение подробной диагностики разбора больше не читает данные из отменённого буфера. #109708 (Groene AI). - Фильтрующие выражения в row policy, использующие
arrayJoin(или его алиасunnest), теперь отклоняются с понятной ошибкой; ранее такие policy вызывали логическую ошибкуcolumn->size() == num_rowsво время выполнения запроса. #109753 (Raúl Marín). #109973 (Raúl Marín). - Чтение таблицы Paimon, чья схема содержит неподдерживаемый вложенный тип (например, поле
ROW), теперь сообщает понятную ошибкуBAD_ARGUMENTSс указанием неподдерживаемого типа вместо простогоDB::Exception. (OK)с кодом ошибки 0 и без сообщения. #109762 (Groene AI). - Исправлен
LOGICAL_ERROR(std::length_error), возникавший, когда запрос с экспериментальной настройкойmake_distributed_plan = 1использовал слишком большое значениеdistributed_plan_default_reader_bucket_countилиdistributed_plan_default_shuffle_join_bucket_count. Такие значения теперь отклоняются с ошибкойINVALID_SETTING_VALUE. #109770 (Groene AI). - Исправлен
LOGICAL_ERROR(query tree node does not have valid source node), возникавший, когда рекурсивный CTE разрешал идентификатор из внешней области видимости как коррелированный столбец (приallow_experimental_correlated_subqueries = 1). Такие запросы теперь возвращают понятную ошибкуUNSUPPORTED_METHOD. #109863 (Groene AI). - Исправлено переполнение знакового целого числа, когда
ORDER BY ... WITH FILLпропускает очень большой промежуток в столбцеInt64/UInt64(например, шаг 2 через промежуток вблизи 2^63). Такое переполнение приводило к неопределённому поведению при использовании sanitizer’ов и молча приводило к переполнению по кругу в release-сборках. #109937 (Groene AI). - Исправлена логическая ошибка
Bad cast from type DB::FunctionNode to DB::ConstantNode(аварийное завершение server в debug/sanitizer-сборках) при выполненииSELECT ... ORDER BY ... WITH FILLдля таблицыDistributedс низким значениемoptimize_const_name_size. #109938 (Groene AI). - Исправлена логическая ошибка
Invalid number of rows in Chunk, возникавшая, когда цельINTERPOLATEбыла псевдонимом столбцаWITH FILLпри использовании старого analyzer (enable_analyzer = 0). Такие запросы теперь отклоняются с понятной ошибкойINVALID_WITH_FILL_EXPRESSION. #110103 (Groene AI). - Исправлена логическая ошибка (аварийное завершение server в debug/sanitizer-сборках), возникавшая, когда функциям
indexHint/ignore/isZeroOrNullпередавался аргумент, тип которого разрешался вNothing, например внутри выражений вродеindexHint(assumeNotNull(materialize(NULL))). #110192 (Groene AI). - Исправлена логическая ошибка
Too large size (...) passed to allocator, которая могла возникать, когда для настройки размера буфера чтения, такой какmax_read_buffer_sizeилиmax_read_buffer_size_local_fs, задавалось значение вне допустимого диапазона. Такие значения теперь ограничиваются 256 MiB при проверке корректности настроек, а также дополнительно в месте использования дляINSERT ... FROM INFILE, который читает файлы внутри клиента ClickHouse, где эта проверка не применяется. #110207 (Alexey Milovidov). CHECK TABLEтеперь сообщает о фактическом повреждении projection part, если не удалось загрузить её metadata, вместо вводящей в заблуждение ошибкиColumns doesn't match ... Expected: 0 columns. #110262 (Raúl Marín).- Несоответствие типов, когда значение, прочитанное из источника PostgreSQL (например, через table function
postgresqlили движок таблицыPostgreSQL), не может быть разобрано в объявленный тип столбца (например, столбецtext, объявленный какInt32), теперь сообщается как корректная ошибка запроса; ранее это приводило к аварийному завершению server в debug- и sanitizer-сборках. #110264 (Groene AI). - Добавлена поддержка query profiler, profiler’ов памяти и trace, а также symbolization для
system.trace_logна macOS. #109825 (Raúl Marín). - Обновлен
chdigдо v26.7.1: сжатые трассировки стека для общего доступа, шаблоны запроса, поддержка памяти с раздельными Arena, улучшения Perfetto и исправления совместимости. #110938 (Azat Khuzhin). - Исправлен некорректный вывод монотонности для
intDivна беззнаковом ключе, деленном на знаковую константу, из-за которого могло отключаться отсечение по индексу основного ключа для предикатовIN/NOT IN, пересекающих знаковую границу результирующего типа; в отладочных сборках также возникалLOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex. #107586 (Groene AI). - Добавлена настройка
allow_lossy_numeric_supertype(по умолчанию отключена). Когда она включена,if,multiIf,coalesce,ifNull,arrayиmapдля числовых аргументов, у которых нет общего типа без потери точности (например,DecimalиFloat64илиInt64иFloat64), приводятся кFloat64вместоVariant, поэтому результат можно использовать с агрегатными функциями, такими какsum,avg,minиmax. Соответствующие сообщения об ошибках агрегатных функций теперь упоминают эту настройку по имени. Закрывает #106707. #107236 (Groene AI). - Конечная точка Prometheus (для конфигураций только с метриками) и асинхронный сбор метрик теперь запускаются до загрузки таблиц, чтобы метрики были доступны во время потенциально долгой фазы загрузки метаданных. #108402 (Christoph Wurm).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка, из-за которой
TRUNCATE TABLEиDROP PARTITIONзавершались сбоем на таблицах с большим количеством блоков дедупликации: их удаление одним запросом к ZooKeeper могло превысить ограничениеjute.maxbufferпо умолчанию в 1 МБ. #105991 (Clayton McClure). Это затрагивает только пользователей Apache ZooKeeper (не рекомендуется) вместо ClickHouse Keeper. - Исправлена работа с полными именами столбцов (
database.table.column) в предложенииWHEREмутаций, таких какDELETE FROMиALTER TABLE ... UPDATE/DELETE, для таблиц семействаMergeTree; ранее такие запросы завершались ошибкой об отсутствующих столбцах. Закрывает #71760. #109491 (Mikhail Artemenko). - Исправлен кэш результатов запросов для PromQL-запросов. Диалект
promqlобходил проверку недетерминированных функций и мог отдавать устаревшие результаты, привязанные кnow(); HTTP API Prometheus (/api/v1/query,/api/v1/query_range) при этом вообще не сохранял записи кэша. #110887 (Nikita Mikhaylov). - Исправлена ошибка, из-за которой сервер не запускался, если переменная окружения
TZбыла пустой. Закрывает #68920. #68921 (Ardenwick). - Исправлена ошибка, из-за которой сервер не запускался, если движок базы данных
Backupссылался на ставшую недоступной резервную копию (например, если её файлы были удалены или нижележащее хранилище недоступно). Теперь база данных загружается без таблиц, вместо того чтобы препятствовать запуску всего сервера. #83188 (Vitaly Orlov). - При использовании фоновых вставок в таблицы с движком
Distributedзадержки, вызванные повторяющимися ошибками при отправке данных на удалённые шарды, теперь уменьшаются после устранения этих ошибок. Ранее задержка могла только расти и никогда не сбрасывалась. #87378 (Andrei Kochemirovskii). - Исправлены
broken_data_filesвsystem.distribution_queueи метрикаBrokenDistributedFilesToInsert, которые всегда показывали0для повреждённых файлов, обнаруженных при сканировании очереди async-insert движкаDistributedпри запуске. #92124 (KG.Xu). - Исправлено восстановление логирования после переполнения диска. Ранее, когда диск для логов заполнялся, ClickHouse переходил в состояние сбоя и непрерывно засорял syslog сообщениями об ошибках (потенциально записывая более 100 ГБ/час), не восстанавливаясь даже после освобождения места на диске. Теперь система логирования автоматически восстанавливается, как только на диске снова появляется место, без необходимости перезапуска сервера. #93127 (jaehanbyun).
- Статические учётные данные S3 теперь передаются при чтении таблиц Unity
DataLakeCatalog, когдаvended_credentialsотключён, что предотвращает ошибки анонимного доступа к объектному хранилищу. #96910 (kgeg401). - Исправлен сбой в коде разбора схемы движка таблицы
DeltaLake. #97112 (Kseniia Sumarokova). - Исправлена проблема безопасности, из-за которой неаутентифицированный TCP-клиент мог проверять существование таблиц и состояние репликации через interserver-порт. #99854 (Shaohua Wang).
- Исправлена синтаксическая ошибка, возникавшая, когда за подзапросом в
DESCRIBE TABLEследует псевдоним. Исправляет #100031. #100205 (Yarik Briukhovetskyi). - Исправлено Исключение в correlated subqueries, возникавшее, когда outer columns становились
Nullableприgroup_by_use_nullsсROLLUP/CUBE. #100365 (Alexey Milovidov). - Исправлено аварийное завершение server (в сборках с sanitizer) и незаметная потеря данных при запуске table, когда откаченная transactional часть
MergeTreeпересекается с committed частью. #100992 (Tuan Pham Anh). - Исправлен возврат некорректных результатов функцией
indexOfAssumeSortedдля столбцовArray(LowCardinality(String))в таблицахMergeTree. #101771 (Yash ). - Исправлено некорректное pruning по primary key, когда ключ сортировки table оборачивает столбец
DateвtoDateTime(например,ORDER BY toDateTime(date_column)), а запрос фильтрует по исходному столбцу сравнением видаWHERE date_column >= '...'.toDateTime(Date)вызывает overflow для значенийDate, выходящих за диапазонDateTime(после2106-02-07), поэтому сохранённый ключ становится немонотонным; ClickHouse больше не использует pruning по primary key для этой комбинации ключа и предиката, поскольку это могло бы отбросить granules, содержащие подходящие строки. Закрывает #101744. #101814 (Nihal Z. Miaji). - Исправлено поведение, при котором
intDivOrNull,moduloOrNullиpositiveModuloOrNullвозвращали0вместоNULL, аintDivOrNullиintDivOrZeroвызывали исключение вместо возвратаNULL/0, когда деление приводило к исключению с плавающей запятой (деление на ноль илиINT_MIN / -1), в том числе для смешанных signed/unsigned argument. #101976 (Yarik Briukhovetskyi). - Исправлены Исключения
LOGICAL_ERRORпри чтении таблицIcebergилиDeltaLakeв редких случаях, таких как concurrent обновления metadataIcebergили чтение черезmergetable function поверх таблицDeltaLake. #102033 (Groene AI). - Исправлена ошибка, из-за которой исходящие HTTP request (например, функция
aiGenerate, table functionurl, S3) завершались сNo route to hostна хостах, у которых объявлены и IPv4-, и IPv6-адреса, когда маршрутизируется только одно семейство адресов. HTTP connection pool теперь переключается на следующий разрешённый адрес, если первый завершается сетевой ошибкой, вместо того чтобы сразу возвращать ошибку уже при самом первом request. #103786 (Alexey Milovidov). - Исправлено аварийное завершение server во время
RESTOREрезервных копий, содержащих таблицы с циклическими dependencies. #103824 (Konstantin Bogdanov). - Schema inference для столбцов Arrow
time32/time64(например,SELECT * FROM file(..., 'Arrow')) теперь определяетTime64вместоDateTime64; всё, что далее зависит от ранее определявшегося типа, после обновления будет видеть новый тип. Кроме того, значенияTime/Time64теперь можно экспортировать в Arrow с выбором подходящего временного типа Apache Arrow в зависимости от precision. Исправляет #104038. #104316 (/bin/cat). - Исправлена race condition между
ALTER TABLE ... RENAME COLUMNи конкурентнымOPTIMIZE TABLE ... FINAL(или любым фоновым merge) вMergeTree, из-за которой данные переименованного столбца могли незаметно заменяться значениями по умолчанию. #104822 (Groene AI). - Исправлена logical error
Block structure mismatch, возникавшая при конкурентномINSERT, пока выполняетсяALTER TABLE ... RENAME COLUMN, в базе данныхAtomicсlazy_load_tables = 1послеDETACH DATABASE/ATTACH DATABASE. #104852 (Groene AI). - Исправлено поведение
groupConcat, когда смешиваются параметрическая форма и форма с двумя аргументами, напримерgroupConcat(',', 2)(x, '/'): параметр, ограничивающий число строк, незаметно игнорировался, поэтому возвращались все строки вместо запрошенного количества; теперь разделитель из второго аргумента корректно переопределяет параметр. #104882 (Yarik Briukhovetskyi). - Исправлена
LOGICAL_ERROR(Expected one block from input stream), возникавшая вKILL QUERY/KILL MUTATION/KILL PART_MOVE_TO_SHARD/KILL TRANSACTION, когда ихWHEREclause содержит подзапрос, вычисляемый для каждой строки, либо когдаmax_block_sizeнастолько мал, что внутреннийSELECTпо соответствующей таблицеsystem.*выдаёт более одного блока. #104927 (Groene AI). - Исправлен
CASTиз меньших interval в более крупные, возвращавший неверные результаты (например,CAST(toIntervalSecond(60) AS IntervalMinute)возвращал0вместо1). Закрывает #104986. #105058 (Yarik Briukhovetskyi). - Исправлена logical error (
Assertion 'row < chunk.getNumRows()' failed) в запросахLIMIT ... WITH TIES, выполняемых с конвейером чтения в порядке сортировки (optimize_read_in_order = 1иread_in_order_use_virtual_row_per_block = 1). #105102 (Groene AI). - Исправлена утечка в refreshable materialized views (
MATERIALIZED VIEW ... REFRESH ...): временную внутреннюю таблицу, которую refresh выводил из использования черезEXCHANGE TABLES, нельзя было удалить, если её размер превышалmax_table_size_to_drop, поэтому каждый последующий refresh создавал ещё одну временную внутреннюю таблицу, увеличивая каталог данных представления, пока не заканчивалось место на диске. Внутренний drop в задаче refresh теперь обходитmax_table_size_to_dropиmax_partition_size_to_drop; эти защитные ограничения по-прежнему применяются к выполняемому пользователемDROP TABLEсамого представления. Закрывает #104900. #105106 (Groene AI). - Исправлена неожиданная ошибка
DATA_TYPE_CANNOT_BE_USED_IN_KEYв запросахALTER, которые не изменяют ключ сортировки (изменение settings, comments, codecs, добавление столбца, не входящего в ключ, и т. д.), для таблицMergeTree, у которых в ключе сортировки используетсяSimpleAggregateFunction(или другой тип, допустимый только приallow_suspicious_primary_key = 1). #105111 (Groene AI). - Исправлено обращение к уже освобождённой памяти при запросе столбцов состояния реплик
system.clusters(таких какis_active,unsynced_after_recovery,recovery_time) в момент, когда база данныхReplicatedудаляется или отсоединяется. Кроме того, безвредные исключения Keeper, которые в этом участке кода ранее подавлялись (затронутая база данных считается временно недоступной и пропускается), теперь записываются в журнал с уровнемInformationвместоError, поэтому при значении по умолчаниюsend_logs_level = 'warning'они больше не доходят до клиентов. #105149 (Groene AI). - Исправлена проблема, из-за которой при выполнении нескольких команд в
clickhouse-local --ignore-errorв сообщение об ошибке для каждой лексической ошибки или ошибки несогласованных скобок попадали все последующие команды. #105480 (Groene AI). - Исправлен редкий сбой server, возникавший при одновременном удалении или замене refreshable materialized views и планировании их обновления. #105588 (Groene AI).
- Для таблиц
Iceberg, у которых формат файла данных неParquet,ALTER TABLE ... DELETEиALTER TABLE ... UPDATEтеперь отклоняются с понятной ошибкойNOT_IMPLEMENTEDвместо сбоя server или незаметного повреждения таблицы. #105893 (Groene AI). - Исправлены неверные результаты для представления, определённого с помощью
EXCEPTилиINTERSECT, если его операндом была цепочкаUNION, послеDETACH/ATTACHили перезапуска server. Форматтер не добавлял скобки вокруг дочерних выраженийUNIONуINTERSECT/EXCEPT, из-за чего сохранённый SQL повторно разбирался с обратным старшинством. #105935 (Groene AI). - Исправлено ошибочное определение данных
JSONкакTSKVпри автоопределении format. Закрывает #100797. #106009 (Pavel Kruglov). - Запрещено создавать индекс пропуска данных
minmaxнепосредственно на столбцахJSON— впоследствии это могло приводить к сбою вставки с исключениемNO_COMMON_TYPE, когда вставлялись массивы со смешанными типами. Вместо этого создавайте индекс на типизированных подстолбцах (например,INDEX idx json.field TYPE minmax). #106094 (linhaojie). - Исправлена logical error (
Parsed partition value ... doesn't match partition value for an existing part with the same partition ID), возникавшая при выполненииOPTIMIZE TABLE ... PARTITION ...и других запросов, которые определяют значение партиции, в таблицах с ключом партиционирования типаTime. #106202 (Groene AI). - Исправлена ситуация, при которой data part ошибочно помечалась как имеющая повреждённую projection после того, как легковесное удаление не оставляло после себя projection part — либо когда projection пересобиралась с нулевым количеством выходных строк, либо когда она удалялась (
lightweight_mutation_projection_mode = 'rebuild'/'drop'). Это состояние ранее отключало оптимизацию projection для запросов к этой part. #106273 (Shaohua Wang). - Исправлено поведение
removeDirectoryна дисках объектного хранилищаplain(таких какs3_plain): он удалял все файлы внутри непустого каталога так, как будто удаление было рекурсивным; теперь удаление непустого каталога завершается ошибкойCANNOT_RMDIR, а рекурсивное удаление явно обрабатывает его содержимое. #106281 (RinChanNOW). - Исправлена logical error (
Part ... doesn't exist), которая могла прервать работу server во время recovery quorumINSERTпосле аппаратной ошибки Keeper, если quorum одновременно помечался как завершившийся неудачей. #106424 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORиз-за дублирующихся имен столбцов при применении политик доступа на уровне строк. #106438 (János Benjamin Antal). - Исправлено поведение
CREATE OR REPLACE TABLEиREPLACE TABLE, при котором на диске оставалась «зависшая» таблица_tmp_replace_*, а исходная таблица заменялась пустой, если размер существующей целевой таблицы превышалmax_table_size_to_drop. Теперь проверка размера выполняется до подмены, поэтому при нарушении операция корректно прерывается, а в сообщении об ошибке используется видимое пользователю имя таблицы. #106782 (Groene AI). - Исправлено поведение
JSON_QUERY/JSON_VALUE/JSON_EXISTS, которые возвращалиDynamicвместоString/UInt8для аргументов типаDynamic. Закрывает #106461. #106877 (Pavel Kruglov). - Исправлены неверные результаты при запросах к таблице
ReplacingMergeTreeсFINALи фильтром по текстовому индексу, когда был включенquery_plan_optimize_lazy_final. Отложенная оптимизацияFINALстроила шаги чтения, которые не воспроизводили прямое чтение из текстового индекса, из-за чего фильтр отбрасывал все подходящие строки. #106894 (Jimmy Aguilar Mena). query_masking_rulesтеперь применяется к сообщениям, дописываемым к исключениям, чтобы учетные данные, закодированные для URL, в суффиксах(in file/uri ...)ошибок из табличных функцийjdbc/odbcне раскрывались при настроенных правилах маскирования. #106916 (Gaurav Dubey).- Исправлена проблема, из-за которой части помечались как поврежденные и переводились в состояние detached при любой перезагрузке части (перезапуске сервера,
DETACH/ATTACH) для таблиц со столбцомLowCardinality(Nullable(...))в ключе партиционирования. Начиная с 26.5, для каждой части не записывался файл индекса minmax, если минимальное и максимальное значения такого столбца былиNULL, при этом проверка целостности части по-прежнему требовала этот файл. Части, записанные затронутыми версиями, не содержат файл индекса minmax и по-прежнему требуют повторногоATTACHвручную. Закрывает #106837. #106945 (Pedro Ferreira). - Исправлено исключение
LOGICAL_ERROR(Unexpected expression in JOIN ON section. Expected boolean (UInt8), got 'Nothing'), возникавшее, когда предикат неэквивалентногоJOIN ... ONссылался на столбец типаNothing, например созданный с помощьюARRAY JOIN []. #106981 (Groene AI). - Исправлены редкое исключение
LOGICAL_ERROR(Attempt to release query context that does not exist) и сопровождавший его сбой сервера при чтении таблицMergeTreeчерез диск файлового кэша, созданный сenable_filesystem_query_cache_limit = 1. #107028 (Groene AI). - Исправлен сбой сервера при перемещении пустой части на диск
plain_rewritable(например, с помощьюALTER TABLE ... MOVE PARTITION ... TO DISKдля пустой части, сохраненной из-заremove_empty_parts = 0). #107040 (Groene AI). - Исправлен неверный порядок строк в запросах
ORDER BYкUNION ALLпри включенныхoptimize_read_in_orderиread_in_order_use_virtual_row. Закрывает #106879. #107053 (Vladimir Cherkasov). - Исправлен
LOGICAL_ERROR(Unsupported argument types) в функцииgeohashesInBox, возникавший, когда её аргументы координат содержали смесь константных и неконстантных значений или когда координата имела типBFloat16. Смешанные const/non-const аргументыFloat32теперь работают, а аргументыBFloat16отклоняются с понятной ошибкой. #107063 (Groene AI). - Исправлены неверные результаты (дублирующиеся строки) для
SELECT DISTINCTповерхGROUP BYсWITH CUBE,WITH ROLLUPилиGROUPING SETSпо тем же ключам. Оптимизацияquery_plan_remove_redundant_distinctбольше не удаляетDISTINCTв этих случаях, поскольку модификаторы группировки создают дополнительные строки, в которых столбцы ключа получают значения по умолчанию, и они могут совпадать с реальными значениями групп. #107072 (Groene AI). - Исправлен неверный результат в
OUTER JOIN, когда фильтрWHEREпредставляет собой конъюнкцию с константным членом (например,p AND 1илиWHERE p QUALIFY NULL, гдеQUALIFY NULLобъединяется сWHERE). Константная часть конъюнкции могла быть протолкнута в неподлежающую сохранению сторону JOIN и удалена из фильтра после JOIN, из-за чего JOIN создавал несовпавшие строки со значениями по умолчанию в столбцах этой стороны, и эти строки ошибочно проходили фильтр. #107084 (Groene AI). - Исправлено поведение пользовательских функций
executable_pool, настроенных с<lifetime>, из-за которого они не подхватывали изменения в базовом скрипте. Ранее толькоSYSTEM RELOAD FUNCTIONSперечитывал изменённый скрипт; периодические перезагрузки по<lifetime>продолжали выполнять старую версию. #107087 (Groene AI). - Исправлено исключение
LOGICAL_ERROR(Cannot find input column ... on its position in inputs of expression actions DAG) для коррелированного скалярного подзапроса над источником, который дважды проецирует один и тот же идентификатор столбца (например,SELECT number, *), когдаcorrelated_subqueries_default_join_kind = 'left'. #107112 (Groene AI). - Исправлена гонка данных в глобальном для server сборщике трассировок между worker thread, запускающим свой профилировщик, и остановкой server. #107307 (Groene AI).
- Инкрементные резервные копии больше не сохраняют учётные данные
S3в локаторе<base_backup>файла метаданных.backup. Резервные копии, созданные сuse_same_s3_credentials_for_base_backup = 1или с явными учётными данными базовой резервной копии, совпадающими с локатором этой резервной копии, сохраняют несекретный маркер и восстанавливаются без дополнительных настроек на этапе восстановления; для резервных копий, созданных с другими явными учётными данными базовой резервной копии или дополнительными аргументами authentication для базовой резервной копии, передавайте их вRESTOREс настройкойbase_backup. Резервные копии, созданные старыми версиями со встроенными учётными данными, по-прежнему можно восстановить. #107357 (Pablo Marcos). - Исправлена ситуация, когда заголовок
CSVWithNamesиCSVWithNamesAndTypesсодержал меньше столбцов, чем данные, если включенаoutput_format_csv_serialize_tuple_into_separate_columns(по умолчанию). Заголовок (и строка с типами) теперь разворачивает столбцыTupleв конечные поля с точечными именами (например,t.a,t.b), так что число столбцов в заголовке соответствует данным. Это поведение управляется новой настройкойoutput_format_csv_header_serialize_tuple_into_separate_columns(по умолчанию1); её можно установить в0, чтобы вернуть прежний заголовок с одним именем. #107371 (Groene AI). - Исправлено чтение таблиц
Icebergv3, чьи data filesParquetсодержат зарезервированные столбцы происхождения строк (например,_row_id); встроенный readerParquetбольше не вызываетICEBERG_SPECIFICATION_VIOLATIONдля зарезервированных идентификаторов field, которые не входят в schema table. #107377 (Greg Maher). - Исправлено редкое аварийное завершение server при остановке (
std::future_error:The associated promise has been destructed prior to the associated state becoming ready), вызванное тем, что запланированная задача удалялась из очереди пула потоков до запуска. #107383 (Groene AI). - Исправлены движки table и database
MaterializedPostgreSQL: теперь можно реплицировать одну table или database из схемы PostgreSQL, отличной от схемы по умолчанию (materialized_postgresql_schema), в том числе если table с одинаковыми именами существуют в нескольких схемах одной и той же database (раньше они использовали общие публикацию и слот репликации и конфликтовали друг с другом). #107425 (Alexey Milovidov). - Исправлена остановка репликации всей database в
MaterializedPostgreSQL(сLOGICAL_ERROR: Columns number mismatch), если структура одной реплицируемой table менялась, пока server был недоступен. Теперь пропускается только затронутая table, и ее можно восстановить с помощьюDETACH/ATTACH. #107427 (Alexey Milovidov). BACKUPdatabaseMaterializedPostgreSQLбольше не зависает навсегда сTable ... were created or changed its definition during scanning, а также теперь действительно сохраняет данные table в резервную копию (это делегируется базовомуReplacingMergeTree), которую затем можно восстановить как автономныйReplacingMergeTree. #107433 (Alexey Milovidov).- Исправлена регрессия, из-за которой настройка
compatibility = '26.6'(неявно включающая стратегию партиционированияhive) молча принимала{_partition_id}в путях table S3/Объектное хранилище вместо того, чтобы выдаватьBAD_ARGUMENTS. #107437 (Lefteris). - Исправлена утечка памяти во встроенном
mongo-c-driver, которая могла возникать при чтении из MongoDB (например, через словарь MongoDB или table functionmongodb), если за retryable-ошибкой чтения следовал неудачный повторный выбор server. #107448 (Groene AI). - Исправлено Исключение при вставке в table
Iceberg, чьи metadata были созданы external engine и не содержали необязательных массивовsnapshots,metadata-logилиsnapshot-log. Теперь такие вставки завершаются успешно, а не с ошибкой. #107473 (Shaohua Wang). - Исправлено требование привилегии
ALTER UPDATEдляDELETE FROM(легковесное удаление) в дополнение кALTER DELETE. Теперь пользователь, которому выдана толькоALTER DELETE, может выполнятьDELETE FROM, как и указано в документации. #107491 (Shaohua Wang). - Исправлен
NOT_FOUND_COLUMN_IN_BLOCKпри чтении файлов, партиционированных Hive, сuse_hive_partitioning = 1и предложениемWHERE/PREWHERE, которое фильтрует реальный (не виртуальный) столбец, при этом также выбирается столбец партиции Hive. #107505 (Groene AI). - Исправлен
LOGICAL_ERROR(Different order of columns in UNION subquery), возникавший, когда старый analyzer (enable_analyzer = 0) читал подмножество столбцов из подзапроса, у которого дочерние элементыUNIONпредставляют собой операции над множествамиINTERSECT/EXCEPT. #107511 (Groene AI). - Исправлено молчаливое преобразование значений
NULLв пустые строки при вставке данныхArrow/ORCв столбецLowCardinality(Nullable(...)). Эта регрессия появилась в 26.5. #107532 (Jimmy Aguilar Mena). - Исправлена логическая ошибка (
Stream ... variant_discr ... is not found), которая могла возникать при слиянии или чтении частиMergeTree, созданной в результате мутации таблицы со столбцомDynamic. #107562 (Alexey Milovidov). - Исправлена логическая ошибка (
WhichDataType(const_type).isArray()), возникавшая при анализе первичного ключа, когдаpointInPolygonвызывается с константным аргументом-полигоном обёрточного типа, напримерVariantилиDynamic(например,pointInPolygon((x, y), if(c, [(0, 0), ...], NULL))). #107589 (Groene AI). - Исправлена логическая ошибка (
Last stored last_written_position in meta file ... is bigger than current last_written_pos) в движкеFileLog, которая могла возникать, если отслеживаемый файл удаляли и создавали заново с повторным использованием того же inode. #107617 (Groene AI). - Исправлено редкое аварийное завершение сервера (
std::future_error:The associated promise has been destructed prior to the associated state becoming ready) при обработке запроса клиента ZooKeeper, когда асинхронный запрос к Keeper отбрасывался во время отправки, например при нехватке памяти. #107647 (Groene AI). - Исправлен
RESTOREдля таблицReplicatedMergeTree: части с дублирующимся содержимым из резервной копии теперь сохраняются, а не дедуплицируются молча. #107652 (Pablo Marcos). - Исправлен runtime join filter, из-за которого для столбцов
JSONмогли возвращаться неверные результаты. Закрывает #107646. #107663 (Pavel Kruglov). - Исправлены некорректные результаты распределённых запросов, выбирающих столбцы
ALIASс общим подвыражением: столбцы могли смещаться, и значения возвращались не под тем столбцом. #107675 (Vladimir Cherkasov). - Квоты с ключом
normalized_query_hashтеперь учитывают все ресурсы (read_rows,read_bytes,result_rows,result_bytes,execution_time,written_bytes,errors) для каждого шаблона запроса, как и счётчики количества запросов, вместо того чтобы учитывать их в одном общем бакете на пользователя. #107681 (Alexey Milovidov). - Исправлена логическая ошибка
Block structure mismatch in UnionStep stream(аварийное завершение сервера в debug/sanitizer builds,Code: 49в release builds), которая возникала, когда соседние ветви вUNION/INTERSECT/EXCEPTразличались только условиемWHERE, и условие одной из ветвей сворачивалось в константный столбецConst. #107719 (Groene AI). - Исправлены логические ошибки (
Bad cast), вызванные несогласованным удалениемLowCardinality, вложенного в столбцыVariantиDynamic, например вconcat,formatи при анализе первичного ключа. Закрывает #107598. #107773 (Pavel Kruglov). - Исправлен серьёзный перекос в распределении работы при использовании параллельных реплик, когда кластер содержит неактивные реплики (например, устаревшие записи, оставшиеся после автомасштабирования). Такие реплики больше не учитываются координатором чтения, поэтому нагрузка распределяется между активными репликами, а не сваливается на одну из них. #107805 (Alexey Milovidov).
- Исправлено исключение
Not-ready Set is passed as the second argument, которое могло возникать, если при построении множества для подзапросаINво время анализа primary key сбой происходил без явной ошибки (например, тайм-аут подзапроса сoverflow_mode = 'break'), из-за чего множество навсегда оставалось непостроенным в конвейере выполнения запроса. #107924 (Alexey Milovidov). - Исправлен сбой сервера в predicate pushdown (
enable_optimize_predicate_expression, legacy analyzer), когда подзапросUNIONвстречается внутри условияJOIN ... ON. #107930 (Groene AI). - Исправлены ложные ошибки
CHECKSUM_DOESNT_MATCHи ошибки чтенияParquet(а для некоторых форматов — и незаметно неверные результаты), возникавшие, когда объект S3 или S3-compatible (например, GCS) перезаписывался на месте во время чтения. Теперь такие операции чтения завершаются понятной, retryable ошибкой, а не возвращают данные, сшитые из двух версий объекта; поведение управляется новой настройкойs3_validate_etag_on_read(включена по умолчанию). #107934 (Shaohua Wang). - Исправлена ошибка
SELECTсNOT_FOUND_COLUMN_IN_BLOCKна таблице с data-skipping индексомset, когда ROW POLICY фильтрует её с помощью всегда истинного условия в сочетании с проверкой по неиндексированному столбцу. #107971 (Shaohua Wang). - Исправлен parsing параметров команды executable user-defined function: плейсхолдеры с пустыми или недопустимыми именами больше не принимаются как параметры. #107983 (Goutam Adwant).
- Исправлена регрессия производительности для подстолбцов
MapсPREWHERE. Закрывает #107912. Вызвана изменением #99200. #107988 (Pavel Kruglov). - Исправлена запись за пределы допустимого диапазона при чтении столбца
Variantиз повреждённого блокаNative, в котором discriminator’ы ссылаются на несуществующий индекс варианта. #107991 (uwezkhan). - Исправлены неверные query results из-за некорректного pruning по primary key и партициям, когда
toStartOfDay,toStartOfISOYear,toDaysSinceYearZero,toRelativeSecondNum,toRelativeMinuteNum,toRelativeHourNum,toRelativeWeekNum,toRelativeDayNum,toMonthNumSinceEpochилиtoYearNumSinceEpochприменяется к key columnDate32, содержащему даты вне диапазона, представимого этой функцией (в частности, даты до1970-01-01). Эти функции сообщают primary index, что они монотонны, но раньше для таких arguments происходило переполнение с циклическим переходом, из-за чего индекс мог отбрасывать granules, которые на самом деле содержали подходящие строки; теперь значения насыщаются на границах типа результата, а сами функции сохраняют монотонность во всём диапазонеDate32. #108018 (Nihal Z. Miaji). - Исправлен
accurateCastOrNullдляTuple, элемент которого имеет типDynamic/Variant: настоящий исходныйNULLтрактовался как ошибка преобразования. Для целевого элементаNullableисходныйNULLтеперь остаётся элементомNULL(как и в случае с обычным источникомTuple(Nullable(...))); для целевого элемента безNullableисходныйNULLтеперь делаетNULLвесь кортеж вместо подстановки значения элемента по умолчанию; ошибки разбора/переполнения по-прежнему делаютNULLвесь кортеж. #108023 (Groene AI). Также исправлена логическая ошибка при приведении столбцаDynamicилиVariant, вложенного вTuple, к типу элемента безNullableс помощьюaccurateCastOrNullилиaccurateCastOrDefault. #108061 (Alexey Milovidov). - Исправлена ошибка, из-за которой
numericIndexedVectorPointwiseMultiplyвозвращала пустой результат при умножении на вектор, полностью состоящий из единиц, но с другой конфигурацией BSI (bit-sliced index). #108027 (Alexey Milovidov). - Исправлена ошибка, из-за которой
toTime64иCAST(... AS Time64)не ограничивали выходящие за диапазон значения пределами диапазонаTime64в режимах переполненияsaturateиignore, что могло приводить к появлению значений, которые отображаются одинаково, но сравниваются как разные. #108028 (Alexey Milovidov). getClientHTTPHeaderтеперь корректно считается недетерминированным, поэтому его результат больше не переиспользуется по ошибке кешем результатов запросов. #108029 (Alexey Milovidov).clickhouse-client --port 9440снова автоматически включает защищённое соединение (TLS); это перестало работать после рефакторинга, из-за которого порт перестал передаваться в проверку защищённого соединения. #108032 (Alexey Milovidov).- Временная ошибка при обновлении частей данных таблицы только для чтения больше не приводит к полной остановке фоновой задачи обновления. #108034 (Alexey Milovidov).
- Исправлено отставание предупреждений о перегрузке памяти/CPU/мутаций в
system.warningsна один цикл асинхронных метрик (и их отсутствие в первом цикле). #108035 (Alexey Milovidov). - Табличная функция
mongodbтеперь принимаетoid_columns, переданный как именованный argument (например,oid_columns='_id'), вместо того чтобы отклонять его сBAD_ARGUMENTS. #108039 (Alexey Milovidov). - Исправлено Исключение
Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>(логическая ошибка), возникавшее, когда квалифицированная звёздочка (t.*) выбирает ключJOIN USING, а этотJOINвложен подPASTE/CROSS/JOIN через запятую или внешнийONJOIN, приjoin_use_nulls = 0. #108043 (Groene AI). - Исправлена некорректная обработка утверждений нулевой ширины (
\b,^,$) в regexp-функциях “match all”extractAll,extractAllGroupsVertical,extractAllGroupsHorizontal,countMatchesиsplitByRegexp. Например,extractAll('new york is the greatest', '\b(\w)')теперь корректно возвращает первую букву каждого слова, а не каждую букву. #108047 (Alexey Milovidov). - Исправлено поведение
CREATE TABLE ... AS SELECTв базах данныхAtomic, из-за которого после сбоя запроса оставалась пустая таблица — например, когда у пользователя нет доступа к таблице, на которую ссылается подзапрос. Ранее при повторной попытке вместо исходной ошибки сообщалось, что таблица уже существует. Теперь таблица создаётся через временную таблицу и становится видимой только после полного заполнения. #108048 (Alexey Milovidov). - Разрешено выполнять запросы к словарю
range_hashedилиcomplex_key_range_hashed, использующему диапазонDateTime64,Decimalили диапазон с плавающей запятой, с соответствующим аргументом дляdictGet/dictHas. Ранее такие запросы завершались ошибкойmust be convertible to Int64, а открытые интервалы диапазоновDecimal/DateTime64некорректно возвращали значение по умолчанию. #108052 (Alexey Milovidov). - Исправлено Исключение (
CANNOT_PARSE_TEXT) при загрузке словаря с составным ключом, если столбцы ключа не были первыми в определении словаря, для локального sourceClickHouse, использующего явный запрос. Теперь исходные столбцы сопоставляются со структурой словаря по имени, а не по позиции. #108053 (Alexey Milovidov). - Исправлена ошибка в table function
values, из-за которой возникалARGUMENT_OUT_OF_BOUND, если использовался десятичный литерал, который нельзя точно представить в узком столбце с плавающей запятой (например,0.1для столбцаFloat32), например:SELECT * FROM values('x Float32', 0.1). Теперь такие значения принимаются и преобразуются в ближайшее представимое значение, как и вCASTиINSERT ... VALUES. #108055 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR(No available columns) при выполненииSELECT count()(или других тривиальных запросов) на таблице, где пользователю предоставлена привилегияSELECTтолько для столбцаALIAS. #108056 (Alexey Milovidov). - Исправлено поведение
mapFilter,mapSort(и его вариантов) иmapConcat, из-за которогоLowCardinalityудалялся из типов ключа и значения уMap. РанееmapFilterдля столбцаMap(LowCardinality(String), String)возвращалMap(String, String), что могло повредить метаданные таблицы, созданной черезCREATE TABLE ... AS SELECT, и приводить к сбоюCHECK TABLE. #108057 (Alexey Milovidov). - Исправлены некорректные результаты при использовании
hasTokenна текстовых индексах с токенизатором, отличным отsplitByNonAlpha. #108066 (Robert Schulze). - Исправлено зависание
SYSTEM RELOAD DICTIONARIES(иRELOAD DICTIONARY), возникавшее, когда множество MySQL-словарей, определённых в XML, использовали один общий пул соединений черезshare_connection. Теперь такие пулы учитываютconnection_pool_sizeиconnection_wait_timeout(по умолчанию 5 секунд) из конфигурации, как и словари, определённые через named collections. #108083 (Alexey Milovidov). - Разрешён
EXISTS <dictionary>для пользователя, у которого есть только привилегияSHOW DICTIONARIESна словарь (ранее требовалсяSHOW TABLES). #108084 (Alexey Milovidov). - Исправлено поведение
CREATE TABLE dst AS src SETTINGS ...(и аналогичных вариантов сORDER BY/PARTITION BY, но без явногоENGINE), которое молча отбрасывало движок исходной таблицы, секции хранения (например, табличныйTTLи ключи) и настройки. Теперь движок и не переопределённые секции хранения наследуются от исходной таблицы, а указанные настройки объединяются с настройками исходной таблицы поверх них. #108085 (Alexey Milovidov). - Исправлена ошибка, из-за которой
INSERTв таблицыMergeTreeзавершался сбоем сfilesystem error: in rename: Permission deniedв файловых системах на базе Windows (WSL, CIFS/SMB, Docker Desktop bind mounts). Причиной было то, что компонент записи part оставлял файловые дескрипторы открытыми во время переименования каталога part. #108089 (Alexey Milovidov). - Исправлен сбой (разыменование нулевого указателя) при выполнении запроса к таблице
Hiveбез секцииWHERE, напримерSELECT * FROM hive_table. #108094 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR(“Unexpected return type from if”) при чтении столбца сapply_mutations_on_fly = 1послеALTER UPDATE col = ... WHERE <cond>с неконстантным или ложным условием, за которым следуетALTER MODIFY COLUMN col <new type>. #108128 (Groene AI). - Исправлено поведение
toStartOfIntervalиdateTrunc, которые возвращали округлённое значение вместо начала содержащего интервала, когда входные данные имели более высокую точность, чем единица интервала. Например,toStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond)возвращал10:11:12.001вместо10:11:12.000. Перегрузка с явно заданной точкой отсчёта тоже была затронута. Закрывает #103535. #108186 (Yarik Briukhovetskyi). - Скрыта конфиденциальная информация в столбце
view_queryтаблицыsystem.query_views_log. #108214 (Valerii Mordovskii). - Исправлено зависание таблицы
MergeTree, присоединённой с устаревшим индексом пропуска данныхhypothesis(удалённый тип индекса, сохранённый только для совместимости сATTACH). Ранее легковесныйDELETE,OPTIMIZE, обычныйINSERTили отфильтрованныйSELECTдля такой таблицы завершались ошибкойILLEGAL_INDEX(“Index of type ‘hypothesis’ is no longer supported”), а мутацияDELETEбесконечно повторялась. Теперь такой индекс считается инертным: он без изменений переносится при merge/мутациях, пропускается при вставке и планировании запросов, и его по-прежнему можно удалить с помощьюALTER TABLE ... DROP INDEX. #108217 (Groene AI). - Исправлено то, что настройка
type_json_allow_duplicated_key_with_literal_and_nested_objectне работала с типизированными путями вJSON. #108218 (Pavel Kruglov). - Исправлен
LOGICAL_ERROR(Different list of shards in child plans) при выполнении запроса сmake_distributed_plan = 1к таблицеMergeTree, у которой есть обычная или агрегатная проекция. #108256 (Groene AI). - Исправлены
replaceRegexpOneиreplaceRegexpAll, чтобы.по умолчанию сопоставлялся с символами новой строки, как и в других функциях регулярных выражений. #108265 (linjiayu1025-collab). - Исправлена логическая ошибка при приведении
Array(Dynamic)илиArray(Variant)кQBitс помощьюaccurateCastOrNull, напримерaccurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI). - Теперь
index_granularity_bytesучитывается для столбцов состоянийAggregateFunction. Ранее ограничение размера гранулы в байтах для таких столбцов игнорировалось (например, для состоянийuniqExactв таблицахAggregatingMergeTreeи агрегирующих проекциях), из-за чего гранулы получались значительно больше заданного предела, что увеличивало read amplification и расход памяти во время выполнения запроса. #108297 (Groene AI). - Исправлено двойное вычисление условий в легковесных
UPDATE/DELETE, которое могло приводить к некорректному поведению для недетерминированных условий и лишней работе для детерминированных. Закрывает #86032. #108323 (ofeliacode). - Исправлено исключение в предопределённом HTTP-обработчике, возникавшее, когда в запросе отсутствовал заголовок, для которого регулярное выражение
headers_regexpдопускает пустое значение. #108324 (Vitaly Baranov). - Исправлена работа
arrayPartialSortс неконстантным аргументомlimit. #108327 (Vitaly Baranov). - Исправлена проблема, из-за которой отменённый или завершённый через
KILLINSERTмог ещё долго продолжать выполняться при построении индекса пропуска данных (например, неограниченного индексаset(0)по столбцу с большим числом уникальных значений). Теперь построение индекса останавливается сразу после отмены запроса. #108351 (Shaohua Wang). - Исправлена ситуация, когда
SELECTиз табличной функцииprimesне реагировал на отмену: при большомstep(илиlimit) запрос мог ещё долго выполняться послеKILL QUERYили тайм-аута. Теперь он останавливается сразу. #108353 (Shaohua Wang). - Исправлен разбор имён типов данных, содержащих подстроку
INT(например, имени в стиле функции вродеquantileInterpolatedWeighted, используемого в позиции типа данных). Такие имена ошибочно принимались за целочисленные типы MySQL, и их первая группа аргументов(...)незаметно поглощалась как модификатор ширины отображения, что могло нарушать корректность повторного разбора отформатированного запроса. #108354 (Groene AI). - Исправлена несогласованность, из-за которой некорректный
ARRAY JOIN, за которым следовали запятая и заключённый в скобки список таблиц, ошибочно разбирался какCROSS JOINвместо того, чтобы быть отклонённым. #108365 (Raúl Marín). - Скрыты секретные аргументы таких функций, как
encrypt,decryptиHMAC, в выводеEXPLAIN actions,EXPLAIN headerиEXPLAIN PIPELINE, когдаformat_display_secrets_in_show_and_selectотключён (по умолчанию). #108386 (Raúl Marín). - Исправлена работа
CREATE OR REPLACEдля refreshable materialized view с цельюTO: ранее операция ошибочно отклонялась, поскольку целевая таблица уже принадлежит заменяемому представлению. #108392 (Nikolay Degterinsky). - Исправлен сбой сервера (
Received signal 4, illegal instruction), который мог быть вызван некорректным или рассинхронизированным потоком собственного TCP-протокола. Перед разбором исходный адрес, переданный клиентом, теперь проверяется на то, что это числовойhost:port, вместо того чтобы позволять нечисловому порту попадать в перехватываемую функцию libcgetservbyname. #108410 (Groene AI). - Исправлен сбой сервера при завершении работы, если при остановке базы данных генерируется исключение (например, когда
flushтаблицы упирается в тайм-аут ZooKeeper). Остальная часть последовательности завершения работы больше не пропускается, поэтому системные логи сбрасываются, а их потоки дожидаются завершения через join перед выходом сервера. #108417 (Groene AI). - Исправлены функции регулярных выражений (
match,extract,extractAll,replaceRegexpOne,replaceRegexpAllи т. д.), которые молча возвращали неверные результаты, если шаблон содержал байт NUL (\0). Теперь NUL обрабатывается как обычный литеральный байт, в соответствии с RE2. #108427 (Alexey Milovidov). - Исправлено поведение
clickhouse-local, который возвращал пустой ответ на HTTP-запросыOPTIONS, когдаhttp_options_responseне настроен, из-за чего веб-интерфейс (/play) показывал соединение как неработающее, хотя запросы выполнялись. #108428 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR(“Invalid action query tree node …”), возникавшее, когда distributed query одновременно выполнял дедупликацию структурно идентичных дубликатов столбцовALIASи ссылался на table function с аргументом именованной коллекции в видеkey = value(например,oss(s3_conn, filename = '...')). #108435 (Groene AI). - Исправлен сбой сервера (
LOGICAL_ERROR: 'Unexpected exception in refresh scheduling'), который мог происходить при запуске, когда координируемый refreshable materialized view в базе данныхReplicatedподключался к Keeper, не поддерживающему флаг возможностиMULTI_READ(например, после понижения версии Keeper). Теперь представление корректно останавливается вместо аварийного завершения сервера. #108441 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK(например,Column _part not found) при выборке virtual columns из таблицыMergeTreeв режиме параллельных реплик, в том числе черезSELECT *сasterisk_include_virtual_columns = 1. #108451 (Groene AI). - Для
SYSTEM RESET DDL WORKERтеперь требуется новая привилегияSYSTEM RESET DDL WORKER. Ранее любой аутентифицированный пользователь (включаяreadonly) мог выполнять эту команду и многократно сбрасывать состояние DDL-воркера, блокируя DDL с предложением ON CLUSTER. #108460 (Groene AI). - Путь к модели для
catboostEvaluateограничен директориейuser_files, как и у table functionfileи dictionary sources. Ранее функция принимала произвольный путь в файловой системе без проверки ограничения, что позволяло проверять существование файлов внеuser_filesи инициировать их чтение. Теперь модели должны располагаться внутриuser_files. #108463 (Groene AI). - Для функции
hasColumnInTableтеперь требуется привилегияSHOW COLUMNSна целевую таблицу — та же, что нужна дляDESCRIBEиSHOW CREATE TABLE. Ранее любой пользователь мог вызыватьhasColumnInTable, чтобы проверять имена столбцов и существование таблиц и баз данных без какой-либо проверки доступа. #108464 (Groene AI). - Исправлено чрезмерное выделение памяти при десериализации специально сформированных состояний агрегатных функций
mannWhitneyUTest,rankCorr,largestTriangleThreeBuckets,quantileGK,sequenceMatch/sequenceCountиgroupArrayIntersect. Некорректное состояние могло объявить огромное число элементов и заставить сервер попытаться выделить десятки гигабайт памяти на основе всего нескольких байт входных данных; теперь такие состояния отклоняются с ошибкойTOO_LARGE_ARRAY_SIZE. #108465 (Groene AI). - Проверяется, что цель перенаправления в ответе S3
301 Moved Permanentlyсоответствуетremote_url_allow_hosts(RemoteHostFilter). Ранее обработка 301 в AWS SDK переходила на конечную точку, заданную атакующим в ответе (заголовокLocationили элемент<Endpoint>), без проверки хоста, поэтому вредоносный или скомпрометированный S3-compatible сервер мог перенаправить ClickHouse на произвольный хост (SSRF). Для перенаправления 307 эта проверка уже выполнялась; теперь оба варианта работают одинаково. #108466 (Groene AI). - Исправлена утечка учётных данных: устаревшие настройки
storage_aws_access_key_id,storage_aws_secret_access_key,storage_catalog_credentialиstorage_auth_headerдвижка базы данныхDataLakeCatalogотображались в открытом виде вsystem.databases.engine_fullиSHOW CREATE DATABASE. Теперь они маскируются как[HIDDEN]. #108470 (Groene AI). - Исправлена идентификация пользователя по
ssl_certificate: одиночный wildcard*теперь соответствует ровно одному компоненту имени (RFC 6125 6.4.3). Ранее wildcard в субъектеCNилиDNS:SAN (например,*.corp.example.com) также соответствовал именам с несколькими метками, таким какevil.deep.corp.example.com, что позволяло владельцу сертификата для более глубокого поддомена аутентифицироваться как wildcard-пользователь. СопоставлениеURI:SAN не изменилось. #108472 (Groene AI). - Исправлена SQL-инъекция в протоколе MySQL: аргумент
SHOW TABLE STATUS LIKEи значениеSET <mysql_setting>, отправляемое через MySQL interface (порт 9004), теперь разбираются и заново заключаются в кавычки, а не дословно подставляются в переписанный запрос. Также исправлено поведение, при которомKILL QUERY <id>через MySQL interface молча игнорировал многозначные идентификаторы соединений. #108474 (Groene AI). - Чувствительные значения, передаваемые как параметры строки запроса HTTP (например, привязки query-параметров
param_*, такие какparam_secret_key/param_aws_secret_access_key, параметрpasswordили параметрыsignatureв стиле S3), больше не записываются вsystem.text_logили спаны OpenTelemetry в исходном виде. Строка журналаRequest URIтеперь маскирует значения параметров, чьи имена выглядят чувствительными, заменяя их на[HIDDEN]. #108475 (Groene AI). - Конфигурация
http_forbid_headersтеперь принудительно применяется при определении схемы для табличной функцииurlи движка храненияURL. Ранее запрещённый заголовок всё равно отправлялся по сети при определении схемы (например, с форматомRegexpилиDESCRIBE), а его тело ответа могло затем попасть в ошибку разбора, раскрывая секреты. Теперь фильтр заголовков проверяется до любого сетевого доступа на пути определения схемы, что соответствует уже существующему поведениюurlCluster. #108476 (Groene AI). - Исправлены неверные результаты при использовании
SELECT ... SAMPLE ...вместе с кэшем условий запроса (настройкаuse_query_condition_cache, включена по умолчанию). #108488 (Groene AI). - Исправлен сбой сервера (переполнение стека), вызванный глубоко вложенными выражениями, такими как
[[[ ... ]]]илиarray(array( ... )), когда дляmax_parser_depthзадано большое значение. #108493 (Raúl Marín). - Исправлено бесконечное зависание движка таблицы
RabbitMQприDROP TABLEили остановке сервера, когда брокер закрывает AMQP-соединение из-за пропущенных heartbeat-сигналов без отправки TCP RST. Все блокирующие вызовы цикла событий теперь имеют тайм-аут 30 секунд, поэтому остановка всегда завершается. #108497 (Aly Ayman). - Вторичные запросы, выполняемые в рамках внутренних запросов, теперь будут логироваться как внутренние запросы. #108506 (Miсhael Stetsyuk).
- Движок таблицы
ArrowFlightи табличная функцияarrowFlightтеперь учитывают список разрешённых хостов<remote_url_allow_hosts>. Ранее хост и порт соединения не проверялись, поэтому запрос мог обращаться к хостам, отсутствующим в этом списке. #108507 (Groene AI). - Команды протокола MySQL
COM_FIELD_LIST(mysql_list_fields) иCOM_INIT_DB(USE database) теперь применяют то же управление доступом, что и их SQL-эквиваленты (SHOW COLUMNS/DESCRIBEиUSE). Ранее они могли раскрывать имена столбцов таблиц, на которые у пользователя были только частичные привилегии на столбцы, а также переключать текущую базу данных без привилегииSHOW DATABASES. #108508 (Groene AI). http_forbid_headersтеперь сопоставляется регистронезависимо. Имена HTTP-заголовков регистронезависимы, поэтому запретAuthorizationтеперь также блокируетauthorization,AUTHORIZATIONи другие варианты регистра. Настроенные шаблоныheader_regexpтеперь тоже сопоставляются регистронезависимо без необходимости явно указывать флаг(?i). #108509 (Groene AI).- Исправлен сбой сервера (segmentation fault), который мог возникать, когда распределённый запрос ссылался на ещё не материализованный
MATERIALIZEDCTE как на внешнюю таблицу, а удалённый источник создавался лениво. #108547 (Groene AI). - Исправлены неправильные результаты, когда кэш условий запроса (
use_query_condition_cache = 1) повторно использовал исключение меток, полученное из индекса пропуска данных, для запроса, в котором выполнялся другой набор индексов пропуска данных, например сuse_skip_indexes = 0,ignore_data_skipping_indicesили иным режимомuse_skip_indexes_for_disjunctions. Записи кэша, полученные из индекса пропуска данных, теперь привязываются к фактическому набору выполненных индексов пропуска данных. #108548 (Groene AI). - Исправлено несколько ошибок в
changeYear,changeMonth,changeDay,changeHour,changeMinuteиchangeSecondс аргументами типаDateTime64: столбец результата создавался с жёстко заданным scale по умолчанию 3 вместо scale аргумента, что приводило кLOGICAL_ERROR(writeSlice expects same column types), когда результат передавался вarrayPushBack/arrayPushFront/arrayConcat; входные данные с наносекундной точностью (scale 9) вызывалиDECIMAL_OVERFLOW; а входные данные с долями секунды до эпохи возвращали неправильную календарную секунду. Также исправлено поведениеtimeSlotsдляDateTime64: ранее функция игнорировала scale необязательного аргументаSizeв объявленном return type и возвращала неправильные временные метки для максимального scale вSize. #108551 (Groene AI). #108681 (Takumi Hara). #108994 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когда составному предикату назначался псевдоним вGROUP BY, а затем на него снова ссылались при включенномenable_identifier_resolve_cache(по умолчанию). #108553 (Groene AI). - Исправлена логическая ошибка (
Equal values are not contiguous within the range assumed to be sorted), возникавшая при выполненииDISTINCTповерх чтенияSTREAM(SELECT DISTINCT ... FROM table STREAM). Оптимизации чтения в порядке сортировки больше не применяются к чтениямSTREAM, которые выдают строки в порядке коммитов, а не в порядке ключа сортировки. #108568 (Groene AI). - Исправлены случаи, когда проекции возвращали типовое значение по умолчанию для столбца’а (например,
0) вместо объявленного значенияDEFAULT(например,-1) в двух ситуациях: при чтении столбца, добавленного черезALTER TABLE ... ADD COLUMN ... DEFAULTпосле создания проекции (чтение из базовой таблицы уже работало корректно), и после истеченияTTLстолбца в части Wide. #108569 (Shaohua Wang). #109013 (Shaohua Wang). - Исправлена ошибка
ReadBuffer is canceled. Can't read from it., которая могла возникать при повторной попытке загрузки в S3 (например, резервной копии) после временной ошибки чтения. #108573 (Groene AI). - Исправлено поведение
ATTACH PARTITION ... FROM, из-за которого отклонялись таблицы, чьи первичные ключи эквивалентны, но объявлены по-разному (в одном случае явныйPRIMARY KEY, в другом — неявный изORDER BY). #108590 (Jordi Orihuela). - Исправлен сбой прямого чтения из текстового индекса, возникавший, когда несколько текстовых индексов были частично материализованы. Исправляет #108530. #108607 (Anton Popov).
- Исправлено раскрытие метаданных, при котором
DESCRIBE loop('db', 'table')иDESCRIBE loop(<inner table function>)обходили проверку доступаSHOW COLUMNS/ к источнику, позволяя непривилегированному пользователю читать схему столбцов таблицы. #108624 (Groene AI). - Исправлен виртуальный столбец
_etagдля движков таблицS3QueueиAzureQueue: он был объявлен, но никогда не заполнялся, поэтомуSELECT _etagвсегда возвращал пустую строку. Теперь он возвращает ETag объекта, как и движокS3и табличная функцияs3. #108625 (Groene AI). - Исправлено чтение файлов
Arrow,ArrowStreamи основанных на Arrow файловORC, у которых столбец временной метки содержит фиксированное числовое смещение UTC (например,+05:30,-08:00,00:00) или не-IANA-маркерfixedв качестве часового пояса; ранее это приводило к ошибкеCannot load time zone ...(BAD_ARGUMENTS). #108633 (Groene AI). - Исправлено исключение (
LOGICAL_ERROR: Join is supported only for pipelines with one output portилиNOT_IMPLEMENTED: MergeJoinAlgorithm is not implemented for strictness Semi), возникавшее, когдаjoin_algorithm = 'full_sorting_merge'использовался дляSEMI/ANTIJOIN, включая JOIN, полученные при декорреляции коррелированного подзапросаEXISTS. Теперьfull_sorting_mergeотклоняет комбинации strictness/kind, которые не может выполнить, поэтому планировщик переключается на другой включенный алгоритм или сообщает, что JOIN не может быть выполнен. #108658 (Groene AI). - Исправлено переполнение буфера кучи при построении text index с
positions = 1на множестве различных коротких токенов. #108659 (Groene AI). - Запрос, читающий из S3 или записывающий в S3, который отменяется (например, через
KILL QUERY) во время выполнения s3 request, теперь помечается как отменённый, а не как сетевая/S3 ошибка, вводящая в заблуждение. В частности, отменённые backup или restore в S3 теперь показываютBACKUP_CANCELLED/RESTORE_CANCELLEDвsystem.backups. #108673 (Julia Kartseva). - Исправлена ошибка запуска, из-за которой database
DataLakeCatalog, созданная в старой версии (25.12 или ранее) с некорректнымauth_header, не могла быть attached после обновления до 26.2 или новее, что не позволяло запустить server. Теперьauth_headerпроверяется только приCREATE, а приATTACHкаталог создаётся лениво при первом использовании, а не во время запуска, поэтому одна неверно настроенная или недоступная база данных каталога больше не блокирует запуск server. #108674 (Groene AI). - Исправлена logical error (
Sort order of blocks violated) во время слияния, а также некорректные reads, когда не-nullable элементLowCardinalityстолбцаNullable(Tuple(...))используется как подстолбец (например, как ключ сортировки). #108679 (Groene AI). - Исправлен возможный crash (use-after-free), когда
SYSTEM FLUSH DISTRIBUTEDвыполняется одновременно сDROP TABLEдля той жеDistributedtable. #108684 (Groene AI). - Исправлен crash при декодировании Base64-ключа аккаунта Azure, достижимый через
azureBlobStorage(и связанные Azure table functions и хранилища), когда key не является корректным Base64: байт>= 0x80вызывал чтение за пределами границ, а любой некорректный байт приводил к undefined behaviour. Некорректные ключи теперь корректно отклоняются. #108716 (Groene AI). - Исправлена ошибка
NUMBER_OF_COLUMNS_DOESNT_MATCH, возникающая, когда subquery поDistributedtable читает два или более столбцаALIAS, разворачивающихся в одно и то же expression (например,a1 String ALIAS toString(x), a2 String ALIAS toString(x)), и результаты этого subquery передаются во внешний запрос, напримерSELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (Groene AI). - Исправлено поведение
CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE, при котором новая materialized view оставалась не подписанной на свою исходную таблицу, из-за чего молча отбрасывалась каждая строка, вставленная после replace. #108728 (Alexey Milovidov). - Исправлено Исключение (
Cannot find sharding key column, а в debug- и sanitizer-сборках — аварийное завершение server), возникавшее, когда ключ сегментированияDistributedtable представлял собой expression, которое analyzer сворачивал в константу, напримерif(1, toInt32(id), toInt32(id) + 1), приoptimize_skip_unused_shards = 1. #108737 (Groene AI). - Исправлена logical error (
Bad cast from type DB::ColumnNullable to DB::ColumnString) и возможные неверные результаты при использованииgroup_by_use_nullsс константным ключом группировкиLowCardinalityвGROUPING SETS/ROLLUP/CUBE. #108771 (Alexey Milovidov). - Исправлена проблема, из-за которой отсечение по партициям и первичному ключу незаметно отключалось, если ключевой столбец
LowCardinality(FixedString)(илиLowCardinality(Nullable(FixedString))) был обёрнут в функцию в ключе, напримерPARTITION BY sipHash64(k) % NсWHERE k = 'literal'. В таких запросах сканировались все партиции вместо их отсечения. #108777 (Groene AI). - Исправлена logical error (аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когда
INSERT ... SELECTчерез таблицуAliasили в таблицуTimeSeriesотменялся без исключения, например приtimeout_overflow_mode = 'break'. #108783 (Groene AI). #108796 (Shaohua Wang). - Исправлена logical error
Bad cast from type DB::ColumnSparse to DB::ColumnString(аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когдаgroupConcatприменяется кTuple, у которого элементStringхранится в разреженном виде. #108790 (Groene AI). - Исправлен
TYPE_MISMATCHвmapFilter,mapSort,mapReverseSort,mapPartialSortиmapConcat, когда значениеMapсодержит вложенныйMapсLowCardinality, напримерmapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y'))). #108798 (Groene AI). - Исправлена ситуация, когда
insert_quorum = 'auto'не отклонял вставки сразу, если в живых оставалось меньше большинства реплик. Теперь такие вставки сразу завершаются ошибкойTOO_FEW_LIVE_REPLICASвместо записи локальной части и последующего тайм-аута сUNKNOWN_STATUS_OF_INSERT. #108800 (Gagan Dhakrey). - Исправлена ошибка, из-за которой строка
WITH TOTALSвJOINмогла содержать значения по умолчанию (например,0) вместо константных значений из константного подзапроса на одной из сторон JOIN. Неправильный результат появлялся только при некоторых порядках JOIN или при использовании настройкиquery_plan_join_swap_table. #108807 (Vladimir Cherkasov). - Исправлена segmentation fault (разыменование нулевого указателя), которая могла возникать, когда завершение работы сервера происходило одновременно с остановкой таблицы
S3Queue/AzureQueue. #108810 (Miсhael Stetsyuk). - Исправлено аварийное завершение при запуске (
Cannot allocate ThreadStack,EINVAL) в glibc-сборках, работающих на CPU с большим размером стека сигналов (например, Intel Sapphire Rapids / Granite Rapids с ядром с поддержкой AMX), где размер альтернативного стека сигналов не округлялся вверх до величины, кратной размеру страницы. #108813 (Groene AI). - Исправлена ситуация, когда distributed queries иногда завершались ошибкой
UNEXPECTED_PACKET_FROM_SERVER(expected TablesStatusResponse, got ProfileInfo), если из пула повторно использовалось connection, которое предыдущий отменённый запрос оставил в рассинхронизированном состоянии. #108854 (Alexey Milovidov). - Исправлена logical error (исключение в release-сборках, аварийное завершение server в debug- и sanitizer-сборках), которая могла возникать при вызове функции с более чем одним аргументом
LowCardinalityдля distributed таблицы, напримерconcatAssumeInjective((SELECT toLowCardinality('p')), s), используемом в качестве ключаGROUP BYс table functionremote. Сообщения были такими:Default functions implementation for LowCardinality is supported only with a single LowCardinality argumentилиExpected the argument ... to have N rows, but it has M. #108871 (Groene AI). - Исправлено поведение
reinterpret(x, 'Decimal128(scale)')(а также для целевых типовDecimal32/Decimal64/Decimal256/DateTime64): в некоторых случаях создавался результирующий столбец, у которого внутренняя scale совпадала со scale источника, а не с запрошенной scale целевого типа, если источник и цель имели один и тот же физический тип. Значения были корректны, но объект столбца был структурно несовместим со своим объявленным типом. #108878 (Groene AI). - Исправлена
LOGICAL_ERROR(New empty part is about to materialize but the directory already exist), которая могла приводить к аварийному завершению server в debug- и sanitizer-сборках, когда операцияDROP/DETACH/MOVE/REPLACE PARTITIONнад таблицейMergeTreeвыполнялась после того, как предыдущая аналогичная операция была прервана (например, из-за отката transaction или сбоя) и оставила после себя устаревший каталогtmp_empty_<part>. Теперь такой устаревший каталог освобождается и используется повторно вместо завершения с ошибкой. #108879 (Groene AI). - Исправлено, что ClickHouse Keeper возвращал некорректное значение
dataLength = 0вStatответовCreate2, а клиент ClickHouse ZooKeeper не десериализовалStatиз ответовCreate2. #108909 (unintended). - Исправлено поведение
clickhouse-local, который отклонял пустое значение параметра, записанное вплотную к=(например,--format_csv_null_representation=''); теперь он ведет себя так же, как--format_csv_null_representation ""иSET format_csv_null_representation = ''. #108910 (Vismay). - Исправлена
LOGICAL_ERROR(Inconsistent AST formatting), из-за которой server аварийно завершался в debug- и sanitizer-сборках при форматировании data typeTuple, в котором смешаны именованные и неименованные элементы (например,Tuple(a UInt8, UInt16)). #108915 (Groene AI). - Исправлен segmentation fault при слиянии состояний агрегатной функции
uniqExactсGROUPING SETS,ROLLUPилиCUBEиmax_threads > 1. #108928 (Raúl Marín). - Исправлены возможные неправильные результаты или выход за границы при чтении, когда
INSERTоткатывается после ошибки в середине пакета (например, в таблицахBuffer, при асинхронных вставках или в движкахKafka/RabbitMQ/FileLog), пока действует отложенная репликация столбцов (enable_lazy_columns_replication). #108935 (Groene AI). - Теперь
join_any_take_last_rowучитывается во всех поддерживаемых путях JOIN на основе хеширования, включая JOIN с автоматическим spilling to disk. #108936 (János Benjamin Antal). - Исправлен bug в analyzer, из-за которого
FINALдля одной таблицы вJOIN(например,FROM t1 FINAL JOIN t2) ошибочно применялся и к другим соединяемым таблицам, из-за чего такие запросы могли выполняться медленнее. #108979 (Vladimir Cherkasov). - Исправлен
LOGICAL_ERROR(“Cannot find__grouping_setcolumn in header of MergingAggregatedTransform with grouping sets” или “Chunk info was not set for chunk in MergingAggregatedTransform”), который мог возникать при отключенном analyzer вUNION ALL/INTERSECT/EXCEPT, где в одной ветке используетсяGROUP BY GROUPING SETSс параллельными репликами, а в другой —FINAL. #109003 (Groene AI). - Исправлен
LOGICAL_ERRORв автоматическом планировщике параллельных реплик, который мог возникать, когдаautomatic_parallel_replicas_modeвключен, аparallel_replicas_min_number_of_rows_per_replicaбольше 0. #109011 (Groene AI). - Исправлено чрезмерное выделение памяти при schema inference формата
MsgPack: поврежденный входной поток, в котором заголовок array/map/string/binary указывает огромное число элементов, больше не приводит к единовременному многогигабайтному выделению памяти и отклоняется как некорректный ввод. Это устраняет состояние out-of-memory в release-сборках (и аварийное завершениеallocation-size-too-bigпри использовании sanitizer). #109019 (Groene AI). - Исправлено игнорирование
use_client_time_zoneдля строковых литераловDateTime/DateTime64, интерпретируемых на сервере (асинхронныйINSERT, литералыSELECT). Теперь клиент передает свой локальный часовой пояс какsession_timezone, когда включенuse_client_time_zone, поэтому разбор на стороне сервера соответствует пути синхронногоINSERT. #109051 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когдаquery_plan_optimize_lazy_finalвключен одновременно с фильтромWHERE, частично перенесенным вPREWHERE(черезoptimize_move_to_prewhere_if_final). #109073 (Groene AI). - Исправлена ошибка при использовании квалифицированной звездочки, такой как
b.*, в запросе, гдеb— это алиас таблицы (или подзапроса/CTE), совпадающий по имени с несоставным столбцом другой таблицы. Такие запросы больше не завершаются ошибкой и корректно выбирают все столбцыb. #109078 (Vladimir Cherkasov). - Исправлена logical error
Block structure mismatch in JoinStep(аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когда коррелированный подзапрос преобразуется в JOIN, а исходное отношение содержит одно и то же имя столбца более одного раза, напримерWITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM tсcorrelated_subqueries_default_join_kind = 'right'. #109114 (Groene AI). - Исправлено зависание, при котором запрос, читающий через файловый кэш, мог продолжать ждать незавершенную загрузку после отмены с помощью
KILL QUERY, а удаление refreshable materialized view или выполнение для нееSYSTEM STOP VIEW, если ее обновление зависло в таком ожидании, приводило к блокировке. #109116 (Murphy). - Исправлено игнорирование настройки
parallel_view_processingпри вставке в таблицу с materialized view — начиная с 25.10, view всегда выполнялись параллельно независимо от этой настройки. #109170 (Antonio Andelic). - Исправлена несогласованность в парсере: список столбцов
INSERTпринимал квалифицированный сопоставитель столбцов, записанный какt.* LIKE '<pattern>'/t.* ILIKE '<pattern>', но отклонял его каноническую формуt.COLUMNS('<regexp>'), из-за чего нарушался round-trip формата запроса (и происходило аварийное завершение сервера в debug- и sanitizer-сборках). #109176 (Groene AI). - Исправлены немонотонные приращения
ProfileEvents: счётчикиNetworkReceiveBytesиAIOWriteBytesмогли увеличиваться на отрицательную величину (с переполнением до огромного значения) при тайм-ауте сокета или сбое AIO, а дляMemoryOvercommitWaitTimeMicrosecondsиспользовались немонотонные часы. #109180 (Azat Khuzhin). - Исправлен вывод схемы для форматов
Arrow,ArrowStream,Avro, а также устаревших средств чтенияORCиParquet, которые возвращалиNullable(Tuple)для nullable-столбцов структур, хотя типNullable(Tuple)недопустим (allow_experimental_nullable_tuple_typeотключён).DESCRIBEвозвращал тип, которыйCREATE TABLEне принимает, поэтому создание таблицы или вставка данных с использованием выведенной схемы завершались ошибкойNullable Tuple type is not allowed. #109185 (Nihal Z. Miaji). - Исправлен неверный результат коррелированных
EXISTSи скалярных подзапросов, когда корреляция присутствует только в проекции подзапроса вместе с некоррелированным предложениемWHERE(в этом случае подзапрос мог вычисляться в false /NULLдля каждой строки). Исправляет #105760. #109186 (Dmitry Novik). - Исправлено поведение
CREATE USER ... HOST LIKE 'a', 'b'(и эквивалентногоALTER USER), при котором молча сохранялся только первый шаблон. Теперь все указанные шаблоныHOST LIKEсохраняются в списке разрешённых хостов пользователя. #109187 (Groene AI). - Исправлено поведение, при котором текстовый индекс, определённый для
mapValues(map)илиmapKeys(map), молча не использовался при запросах к таблице через таблицу с движкомDistributedи analyzer. Индекс использовался для локальной таблицы и через табличные функцииcluster/remote, но при запросе через таблицу с движкомDistributedпропускался (и приводил к ошибкеINDEX_NOT_USEDприforce_data_skipping_indices). #109188 (Groene AI). - Исправлена ложная ошибка
LOGICAL_ERROR(There was an error on <host>: Cannot obtain error message (probably it's a bug)), которая могла аварийно завершить сервер в debug- и sanitizer-сборках при выполнении DDL-запроса для базы данныхReplicated, если её узел статусаfinishedдля конкретного хоста в Keeper уже был очищен. #109192 (Groene AI). - Исправлено поведение, при котором коэффициенты
SAMPLEс exponent, величина которого переполняетInt32(например,SAMPLE 1e-3000000000), молча обрабатывались какSAMPLE 1. #109197 (Raúl Marín). - Исправлена проверка доступа для
SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER, которая ошибочно требовала привилегиюSYSTEM PREWARM MARK CACHEвместоSYSTEM PREWARM PRIMARY INDEX CACHE. #109198 (Raúl Marín). - Исправлено падение запросов
ALTERдля таблицMergeTree, созданных с пользовательской настройкойdisk(SETTINGS disk = disk(...)). Исправляет #63019. #109199 (Mikhail Artemenko). - Исправлен сбой сервера при чтении состояний агрегатных функций
cramersV,cramersVBiasCorrected,contingencyилиtheilsU, если они объединяются из оконного контекста (OVER ()) и обычной агрегации через цепочки операций над множествами (EXCEPT,INTERSECT) или вложенныеUNION ALL, например с помощью комбинатора-Merge. #109200 (Groene AI). - Исправлен неверный результат для
ANY JOINс константным условиемON(например,t1 ANY INNER JOIN t2 ON 1): запрос возвращал полное декартово произведение вместо результатаANY JOIN. #109207 (Vladimir Cherkasov). - Исправлен сбой сервера при асинхронной вставке с дедупликацией, когда
optimize_on_insertделает вставляемый блок пустым (например, если строки суммируются в ноль вSummingMergeTree). #109229 (Den Kalantaevskii). - Исправлены
SYSTEM DROP REPLICAиSYSTEM DROP DATABASE REPLICA ... FROM ZKPATH: теперь они отклоняют пустые пути ZooKeeper или пути, состоящие только из корня, на этапе разбора сBAD_ARGUMENTS, направляют вспомогательные пути Keeper в именованный Keeper и канонизируют пути Keeper, чтобы локальные проверки самозащиты не могли ошибочно выбрать не ту реплику или обойти защиту целевой реплики. #109230 (Groene AI). - Исправлен приоритет настроек S3: теперь блок конечной точки
<s3>с областью действия URL имеет приоритет над верхнеуровневыми значениями<s3>по умолчанию. #109251 (Bharat Nallan). - Исправлена ошибка, из-за которой значения
DEFAULTдля столбца не применялись приINSERT INTO TABLE FUNCTION(например,remoteилиfile) со встроенными даннымиVALUES, когда сервер сам разбирает встроенные данные (send_table_structure_on_insert_with_inline_data = 0). ЯвныйNULL, вставленный в столбец безNullableсDEFAULT, превращался в0вместо объявленного значения по умолчанию. Теперь это работает так же, как обычныйINSERTв таблицу и HTTP-протокол. #109258 (Groene AI). - Исправлена ошибка
CREATE TABLE ... AS SELECTизs3Cluster(и других кластерных табличных функций, таких какfileCluster/urlCluster), которая приводила к сбою сNOT_FOUND_COLUMN_IN_BLOCKвнутри базы данныхReplicated. #109266 (Groene AI). - Исправлено различие в результатах
SHOW TABLESиSELECT ... FROM system.tablesдля баз данных каталогов озёр данных: таблицы, которые ClickHouse не может читать, теперь последовательно скрываются в обоих случаях. #109273 (Smita Kulkarni). - Исправлена ошибка, из-за которой слияние таблицы
MergeTreeс проекциями при включённой настройкеenable_block_number_columnилиenable_block_offset_columnприводило к созданию частей проекции, содержащих лишний столбец_block_number/_block_offset. После этого объединённая часть проекции переставала соответствовать определению проекции и частям проекции, созданным при вставке, поэтомуCHECK TABLEиOPTIMIZE ... DRY RUNсообщали о ней как о повреждённой (CORRUPTED_DATA). #109284 (Groene AI). - Разрешено читать Avro
arrayиз записей{key, value}с двумя полями в столбец ClickHouseMap. Именно такое кодирование Iceberg и Spark создают дляMAP<K, V>с ключом нестрокового типа (собственные map в Avro поддерживают только строковые ключи). Ранее такой файл можно было читать какArray(Tuple(key, value)), но не какMap(K, V), что приводило к ошибкеType Map(...) is not compatible with Avro array. #109289 (Groene AI). - Исправлен сбой сервера при
CREATE HYPOTHETICAL INDEX ... TYPE set(иngrambf_v1/tokenbf_v1), если обязательный аргумент индекса опущен. Теперь такие операторы отклоняются с понятной ошибкой. #109294 (Groene AI). - Исправлен
LOGICAL_ERROR(Current component is empty), который мог возникать при операциях мутации, таких какKILL MUTATION, над таблицейMergeTree, хранящей свои метаданные в Keeper, если включена настройка сервераenforce_keeper_component_tracking. #109297 (Groene AI). - Исправлено чтение временных меток
ORCза пределами примерно 2262 года в столбецDateTime64с scale меньше 9. Встроенный readerORCранее преобразовывал каждую временную метку через фиксированный промежуточныйDateTime64(9), что приводило к overflowInt64на наносекундном масштабе и отклонению таких значений сVALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE, даже если запрошенный scaleDateTime64(например,DateTime64(6), как в Iceberg) позволяет представить это значение. Теперь временные метки читаются сразу в запрошенном scale, аdate_time_overflow_behaviorучитывается, если значение не помещается даже в целевой scale. #109302 (Groene AI). clickhouse-local, работающий как сервер (послеSYSTEM START LISTEN HTTP), теперь обслуживает HTTP-соединения, используяTabSeparatedкак output format по умолчанию, как иclickhouse-server, вместо интерактивного значения по умолчаниюPrettyCompact. Это исправляет подключение кclickhouse-localпо HTTP через драйверы, такие какclickhouse-connect. Интерактивная сессия в terminal по-прежнему отображает результаты в форматеPrettyCompact. #109362 (Alexey Milovidov).- Исправлен временный сбой
Code: 499 ... InvalidPart(S3_ERROR) при S3 multipart-загрузках. MinIO может кратковременно сообщать об отсутствии только что загруженной части приCompleteMultipartUpload; теперь для этой ошибки выполняются повторные попытки, как и для уже обрабатываемойNoSuchKey, с ограничениемs3_max_unexpected_write_error_retries. #109364 (Groene AI). - Исправлена ошибка
UNKNOWN_IDENTIFIERприALTER TABLE ... DROP COLUMN, когда у другого столбца есть выражениеDEFAULTилиMATERIALIZED, которое определяет и использует встроенный alias. #109374 (Alexey Milovidov). - Исправлена data race (и вызванный ею редкий crash) при параллельном merge состояний агрегатной функции
uniqExactс двухуровневыми sets, что могло происходить приGROUPING SETS,ROLLUPиCUBE. #109389 (Groene AI). - Исправлена ошибка (
NOT_FOUND_COLUMN_IN_BLOCKилиstd::bad_function_callв старых версиях) при выполненииCREATE TABLE ... ON CLUSTER ... AS SELECT, читающегоDistributed-таблицу в кластере с двумя или более шардами. #109407 (Alexey Milovidov). - Исправлены merge для таблиц с
TTL ... GROUP BY(rollup): части, которые уже были полностью агрегированы, могли снова и снова бесконечно планироваться на merge, а таблицы со столбцамиMATERIALIZEDили с включенными persistent virtual columns обрабатывались некорректно — теперь такие столбцы агрегируются с помощьюany. Закрывает #105647. #109410 (Mikhail Artemenko). #109532 (Mikhail Artemenko). - Исправлено поведение
INс обычным столбцом типа Array в правом аргументе: ранее выражение могло молча возвращать неверный результат (всегдаfalse) или генерировать исключение; теперьx IN arrведёт себя какhas(arr, x). #109416 (Alexey Milovidov). - Исправлены ошибки
UNKNOWN_IDENTIFIERв операцияхALTER TABLE(RENAME/ADD/MODIFY COLUMN, а такжеMATERIALIZE INDEXна таблице с недавно вставленными частями) для таблицMergeTreeс неявным индексом min-max по persistent virtual columns_block_number/_block_offset(включается черезadd_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column). #109428 (Groene AI). #110236 (Groene AI). - Исправлен
LOGICAL_ERRORвarrayFoldдля неконстантного аргументаArray(LowCardinality(T))(например,arrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0))), который завершался ошибкойArguments of 'plus' have incorrect data types(с аварийным завершением сервера в debug- и sanitizer-сборках). #109462 (Groene AI). - Исправлено поведение
CHECK TABLEдля таблицыReplicatedMergeTree: корректная часть больше не помечается как повреждённая, если во время проверки возникает временная retryable ошибка ZooKeeper (например, потеря connection); теперь такие ошибки отображаются как retryable ошибка запроса. #109465 (Alexey Milovidov). - Исправлены segfault в
groupArrayLastMergeи aggregate functionlargestTriangleThreeBuckets: deserialization состояния агрегатной функции теперь проверяется, поэтому повреждённое состояние больше не приводит к выходу за границы памяти. #109485 (Miсhael Stetsyuk). #109492 (Miсhael Stetsyuk). - Исправлена ситуация, когда глобальное ограничение
max_rows_in_join/max_bytes_in_joinне применялось к join algorithmparallel_hash, из-за чего запрос сjoin_overflow_mode = 'throw'мог молча завершиться успешно вместо генерацииSET_SIZE_LIMIT_EXCEEDED. #109488 (Hechem Selmi). - Исправлено чтение таблиц Paimon, разбитых на партиции по столбцу
BIGINT, значение которого не помещается вInt32. Такие значения партиции усекались (например,9223372036854775807становилось-1), что приводило к неверному пути партиции и завершалось ошибкой файловой системы. #109510 (Groene AI). - Исправлен crash при чтении таблиц Iceberg с файлами equality delete. Если столбец в файле equality delete допускал NULL, а в схеме таблицы не допускал NULL (или наоборот), значения, прочитанные из файла delete, вставлялись в столбец другого типа через непроверенное приведение (ошибочное смешение типов столбцов), что повреждало столбец и приводило к аварийному завершению сервера. #109551 (Miсhael Stetsyuk).
- Исправлено то, что
connect_timeout, а также тайм-ауты чтения и записи для MySQL не вступали в силу: попытка connection к не отвечающему серверу MySQL могла зависнуть более чем на две минуты даже приconnect_timeout = 1, потому что периодические сигналы выборочного профилировщика запросов постоянно сбрасывали внутренний дедлайн poll в клиенте MySQL. #109592 (Shaohua Wang). - Исправлен
LOGICAL_ERROR(creation_csn is not set while removal_csn is set to 1), который мог возникать, когда нетранзакционныйTRUNCATEвыполнялся одновременно с незакоммиченной транзакцией, вставившей данные в ту же таблицу. Теперь такойTRUNCATEбольше не удаляет части, созданные ещё не закоммиченными транзакциями. #109598 (Tuan Pham Anh). - Исправлены ошибки
TYPE_MISMATCHпри чтении столбцовstructвParquet, если их физическая nullability отличается от запрошенного типа ClickHouse: не-nullable группаParquetтеперь может читаться какNullable(Tuple(...)), а нативный readerParquetтеперь может читать физически nullablestruct(группуOPTIONALвParquet) какNullable(Tuple(...)). #109615 (Groene AI). #109898 (Groene AI). - Исправлена незаметная потеря данных, возникавшая, когда после
INSERT ... VALUESв потоке из нескольких запросов шёл завершающий SQL-комментарий (например,VALUES (1) -- comment) при использовании server-side inline parsing для вставок (send_table_structure_on_insert_with_inline_data = 0). Этот комментарий разбирался как данные строки после завершающего;, из-за чего последующие запросы в потоке молча пропускались. #109643 (Groene AI). - Исправлен segfault, возникавший, если запрос поступал в короткий промежуток во время остановки server после ошибки при запуске. #109675 (Miсhael Stetsyuk).
- Исправлены устаревшие skip-индексы (
text,bloom_filterи т. д.) и проекции после материализации легковесных обновлений с помощьюALTER TABLE ... APPLY PATCHES. Ранее файлы индексов и проекций, зависящие от столбца, обновлённого через patch, оставались без изменений, поэтому запросы, использующие их, могли возвращать неверные результаты (например,hasTokenне находил обновлённую строку, а проекция возвращала устаревшие агрегаты после удаления израсходованной patch part). #109709 (Groene AI). - Исправлена проблема, из-за которой
system.tablesмолча пропускала базы данных для пользователей с правами на уровне отдельных баз данных, когда запрос читал только столбцыname/database. Добавленный в 26.2. #109723 (Samay Sharma). - Исправлен
LOGICAL_ERRORпри записи столбцаLowCardinality(Time)в форматArrowсoutput_format_arrow_low_cardinality_as_dictionary = 1. #109730 (Groene AI). - Исправлена проблема, из-за которой
ObjectStorageQueue/AzureQueue(и table functionazureBlobStorage) молча пропускали object, когда Объектное хранилище возвращало пустую страницу списка вместе с токеном продолжения. Azure Blob Storage ведёт себя именно так (например, когда список пересекает внутреннюю границу партиции), а асинхронный итератор списка воспринимал пустую страницу как конец списка и отбрасывал токен. Теперь он следует токену продолжения. #109761 (Gal Ben Moshe). - Исправлена ошибка, из-за которой partition pruning не возвращал ни одной строки для таблица Iceberg, партиционированных по столбцу временной метки (
DateTime64). #109764 (Den Kalantaevskii). - Исправлено исключение
ILLEGAL_COLUMNв функцииconvдля аргументовFixedString; теперь они корректно приводятся кString. Закрывает #109670. #109771 (hp). - Функция
getClientHTTPHeaderтеперь обрабатывает имена заголовков как регистронезависимые в соответствии с RFC 9110; в частности, заголовокauthorizationтеперь отфильтровывается независимо от регистра. Закрывает #103957. #109791 (Mikhail f. Shiryaev). - Исправлена проблема, из-за которой
max_execution_time(сtimeout_overflow_mode = 'throw') иногда вообще не отменял запрос: если внутренний механизм отслеживания тайм-аута уже ждал запрос с более поздним deadline, то запрос с более ранним deadline, зарегистрированный позже, мог быть полностью пропущен и продолжать выполняться намного дольше допустимого времени. #109792 (Shaohua Wang). - Исправлено имя файла для сжатых gzip файлов метаданных Iceberg. ClickHouse записывал их как
v{N}.gzip.metadata.json(токен HTTPContent-Encoding), тогда как спецификация Iceberg ожидает расширениеgz:v{N}.gz.metadata.json. В результате Spark и другие читатели Hadoop catalog не могли найти метаданные, записанные ClickHouse. Теперь ClickHouse записываетv{N}.gz.metadata.jsonи по-прежнему читает устаревшее имяgzipдля обратной совместимости. #109812 (Groene AI). - Исправлена ошибка
NOT_IMPLEMENTED(“Method getDataAt is not supported for Nullable(String)”), которая могла возникать при JOIN сenable_join_runtime_filters = 1(включено по умолчанию начиная с 26.2), когда ключ JOIN на build side имел типLowCardinality(Nullable(...))со значениямиNULL, а runtime filter переключался на свой bloom filter. #109824 (Groene AI). - Внешние движки баз данных (например,
PostgreSQL) больше не выполняют pushdown сравнений диапазона (>=,>,<=,<) для столбцовUUID. ClickHouse и внешние СУБД по-разному упорядочивают UUID, поэтому такой pushdown незаметно исключал строки из результата; теперь такие предикаты вычисляются в ClickHouse. #109833 (Vismay). - Исправлен сбой сервера, возникавший, когда lambda-выражение передавалось туда, где higher-order function ожидает конкретное значение (например, аккумулятор
arrayFold, как вarrayFold(lambda, arr, another_lambda)). Теперь такие запросы отклоняются сILLEGAL_TYPE_OF_ARGUMENTвместо аварийного завершения приenable_analyzer = 0. #109840 (Groene AI). - Исправлены table function
icebergLocalи движокIcebergLocal, которые объявлялиazureвместоlocalв качестве типа объектного хранилища, из-за чего они не проходили проверку типа диска (Disk type doesn't match) при использовании с локальным диском черезSETTINGS disk = '...'. #109872 (Pedro Ferreira). - Исправлено чтение таблиц Iceberg, партиционированных по одному и тому же исходному столбцу более одного раза (например,
PARTITIONED BY (hours(ts), ts)). Ранее такие таблицы завершались ошибкойCannot add column ...: column with this name already exists (ILLEGAL_COLUMN). #109895 (Groene AI). - Исправлены неверные результаты запроса, вызванные тем, что индекс первичного ключа неправильно отсеивал гранулы для таблиц с обратным (
DESC) ключевым столбцом, когда части не имеют финальной отметки (неадаптивная granularity,index_granularity_bytes = 0). #109901 (Nihal Z. Miaji). - Исправлен случай, когда
generateRandomStructureиногда создавал недопустимую строку структуры с двумя слитно записанными типами данных (например,Decimal32(7)IPv4), если вложенность типов превышала внутренний предел глубины, из-за чего результат невозможно было распарсить. #109928 (Groene AI). - Исправлена ошибка
NOT_IMPLEMENTED(Method getDataAt is not supported for Nullable(String) in case if value is NULL), возникавшая, когдаtext-индекс строился поArray(LowCardinality(Nullable(String)))(включая поляNested, хранящиеся в таком виде), а индексируемый массив содержал элементNULL. Теперь элементы массива со значениемNULLпропускаются при построении индекса, что соответствует поведениюArray(Nullable(String)). #110055 (Groene AI). - Исправлены неверные результаты, когда индекс пропуска данных
minmaxстроится по столбцуLowCardinality(Nullable(...)): предикатыWHERE/PREWHERE/HAVING ... IS NULL, проталкиваемые в хранилище, ранее отбрасывали все гранулы и возвращали 0 строк, даже если столбец содержал значенияNULL. #110061 (Groene AI). - Исправлено поведение
distinct_overflow_mode = 'break': теперьDISTINCTвозвращает частичный результат, накопленный до достижения лимита, и прекращает чтение источника, как и задокументировано. Ранее фрагмент, на котором превышалсяmax_rows_in_distinct/max_bytes_in_distinct, отбрасывался (что приводило к усечённым или пустым результатам), а запрос продолжал чтение и вставку в хеш-таблицу до конца входных данных, что могло закончитьсяMEMORY_LIMIT_EXCEEDED. #110075 (Sergey Kuznetsov). - Исправлена логическая ошибка
ChunkInfoRowNumbers does not existприOPTIMIZE TABLEIceberg-таблицы, содержащей файл данных в формате, отличном от Parquet (например,ORC), который новее всех файлов позиционного удаления. #110107 (Alexey Milovidov). - Исправлены
max_bytes_in_distinctиmax_bytes_in_set: строковые ключи хранятся в arena, которая не учитывалась при проверке лимитов, поэтомуDISTINCT/INпо строковым ключам могли занимать памяти больше байтового лимита на полный размер полезной нагрузки ключей (без ограничения по длине ключа). Теперь лимиты учитывают arena, в соответствии с документацией; запросы со строковыми ключами, близкие к байтовому лимиту, теперь могут достигать его раньше (и это корректно). #110120 (Sergey Kuznetsov). - Исправлена ошибка
LOGICAL_ERROR(Bad cast from type ColumnLowCardinality to ColumnString), когдаidentity(или результат scalar subquery) оборачивает значение, содержащее вложенныйLowCardinality, а запрос используетWITH TOTALS/WITH ROLLUP. #110138 (Groene AI). - Исправлено чтение файлов
Npyс внутренними размерностями нулевого размера: теперь число materialized строк и результатыcountс оптимизацией и без неё совпадают. #110146 (Yanjun Qiu). - Исправлен квадратичный рост времени выполнения (и отсутствие реакции на
max_execution_time) в aggregation in order при группировке по нескольким ключам, когда sort order является лишь префиксом grouping key. #110159 (Alexey Milovidov). - Исправлена логическая ошибка (
Unexpected number of columns in result sample block), возникавшая, когда фильтр, содержащий correlated subquery (например,exists((SELECT ...))), оптимизировался сconvert_query_to_cnfилиoptimize_and_compare_chain. #110187 (Alexey Milovidov). - Исправлено Исключение (
UNION mode UNION_DEFAULT must be normalized), возникавшее, когда мутацияDELETEилиALTER UPDATEиспользовала операцию над множествами (UNION/UNION ALL/UNION DISTINCT/EXCEPT/INTERSECT) внутри подзапроса в условииWHEREили в присваиванииUPDATE. #110196 (Alexey Milovidov). - Исправлена логическая ошибка
ReadBuffer is canceled. Can't read from it.(аварийное завершение сервера в debug/sanitizer-сборках), которая могла возникать при чтении zip-архива (например, во времяRESTOREиз zip-резервной копии), если предыдущее чтение из того же архива прерывалось с ошибкой посреди потока. #110197 (Groene AI). - Исправлены медленное завершение работы сервера и отсутствие отклика у
KILL MUTATION, когда мутация сx IN (subquery)строила множество подзапроса во время анализа первичного ключа; теперь построение множества отменяется сразу. #110198 (Alexey Milovidov). - Keeper теперь отклоняет установку настроек coordination
max_requests_batch_sizeиmax_requests_append_sizeв значение0вместо того, чтобы застревать в бесконечном append-entries-цикле в многоузловой конфигурации. #110200 (Alexey Milovidov). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKпри использованииGROUP BY ALLдля кортежного выражения вместе сORDER BY. #110206 (Alexey Milovidov). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKприINSERTв таблицу с ограничениемCHECK, ссылающимся на подстолбец (например,x.nullу столбцаNullableилиarr.size0уArray). #110208 (Alexey Milovidov). - Исправлено чтение таблиц Iceberg, у которых порядок сортировки по умолчанию ссылается на столбец, требующий кавычек (например,
@timestamp). Такие таблицы были нечитаемы, потому что синтезированныйORDER BYхранилища строился из исходного имени столбца и не разбирался, приводя кSYNTAX_ERROR. #110233 (Groene AI). - Исправлено поведение
system.tablesдля базы данныхDataLakeCatalog(Iceberg/Glue), при котором весь запрос аварийно завершался или таблицы молча пропадали, если не удавалось разрешить метаданные одной таблицы. Теперь такая таблица остаётся в списке по имени, со значениями по умолчанию/NULL в столбцах, для которых требуется открытый объект хранилища (engine,total_rowsи т. д.), независимо отdatabase_datalake_require_metadata_access. Прямой доступ к повреждённой таблице по-прежнему возвращает ошибку. #110242 (Groene AI). - Исправлено возможное аварийное завершение (heap-buffer-overflow), когда столбец состояния агрегатной функции семейства
quantileTDigestиспользовался как ключGROUP BYи одновременно сериализовался несколькими потоками. #110263 (Groene AI). - Исправлена ошибка при
INSERTв таблицуDataLakeCatalogMicrosoft Fabric / OneLake сIncorrectEndpointError(HTTP 400): запись в ADLS Gen2 (DFS) теперь направляется на хост конечной точки.dfs, а не на хост.blob. Примечание: при использованииremote_url_allow_hostsдляINSERTв список разрешённых должны быть добавлены оба хоста Fabric —.blob(чтение) и.dfs(запись). #110290 (Mohammad Lareb Zafar). - Исправлено аварийное завершение сервера при разборе некоторых PRQL-запросов (
SET dialect = 'prql'). Паника внутри компилятораprqlcприводила к аварийному завершению процесса вместо того, чтобы возвращаться как ошибка запроса. #110316 (Groene AI). - Исправлены случаи, когда запрос мог незаметно возвращать неверные результаты, если часть проекции была записана до изменения набора столбцов проекции (например, после обновления между версиями, которые по-разному материализуют источник столбца
ALIAS, или после того, какALTER TABLE ... MODIFY COLUMNпереназначает столбецALIAS, используемый проекцией), а затем читалась через проекцию или участвовала в слиянии: отсутствующий столбец заполнялся значениями по умолчанию вместо реальных данных. Такие части теперь читаются из базовой таблицы, а при слиянии проекция заново строится из базовых данных. #110328 (Shaohua Wang). - Исправлено поведение, при котором
ORDER BY ... WITH FILLне учитывалmax_execution_timeи медленно отменялся при генерации большого диапазона заполнения (особенно сINTERPOLATE). #110332 (Alexey Milovidov). - Исправлена логическая ошибка (аварийное завершение сервера в debug/sanitizer-сборках), возникавшая при выполнении многокомандного
ALTER, напримерUPDATE ..., DELETE ..., для Iceberg table. Такие мутации теперь отклоняются с понятной ошибкойNOT_IMPLEMENTED. #110347 (Groene AI). - Исправлена ошибка парсера, из-за которой
COMMENTошибочно воспринимался как неявный alias, когда запросSELECTзаканчивался сразу после простого идентификатора таблицы (например,... FROM t COMMENT 'x'), что приводило к вводящей в заблуждение синтаксической ошибке вместо применения комментария к представлению/таблице. #110372 (Aditya Kumar). - Исправлен сбой сервера (native stack overflow), возникавший при копировании или уничтожении глубоко вложенного литерала
Array/Tuple/Map/Object, например в запросе с очень глубоко вложенным литералом при увеличенномmax_parser_depth. #110393 (Raúl Marín). - Исправлены два случая, когда векторный поиск мог возвращать меньше строк, чем ожидалось: значения
vector_search_index_fetch_multiplierниже 1.0 могли обрезать вычисленное число извлекаемых строк до нуля и давать пустой результат (такие значения теперь отклоняются), а оптимизация векторного поиска теперь пропускается для запросовLIMIT ... WITH TIES, поскольку она ограничивала поиск ровно N кандидатами и отбрасывала строки, совпадающие с N-й строкой. #110452 (Tamish Mhatre). #110453 (Tamish Mhatre). - Исправлены логическая ошибка
Expected CommonSubplanReferenceStep to reference CommonSubplanStep, ошибкаSubplan cannot be used to build pipelineи логическая ошибкаTrying to extract chunk from ChunkBuffer before all inputs are finishedдляIN (subquery), где подзапрос содержит коррелированный подзапрос, а Set строится во время анализа индекса. #110491 (Alexey Milovidov). - Исправлена подстановка параметров запроса внутри определений именованного предложения
WINDOW. Ранее параметры там незаметно оставались неподставленными, а незаданный параметрIdentifierмог приводить к исключениюLogical error: '!part.empty()'во времяEXPLAIN SYNTAX. #110506 (Alexey Milovidov). - Исправлен сбой запуска сервера для таблиц
MergeTreeна дисках объектного хранилища, когда оставшийся файлtxn_version.txt.tmpповреждал метаданные на уровне диска. #110519 (Alexey Milovidov). - Исправлена logical error в файловом кэше (
Expected file ... not to exist), которая могла возникать, когда фоновая загрузка кэша завершалась ошибкой, не связанной с файловой системой (например, при выполненииOPTIMIZEдля Iceberg table), оставляя после себя пустой осиротевший файл кэша. #110549 (Groene AI). - Исправлено чтение повреждённого потока в формате
Native, у которого число типовDynamicили число путейJSON/Objectблизко кSIZE_MAX: такой некорректный входной поток теперь отклоняется с понятной ошибкойINCORRECT_DATAвместо неперехваченногоstd::length_error. #110590 (Alexey Milovidov). - Исправлено падение сервера в database engine
MaterializedPostgreSQL, которое могло происходить, если table была detached (или её structure изменялась), пока она всё ещё находилась в очереди на синхронизацию. #110596 (Alexey Milovidov). - Исправлено некорректное поведение
SET param_<name>в клиенте (и флагов--param_<name>), когда имя parameter совпадало с именем встроенной setting, напримерlimit,offset,max_threadsилиlog_comment. В зависимости от конфликтующей setting, запрос завершался ошибкойCANNOT_PARSE_QUOTED_STRING, значение молча нормализовалось (например,max_threads=0превращалось вauto(N)), либо терялось имя алиаса setting. Такой parameter также ломал все последующиеSET param_*в той же сессии. #110597 (Raúl Marín). - Исправлено чтение подстолбцов столбца, который имеет выражение
DEFAULTи не materialized в part (например, послеALTER TABLE ADD COLUMNили во времяALTER TABLE MATERIALIZE COLUMN): подстолбец заполнялся значениями по умолчанию для type вместо вычисленного выраженияDEFAULT, а transposed функции расстояния между векторами (cosineDistanceTransposedи другие) на таких столбцахQBitзавершались ошибкойSIZES_OF_ARRAYS_DONT_MATCH. Это закрывает #110634. #110636 (Alexey Milovidov). - Исправлена ошибка
LOGICAL_ERRORInvalid partition key size: 0, из-за которой могла завершиться неудачей операцияINSERTв партиционированную tableMergeTreeс включённойnon_replicated_deduplication_window, когда пакет async insert был дедуплицирован лишь частично (некоторые значенияinsert_deduplication_tokenбыли дубликатами, а некоторые — новыми). #110651 (Groene AI). - Фоновый flush asynchronous insert теперь оперативно останавливается при завершении через
KILL QUERY; ранее flush большого буферизованного полезного содержимого продолжал разбор до конца и игнорировал отмену. #110652 (Shaohua Wang). - Исправлены неверные результаты
GROUP BYсoptimize_aggregation_in_orderиDISTINCTсoptimize_distinct_in_order, размещёнными поверхpartial_mergeJOIN. Оптимизация чтения в порядке распространялась через partial-merge JOIN, который повторно сортирует свой левый вход по ключу JOIN и поэтому не сохраняет исходный порядок левого потока, из-за чего строки группировались некорректно. #110671 (Groene AI). - Исправлено переполнение знакового целого числа в
toStartOfIntervalпри экстремальном количестве intervalMONTH,WEEKилиDAYдля значенийDate/Date32/DateTime64. #110688 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKдля запросов с подзапросом вFROM, когда параллельные реплики работают в режимеcustom_key_sampling/custom_key_range. Такие запросы (например,SELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k) ранее завершались ошибкойNot found column __table2.id in block .... #110690 (Groene AI). - Исправлено поведение
readWKT, из-за которого функция отклоняла строки WKT с ведущими пробелами (например,readWKT(' POINT(1 2)')), хотя они допускаются типизированными функциями чтенияreadWKTPoint/readWKTPolygon/… и грамматикой WKT. #110706 (Groene AI). - Исправлена logical error (
Column ... already added for reading, аварийное завершение сервера в debug/sanitizer builds), возникавшая, когда один и тот же предикат текстового индекса использовался и вPREWHERE, и в предложенииWHEREв запросе к таблицеMergeповерх таблицыDistributed. #110710 (Groene AI). - Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKдля транспонированных функций расстояния над столбцамиQBit(таких какcosineDistanceTransposed), вызываемых со скалярным подзапросом или константным reference vector при включённых параллельных репликах. Это закрывает #110719. #110729 (Alexey Milovidov). - Исправлена редкая
LOGICAL_ERROR(Unexpected number of parts to remove from parts_queue; аварийное завершение сервера в debug/sanitizer builds) вReplicatedMergeTree, возникавшая, когда две операции с партициями (например, два запросаMOVE PARTITION/REPLACE PARTITIONили один такой запрос, выполняющийся одновременно с фоновымDROP_RANGE) одновременно отменяли фоновую проверку частей на перекрывающихся диапазонах. #110738 (Groene AI). - Исправлена logical error
Hash is not set for serialization, которая могла возникать, когда столбец с кодекомQuantized(...)был обёрнут в другую сериализацию, например в таблицеMergeповерх Sources, где одноимённый столбец имеет разные типы (объединяемые вVariant). #110776 (Groene AI). - Исправлено зависание сервера при умножении состояния aggregate function
median/quantileна очень большую целочисленную константу (например,medianState(x) * 18446744073709551615). Запрос переставал реагировать на отмену и мог выполняться бесконечно. #110779 (Groene AI). - Исправлено падение сервера (целочисленное деление на ноль), возникавшее при использовании квоты с интервалом нулевой длины (например,
CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000). Теперь неположительная длительность интервала квоты отклоняется при создании квоты. #110846 (Pedro Ferreira). - Исправлено поведение
throwIf(notLike(col, pattern))(и другихthrowIf, применённых к функции), при котором исключение генерировалось безусловно, еслиcolимеет типLowCardinality. РеализацияLowCardinalityпо умолчанию запускалаthrowIfпо всему словарю, который всегда содержит зарезервированное значение по умолчанию, даже если на него не ссылается ни одна строка, поэтому ненулевое значение в этом неиспользуемом слоте заставлялоthrowIfгенерировать исключение для данных, не удовлетворяющих условию. #110864 (Groene AI). - Исправлена передача активных ролей запроса (
SET ROLEили параметрrole) на удалённые узлы при чтении через parallel-replica иDistributedв кластере, защищённом межсерверным секретом; ранее удалённые узлы переключались на роли пользователя по умолчанию, из-за чего политики на уровне строк применялись иначе, чем на узле-инициаторе. #110867 (Nikolay Degterinsky). - Исправлена ошибка, из-за которой таблица Iceberg создавала дублирующиеся ID полей после
ALTER TABLE ... ADD COLUMN, если исходная схема содержала вложенные поля (Tuple/Array/Map). Теперьlast-column-idсохраняет максимальный назначенный ID поля, включая вложенные дочерние элементы, поэтому добавленный позже столбец больше не использует повторно ID вложенного поля, а чтение больше не завершается ошибкойICEBERG_SPECIFICATION_VIOLATION(Duplicate field id). #110884 (Groene AI). - Исправлен сбой в FIPS-сборках при использовании SSH-ключа Ed25519 (
CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519'или такого ключа вusers.xml). Ed25519 не одобрен для FIPS; теперь такие ключи отклоняются с понятной ошибкойLIBSSH_ERROR. #110891 (Konstantin Bogdanov). - Исправлены результаты с пониженной точностью у транспонированных функций расстояния для столбцов
QBit(cosineDistanceTransposed,L2DistanceTransposed,dotProductTransposed). Значения, усечённые доprecisionбитовых плоскостей, восстанавливались с заполнением отброшенных битов нулями, что смещало каждое восстановленное значение к нулю и давало вырожденный результат при низкой точности: дляQBit(BFloat16)при precision 1 сохраняется только знаковый бит, поэтому каждое значение восстанавливалось в±0.0, а расстояние становилось одной и той же константой для каждой строки, не неся информации для ранжирования. Теперь усечённые значения восстанавливаются в ограниченную середину оставшейся ячейки точности (сырые кодыInt8— в центр своей ячейки; точные нули и бесконечности сохраняются), так что меньшаяprecisionозначает обмен точности на скорость без сильного смещения результатов. Результаты с полной точностью не изменились. Это закрывает #110898. #110911 (Alexey Milovidov). - Исправлен сбой сервера (use-after-free) во время корректного завершения работы после выполнения запросов к таблицам Iceberg из сеансов, в которых также использовались временные таблицы. #110914 (Miсhael Stetsyuk).
- Исправлена ошибка
LOGICAL_ERROR: Cannot sum Bools(аварийное завершение сервера в debug/sanitizer-сборках) при слиянии состояний агрегатной функцииsumMap/sumMapWithOverflow/sumMapFilteredсо значениямиBool, сериализованными в старом формате состояния (version 0). Это же исправление также устраняет два случая молчаливо неверного результата для состоянийBoolверсии 0: ключи map типаBoolне дедуплицировались между состояниями, а compaction нулевых значений удалял неправильные записи. #110922 (Groene AI). - Исправлен сбой, возникавший, когда агрегатная функция с комбинатором
-Tupleиспользовалась сRESPECT NULLSи создавала промежуточное состояние (-State, распределённая агрегация,WITH ROLLUP/WITH CUBE). Комбинированная функция получала имя по неправильному варианту состояния, поэтому её сериализованный типAggregateFunctionпри round-trip повторно разрешался в несовместимое представление в памяти. #110930 (Groene AI). - Исправлена проблема, из-за которой
PREWHERE(и политики на уровне строк) для столбца Iceberg, переименованного через изменение схемы, молча возвращал0строк для старых data files. Теперь такие запросы возвращают правильные строки, как иWHERE. #110941 (Groene AI). - Исправлен
LOGICAL_ERROR(LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M), который мог возникать в запросах векторного поиска сvector_search_with_rescoring = 1в сочетании с отложенной материализацией, когда несколько расстояний совпадали. #111003 (Groene AI). - Исправлено чтение данных
Arrow/ArrowStreamс пустыми вложенными столбцамиArray/Map, созданных в Apache Arrow Java < 19.0.0 (входит в состав Apache Spark), которые ранее отклонялись с ошибкойINCORRECT_DATAо слишком маленьком буфере offsets. #111101 (Raúl Marín). - Исправлено чтение устаревших данных на дисках
plain_rewritableпри включённом page cache. #111105 (Mikhail Artemenko). - Исправлена ошибка
CANNOT_CONVERT_TYPEдля констант типаVariant(включаяGeometry) в распределённых запросах и запросах с параллельными репликами. #111136 (Nikita Fomichev). - Исправлена ошибка, из-за которой чтение больших файлов из HDFS могло завершаться сбоем или давать некорректный результат, если один запрос на чтение превышал 32-битный предел размера
hdfsPread(INT_MAX). #98470 (Arup Chauhan). - Исправлено некорректное использование text index для проверок на равенство с пустой строкой поиска. #108340 (Robert Schulze).
- Исправлено зависание в
SYSTEM SYNC MERGESс селектором слиянияManual, когда запланированное слияние не удавалось поместить в заполненный фоновый пул. #108770 (Alexey Milovidov). - Исправлено поведение
ATTACH TABLE ... AS REPLICATED, при котором отбрасывались закоммиченные данные и восстанавливались строки до применения mutation, если в части данных оставался устаревший файлtxn_version.txt.tmp. #108772 (Alexey Milovidov). - Исправлена возможная race condition в
ALTER TABLE ... MOVE PARTITION TO TABLEс нереплицируемыми таблицамиMergeTree, которая могла приводить к появлению пересекающихся частей данных, поскольку коммит перемещённых частей и выделение номеров блоков выполнялись не под одной и той же блокировкой. #108922 (Mikhail Artemenko). - Исправлено чтение таблиц
Iceberg, записанных Databricks UniForm, который записывает в manifest files вырожденную placeholder-схему (с пустым списком полей). #108945 (Konstantin Vedernikov). - Исправлена ошибка use-after-free при многопоточном чтении непартиционированной таблицы
Hive. #109164 (Alexey Milovidov). - Исправлено поведение, при котором уровень логирования консоли не возвращался к исходному после запуска сервера, если задан
logger.startup_console_log_level: уровень считывался из неверного ключа конфигурации, поэтому консоль оставалась на повышенном startup level на протяжении всей работы сервера. Закрывает #103472. #109858 (Garrett Thomas). - Исправлены аномалии snapshot isolation в транзакциях метаданных диска
plain_rewritable. Исправляет #92055. #110948 (Mikhail Artemenko). - Исправлено аварийное завершение (
front() called on an empty vector) вclickhouse-client --login, когда хост не передавался явно через аргумент--host, например если он брался из--connection, файла конфигурации или переменной окруженияCLICKHOUSE_HOST. Закрывает #103603. #110279 (Christoph Wurm). - Исправлена логическая ошибка (
!part.empty()), возникавшая, когда аргумент лямбда-выражения — это идентификатор в обратных кавычках, имя которого содержит точку (например,__table1.). Ранее такой запрос приводил к обрабатываемому исключению в релизных сборках и аварийно завершал сервер в debug- и sanitizer-сборках при форматировании сообщения об ошибке. #108735 (Groene AI). - Исправлена
LOGICAL_ERROR(No set is registered for key) вALTER TABLE ... DROP COLUMN, мутацияхALTER TABLE ... DELETE/UPDATEи легковесномDELETE FROMдля таблиц со столбцомALIAS, выражение которого использует операторIN(в том числе через другой столбецALIAS). #111039 (Pedro Ferreira). - Исправлена незаметная потеря данных при async inserts и дедупликации (
async_insert=1,async_insert_deduplicate=1). Когда несколько записей async-insert с разными значениямиinsert_deduplication_tokenобъединялись в один flush, записывающий данные в непересекающиеся партиции, каждый токен регистрировался в журнале дедупликации всех партиций, которых касался flush, а не только той партиции, куда попадали соответствующие строки. В результате более поздняя вставка, повторно использующая один из этих токенов в партиции, в которую она никогда не писала, незаметно дедуплицировалась. Теперь токены регистрируются только для той партиции, куда их строки действительно были записаны. Закрывает #111031. #111049 (Groene AI). - Исправлены исключение
LOGICAL_ERROR(ScatterExchangeStep should have one source shard, got 8) и дублирование строк при выполнении запроса к таблицеMergeповерх таблиц или представленийDistributedс экспериментальной настройкойmake_distributed_plan = 1. Закрывает #107946. #108401 (Groene AI). - Столбец
Nullable(Tuple(...))теперь сериализуется как одно полеCSVвместо развертывания в отдельные столбцы. Ранее значение, отличное отNULL, записывалось как несколько полейCSV, тогда какNULLзаписывался как один\N, из-за чего количество столбцов зависело от строки, что ломало заголовкиCSVWithNames/CSVWithNamesAndTypesи round-trip. #108959 (Groene AI). - Исправлена логическая ошибка (
KeyCondition uses PREWHERE output) в readerParquetv3, когда условие по ключу на уровне формата ссылается на столбец, который не читается из файлаParquet. #109267 (Groene AI). - Исправлены неверные результаты при чтении через table function с
FINALилиSAMPLEприserialize_query_plan = 1. Также исправлен ключ кэша статистики hash-таблицы aggregation для table functions, чтобы разные table functions больше не использовали одну и ту же запись предварительного выделения. #109847 (Azat Khuzhin). - Исправлена очистка
BACKUP ... TO Memory(...), завершающегося ошибкой до финализации: неудавшийся backup оставался зарегистрированным, поэтому его имя нельзя было использовать повторно. #109947 (Julia Kartseva). - Исправлена арифметика экстремальных interval в
WITH FILL STEPи функциях date/time intervaladd*/subtract*: дельты вне допустимого диапазона больше не полагаются на signed overflow, аWITH FILLс огромным шагомYEARбольше не зависает, прокручивая календарь назад. #110158 (Groene AI). - Исправлены ошибки
411 Length Requiredот сервисов Azure: Azure HTTP transport на базе Poco теперь задаётContent-Lengthна основе request body для SDK-клиентов, которые не устанавливают его самостоятельно, например Azure Key Vault. #110299 (Konstantin Bogdanov). - Отложенная оптимизация
FINAL(query_plan_optimize_lazy_final, по умолчанию отключена) больше не применяется, если запрос читает данные в порядке ключа сортировки, поскольку её заменяющий plan не сохраняет этот порядок и может возвращать результаты в неверном порядке. Она также больше не применяется, когдаLIMIT, меньший числа читаемых строк, применяется непосредственно на шаге чтения, где обязательный проход построения множества сводит на нет возможность раннего завершения. #110576 (Nikolai Kochetov). - Исправлены
readWKTиreadWKTPoint, которые дляPOINT EMPTYвозвращали неинициализированные координаты (в scalar-режиме) или устаревшие координаты из предыдущей строки (в vectorized-режиме). ТеперьPOINT EMPTYотклоняется с ошибкойCANNOT_PARSE_TEXT, поскольку ClickHousePoint— это фиксированныйTuple(Float64, Float64)без представления пустого значения. #110692 (Groene AI). - Исправлена некорректная обработка timezone при materializing столбцов правой стороны в hash joins. Закрывает #111033. #111074 (Yarik Briukhovetskyi).
- Исправлены неверные результаты
count()и пропуск строк, когда ключString(или более узкийFixedString) либо индекс пропуска данных minmax фильтруется сравнением с более широкой константойFixedString, напримерtoFixedString('abc', 257) = string_col. Primary key и minmax pruning строили диапазон по дополненной NUL-байтами константе и ошибочно пропускали подходящие granules. #111106 (Groene AI). - Исправлены асинхронные inserts в формате
Native: теперь одна буферизованная запись, ставшая несовместимой послеALTER ... MODIFY COLUMN, больше не приводит к сбою всего пакета. Закрывает #111064. #111108 (Mikhail f. Shiryaev). - Исправлен
CREATE OR REPLACEдля словаря с объектом другого типа: операция завершалась ошибкойCANNOT_DETACH_DICTIONARY_AS_TABLEуже после того, как замена была committed, оставляя осиротевшую таблицу_tmp_replace_*. #111142 (Nikolay Degterinsky). - Исправлен
INCOMPATIBLE_TYPE_OF_JOINдляANYJOIN по таблице движкаJoin, когда фильтр в предложении WHERE по столбцу правой стороны позволял planner переписать JOIN вSEMIилиANTI. У таблицы движкаJoinфиксированная объявленная strictness, которую нельзя изменить, поэтому теперь для таких таблиц это преобразование не выполняется. #111362 (Groene AI). - Исправлена table function
format, которая не возвращала столбцы, если входные данные разбирались в ноль строк (например, пустой JSON document или GeoJSONFeatureCollectionбез features). Теперь она возвращает пустой результат с корректными столбцами вместоNOT_FOUND_COLUMN_IN_BLOCK. Закрывает #111390. #111428 (Groene AI).
Улучшения сборки/тестирования/упаковки
- Сборки с sanitizer теперь сохраняют отчёт sanitizer в глобальный buffer
sanitizer_report, чтобы анализатор core dump мог прочитать его из core dump. #109333 (Miсhael Stetsyuk). muslтеперь собирается из исходного кода вместо использования вендорных бинарных файлов. #97452 (Konstantin Bogdanov).- Используются SIMD-реализации
memcmp/memcpy/memmove/memset/bcmp/memmemиз LLVM-libc. #107566 (Konstantin Bogdanov). Исправлено незаметное повреждение данных вmemmoveв отладочных сборках с-O0(-DDEBUG_O_LEVEL=0) на машинах с AVX-512. #110904 (Konstantin Bogdanov). - Удалено использование библиотеки
curlпо всей кодовой базе и во включённых сторонних библиотеках. #108296 (Konstantin Bogdanov). mariadb-connector-cобновлён до 3.4.9. #108328 (Konstantin Bogdanov).libsshобновлён до 0.12.0. #108329 (Konstantin Bogdanov).- Исправлено зависание при transaction
COMMITна macOS. #108375 (Raúl Marín). - Добавлена опция CMake
COMPRESS_DEBUG_SECTIONS, которая сжимает отладочные секции DWARF в object file (-gz); она автоматически включается там, где это поддерживает compiler, чтобы уменьшить размер каталогов Debug-сборок. При этом итоговые бинарные файлы остаются несжатыми, поэтому символизация stack trace во время выполнения не затрагивается. #109306 (Murphy). Входящий в комплект toolchain LLVM теперь собирается с zlib, поэтому его clang поддерживает-gz=zlib, а также была добавлена отсутствующая символическая ссылкаclang++-21. #109596 (Murphy). - Debug-сборки теперь компилируют вендорные Rust-крейты с сокращённой отладочной информацией (
debug = 1, уровень cargolimited) и без incremental cache (REDUCE_RUST_DEBUG_INFO, включено по умолчанию), что уменьшает размер Rust-артефактов сборки (~12 → ~7 GB при сборке с нуля) и предотвращает неограниченный рост cache cargo при повторных сборках. Установите-DREDUCE_RUST_DEBUG_INFO=OFF, чтобы вернуть полный DWARF и incremental compilation. #109471 (Murphy). - Добавлена поддержка streaming distributed query exchange и чтений
STREAMна macOS. #109769 (Raúl Marín). libarchiveобновлён с 3.8.7 до 3.8.8. #109874 (Robert Schulze).c-aresобновлён с 1.34.6 до 1.34.8. #109905 (Robert Schulze).krb5обновлён для исправления CVE-2026-40355 и CVE-2026-40356. #109910 (Robert Schulze).- Удалена сторонняя зависимость
libpng. Вместо неёFORMAT PNGтеперь использует небольшой встроенный PNG-кодировщик (на основе включённого в комплект zlib). #110051 (Alexey Milovidov). - На macOS raw C-выделения памяти (не проходящие через
operator new) теперь отслеживаются в трекере памяти за счёт обёртки над malloc zone из jemalloc, поэтому для них применяются ограничения памяти. #110370 (Raúl Marín). - Docker-образы
-distrolessдляclickhouse-serverиclickhouse-keeperтеперь собираются из не содержащей shell стадии продакшн; ранее они собирались из стадии отладки и включали/busybox/sh. Закрывает #105677. #105678 (ashishch432). abseil-cppобновлён до LTS20260526.0. #108991 (Konstantin Bogdanov).
Релиз ClickHouse 26.6, 2026-06-25. Презентация, Видео
обратно несовместимое изменение
- Это изменение удаляет возможность
allow_experimental_query_deduplication. Эта возможность долгое время оставалась экспериментальной, не имеет тестов и поддерживаться не будет (изначальные тесты были нестабильными и были удалены в #49579). #99398 (Igor Nikonov). - Возможность
SYSTEM INSTRUMENTна основе XRay теперь используетargumentsвместоparameters: столбецsystem.instrumentation.parametersбыл переименован вarguments, а синтаксисSYSTEM INSTRUMENT ADD ... HANDLER PARAMETERS ...— вSYSTEM INSTRUMENT ADD ... HANDLER ARGUMENTS .... Запросы и автоматизация, использующие старый столбец или синтаксис, нужно обновить на новые имена; старые имена больше не поддерживаются. #103854 (Pablo Marcos). - Настройка
show_data_lake_catalogs_in_system_tablesбыла переименована вshow_remote_databases_in_system_tablesи получила более широкое действие: когда её значение равно 0 (по умолчанию), базы данныхMySQLиPostgreSQLтакже скрываются изsystem.tables,system.columnsиsystem.completionsв дополнение к каталогам озер данных. Старое имя настройки сохранено как псевдоним. #104416 (Pablo Marcos). - Сборка x86 по умолчанию теперь нацелена на x86-64-v3 (AVX2) вместо x86-64-v2 (SSE4.2). Для этого требуется CPU с поддержкой AVX2 (Intel Haswell или новее, AMD Excavator или новее). Если ваш CPU не поддерживает AVX2, используйте сборку
amd64compat, рассчитанную на обычный x86-64. #105019 (Raúl Marín). - Вложенные
Dynamic/Variantв агрегатахmin/maxи индексахminmaxтеперь отклоняются. Ранее проверялись толькоDynamic/Variantверхнего уровня. Закрывает #104747. #105468 (Pavel Kruglov). icebergHashиicebergBucketтеперь отклоняют аргументыInt128,UInt128,Int256,UInt256иDecimal256, выдавая явную ошибку. Ранее они молча усекали значения большей разрядности и создавали коллизии хэшей. Спецификация Iceberg определяет хэширование только для 32-/64-битных целых чисел и decimal-значений с precision до 38; приведите значение кInt64илиDecimal128, чтобы сохранить прежнее поведение для подходящих значений. #105866 (Raúl Marín).- В CLI добавлен более гибкий контроль вывода запросов. Опция
--echoтеперь принимает необязательное булевое значение и работает как в интерактивном режиме, так и в batch mode. Новые опции--echo-formattedи--echo-query-idуправляют тем, будут ли выводимые запросы форматироваться и будет ли печататьсяquery_idсоответственно. Опция--hilite/--highlightтеперь также управляет подсветкой выводимых запросов. Как побочный эффект,--echoтеперь является опцией с булевым значением, поэтому позиционный запрос сразу после--echoбез указанного значения воспринимается как её значение; вместо этого используйте--echo --query "..."или--echo=false. #106191 (Alexey Milovidov). - Удалены экспериментальные функции KQL (Kusto)
array_sort_ascиarray_sort_desc, а также их SQL-backend’ыkql_array_sort_ascиkql_array_sort_desc. Эти функции были экспериментальными, были некачественно реализованы и служили источником ошибок корректности и парсера. Запросы, использующие эти имена, теперь возвращаютUNKNOWN_FUNCTION. #108101 (Groene AI). ALTER TABLE ... REPLACE PARTITION ... FROM ...больше не удаляет молча данные целевой партиции, если в исходной таблице нет частей в запрошенной партиции. Раньше такой запрос удалял целевую партицию и ничего не записывал взамен — опасное поведение, которое могло привести к потере данных. Теперь по умолчанию такой запрос отклоняется с ошибкойBAD_ARGUMENTS. Чтобы вернуть прежнее поведение с неявной очисткой, установите новую настройкуallow_replace_partition_from_empty_source = 1или задайтеcompatibilityравным26.5или ниже; чтобы явно удалить данные в целевой партиции, используйтеALTER TABLE ... DROP PARTITION. #104939 (Groene AI).- Значение по умолчанию для настройки сервера
insert_deduplication_versionменяется сcompatible_double_hashesнаnew_unified_hash. Дедупликация вставки теперь работает для всего вставляемого блока (на одну вставку), а не отдельно для каждой части/партиции: повтор той же вставки по-прежнему дедуплицируется, но две разные вставки, создающие идентичную часть, больше не дедуплицируются между собой, и вставки одних и тех же строк в разном порядке тоже больше не дедуплицируются. Установитеinsert_deduplication_version = compatible_double_hashes, чтобы вернуть прежнее поведение. Экземпляры, которые обновляются напрямую с релиза, где значением по умолчанию былold_separate_hashes, должны сначала работать сcompatible_double_hashes, пока не истечёт максимально длительное релевантное окно дедупликации, и лишь после этого полагаться наnew_unified_hash. #107886 (Sema Checherinda).
Новая возможность
- Добавлена поддержка непрерывных запросов к таблицам
MergeTree, реализованная в виде серии операций чтения снимка. Это первый шаг к полноценной поддержке потоковых запросов. #105114 (Mikhail Artemenko). - Добавлены гипотетические (what-if) индекс пропуска данных. Используйте
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ..., чтобы определить виртуальный индекс пропуска данных, действующий в рамках сессии, а затемEXPLAIN WHATIF SELECT ..., чтобы оценить его коэффициент пропуска и стоимость без материализации. Определённые индексы видны в новой таблицеsystem.hypothetical_indexes. #104608 (Yarik Briukhovetskyi). - Добавлен встроенный веб-интерфейс
/schemaвclickhouse-server, визуализирующий граф зависимостей между таблицами, materialized view, refreshable materialized view, словарями, distributed таблицами и представлениями. #105276 (Nikita Mikhaylov). - Добавлена поддержка output format
PNG, позволяющая напрямую выводить результаты запроса в виде PNG-изображений. #74691 (Maksim Dergousov). - Добавлено определение ИИ-агента для написания кода (Claude Code, Cursor, Codex, Gemini CLI, Goose и т. д.), вызвавшего
clickhouse-clientилиclickhouse-local, на основе переменных окружения. Обнаруженный агент указывается в новом столбцеclient_agentтаблицsystem.query_log,system.query_thread_logиsystem.processes. #106619 (Alexey Milovidov). - Добавлена новая system table
system.documentation, которая собирает встроенную справочную документацию по унифицированным компонентам системы (functions, table engines, data types, settings, formats и другим) в одну таблицу, при этом документация отображается в формате Markdown. #107463 (Alexey Milovidov). - Добавлен input format
GeoJSONдля чтения документов GeoJSONFeatureCollection, создающий по одной строке на каждый объект со столбцамиid(String),geometry(Geometry) иproperties(Nullable(JSON)). ГеометрииPoint,LineString,MultiLineString,PolygonиMultiPolygonсчитываются в нативный типGeometryClickHouse.GeometryCollectionиMultiPoint, которые типGeometryне может представить, по умолчанию генерируют исключение, либо могут сохраняться какNULLс помощью настройкиinput_format_geojson_unsupported_geometry_handling. Вклад в #91533. #98124 (Mark Needham). - Добавлены функции для прямой выдачи векторных тайлов Mapbox из SQL:
MVTEncodeGeomпроецирует геометрию в пиксельное пространство тайла slippy-map и обрезает её,MVTEncodeагрегирует спроецированные геометрии группы в двоичное представление однослойного тайла, аMVTBoundingBox/MVTBoundingBoxMercatorвозвращают ограничивающий прямоугольник тайла для отбора строк в его пределах. Поддерживается геометрия точек, линий и полигонов. Также доступны псевдонимы PostGISST_AsMVTGeomиST_AsMVT. #106107 (Saarthak Gupta). clickhouse-localтеперь поддерживает запросыSYSTEM START LISTENиSYSTEM STOP LISTEN, что позволяет превратить его в сервер, принимающий TCP- и HTTP-соединения. #101143 (Alexey Milovidov).- Добавлена интерактивная команда
helpвclickhouse-clientиclickhouse-local. При вводеhelp <name>(а также/help,man,/man) в терминале отображается документация по функции, движку таблицы, типу данных, формату, настройке или другому компоненту, отрендеренная из Markdown с подсветкой синтаксиса SQL. Если слово неоднозначно, показываются все совпадения, а если оно не найдено, предлагаются похожие названия. #108042 (Alexey Milovidov). - Добавлена поддержка записи в Azure Data Lake Storage Gen2. #105406 (Konstantin Vedernikov).
- Добавлен формат
RowBinaryWithNamesAndTypesAndDefaultsдля более качественной поддержки изменения схемы. #105736 (Mark Zitnik). - Добавлена поддержка
ADD ENUM VALUESв запросахALTER TABLE, чтобы упростить добавление новых значений в существующий типEnumбез необходимости заново указывать все текущие значенияEnum. #93830 (Ilya Golshtein). - refreshable materialized view теперь поддерживает
REFRESH DEPENDS ON, что позволяет запускать обновление при обновлении другого RMV, а не по расписанию, привязанному ко времени. (REFRESH EVERY ... DEPENDS ONуже существовал, но его нельзя было надёжно использовать в этом сценарии.) См. документациюCREATE MATERIALIZED VIEW. #104440 (Michael Kolupaev). - Добавлена поддержка выбора столбцов по шаблону имени с помощью
* LIKE '<pattern>'и* ILIKE '<pattern>', включая квалифицированные формы, такие какtable.* LIKE '<pattern>'иtable.* ILIKE '<pattern>'.LIKEсопоставляет имена столбцов с учётом регистра,ILIKE— без учёта регистра. #104569 (Yue Ni). - Добавлен синтаксис
ESCAPE, позволяющий задать собственный символ экранирования в шаблонеLIKE, чтобы%и_трактовались как обычные символы, а не как подстановочные. #99774 (Ilya Yatsishin). - Добавлены настройки таблицы
MergeTreematerialize_projections_on_insertиmaterialize_projections_on_merge. Когдаmaterialize_projections_on_insert = 0, операцииINSERTпропускают построение частей проекций, что повышает пропускную способность вставки для таблиц с большим количеством проекций. Когдаmaterialize_projections_on_merge = 1, слияние перестраивает проекцию, отсутствующую во всех исходных частях, так что проекции можно строить во время слияний, а не при вставке. Слияния по-прежнему объединяют только части с одинаковым набором проекций. #100993 (Christoph Wurm). - Добавлена новая неизменяемая настройка
MergeTreeallow_tuple_element_aggregation, по умолчанию отключённая. Когда она включена,SummingMergeTree,AggregatingMergeTreeиCoalescingMergeTreeрекурсивно разворачивают столбцыTupleи агрегируют каждый листовой элемент независимо во время слияний, точно так же, как если бы это был столбец верхнего уровня:SummingMergeTreeсуммирует его,AggregatingMergeTreeобъединяет его состояние агрегатной функции, аCoalescingMergeTreeсохраняет его последнее значение, отличное от NULL. Эту настройку нужно задавать при создании таблицы, и движки, которые её не поддерживают, молча её игнорируют. #98039 (johnjing). - Новые функции
quantizeBFloat16ToInt8иdequantizeInt8ToBFloat16: скалярный кодек для сжатия компонентов эмбеддингов до 8 бит с помощью 256-уровневого гауссова квантователя Ллойда — Макса, из которого затем можно извлекать коды Int4/Int2/бинарные коды путём усечения битов. #108102 (Alexey Milovidov). - Добавлены функции
arrayTopKиarrayBottomK: -arrayTopK(k, array)возвращает K наибольших элементов в порядке убывания -arrayBottomK(k, array)возвращает K наименьших элементов в порядке возрастания. #104563 (Vitaly Baranov). - Добавлена новая системная таблица
system.iceberg_files, предоставляющая метаданные отдельных файлов для таблицIceberg, по одной строке на каждый файл данных или файл удаления в текущем снимке каждой таблицы. Это закрывает #98777. #104415 (Asya Shneerson). - Добавлена таблица
system.constraints, которая предоставляет информацию обо всех ограниченияхCHECKиASSUMEво всех таблицах, включая имя ограничения, тип и выражение. #105337 (Pedro Ferreira). - Добавлена новая таблица
system.dictionary_layouts, в которой перечислены доступные структуры словарей вместе со встроенной документацией (description,syntax,examples,introduced_in,related). #106182 (Alexey Milovidov). - Добавлена новая таблица
system.dictionary_sources, в которой перечислены доступные источники словарей вместе со встроенной документацией (description,syntax,examples,introduced_in,related). #106184 (Alexey Milovidov). - Добавлена новая таблица
system.data_skipping_index_types, в которой перечислены доступные типы индексов с пропуском данных вместе со встроенной документацией (description,syntax,examples,introduced_in,related). #106186 (Alexey Milovidov). - Добавлена новая таблица
system.disk_types, в которой перечислены доступные типы дисков вместе со встроенной документацией (description,syntax,examples,introduced_in,related). #106187 (Alexey Milovidov). - Реализована команда
SYSTEM RESTART DISK <name>: теперь она заново загружает хранящиеся в памяти метаданные диска и повторно сканирует части данных таблиц с репликами только для чтения, расположенных на нём. Это позволяет реплике таблицы только для чтения на общем хранилищеplain_rewritableпо запросу увидеть данные, записанные другим сервером, не дожидаясьrefresh_parts_intervalи без перезапуска сервера. #106645 (Jordi Villar). - Теперь поддерживается синтаксис в стиле PostgreSQL
expr OP SOME(array)/expr OP ALL(array)(с правой частью не в форме с подзапросом), который переписывается вhas/NOT hasдля=/<>или в лямбда-выраженияarrayExists/arrayAllдля других операторов сравнения.ANYне принимается для формы с массивом, посколькуanyтакже является агрегатной функцией; используйте вместо этогоSOME. Форма с подзапросом дляANY/SOME/ALLпо-прежнему сводится кIN/NOT IN. #105129 (Alexey Milovidov). - Добавлены две новые стратегии
load_balancing,hostname_longest_common_prefixиhostname_longest_common_suffix, которые отдают предпочтение той реплике, чей хост имеет самый длинный общий префикс (соответственно, суффикс) с хостом инициатора. Они полезны, когда дата-центр закодирован как префикс или суффикс в именах хостов, числовые сегменты которых имеют переменную длину, и существующие стратегииnearest_hostnameиhostname_levenshtein_distanceвыбирают неправильную реплику. #107360 (Denny [DBA at Innervate]). - В таблицу
system.session_logдобавлена информация о TLS-сертификате клиента (subjects, серийный номер, издатель и срок действия), чтобы улучшить обсервабилити аутентификации на основе сертификатов. #107679 (Alexey Milovidov). - Добавлен необязательный учетный параметр
external_idдля role-based access кS3. #106941 (Elian Gidoni). - Добавлена новая настройка
S3Queueafter_processing_move_preserve_path. Когда она включена вместе сafter_processing='move'иafter_processing_move_prefix, обработанные объекты перемещаются с сохранением полного исходного пути под префиксом пункта назначения, а не сводятся только к имени файла. #105354 (Asya Shneerson). - Добавлена настройка сервера
message_queue_disable_insertion, чтобы отключить вставку из движков очередей сообщений (Kafka,RabbitMQ,NATS) в materialized view в состоянии attached. Полезно для сценариев с репликой только для чтения. #104911 (JIaQi Tang). - Добавлены
LOCALTIMEиLOCALTIMESTAMP(SQL-стандарт / синтаксис PostgreSQL).LOCALTIMESTAMP— это псевдоним дляnow()(возвращаетDateTime);LOCALTIMEвозвращает текущее время суток как значениеTime. #106139 (Thomas Cabral). - Добавлен
date_part('unit', expr)как синтаксический сахар дляEXTRACT(unit FROM expr). Поддерживаются все стандартные виды интервалов, а также дополнительные варианты PostgreSQL (epoch,dow,doy,isodow,isoyear,century,decade,millennium). #105127 (Alexey Milovidov). - Добавлена PostgreSQL-совместимая поддержка
EXTRACT(TIMEZONE_HOUR FROM dt)иEXTRACT(TIMEZONE_MINUTE FROM dt)для получения часов и минут смещения часового пояса, а такжеEXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>)для извлечения значения из интервала. #106227 (Vinayak Joshi). - Добавлены агрегатные псевдонимы
min_byиmax_byдляargMinиargMax. #105712 (Joey Yu). Эти псевдонимы дурацкие, настоящие инженеры используют оригинальные имена ClickHouse. - Добавлен
REGEXP_SUBSTRкак регистронезависимый псевдонимregexpExtractдля совместимости с Oracle/MySQL/Snowflake. #105122 (Alexey Milovidov). - Добавлен
SESSION_USERкак регистронезависимый псевдонимcurrentUser()для совместимости с PostgreSQL / SQL-стандартом. #106081 (Takumi Hara). - Поддерживается завершающий модификатор
NULL/NOT NULLвALTER TABLE ... ADD/MODIFY COLUMN, по аналогии сCREATE TABLE. #106150 (Takumi Hara). - Теперь можно использовать функцию
h3PolygonToCellsWithContainmentиз h3, чтобы задействовать их новый алгоритм, поддерживающий режимы включения по центру, полного включения и перекрытия. #104455 (Youssef Kadry). - Добавлены флаги
IPV4_PREFIX_BITSиIPV6_PREFIX_BITS, если формирование ключей выполняется поIP_ADDRESSилиFORWARDED_IP_ADDRESS. #89270 (Aditya Chopra). formatReadableTimeDeltaтеперь принимает на вход выражениеINTERVALтипа, отличного отMonthиYear. #64315 (Francisco J. Jurado Moreno).- Теперь можно указать необязательный аргумент precision для функций
formatReadableSize,formatReadableDecimalSizeиformatReadableQuantity, который задаёт количество цифр после десятичной точки. Значение по умолчанию — 2, что сохраняет прежнее поведение. #104648 (Antonio Filipovic). - Добавлена настройка
output_format_float_precision, управляющая количеством десятичных цифр в текстовом выводе чисел с плавающей запятой. #99721 (phulv94). - Добавлена настройка
output_format_always_write_decimal_point_in_float_and_decimal, которая всегда выводит десятичную точку для чисел с плавающей запятой и чиселDecimalв текстовых форматах, даже если значение является целым числом. Например, выводится1.вместо1. По умолчанию отключена. #62614 (Ilya Yatsishin). - Добавлена поддержка новых элементов configuration HTTP-обработчика:
<url_prefix>и<full_url_prefix>(сопоставляют все path в пределах базового path, полезно, например, для обработчиков Prometheus), а также<url_regexp>,<full_url_regexp>и<headers_regexp>. Старая форма<url>regex:...</url>теперь Obsolete. #107492 (Vitaly Baranov). - Добавлена поддержка статистики
basic— компактной статистики по каждому столбцу, которая хранит числовые min/max, среднюю длину строк и количество значений NULL там, где это применимо. #106048 (Han Fei). - Добавлена поддержка TTL-узлов в ClickHouse Keeper; включается флагом возможности
create_ttl. #100397 (Konstantin Vedernikov). - Представлена возможность резервирования памяти для рабочих нагрузок. См. документацию по планированию рабочих нагрузок. #82414 (Sergei Trifonov).
Экспериментальные возможности
- Многостадийное выполнение распределённого запроса: планировщик разбивает план запроса на стадии, соединённые обменами scatter / broadcast / gather / shuffle, и отправляет фрагменты плана на узлы-воркеры. Данные между стадиями передаются потоком по TCP или через временные файлы в общем объектном хранилище; этот механизм поддерживает distributed shuffle и broadcast hash JOIN, shuffle-агрегацию и распределённую сортировку. Эта возможность экспериментальная и по умолчанию отключена. #106020 (Alexander Gololobov). Экспериментальный движок планов распределённых запросов (
make_distributed_plan) теперь может использовать разные порты для диспетчеризации задач и streaming exchange для каждого воркера, настраиваемые для каждой реплики в<remote_servers>с помощьюstateless_worker_portиstreaming_exchange_port. Если они не заданы, используются прежние порты уровня сервера (stateless_worker_client.portиdistributed_query.streaming_exchange_port). Это позволяет запускать несколько воркеров на одном хосте. #107885 (Alexander Gololobov). - Добавлен экспериментальный алгоритм переупорядочивания JOIN
dphypдля inner JOIN в качестве опции настройкиquery_plan_optimize_join_order_algorithm, а также настройкаquery_plan_optimize_join_order_max_searched_plans, которая ограничивает поиск порядка JOIN и при превышении лимита переключается на следующий алгоритм в цепочке; установите0, чтобы сохранить прежнее неограниченное поведение поиска. #98798 (Alexander Gololobov). - Добавлена функция
aiEmbedдля использования API LLM и генерации эмбеддингов прямо из ClickHouse. #102922 (George Larionov). - Добавлена экспериментальная Linux OOM-канарейка: жертвенный дочерний процесс, который Linux OOM killer завершает раньше основного процесса сервера. При включении с помощью
oom_canary_enableона снижает нехватку памяти, очищая кэши аллокатора, отменяя запросы, отменяя слияния и записывая событие вsystem.crash_log. Реакция на OOM требует наличия свидетельства OOM-kill вmemory.eventscgroup v2. #101942 (Peng). - Веб-интерфейс терминала по адресу
/webterminalтеперь является production-функцией и включён по умолчанию. Он управляется новой серверной настройкойenable_webterminal; прежняя настройкаallow_experimental_webterminalустарела, но по-прежнему поддерживается для обратной совместимости. Чтобы отключить конечную точку, установитеenable_webterminalвfalse. #106255 (Alexey Milovidov). - HTTP-конечные точки PromQL теперь поддерживают указание базы данных и таблицы через параметры запроса URL (
database=,table=, илиtable=db.table). Прежний неявный fallback на таблицуdefault.prometheusудалён: если ни config обработчика, ни URL не указывают таблицу, обработчик теперь возвращаетThe time series table name is not set. Чтобы сохранить прежнее поведение, настройте<table>default.prometheus</table>или передайтеtable=...в URL. #107553 (Vitaly Baranov). - Добавлена поддержка функции PromQL
histogram_quantileв табличных функцияхprometheusQueryиprometheusQueryRange. Это позволяет вычислять квантили по классическим бакетам гистограммы Prometheus, определяемым меткойle. #103477 (Joe Smith). - Добавлен отложенный режим применения списка вхождений для текстового индекса. При включении через
SET allow_experimental_text_index_lazy_apply = 1иSET text_index_posting_list_apply_mode = 'lazy'списки вхождений декодируются по требованию на уровне упакованных блоков с использованием подхода на основе курсора вместо полной материализации в Roaring Bitmaps, что снижает использование памяти и время CPU для выборочных запросов к текстовому индексу. #100035 (Peng). - Добавлена поддержка ABI AssemblyScript для WebAssembly UDF. Попробовать ABI AssemblyScript можно без локальной установки toolchain — в браузерной песочнице, которая компилирует код AssemblyScript и загружает получившийся модуль WebAssembly в локальный ClickHouse. #104606 (Vladimir Cherkasov).
- Разрешено подключать обработчики Prometheus на основном HTTP-порту с необязательным префиксом. #104975 (James Cunningham).
- Добавлен экспериментальный параметр
MergeTreepacked_skip_index_max_bytes, который объединяет небольшие подстримы skip-индексов в один архивskp_idx.packedдля каждой части, снижая расход inode, когда для таблицы определено много skip-индексов. Решение принимается для каждого подстрима во время записи: подстримы, чей сериализованный размер остаётся ниже порога, попадают в архив, а всё, что больше, сохраняет автономную структуруskp_idx_<name>.idx2/.mrk2. В одной части можно сочетать оба варианта структуры. Полнотекстовые индексы не поддерживаются и всегда хранятся в отдельных файлах. Значение по умолчанию — 0 (упаковка отключена). #105321 (Raúl Marín). - Добавлена поддержка сериализации
Buffersдля WebAssembly UDF с использованиемABI BUFFERED_V1, а также добавленwebassembly_udf_enable_fuelкак сохраняемый параметр функции WASM UDF. #105574 (Antonio Andelic). - Добавлен экспериментальный параметр
use_reader_executor(по умолчанию выключен), который направляет чтение через новый конвейерныйReaderExecutorвместо legacy-цепочки буферов чтения. #106570 (Sema Checherinda). Добавлены метрики обсервабилити для экспериментального пути чтенияuse_reader_executor, включая моделируемый KPI стоимости чтения (ReaderExecutorModeledCostMsPerRequestedMiB). #106968 (Sema Checherinda). Добавлен буферChainedBuffersдля экспериментального пути чтенияuse_reader_executorс метрикойReaderExecutorChainedBufferBytes. #107210 (Sema Checherinda). - Нисходящий порядок сортировки в ключах сортировки
MergeTree(например,ORDER BY (time DESC, key)) теперь поддерживается всегда и больше не требует экспериментального параметраallow_experimental_reverse_key, который стал устаревшим. #106440 (Nikita Mikhaylov). Nullable(Tuple(...))теперь в статусе бета. По умолчанию отключено; чтобы использовать, установитеenable_nullable_tuple_type = 1. #107754 (Nihal Z. Miaji).
Повышение производительности
- Различные изменения в Keeper, которые в целом ускоряют его примерно в 2 раза (улучшенная пакетная обработка, конвейерная отправка сообщений лидеру, конвейерное добавление записей в журнал). #101757 (Michael Kolupaev).
- Снижены накладные расходы на запрос для простых запросов
SELECT(разбор, анализ и планирование). Например,SELECT count() FROM hitsчерез одно соединение теперь выполняется примерно на 50% быстрее. #104513 (Raúl Marín). - Оптимизирован анализ индекса первичного ключа для длинных первичных ключей и первичных ключей с высокой кардинальностью. Для длинного первичного ключа время анализа индекса теперь в основном зависит от сложности фильтра запроса (то есть от столбцов ключа, которые он действительно использует), а не от длины самого первичного ключа — поэтому расширение ключа сортировки почти не добавляет накладных расходов на анализ индекса для запросов, которые фильтруют только по нескольким его столбцам. Для первичного ключа с высокой кардинальностью, где ClickHouse хранит в памяти только выборочный префикс столбцов ключа и не загружает последующие, анализ индекса теперь работает только с этим префиксом в памяти, а не со всем ключом. Оптимизация включена по умолчанию, а отключить ее можно с помощью новой настройки
use_lightweight_primary_key_index_analysis. Закрывает #65103. #91836 (Nihal Z. Miaji). - Сборка x86 по умолчанию теперь ориентирована на x86-64-v3 (AVX2) вместо x86-64-v2 (SSE4.2). Для этого требуется CPU с поддержкой AVX2 (Intel Haswell или новее, AMD Excavator или новее). Если ваш CPU не поддерживает AVX2, используйте сборку
amd64compat, ориентированную на обычный x86-64. #105019 (Raúl Marín). - Для сравнительных сортировок общего назначения теперь используются
ipnsortиdriftsort(стабильная сортировка) — порты на C++ реализаций сортировки из стандартной библиотеки Rust. Это ускоряетORDER BYдля нечисловых столбцов и стабильных сортировок, а также устраняет худший сценарий для входных данных, отсортированных в обратном порядке. #106650 (Alexey Milovidov). - Новая оптимизация
GROUP BYдля равномерно распределенных ключей с высокой кардинальностью распределяет строки по потокам с помощью хеширования ключа группировки, так что каждый поток агрегирует непересекающееся подмножество ключей без этапа слияния. Чтобы включить ее, установитеenable_sharding_aggregator = 1. #104233 (Nihal Z. Miaji). - Включена предвыборка hash table для запросов
GROUP BYсо строковыми ключами, что повышает производительность агрегации строк с высокой кардинальностью примерно на 8%. #101007 (Le Zhang). - Снижено пиковое потребление памяти при слиянии частичных результатов двухуровневой агрегации с большими состояниями агрегатной функции (например,
groupArray) за счет поэтапного освобождения исходных состояний каждого бакета во время слияния, вместо того чтобы держать их все в памяти до завершения процесса. #102330 (Yuri Fedoseev). - Оптимизировано представление
EnumDataTypeв памяти. Потребление памяти таблицами, содержащими типEnum, для компонентаEnumможет снизиться до 10 раз. Время получения имени по значению (числу) осталось прежним или стало меньше. Поиск по имени стал немного медленнее, но такой вариант доступа используется реже. #95668 (Ilya Yatsishin). - Добавлено кэширование разрешения идентификаторов, чтобы избежать повторного разрешения одних и тех же идентификаторов при анализе запроса. #88043 (Max Justus Spransy).
- Улучшена производительность анализа запросов к таблицам с большим числом столбцов: исключено вычисление хешей узлов столбцов (которые включают всё выражение исходной таблицы), когда в этом нет необходимости. Анализ вложенных подзапросов
SELECT *для таблицы с ~1200 столбцами теперь выполняется примерно в 50 раз быстрее. #106957 (Dmitry Novik). - Ускорен анализ запросов с большим количеством вызовов функций или с глубоко вложенными вызовами за счёт удаления избыточного хеша дерева запроса из кэша разрешения функций. #107516 (Dmitry Novik).
- Исправлены длительные зависания при входе и запуске запросов в реплицируемом хранилище прав доступа, когда одновременно изменяется много сущностей доступа (политики строк, роли, квоты, профили настроек). Теперь каждый кэш отдельных сущностей пересчитывается один раз на батч уведомлений, а не по одному разу на каждую изменённую сущность, что устраняет квадратичную нагрузку, из-за которой блокировка доступа могла удерживаться минутами. #107672 (Azat Khuzhin).
FixedHashMapиз hash JOIN теперь используется как JOIN runtime filter на стороне probe. Если hash table на стороне build являетсяFixedHashMap(или может быть преобразована в него), она публикуется как runtime filter и заменяетSet/BloomFilter, который в противном случае устанавливал быBuildRuntimeFilterStep. Это поведение управляется новой настройкойjoin_runtime_filter_from_fixed_hash_table(по умолчаниюtrue). #105640 (Xiaozhe Yu).- Отложенное применение selector и индексов репликации в случаях, когда после
JOINидёт селективныйLIMIT,TopNили другойJOIN. Чтобы управлять количеством столбцов полезной нагрузки для включения отложенных selector-индексов, используйте настройкуquery_plan_min_columns_for_join_lazy_indexing(0 означает, что оптимизация отключена). Чтобы управлять значениемLIMIT, при котором применяется оптимизация, используйте настройкуquery_plan_max_limit_for_join_lazy_indexing. #106566 (Hechem Selmi). - DP (dynamic programming) переупорядочивание JOIN теперь разрешено с параллельными репликами. #105889 (Nikita Taranov).
- Улучшен план запроса, когда JOIN использует runtime filters (при включённой по умолчанию настройке
enable_join_runtime_filters): модель стоимости переупорядочивания JOIN теперь учитываетWindowTransform(и другие шаги плана, сохраняющие строки) в правом поддереве и использует базовое количество строк и NDV по каждому столбцу вместо отката к отсутствию статистики. #107229 (UnamedRus). - Де-виртуализован вывод несоединённых строк в RIGHT и FULL join за счёт их батчинга. #105679 (Hechem Selmi).
- Добавлена поддержка packed-методов
keys32иkeys64вHashJoin. #107202 (Nikita Taranov). - Добавлена поддержка packed-методов
keys32иkeys64вSet. #107564 (Nikita Taranov). - Оптимизирована обработка столбцов с типом Nullable в агрегации. #106015 (Nikita Taranov).
- Улучшена производительность запросов
LIMIT BY. #103349 (Nihal Z. Miaji). - Ускорены запросы
ORDER BY ... LIMIT BY:LIMIT BYтеперь выполняется внутри каждого параллельного отсортированного потока на этапеSort, если столбцыLIMIT BYобразуют префиксORDER BY. Это уменьшает число строк, проходящих через финальное слияние сортировки и последующие этапы конвейера. Эта оптимизация управляется новой настройкойquery_plan_push_limit_by_into_sort(включена по умолчанию). #104000 (Nihal Z. Miaji). - Ускорены запросы
SELECT ... LIMIT N BY <cols>, когда<cols>являются префиксом ключа сортировки таблицы или становятся им после того, какWHERE col = constфиксирует начальные столбцы. При включенной опцииMergeTreeчитает данные в порядке первичного ключа, аLIMIT BYсначала фильтрует их в стриминговом режиме с памятью O(1) на каждый отсортированный поток, отсекая большую часть данных; затем на уменьшенном наборе данных выполняется обычныйLIMIT BYдля получения итогового результата. Управляется новой настройкойoptimize_limit_by_in_order(включена по умолчанию). #105135 (Nihal Z. Miaji). - Ускорены запросы
LIMIT BYна партиционированных таблицахMergeTreeза счет выполненияLIMIT BYвнутри потока каждой партиции параллельно, вместо слияния всех потоков в один перед применением ограничения. Это применимо, когда выражение партиционирования является детерминированной функцией от столбцовLIMIT BY, так что ни одна группаLIMIT BYне может охватывать две партиции. Управляется новой настройкойallow_limit_by_partitions_independently(включена по умолчанию). #105126 (Nihal Z. Miaji). - Ускорены запросы
LIMIT BYза счет удаления избыточных ключевых выражений: ключ, который является детерминированной функцией других ключей, отбрасывается (например,LIMIT 5 BY x, f(x)превращается вLIMIT 5 BY x), а инъективная функция от ключа заменяется ее аргументом (например,LIMIT 5 BY toString(x)превращается вLIMIT 5 BY x). Это уменьшает число вычисляемых выражений на строку и снижает их стоимость. Управляется новыми настройкамиoptimize_limit_by_function_keysиoptimize_injective_functions_in_limit_by, обе включены по умолчанию. #106818 (Nihal Z. Miaji). - Ускорены агрегация по сегментам, распределение по бакетам в
grace_hashjoin и параллельное партиционирование окон за счет замены хеширования столбцов для каждого фрагмента на kernel, использующий аппаратный CRC32C. #106538 (Harikrishnan Prabakaran). - Оптимизированы
L1Distance,L2Distance,L2SquaredDistance,LinfDistanceиcosineDistanceдля аргументов типа Array с многоцелевой автовекторизацией на x86-64-v4/v3. Для неконстантных аргументов типа Array все они, кромеLpDistance, который используетstd::powс exponent времени выполнения, теперь могут использовать kernel, векторизованные компилятором. Существующие быстрые пути для константных аргументов на базе AVX-512 и Sapphire RapidsBFloat16дляL2DistanceиcosineDistanceсохранены. #101310 (Peng). - Улучшена производительность функций
{Norm}DistanceиdotProduct. #106007 (Nikita Taranov). - Улучшена производительность функции
arrayNorm. #106211 (Nikita Taranov). - В некоторых случаях улучшена производительность
dotProduct. #106210 (Nikita Taranov). - Улучшена производительность AVX-512 const-left путей для
L2DistanceиcosineDistanceнаArray(Float32),Array(Float64)иArray(BFloat16), когда длина массива делится на ширину векторизованной обработки без остатка. #104625 (Sergey Kuznetsov). - Включена генерация кода AVX-512 для AMD и улучшена генерация кода для
arrayDistance. #106505 (Nikita Taranov). - Улучшена производительность функций
L2DistanceTransposedиcosineDistanceTransposedдля типа данныхQBit. #106701 (Raufs Dunamalijevs). - Производительность функций
encrypt,decrypt,tryDecrypt,aes_encrypt_mysqlиaes_decrypt_mysqlувеличена до порядка величины, что позволило восстановить производительность, потерянную при миграции с BoringSSL на OpenSSL 3.x (24.4). #107339 (Konstantin Bogdanov). - Улучшена производительность функций
encrypt,decryptиhalfMD5за счёт исключения неявных построчных обращений к provider OpenSSL в OpenSSL 3.x. #99105 (Konstantin Bogdanov). - Добавлена SIMD-реализация
SHA1, которая хеширует несколько входных значений параллельно с использованием AVX-512, повышая пропускную способность. #105459 (Joanna Hulboj). - Добавлен backend AArch64 ASIMD/NEON для многобуферной реализации
MD5. #105563 (Venkata Vineel ). - Исходные blocks теперь укрупняются перед вычислением projection во время
MATERIALIZE PROJECTION, чтобы уменьшить число временных projection parts и накладные расходы на merge. Ускорение ~3.4x на таблице с 50M строк. #100047 (Amos Bird). - Снижена latency
INSERTдля таблицMergeTreeс skip-индексами на столбцахORDER BYза счёт исключения избыточных перестановок столбцов при записи части (~17% на рабочих нагрузках, характерных для traces). #101101 (Amos Bird). - Включены SIMD-пути кода Arrow’s (NEON на ARM, SSE4.2/AVX2/AVX512 на x86), которые использованы для ускорения декодирования столбцов Parquet
FLOAT/DOUBLE, закодированных с помощьюBYTE_STREAM_SPLIT. #106376 (Raúl Marín). - Улучшена производительность вставки для столбцов
LowCardinalityс индексамиbloom_filter. #106410 (Michael Jarrett). - Копирование blob в
DiskObjectStorageTransaction::copyFileраспараллелено с использованием отдельного пула потоков для каждого disk. #105089 (Asya Shneerson). - Исключено чтение содержимого файла при использовании input format
Oneс file-подобными table functions, такими какfileиs3. #105157 (Yue Ni). - Запуск
clickhouseна macOS ускорен примерно в 3 раза за счёт отказа от экспорта динамических символов, которые в противном случае динамический компоновщик обрабатывал бы при каждом запуске. #107768 (Raúl Marín). - Ускорена загрузка файлового кэша при запуске за счет устранения лишнего открытия каталога для каждого ключа кэша. #107414 (Alexey Milovidov).
- Ускорена загрузка файлового кэша при запуске: после завершения перечисления каталога потоки, выполнявшие его, теперь помогают загружать метаданные кэша, вместо того чтобы оставлять половину потоков бездействующими. #107416 (Alexey Milovidov).
- Снижены накладные расходы на запуск процесса
clickhouseза счет обновления встроенной библиотеки WasmEdge, которая больше не генерирует случайный hash-секрет в глобальном инициализаторе при каждом запуске. #107869 (Raúl Marín). - Основной ключ
MergeTreeи индекс пропуска данных теперь могут отсекать гранулы для фильтров, в которыхifNullилиcoalesceоборачивает условие, напримерifNull(key = 0, 0)илиcoalesce(key = 0, 0). Такие предикаты — их генераторы запросов часто создают, чтобы преобразовать сравнение с возможнымNULLв однозначное булево значение — ранее были непрозрачны для анализа индексов и не позволяли пропускать гранулы. Это расширяет действие существующей настройкиallow_key_condition_coalesce_rewrite(включена по умолчанию). Закрывает #106264. #106272 (Andy Zhao). - Вычисление индекса пропуска данных для типов
DateTime64в 26.6 должно потреблять меньше CPU. #107707 (Shankar Iyer). - Улучшена производительность анализа текстового индекса при поиске по нескольким токенам за счет оптимизации обработки редких токенов. #98226 (Anton Popov).
- Для сжатых сегментов posting list текстового индекса теперь используется кэш. #106299 (Anton Popov).
- Улучшена производительность универсального алгоритма поиска с исключением для запросов, выбирающих большие непрерывные диапазоны таблицы. #93813 (Michael Jarrett).
S3-клиенты с одинаковыми конечной точкой и bucket используют общий кэш, что позволяет избежать повторного определения региона. Закрывает #92482. #96802 (Andrey Zvonov).- Если запрос содержит
has(<constant array>, <expr>), analyzer преобразует узел так, чтобы по возможности использовать более быструю реализациюin. #97341 (Shankar Iyer). - Когда в
ThreadPoolпланируется новая задача, пробуждается рабочий поток, который последним перешел в бездействующее состояние (LIFO), а не произвольный. Это уменьшает фрагментацию памяти из-за кэшей allocator, привязанных к потокам. Порядок обработки задач не меняется. #100177 (Alexey Milovidov). - Улучшена производительность приближенных Runtime Filters и индексов Bloom filter. #100201 (Christoph Viebig).
- Для
ASOF JOINтеперь можно использовать алгоритм JOINparallel_hash, распараллеливая построение по различным значениям ключей равенства. РанееASOFвсегда исключался изparallel_hash. #105375 (Greg Maher). - Исключено чтение неограниченных входных данных для запросов
INTERSECTиEXCEPT, когда при пустом входе результат заведомо пуст. #105393 (Yue Ni). - Для различных блокировщиков
MemoryTrackerдобавленconstinit. #105490 (Azat Khuzhin). - Повышена производительность
bitmapContainsдля состоянийgroupBitmapс типами, отличными отUInt64, за счёт устранения повторных вызововrb_maxпри проверке диапазона. #105960 (Yue Ni). - Ускорены запросы с несмежным доступом для столбцов
LowCardinality, использующих один словарь. #103662 (Ivan Babrou). - Для probe в
HashJoinдобавлен быстрый путь, когда блок содержит одну строку. #106008 (Nikita Taranov). - Предикаты из запросов вида
SELECT ... FROM view(SELECT ... FROM remote(...)) WHERE ...теперь проталкиваются в запрос, отправляемый на удалённый шард. В оптимизацииallow_push_predicate_ast_for_distributed_subqueriesне хватало обработки табличных функций. #105986 (Nikolai Kochetov). enable_join_transitive_predicatesтеперь включён по умолчанию. #103724 (Alexander Gololobov).- Добавлена поддержка функций
multiSearchAny,multiSearchAnyUTF8иmultiMatchAnyв текстовых индексах. Также улучшен анализ текстовых индексов для функцииmatch: теперь шаблоны с альтернативными группами позволяют пропускать больше гранул. #106279 (Anton Popov). - Теперь фильтры, появляющиеся после первоначального отбора PREWHERE (predicate pushdown, runtime filters или явный PREWHERE плюс предложение WHERE, заданное планировщиком), можно объединять с существующим PREWHERE на втором проходе оптимизатора, а не оставлять отдельным шагом Filter над чтением
MergeTree. #105445 (Yarik Briukhovetskyi). QueryConditionCacheтеперь отдельно фиксирует отфильтрованные гранулы даже внутри пакетов чтения, которые лишь частично проходят PREWHERE, что уменьшает число меток, повторно считываемых последующими запросами с тем же условием. #105335 (Han Fei).- Добавлена настройка Keeper
nuraft_use_bg_thread_for_snapshot_io, включённая по умолчанию, чтобыNuRaftчитал объекты снимков в фоновом потоке, а не в worker threads Raft. #106285 (Antonio Andelic). - Снижено пиковое потребление памяти при применении полученных снимков в ClickHouse Keeper с
KeeperMemoryStorage. #105851 (Antonio Andelic). - Выделения LLVM/JIT теперь направляются в выделенную arena jemalloc. Это уменьшает фрагментацию RSS, вызванную чередованием долгоживущих служебных структур JIT с краткоживущими выделениями запросов. Для обсервабилити добавлены новые асинхронные метрики
jemalloc.jit_arena.active_bytes,jemalloc.jit_arena.dirty_bytes,CompiledExpressionCacheBytesMaxиCompiledExpressionCacheCountMax.SYSTEM DROP COMPILED EXPRESSION CACHEтеперь также удаляет базовые экземпляры CHJIT и очищает JIT arena. #104113 (Raúl Marín). - Исправлено избыточное резервирование памяти при чтении разрежённых словарно-кодированных столбцов
Nullable(String)изParquetс помощью нативного V3-ридера. #102805 (Francisco). - Исправлена работа
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)на дискахencrypted: данные копировались вместо создания жёстких ссылок. #106731 (Nikita Mikhaylov). - Улучшена оценка мощности в оптимизаторе плана запроса: столбец, полученный детерминированной одноаргументной функцией (например,
toYear(date)), теперь наследует число различных значений своего аргумента как верхнюю границу, а не остаётся без статистики, что позволяет точнее переупорядочивать JOIN. #107757 (Alexander Gololobov). - Снижены накладные расходы CPU на асинхронное логирование при высокой интенсивности логов: потребитель лога теперь уведомляется только при переходе queue из пустого состояния в непустое, а не для каждого сообщения. #107352 (Nikita Mikhaylov).
- В большем числе сценариев устранены дублирующиеся вычисления во время выполнения запроса. #106113 (Yarik Briukhovetskyi).
- Распараллелена обработка результата рекурсивного CTE:
GROUP BYи другие операции над большим результатомWITH RECURSIVEбольше не ограничены одним thread. #107694 (Alexey Milovidov). - Улучшена производительность регистронезависимого поиска подстроки (
positionCaseInsensitiveUTF8,ILIKE,multiSearchAnyCaseInsensitiveUTF8и связанных функций) за счёт добавления NEON SIMD-пути на ARM и более широкого AVX2-ядра на x86. #107882 (Raúl Marín). - Исправлена регрессия пропускной способности кодека
FPCдля чисел с плавающей точкой на ARM примерно на 16%, возникшая после того, как его таблицы предсказателя начали использоватьVectorWithMemoryTracking. #108182 (Groene AI).
Улучшения
- Фоновый
MemoryWorkerтеперь периодически обновляет жёсткий лимит памяти сервера на основе текущего использования памяти и объёма памяти, который ядро считает доступным, чтобы ClickHouse оставлял место для других процессов на том же хосте. Формула:(resident memory + system MemAvailable) * max_server_memory_usage_to_ram_ratio. Одна и та же настройка сервераmax_server_memory_usage_to_ram_ratioуправляет и ограничением при запуске, и динамической корректировкой; установите её в0, чтобы отключить оба механизма. Чтобы сохранить только статическое ограничение при запуске/перезагрузке (как в предыдущих версиях), установите новую настройку сервераmemory_worker_dynamic_hard_limitв0. #104964 (Alexey Milovidov). - Добавлена поддержка PostgreSQL client для C# в протоколе
PostgreSQL. Это закрывает #18611. #80785 (Konstantin Vedernikov). - Мутации теперь используют analyzer. #98884 (Nikolai Kochetov).
- Добавлен более гибкий контроль вывода запросов в CLI. Опция
--echoтеперь принимает необязательное булевое значение и работает как в интерактивном режиме, так и в пакетном режиме. Новые опции--echo-formattedи--echo-query-idуправляют соответственно форматированием выводимых запросов и выводомquery_id. Опция--hilite/--highlightтеперь также управляет подсветкой выводимых запросов. Побочный эффект этого изменения:--echoтеперь является опцией с булевым значением, поэтому позиционный запрос, указанный сразу после--echoбез значения, трактуется как её значение; вместо этого используйте--echo --query "..."или--echo=false. #106191 (Alexey Milovidov). - Поддерживается изменение схемы вместе с параллельными проверками согласованности для каталогов озёр данных. #106102 (Konstantin Vedernikov).
- Разрешено использовать cache disk для движков таблиц data lake. #102017 (RinChanNOW).
- Исправлено чтение данных таблиц в базах данных
DataLakeCatalogсcatalog_type = 'onelake': теперь по умолчанию используется конечная точка OneLake Blob (.blob.fabric.microsoft.com). Установитеonelake_use_blob_endpoint = false, чтобы сохранить прежнее поведение с DFS-конечной точкой (.dfs.fabric.microsoft.com). #106843 (Konstantin Vedernikov). - Значение по умолчанию для настройки
persistent_processing_node_ttl_secondsвS3(Azure)Queueизменено с1 hourна6 hours(это время очистки после нештатного перезапуска сервиса и т. п.). Предыдущее значение по умолчанию подходило для TTL узлов обработки, но оно также используется для TTL блокировки бакета, которая может удерживаться дольше, поэтому 1 часа было недостаточно. #106838 (Kseniia Sumarokova). - Размер metadata cache
Icebergпо умолчанию уменьшен с 1 GB до 128 MB. #106492 (Konstantin Vedernikov). query_idстриминг-задачиS3Queueтеперь передаётся в зависимые операции вставки в таблицы. #106494 (Christoph Wurm).- Поле
used_storagesвsystem.query_logтеперь заполняется именем storage engine при выполнении запросов к таблицам черезDataLakeCatalog. #100706 (Melvyn Peignon). - Вы можете проверить, какие значения
operationиsummaryесть у снимков Iceberg. Полезно для тестирования и отладки. #106246 (Den Kalantaevskii). - Финальный запрос multipart-загрузки в
S3теперь выполняется асинхронно через task tracker, поэтому он может перекрываться с загрузкой последней части, а не выполняться последовательно на этапе finalize. #105487 (Asya Shneerson). - Добавлены четыре новые настройки таблицы
MergeTreeдля управления параметрами текстовых индексов по умолчанию:text_index_dictionary_block_size,text_index_dictionary_block_frontcoding_compression,text_index_posting_list_block_sizeиtext_index_posting_list_codec. Эти настройки позволяют настраивать поведение текстовых индексов на уровне таблицы без указания параметров в каждом определении индекса. Явно заданные аргументы отдельных индексов по-прежнему имеют приоритет. #100626 (Anton Popov). - Проекциям разрешено переопределять дополнительные настройки
MergeTree(сжатие, формат частей, сериализацию), а не толькоindex_granularity; для этого используются список разрешённых настроек и валидация. #101170 (Amos Bird). - В
system.mergesдобавлены столбцыcurrent_projection,current_projection_progress,projections_completedиprojections_remaining, чтобы отображать прогресс слияния проекций. #102611 (Amos Bird). - Исправлена ситуация, при которой
PREWHEREс подзапросомINпо столбцам первичного ключа не использовал индекс первичного ключа для отсечения гранул, что приводило к полному сканированию таблицы вместо чтения только нужных гранул. #102570 (Nikita Mikhaylov). - Функция
h3PolygonToCellsтеперь применяет ограничение на максимальный размер массива ко всем полигонамMultiPolygon, проверяет коды возврата базовой библиотеки H3 и отклоняет аргументыMultiLineStringвместо того, чтобы молча возвращать пустой результат. #106399 (Raúl Marín). - Добавлена новая таблица
system.keeper_snapshots, доступная только в Keeper, с информацией о локальных снимках ClickHouse Keeper. #105571 (Miсhael Stetsyuk). - Добавлена новая таблица
system.keeper_changelogs, доступная только в Keeper, с информацией о локальных файлах changelog ClickHouse Keeper (журналах Raft). #105617 (Miсhael Stetsyuk). - Добавлена таблица
system.keeper_cluster, доступная только в Keeper. Она содержит по одной строке на каждого участника кластера Raft, как его видит текущий Keeper. #105646 (Miсhael Stetsyuk). - Для watches добавлено больше событий профиля Keeper (server-side + client-side). Закрывает #97703. #105336 (Konstantin Vedernikov).
- Добавлены
coordination_settingsKeeper для ограничения допуска неподтверждённых записей в журналNuRaftи throttling обратного probe для append-entries. #106108 (Antonio Andelic). - Добавлена настройка
enable_compressionдля табличной функцииmysql, движка таблицыMySQL, движка базы данныхMySQL, словаряSOURCE(MYSQL)и именованных коллекций. Когда она включена, ClickHouse согласовывает сжатие на уровне протокола MySQL для всех данных, передаваемых по соединению. #103229 (Bernard Lim). - Снижена задержка отмены для запросов, выполняемых по протоколу PostgreSQL:
KILL QUERYтеперь прерывает сериализацию вывода в пределах одного фрагмента, вместо того чтобы ждать отправки клиенту всего фрагмента. #106535 (Roman Vasin). - Снижена задержка отмены для запросов, выполняемых по протоколу MySQL:
KILL QUERYтеперь прерывает сериализацию вывода в пределах одного фрагмента, вместо того чтобы ждать отправки клиенту всего фрагмента. #107228 (Roman Vasin). - Исправлено чтение длины
auth_responseпри рукопожатии MySQL: байт длины>= 128интерпретировался как значение размером в несколько гигабайт, поскольку считывался как знаковыйchar. #107384 (uwezkhan). MaterializedPostgreSQLтеперь сопоставляет столбцы PostgreSQLnumeric(p, 0)с precision больше 76 (например,numeric(78, 0), используемый для 256-битных целых чисел) с ClickHouseInt256вместо завершения с ошибкой “Precision too big”. Значения, которые не помещаются вInt256, отклоняются с понятным сообщением об ошибке. #107431 (Alexey Milovidov).- Клиенту теперь отправляется Исключение, если не удаётся установить TCP-соединение. #107317 (Nikolai Kochetov).
- Пользователи теперь могут вставлять поля
AvroFixedдля 8-/16-/32-/64-битных целочисленных вариантов. #98139 (Patrick Pichler). - Формат
AvroConfluentтеперь повторяет попытки через Confluent Schema Registry HTTP client при временных сбоях (тайм-аутах транспорта, отказе в соединении, ошибках DNS, HTTP5xx/408/429) с экспоненциальной задержкой, вместо того чтобы прерывать INSERT при первом же сетевом сбое. Политику задают новые настройкиformat_avro_schema_registry_max_retries(по умолчанию5) иformat_avro_schema_registry_retry_initial_backoff_ms(по умолчанию100). Ошибки валидации схемы (HTTP409, некорректный Avro JSON) по-прежнему считаются фатальными. #106661 (Groene AI). - В
system.query_log.used_privilegesтеперь записываются привилегии для всех проверок выданных прав доступа, включая проверки, проходящие через путь без генерации исключенияisGranted(checkAccessWithFilter). Ранее записывались только привилегии, проверенные через точки входа с генерацией исключения (checkAccess/checkGrantOption), из-за чегоREAD ON FILE/READ ON S3/READ ON AZURE/READ ON URLне отображались в журнале аудита дляDESCRIBE,CREATE TABLE ASи подобных запросов, использующих табличные функцииfile/s3/azure/url. Применение правил доступа не изменилось. #104693 (Alexey Bakharew). - Добавлены асинхронные метрики
TotalUncompressedBytesOfMergeTreeTablesиTotalUncompressedBytesOfMergeTreeTablesSystem, которые показывают общий несжатый размер данных, хранящихся в таблицах семейства MergeTree. #106364 (Alexey Milovidov). - Добавлено событие профиля
GlobalMemoryLimitExceeded, чтобы операторы могли отслеживать моменты, когда достигается общий лимит памяти сервера. #106466 (Sacheendra Talluri). - Счетчики
ExecutableUserDefinedFunction*вProfileEventsтеперь заполняются для UDFexecutable_pool. Вsystem.query_log.ProfileEventsтеперь отображаются количество вызовов, затраченное реальное время и время ожидания в пуле для каждого вызова, использование CPU дочерними процессами, пиковое потребление памяти, а также объем байтов stdin/stdout. #105010 (Xu Jia) #105618 (Ilya Andreev). - Добавлены асинхронные метрики
ExecutableUserDefinedFunctionMemoryResidentBytesиExecutableUserDefinedFunctionProcesses, которые показывают объем resident memory (VmRSS) и количество работающих процессов пользовательских функцийexecutableиexecutable_pool, включая descendant processes и простаивающие воркеры пула. #107300 (Hanzi Jiang). - Добавлены три асинхронные метрики только для Linux —
MemoryThreadStacksCount,MemoryThreadStacksVirtualиMemoryThreadStacksResident, — которые отдельно показывают память стеков pthread, не смешивая ее с остальной анонимной памятью. Включаются черезasynchronous_metrics_enable_heavy_metrics. Требуются Linux 5.17+ (prctl(PR_SET_VMA_ANON_NAME)) и доступный для чтения/proc/self/smaps; в противном случае метрики отсутствуют, а ограничение фиксируется вsystem.warnings. #106230 (Raúl Marín). - Асинхронные метрики
MemoryThreadStacks*(resident/virtual size и количество стеков потоков) теперь доступны в macOS. #107752 (Raúl Marín). - Движки таблиц теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description,syntax,examples,introduced_inиrelatedтаблицыsystem.table_engines. #106177 (Alexey Milovidov). - Движки баз данных теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description,syntax,examples,introduced_inиrelatedтаблицыsystem.database_engines. #106178 (Alexey Milovidov). - Типы данных теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description,syntax,examples,introduced_inиrelatedтаблицыsystem.data_type_families. #106180 (Alexey Milovidov). - Форматы ввода/вывода теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description,examples,introduced_inиrelatedтаблицыsystem.formats. #106181 (Alexey Milovidov). - Комбинаторы aggregate function теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description,syntax,examples,introduced_inиrelatedтаблицыsystem.aggregate_function_combinators. #106185 (Alexey Milovidov). - В
клиент ClickHouse,clickhouse-localи встроенный клиент добавлена опция командной строки--chime. Когда запрос завершается (успешно или с ошибкой) после выполнения в течение как минимум N секунд, клиент записывает в stderr управляющий ASCII-символBEL(\x07). Будет ли терминал издавать звук или показывать визуальную вспышку, зависит от настроек пользователя. По умолчанию опция включена с порогом 5 секунд; передайте--chime N, чтобы задать свой порог, или--chime 0, чтобы отключить ее. Закрывает #92718. #104545 (Groene AI). - В
clickhouse-client, если терминал не поддерживает bracketed paste, переводы строк во вставленном многострочном запросе теперь сворачиваются в одном буфере редактирования, а не вызывают переход к prompt продолжения для каждой строки. Вставленный запрос остается под одним prompt, а клавиши со стрелками позволяют перемещаться между его строками. Это улучшение работает по мере возможности и опирается на типичное поведение вставки с буферизацией TTY. #104299 (Alexey Milovidov). Теперь это также работает при отключенной подсветке синтаксиса (--highlight 0). #106665 (Alexey Milovidov). - Добавлено управление pager во время выполнения в стиле MySQL для
clickhouse-client/clickhouse-local. #105706 (Azat Khuzhin). clickhouse-clientтеперь корректно работает с терминалами без UTF-8: если кодирование символов терминала не UTF-8 (например, приLANG=C), форматыPrettyпереключаются на рамки ASCII вместо вывода Unicode-символов псевдографики, которые могли бы исказить отображение в терминале. #106213 (Alexey Milovidov).- Очищены отображаемые строки, передаваемые сервером при обработке пакета
Helloвclickhouse-client(имя сервера, часовой пояс, отображаемое имя, шаблоны и сообщения правил пароля), чтобы враждебный сервер не мог внедрить байты, которые клиент отобразит как есть; также ограничен их размер для защиты от неограниченного выделения памяти. #105243 (Raúl Marín). - Web UI теперь отображает результат как изображение, если запрос использует выходной формат изображения, например
FORMAT PNG, вместо показа raw bytes в виде таблицы. #107638 (Alexey Milovidov). - Добавлена настройка
output_format_pretty_use_nbsp_for_padding, чтобы отображать дополнение в табличной раскладке табличных форматовPrettyкакU+00A0NO-BREAK SPACE, когдаoutput_format_pretty_grid_charsetравноUTF-8. Это помогает сохранять выравнивание таблицы при копировании выводаPrettyв инструменты, которые схлопывают обычные пробелы. По умолчанию настройка отключена, а вывод с кодировкойASCIIсохраняет обычные пробелы. #103559 (Ashrith Bandla). - Универсальный скрипт установки теперь также устанавливает
clickhousectlв~/.local/binна Linux и macOS, создавая символьную ссылкуchctl. Чтобы пропустить это, установитеCLICKHOUSE_ONLY=1. #105399 (Alasdair Brown). - Исправлена ложная ошибка
Syntax error: Unterminated quoted string, которая могла периодически возникать при установке ClickHouse черезcurl https://clickhouse.com/ | sh, если в текущем каталоге уже существовал бинарный файлclickhouse. #106417 (Alexey Milovidov). - Исправлена высота левой панели на странице
play.html, когда открыт web terminal, чтобы кнопка переключения терминала внизу оставалась видимой. #105087 (Alexey Milovidov). - Устранено автоматическое выделение единственного запроса в Web UI после его выполнения. #105711 (Joey Yu).
- Web SQL UI теперь расширяет редактор запросов, если запрос выше текущей высоты редактора не более чем на 30%. #105713 (Joey Yu).
- В веб-интерфейсе значки нижнего меню (веб-терминал и GitHub) теперь располагаются горизонтально, когда левая панель развернута, что дает списку баз данных и таблиц больше вертикального пространства. #106427 (Alexey Milovidov).
- В веб-интерфейсе (
play.html) нажатиеEscapeтеперь снимает выделение с текущей ячейки таблицы результатов. #107777 (Alexey Milovidov). - Улучшена панель баз данных в Web SQL UI (Play): добавлена всплывающая подсказка на значке базы данных, кнопка скрытия панели, кликабельные названия баз данных и таблиц во всю ширину, а также исправлено смещение ширины панели при появлении полосы прокрутки. #108013 (Alexey Milovidov).
- Добавлена настройка сервера (
min_allocation_size_to_throw_on_memory_limit), позволяющая любой операции выделения памяти сгенерировать исключениеMEMORY_LIMIT_EXCEEDED; это должно помочь предотвратить OOM. #105265 (Azat Khuzhin). - Разрешена аутентификация
NONEдля SSH (это предотвращает запрос пароля для пользователейno_password). #105476 (Azat Khuzhin). - В
clickhouse suперед сбросом привилегий теперь очищается список дополнительных групп, что соответствует поведению/bin/suиsudo. Ранее процесс после сброса привилегий наследовал дополнительные группы пользователя, вызвавшего команду. #105247 (Raúl Marín). - Добавлена поддержка
BFloat16для функций числовых предикатов (isFinite,isNaN). #105391 (Mohamed Hussain S). - Снижено использование памяти полигональных словарей (
polygon_index_cell,polygon_index_each), а также исправлено отображение вsystem.dictionaries.bytes_allocatedиндекса поиска, который они строят. #105431 (Raúl Marín). - Исправлена работа consumers движка таблицы Kafka, которые после назначения партиций продолжали использовать короткий интервал опроса: теперь они возвращаются к настроенному
kafka_poll_timeout_ms, что позволяет избежать избыточных пустых опросов, слишком мелких вставляемых частей и лишних накладных расходов на слияние после перебалансировок. #100431 (sugaf1204). - При удалении неиспользуемых столбцов в плане запроса столбцы теперь идентифицируются по позиции, а не по имени. Это позволяет удалять неиспользуемые столбцы при наличии дублирующихся имен столбцов. #100586 (János Benjamin Antal).
- ClickHouse теперь выдает корректное исключение при попытке использовать
table_readonlyдля движков с репликацией, а также улучшена обработка исключений для DDL-запросов (иDatabaseReplicated), связанных с этой настройкой. #100950 (alesapin).OPTIMIZE TABLE ... ON CLUSTERи другие DDL больше не зависают, если у целевой таблицы заданоtable_readonly = 1. Эта настройка теперь генерирует новый отдельный код ошибкиTABLE_IS_PERMANENTLY_READ_ONLY, которыйDDLWorkerсчитает не подлежащим повторной попытке (в отличие от временногоTABLE_IS_READ_ONLY, возникающего при временных отключенияхReplicatedMergeTreeот ZooKeeper). Настройкаtable_readonlyтеперь также явно запрещена дляReplicatedMergeTree— как при создании, так и черезALTER MODIFY SETTING. В продолжение #97652. #105109 (Alexey Milovidov). - Исправлены обновления refreshable materialized view, которые могли завершаться ошибкой
UNKNOWN_TABLEпосле замены целевой таблицы (например, черезEXCHANGE TABLESили удаление с последующим повторным созданием): теперь при обновлении целевая таблица определяется по имени, а не по устаревшему UUID. #102724 (Seva Potapov). - Добавлена настройка
wait_for_part_commit_in_dependent_materialized_views(по умолчаниюfalse). КогдаSELECTв materialized view читает данные из собственной исходной таблицы (например, черезINNER JOINс источником), каскад мог пропустить строку, вставляемую в данный момент, поскольку вставленный part коммитится только после выполнения зависимых представлений. При включении этой настройки коммит part выполняется до срабатывания зависимых представлений, поэтому они видят строку, находящуюся в процессе вставки, ценой снижения параллелизма вставки. #105943 (Elmi Ahmadov). - Не подавлять фатальные ошибки (например,
MEMORY_LIMIT_EXCEEDED) вtryDeserialize. #106808 (Azat Khuzhin). - Лениво проверять право
CREATE TEMPORARY TABLEвInverseDictionaryLookupPass. #107098 (Azat Khuzhin). - Исправлена ошибка
ILLEGAL_TYPE_OF_ARGUMENTдля distributed queries сserialize_query_plan = 1, содержащих лямбда-выражение с константным аргументом (например,arrayMap(t -> t.2, ...)). Константные столбцы узловINPUTвActionsDAGтеперь сохраняются при сериализации плана запроса. #107124 (Alexey Milovidov). - Десериализация состояний агрегатных функций
contingency,cramersV,cramersVBiasCorrectedиtheilsUтеперь проверяет, что сохранённые счётчики образуют корректную таблицу сопряжённости, и в противном случае выбрасывает ИсключениеCORRUPTED_DATA. Закрывает #106899. #107185 (Nihal Z. Miaji). - Сохраняются исходные коды ошибок для исключений, обёрнутых в
arrow::Status. #107267 (Azat Khuzhin). - Добавлена поддержка
keyed_by_normalized_query_hashдля квот, определённых в статической конфигурации сервера (users.xml), в соответствии с существующим синтаксисом DDLCREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (Alexey Milovidov). - Настройка compatibility больше не применяет устаревшие настройки, поэтому не помечает их как изменённые и не выдаёт предупреждения об устаревших настройках. #107737 (Maxim Orlovsky).
- Async inserts больше не записывают в лог полный список
query_idна уровнеtrace/debug, что с версии 26.2 могло чрезмерно раздуватьtext_logв services с интенсивным трафиком async inserts. Подробные строки теперь выводятся на уровнеtest. #107852 (Sema Checherinda). - Улучшение файлового кэша: невалидные записи приоритета больше не удерживают
KeyMetadata. Продолжение #106387. #107903 (Kseniia Sumarokova). - Улучшение метрик
FileCache. #106116 (Kseniia Sumarokova). - Не выводить преамбулу “Stack trace (when copying this message, always include the lines below):” в сообщениях об исключениях, если трассировка стека на самом деле пуста. #106524 (Alexey Milovidov).
- Исправлено потенциальное переполнение в
roundUpToMultipleпри вычислении выравнивания границы файлового кэша для очень больших смещений. #92579 (Bharat Nallan). EXPLAIN SYNTAXтеперь единообразно форматирует операторы как вызовы функций в выводе explain (например,plus(1, 2)вместо1 + 2). #94681 (Mohamed Abdelhalim ).- Улучшены подсказки имён таблиц в сообщениях об ошибках: больше не предлагается то же самое имя, а в подсказку теперь включается и имя базы данных (например, “Maybe you meant
other_db.my_table?”). #95116 (Mathuranath Metivier). - Улучшено сообщение об ошибке для неразрешённых идентификаторов в запросах без предложения
FROM: теперь оно предлагает добавитьFROM. #101769 (Yash ). - Добавлена опция
EXPLAIN PIPELINEдля компактного отображения повторяющихся цепочек процессоров. #104662 (Yue Ni). - Исправлено чтение за пределами буфера кучи при построении сообщения о синтаксической ошибке (
UTF8::computeWidthImplчерезparseQuery.cpp), возникавшее, когда парсер откатывался назад за первую точку с запятой / токен конца потока; в release-сборках в отображаемую ошибку могли попадать байты из соседней памяти кучи, а сборки с ASan аварийно завершались. #105086 (Groene AI). - Hive-стратегия партиционирования теперь используется по умолчанию в настройке compatibility
file_like_engine_default_partition_strategy. #86746 (Kseniia Sumarokova). - На macOS теперь используется больший стек потока (8 MiB), чтобы соответствовать значению по умолчанию в Linux; это устраняет редкие сбои сервера из-за переполнения стека во время JIT-компиляции. #107033 (Raúl Marín).
- Ограничение размера временного хранилища для
clickhouse-localбольше не жёстко задано на уровне 1 GiB. Значение по умолчанию увеличено до 1 TiB, и его можно настроить с помощью настройки сервераmax_temporary_data_on_disk_size. #106689 (Alexey Milovidov). - В
clickhouse-disksдобавлена командаread-checksums. Она читает файлchecksums.txtизMergeTreeDataPartи выводит его в виде удобочитаемой таблицы с полями, разделёнными табуляцией. #106901 (Asya Shneerson). - В
clickhouse-disksдобавлена командаread-bitmap. #107834 (murphy-4o). - Chdig: включён TLS для защищённых соединений (раньше это приводило либо к “unknown setting
skip_verify”, либо к “connection reset by peer”). #105864 (Azat Khuzhin). chdigv26.5.1. #105918 (Azat Khuzhin).chdigv26.6.1 —{asynchronous_,}metric_log, шаблоны запросов, тепловые карты, журналы/трассировки, сохраняемые на диске (ранее на 1 час трассировок могло уходить >40GiB). #107678 (Azat Khuzhin).- Конфигурация сервера (
programs/server/config.xml) теперь задаетkeep_alive_timeoutравным 30 (ранее 10), что соответствует фактическому задокументированному и реализованному значению по умолчанию. #107779 (Dan Checkoway). - Значение по умолчанию для настройки сервера
disk_connections_rcvbufизменено с0(автотюнинг TCP ядра) на204800(200 КБ), что ограничивает TCP-буфер приема на сокет для подключений дисков объектного хранилища (S3/Azure/GCS). #107859 (Sema Checherinda). - Оптимизатор
PREWHEREтеперь перед оценкой селективности группирует конъюнкты, ссылающиеся на один и тот же набор столбцов, поэтому условия видаa > 2500 AND a < 2502оцениваются совместно как единый диапазон, а не как два независимых предиката, что дает более точную оценку селективности. #106337 (Han Fei). - Добавлены защищенная и обычная реализации сокетов с поддержкой silk fiber. #107680 (Miсhael Stetsyuk).
- Исправлены искаженное сообщение об ошибке (перепутанные аргументы) и опечатка в функции
nested. #108031 (Alexey Milovidov). - В
clickhouse-disksдобавлена командаsed, которая применяет sed-выражение к указанному пути с изменением файла на месте. #107131 (Asya Shneerson). - Для движка базы данных
MaterializedPostgreSQLдобавлена настройкаmaterialized_postgresql_use_extended_date_and_time_types, задаваемая при создании. По умолчанию (если она включена) столбцы PostgreSQLdate/timestampопределяются какDate32/DateTime64; если приCREATE DATABASEзадать ей значение0, будут определяться более узкие типыDate/DateTime. #107428 (Alexey Milovidov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Добавлена возможность удалять отсоединённые части с суффиксом
tryN. #58957 (János Benjamin Antal). - Исправлено исключение
MULTIPLE_EXPRESSIONS_FOR_ALIASдля запросов с повторяющимися псевдонимами проекций (например,SELECT *, day + 365 AS day) во вложенных подзапросах при выполнении с параллельными репликами. #80310 (Alexey Milovidov). - Исправлена ошибка, из-за которой
splitMultipartQueryвыдавал ошибку “Empty query” для запросов, заканчивающихся комментарием после точки с запятой. #85491 (Yarik Briukhovetskyi). - Исправлено исключение в
ARRAY JOIN:Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшее при использовании числовых типовLowCardinality(issue #57243). #91784 (Jimmy Aguilar Mena). - Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCKпри использованииLIMIT BYс константными столбцами вместе сDISTINCTиORDER BYв новом analyzer. #93195 (Ashrith Bandla). - Исправлена проблема, из-за которой столбцы
NOT NULLнезаметно создавались какNullable, когдаdata_type_default_nullable = 1, а таблица создавалась в базе данныхReplicatedили через предложениеON CLUSTER. #97572 (xiaohuanlin). - Повышена стабильность соединения с HiveCatalog за счёт добавления механизма автоматических повторных попыток и логики переподключения для обработки ошибок TTransportException при взаимодействии с Hive Metastore. #98471 (Dmitriy Borisenko).
- Исправлена работа функции
nested(используемой внутриARRAY JOIN), которая удалялаLowCardinalityиз типов столбцов, из-за чегоArray(LowCardinality(String))в выводе превращался вArray(String). Закрывает #95582. #98974 (Yash ). - Исправлено исключение “Distributed task iterator is not initialized” при использовании
url,s3или подобных табличных функций в запросах с включённой параллельной репликой. #100146 (Alexey Milovidov). - Исправлено исключение logical error при чтении таблиц Iceberg, версия формата которых была повышена внешним инструментом (например, Spark). #100407 (Alexey Milovidov).
- Функции
like,ilike,notLike,notILikeиmatchтеперь поддерживают константный haystack с неконстантной needle (например,'foo' LIKE pattern_column), тогда как раньше это приводило кILLEGAL_COLUMN. #100479 (Yash ). - Исправлено неверное количество строк, возвращаемых запросом
MaterializedViewприquery_plan_enable_optimizations = 0, когда представление сопоставляет целочисленный столбец со столбцомBool. #100692 (Maksim Moisiuk). - Исправлено исключение (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') при чтении таблиц Iceberg, содержащих файлы данных ORC, с включённой PREWHERE optimization. #101206 (Groene AI). - Исправлено состояние гонки в RestCatalog. #101216 (Smita Kulkarni).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCKпри выполнении SELECT из VIEW поверх таблицы с обычной проекцией. #101218 (Amos Bird). - Исправлены устаревшие метаданные в FileLog в случае, когда файл удаляется и создается заново. #101408 (Azat Khuzhin).
- Исправлено переупорядочивание JOIN, которое без ошибок отбрасывало несовпавшие строки из
RIGHT/LEFT JOIN, когда он соединялся через запятую (cross) с другой таблицей, напримерt1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Ранее запрос возвращал результат inner join вместо outer join. #101684 (Groene AI). - Исправлено поведение, при котором предложение
FORMATпоглощалосьINSERTвместо применения к выводуEXPLAINвEXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Yash ). - Исправлен некорректный выбор кодека сжатия для частей
MergeTree, когда на уровне таблицы явно задавалась настройкаdefault_compression_codec. Части, записанные при вставке, во время слияний и для проекций, использовали общесерверный кодек по умолчанию вместо настройки уровня таблицы (теперь это также охватывает пустую часть, создаваемую полностью удаляющей мутацией). #101784 (Yash ). - Теперь отрицательные значения
Float64(например,-100.5) в настройках рабочей нагрузки, таких какmax_bytes_per_second,max_cpusи т. д., отклоняются. Ранее проверялись только отрицательные целые числа, из-за чего отрицательные числа с плавающей точкой могли незаметно создавать некорректные узлы scheduler. Закрывает #101825. #101842 (Groene AI). - Исправлена ошибка
LOGICAL_ERROR(“Port is not connected”, code 49), которая могла возникать при выполнении запросов с VIEW, содержащим aggregation внутри JOIN. #102574 (Jimmy Aguilar Mena). - Исправлены несогласованные метаданные части после мутаций столбцов с нестандартными сериализациями. #102817 (Eduard Karacharov).
- Исправлено обновление метаданных перед выполнением мутации, что устраняет #96806. #102882 (Smita Kulkarni).
- Исправлено значительное замедление запросов SELECT при одновременном выполнении
INSERT. Ранее конвейерINSERTрезервировал слоты CPU вплоть доmax_threadsв начале запроса, даже если большинство слотов так и не использовалось, из-за чего параллельные SELECT оставались без ресурсов. Теперь выделение слотов CPU происходит по требованию: конвейер запрашивает слоты только по мере фактической передачи распараллеливаемой работы. Это применяется как к управлению параллелизмом, так и к вытесняющему планировщику CPU для рабочих нагрузок. Новая настройка сервераconcurrent_threads_lazy_allocation(по умолчаниюtrue) служит механизмом отката. #102928 (Seva Potapov). - Исправлено распространение
NULLпри чтении подстолбцов, извлечённых из столбцовNullable(Tuple(...)). Например, дляtup Nullable(Tuple(s Nullable(String)))запросSELECT tup.sтеперь корректно возвращаетNULLв строках, где внешний кортеж равенNULL, вместо мусорных значений. Это охватывает все типы элементов, которые могут представлятьNULL:Nullable,Dynamic,VariantиLowCardinality(Nullable(...)). Закрывает #105356. #102942 (Nihal Z. Miaji). - Теперь выбрасывается
INCORRECT_DATAвместоLOGICAL_ERROR, если данные, переданные клиентом в формате Native, обрезаны или имеют неверный формат. #102975 (János Benjamin Antal). - В операцию чтения из ObjectStorage добавлена проверка отмены. Закрывает #98165. #103016 (Smita Kulkarni).
- Теперь при декодировании параметров aggregate function учитывается
input_format_binary_max_type_complexity. Закрывает #102903. #103026 (Pavel Kruglov). - Исправлен вывод nullable для geo-столбцов в ридере Parquet на базе Arrow. Закрывает #101845. #103032 (Pavel Kruglov).
- Исправлено, что
recursiveRemoveLowCardinalityстирал пользовательские имена geometry type (например,LineStringвместоRing,MultiLineStringвместоPolygon), что приводило к неверной интерпретации geometry type. Закрывает #103207. #103041 (Joanna Hulboj). - Исправлено, что
input_format_max_block_size_bytesмолча игнорировался при разбореINSERT, когдаmax_insert_block_size_bytesравен0(значение по умолчанию). Теперь этот параметр корректно ограничивает размер блоков, формируемых построчными входными форматами. #103068 (Kirill Kopnev). - Исправлено, что ClickHouse иногда создавал недопустимые токены GSSAPI из-за некорректного удаления завершающих null-байтов. #103114 (Michael Jarrett).
- Исправлено вычисление констант на этапе analyzer для функций с short-circuit (
if,multiIf,and,orи т. д.), чтобы статически недостижимые ветви больше не вызывали исключения на этапе анализа. Например,WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))теперь корректно возвращает0вместо ошибки деления на ноль. #103157 (Peng). EXPLAIN SYNTAXраскрывает parameterized views. #103263 (Jordi Villar).- Исправлено повреждение данных при записи в Parquet (и другие форматы с трейлером, такие как ORC и Arrow) в HDFS через
INSERT INTO FUNCTION hdfs(...). Начиная с версии 26.1,WriteBufferFromHDFSне сбрасывал свой рабочий buffer приfinalize(), поэтому последние вплоть доDBMS_DEFAULT_BUFFER_SIZEбайт каждого файла молча терялись, включая нижний колонтитулPAR1файла Parquet. При чтении таких файлов возвращалась ошибкаNot a Parquet file (wrong magic bytes at the end of file). #103268 (Groene AI). - Исправлены неверные результаты и возможная logical error для correlated subqueries, когда ограничение на размер JOIN (
max_rows_in_join/max_bytes_in_join) задано вместе сjoin_overflow_mode = 'break'. JOIN, который внутренне создаётся для вычисления correlated subquery, теперь игнорирует эти пользовательские ограничения, поэтому больше не может преждевременно останавливаться и отбрасывать строки. #103322 (Groene AI). - Исправлена bug, из-за которой
ALTER TABLE ... MODIFY SETTINGдля таблицыEmbeddedRocksDBмог сохранять недопустимое значение настройки в metadata file таблицы, даже если server отклонял запрос. При следующем перезапуске server таблицу не удавалось подключить из-заCANNOT_PARSE_BOOL(или похожей ошибки разбора), а в databases, где ошибки загрузки считаются фатальными, server отказывался запускаться. Недопустимые значения настроек теперь отклоняются до записи каких-либо metadata. #103417 (Groene AI). - Исправлено аварийное завершение server при создании таблицы с движком object storage (
AzureBlobStorage,DeltaLakeAzure,S3,HDFS) с неподдерживаемым числом arguments. Теперь server возвращает корректную ошибкуNUMBER_OF_ARGUMENTS_DOESNT_MATCHвместо аварийного завершения в debug/sanitizer-сборках. #103544 (Groene AI). - Исправлено падение server при parsing параметров data type
JSONиDynamic, когда abstract syntax tree (AST) был структурно некорректным (например, созданным AST-фаззером): у выражения параметраequals(name, value)могло оказаться меньше двух children, которыеDataTypeObjectиDataTypeDynamicзатем разыменовывали без проверки границ. #103545 (Groene AI). - Исправлены logical errors в analyzer при конфликте column names в lambda, используемой в prewhere. Закрывает #103584. #103627 (Pavel Kruglov).
- Исправлена спорадическая
Logical error: 'Database <name> not found'изDataLakeConfiguration::getCatalog, когда таблица с движкомIcebergзагружалась в обычной database во время асинхронной загрузки metadata. #103775 (Groene AI). - Исправлены ошибки
MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшие на удалённых replicas при выполнении queries, которые ссылаются на псевдонимы projection внутриPREWHERE/WHERE/HAVING/QUALIFY(например,SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) илиSELECT *для self-join с пересекающимися column names, с параллельными replicas иparallel_replicas_local_plan = 0. Закрывает #74324. #103806 (Groene AI). - Исправлено аварийное завершение server, когда запрос использует вложенные сравнения
coalesce/ifNull(например,WHERE coalesce(a, b, coalesce(c, d), e) = const) в таблицеMergeTreeс несколькимиminmaxиндексами пропуска данных иuse_skip_indexes_for_disjunctions = 1. Перезапись индексом пропуска данных для<op>(coalesce(...), const)теперь рекурсивно применяется к внутренним аргументам coalesce, так что RPN дляKeyConditionкаждого индекса соответствует RPN шаблона, как уже предполагает код отслеживания дизъюнкций. #103929 (Groene AI). - Исправлено:
max_rows_to_transferиmax_bytes_to_transferбольше не игнорируются для запросовGLOBAL INиGLOBAL JOINв новом анализаторе. Теперь эти настройки вызываютSET_SIZE_LIMIT_EXCEEDED(или прерывают выполнение — в зависимости отtransfer_overflow_mode), если материализованная external table превышает заданный лимит, как и в старом анализаторе. Закрывает #103333. #104119 (Groene AI). - Исправлены избыточные чтения метаданных каталога/S3, когда
INSERTили DDL-оператор обращается к несуществующей таблице в database каталога DataLake при включенномshow_data_lake_catalogs_in_system_tables. Ранее механизм подсказок при опечатках загружал полные метаданные Iceberg для каждой таблицы во всём каталоге, что на больших catalogs могло приводить к исчерпанию памяти. #104124 (DQ). - Исправлены падение (
LOGICAL_ERROR“Columns are assumed to be of identical types, but they are different in Nullable” в debug-сборках, SIGSEGV из-за нулевого указателя вColumnString::compareAtв release-сборках) и неверные результаты, которые могли возникать в запросах сdirectjoin_algorithmи правой таблицейMergeTree, если plan lookup-поиска переставлял столбцы во время optimization. Столбцы правой стороны могли попадать в слоты с неверными именами, из-за чего filter или сравнение по join key выполнялись по столбцу неправильного типа. Проблема обнаружена AST-фаззером как STID 2139-5111 и зарегистрирована в #107272. #104174 (Groene AI). - Теперь идентификатор партиции для
Date, выходящий за допустимый диапазон, отклоняется вместо молчаливого overflow илиLOGICAL_ERRORприALTER. #104250 (Azat Khuzhin). - Отключены
additional_table_filtersпри использовании параллельных реплик и анализатора без serialization плана запроса. Ранее это могло приводить к некорректным результатам. #104296 (Azat Khuzhin). - Исправлено:
dictGetOrNullбольше не затирает другие столбцы в проекцииSELECTзначениемNULL, если вызывается с ключевым столбцомNullable, значения которого отсутствуют в словаре. Функция изменяла на месте null map, ссылающуюся на входные данные; теперь перед мутацией она делает глубокую копию результирующего столбца. Закрывает #73633. #104327 (Groene AI). - Исправлена повреждённая patch part после
ALTER TABLE ... DROP PARTITION ID 'patch-...'с последующимDETACH/ATTACH TABLE. Ранее пустая покрывающая part записывалась безpartition.datиsource_parts.dat, из-за чего после следующего attach или перезапуска сервера вsystem.detached_partsпоявлялась записьbroken-on-start_patch-.... Закрывает #93132. Закрывает #102103. #104353 (Groene AI). - Исправлена стриминговая
INSERTсinput_format_max_block_wait_msдля интерфейсаHTTPи дляINSERT SELECT FROM input: теперь частичные входные block сбрасываются на диск до завершения request. #104534 (Alexey Milovidov). - Исправлена ошибка, из-за которой запросы, сочетающие
arrayJoinсORDER BY ... LIMITпослеJOIN, могли без каких-либо сообщений возвращать ноль строк. Оптимизация плана запроса, поднимающая вычисление функции надSortingStep, больше не применяется, если поднимаемое выражение содержитarrayJoin, посколькуarrayJoinможет изменять количество строк. Закрывает #82279. #104558 (Groene AI). - Исправлено редкое аварийное завершение сервера при удалении таблицы семейства
MergeTree. Оно могло происходить, еслиshutdownвыбрасывал исключение до полной остановки планировщика фоновых задач: фоновая задача, сработавшая в этот короткий промежуток, могла выполнить виртуальный вызов через частично разрушенный объект хранилища и попасть в__cxa_pure_virtual. #104561 (Groene AI). - Исправлен некорректный результат в комбинированном подстолбце
JSONс подсказкой типа, содержащей NULL-значение. #104584 (Pavel Kruglov). - Исправлены неверные результаты или пропуск projection, когда aggregate projection содержит несколько агрегатов
sumIfс разными условиямиIN (...). #104765 (Jimmy Aguilar Mena). - Исправлено неверное количество строк для
arrayJoin(), используемого внутриJOIN ON: результат лишний раз умножался на длину массива. #104785 (Shaohua Wang). - Исправлено, что
deltaSumTimestampвозвращал неверные результаты для знаковых целочисленных типов при переходе через ноль. Решает #104750. #104830 (Konstantin Bogdanov). - Исправлено несоответствие структуры блока в UnionStep после проталкивания фильтра с константами NULL. Закрывает #104821. #104853 (Pavel Kruglov).
- Исправлена ошибка
Logical error: 'Metadata is not initialized', возникавшая приDELETE FROMдля только что подключённой таблицыIceberg,DeltaLakeилиHudi, если её metadata file повреждён или не может быть загружен. Теперь вместо этого возвращается обычное пользовательское исключение, а сервер продолжает работать. Закрывает #104891. #104917 (Groene AI). - Исправлено, что
max_memory_usage_soft_limitне обновлялся на лету при изменении config. Soft memory limit вычислялся один раз при запуске и кэшировался, поэтому последующие Reloads config не давали эффекта. После этого исправления лимит пересчитывается и применяется сразу при каждом Reloads config; перезапуск Keeper не требуется. #104940 (Kai Zhu). - Исправлено разрешение символов JIT на macOS, благодаря чему JIT-компиляция sort, expression и aggregate больше не завершается ошибкой
CANNOT_COMPILE_CODE: Could not find symbol _<name>. #104946 (Alexei Fedotov). - Исправлено исключение (
Received signal 6 (abort)в vector hardening, наблюдаемое какTuple::back()на пустом векторе) при выполнении запроса видаSELECT ... FROM <Distributed table> WHERE/HAVING/GROUP BY ... (sharding_key_column IN tuple())с включённымoptimize_skip_unused_shards_rewrite_inв новом analyzer. #104966 (Alexey Milovidov). - Исправлено аварийное завершение сервера
Logical error: 'Inconsistent AST formatting'(STID 1941-1bfa) на запросах видаCREATE TABLE t (c0 Int CODEC(not((not(materialize(1), materialize(2)))), ZSTD)) ENGINE = Memoryв debug-/sanitizer-сборках. Форматтер больше не добавляет лишние внешние скобки вокруг вызова функцииtuple(...)с несколькими аргументами внутри списков аргументовCODEC/STATISTICS/BACKUP_NAME(где операторная форма(a, b)отключена), благодаря чему round-trip format-parse-format остаётся стабильным. #104991 (Groene AI). - Исправлен
NOT_FOUND_COLUMN_IN_BLOCK, возникавший вALTER TABLE ... MATERIALIZE INDEXна частях, созданных в 25.8 и содержащих индекс пропуска данных по столбцу, добавленному отдельной командойALTER TABLE ... ADD COLUMN. Теперь во время принудительного пересчёта мутация корректно читает все столбцы, необходимые для всех уже существующих индексов пропуска данных и проекций в части. Закрывает #104872. #105039 (Groene AI). - Исправлены два сценария
LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized, возникавшие в запросах сenable_materialized_cte: (1) повторно используемый materialized CTE, отфильтрованный черезIN (subquery)по другому materialized CTE, и (2) materialized CTE, на который есть ссылка и напрямую, и внутри фильтраWHERE ... IN (...), попадающего в основной ключ MergeTree через вложенный IN-подзапрос. Те же запросы вEXPLAINтоже были затронуты, поскольку ошибки проявлялись на этапе оптимизации плана. Закрывает #101940, закрывает #102320. #105041 (Dmitry Novik). - Исправлена оценка selectivity статистики
countminвPREWHEREдля столбцовFloat32. Из-за двух ошибок статистикаcountminнезаметно выдавала неверные оценки для столбцовFloat32:ConditionSelectivityEstimatorполностью пропускал статистику, когда тип столбца (Float32) был уже типа литерала (Float64), возвращаясь к selectivity по умолчанию и игнорируя sketch; аStatisticsCountMinSketch::estimateEqualхешировал первые N байт объектаField, хотяFieldхранитFloat32какFloat64(NearestFieldType<Float32>=Float64), поэтому байтовый шаблон, использовавшийся во время выполнения запроса, отличался от фактических байтовFloat32, сохранённых при build. #105047 (Han Fei). - Запросы
ATTACH TABLE name <clauses>;, в которых указаны секции хранения (ORDER BY,PARTITION BY,PRIMARY KEY,SAMPLE BY,TTL,UNIQUE KEYилиSETTINGSдвижка) безENGINE, теперь выдаютBAD_ARGUMENTSвместо того, чтобы молча повторно подключать таблицу с сохранённым определением и отбрасывать секции, указанные пользователем. СессионныеSETTINGSна уровне запроса (например,log_comment) по-прежнему применяются. ИспользуйтеATTACH TABLE t;, чтобы повторно подключить таблицу с сохранёнными метаданными, илиALTER TABLE t MODIFY SETTING ...послеATTACH, чтобы изменить настройки. #105068 (Groene AI). - Исправлена ошибка use-after-free в
runningAccumulate, когда он вызывался для столбца, чья aggregate function возвращает собственное состояние (например,uniqStateOrDefaultState,sumStateOrDefaultState,uniqStateForEachState). #105085 (János Benjamin Antal). - Исправлена ошибка в веб-интерфейсе (
play.html): при выполнении запроса, когда курсор находился после единственного завершающего;, выводилось сообщение “empty query” вместо выполнения запроса. #105107 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR: 'No user in current context, it's a bug', возникавший, когдаCREATE TABLE ... AS SELECTвнутри базы данныхReplicatedчитал данные изsystem.current_rolesилиsystem.enabled_roles. Теперь запрос успешно выполняется и в этом внутреннем контексте DDL worker возвращает пустой результирующий набор. #105150 (Groene AI). - Исправлен
ILLEGAL_TYPE_OF_ARGUMENTпри слиянии состояний агрегатной функцииquantileExactWeightedInterpolated,quantileDDилиquantilePrometheusHistogramс соответствующими вариантами во множественном числеquantilesXxxMerge(и наоборот). Варианты в единственном и множественном числе у этих трёх семейств quantile используют одно и то же внутреннее состояние агрегатной функции, но не были указаны во внутренней таблице сопоставления имён, поэтому межфункциональное слияние состояний — а также оптимизация слияния функций для этих семейств — отклонялись. #105189 (Groene AI). - Исправлены некорректные результаты
toStartOfWeek,toLastDayOfWeek,toMonday,toStartOfMonth,toLastDayOfMonth,toStartOfQuarterиtoStartOfYearдля аргументовDate32иDateTime64, если результат выходит за пределы диапазонаDate: вместо переполнения в произвольные даты результаты до1970-01-01теперь ограничиваются значением1970-01-01, а результаты после2149-06-06— значением2149-06-06. Это также исправляет неверные результаты запросов (некорректно отсечённые части и гранулы), когда такие функции использовались вWHEREпо ключуDate32илиDateTime64, содержащему значения вне диапазона. #105244 (Yarik Briukhovetskyi). - Исправлена logical error в
arrayRemove, когда первый argument — массивVariant, все варианты которого несовместимы с типом второго argument, аvariant_throw_on_type_mismatchотключён. Теперь функция трактует такое сравнение как “никогда не равны” и возвращает массив без изменений вместо server-side сбояassertTypeEquality. #105248 (Groene AI). - Запрос теперь может успешно выполняться, даже если
FileCacheне смог создать какой-либо каталог на диске для кэширования. #105250 (Den Kalantaevskii). - Исправлено аварийное завершение server с
Assertion 'px != 0' failedвExtremesTransform, когда запрос сextremes = 1сталкивался с исключением (например,MEMORY_LIMIT_EXCEEDED) в момент, когда transform строил свои столбцы extremes из первого chunk. Теперь клиент получает исходное исключение вместо падения сервера. #105264 (Groene AI). LEFT ANTI JOINтеперь корректно возвращает столбец ключа JOIN с правой стороны со значениями по умолчанию для несовпавших строк, вместо того чтобы дублировать значение левого ключа. РанееSELECT a.x AS l, b.x AS r FROM a LEFT ANTI JOIN b ON a.x = b.xмог возвращатьr = a.xдля несовпавших строк, хотя должен был возвращать значение по умолчанию (0дляInt32,''дляString,NULLдляNullable). Затронут был только столбец ключа JOIN; неключевые правые столбцы уже корректно заполнялись значениями по умолчанию. Та же ошибка возникала и вRIGHT ANTI JOIN, когда оптимизатор менял стороны местами. Закрывает #99959. #105278 (Groene AI).- Исправлена потеря данных в
clickhouse-localпри повторных запусках с--default_database, отличной отdefault(например,clickhouse-local --path X -- --default_database=mydb): поиск сохранённого UUID базы данных был жёстко привязан кmetadata/default, поэтому при каждом перезапуске создавался новый UUID, а таблицы из предыдущего запуска становились невидимыми. Закрывает #101831. #105284 (Groene AI). - Исправлена logical error
Mutation ofMemorytable produced incomplete output, возникавшая при выполненииALTER TABLE <memory_table> APPLY PATCHESилиALTER TABLE <memory_table> APPLY DELETED MASK. ТаблицыMemoryне имеют собственных патч-частей или масок удаления, поэтому теперь обе команды корректно обрабатываются как операции без эффекта. #105286 (Groene AI). - Исправлена проблема с долго выполняющимися запросами при работе с Unity Catalog за счёт передачи параметра
table_idв запросе. #105303 (Konstantin Vedernikov). - Исправлен
CANNOT_CONVERT_TYPEдляMergeповерхMergeповерхDistributedприdistributed_group_by_no_merge=1. #105330 (Azat Khuzhin). - Исправлено, что
clickhouse localиclickhouse clientмолча игнорировали--query/-q, если также был указан позиционный аргумент с файлом. Теперь в обоих случаях последовательно выдаётсяBAD_ARGUMENTS. #105334 (Raúl Marín). - Исправлено, что
REPLACE TEMPORARY TABLEмолча создавал новую таблицу, если целевая таблица не существовала. Теперь выбрасываетсяUNKNOWN_TABLE, что соответствует семантикеREPLACE TABLE. ИспользуйтеCREATE OR REPLACE TEMPORARY TABLE, чтобы сохранить поведение create-or-replace. #105373 (Groene AI). - Исправлено падение долго выполняющихся чтений (например,
INSERT ... SELECT) из базы данныхDataLakeCatalogсcatalog_type = 'glue'с ошибкойExpiredToken, когда учётные данные сеанса STS, полученные при загрузке метаданных таблицы, успевали истечь. Теперь учётные данные AWS STS обновляются прямо во время выполнения запроса, поэтому такие чтения продолжаются и после истечения срока действия токена. #105381 (Pratima Patel). - Исправлена logical error в некоторых случаях с отрицательным
LIMIT BYпри использованииARRAY JOIN. #105403 (Nihal Z. Miaji). - Исправлено завышенное значение
read_bytes(и производных байт/с, отображаемых вsystem.query_log, индикаторе прогресса и т. д.) при чтении файлов Parquet. В предыдущей реализации для каждого чанка сообщался общий compressed size всей группы строк, поэтому при чтении K из N столбцов происходил переучёт вN / K. Теперь значение суммируется только по выбранным столбцам. Также исправлено отслеживание прогресса на уровне файла для таблиц Iceberg: ранее размер файла данных вообще не учитывался. #105413 (Groene AI). - Исправлен возможный segfault сервера в cluster table functions (
s3Cluster,urlCluster,fileCluster, …), когда планировщик формируетSELECTс установленным флагомrecursive_with, но без выраженияWITH. Закрывает #105370. #105433 (Groene AI). - Исправлен неверный результат
countDistinct/uniqExactдля столбцовNullable, когдаcount_distinct_optimization = 1(группа NULL подсчитывалась неправильно). #105439 (Raúl Marín). - Исправлены heap-buffer-overflow при чтении файлов Arrow или ArrowStream с поврежденными промежуточными offsets в бинарном или строковом столбце, а также разыменование нулевого указателя при чтении георазмеченных Arrow-столбцов. #105449 (Raúl Marín).
- Добавлена проверка типов
Dynamic/Variantв оконномPARTITION BY; ранее она не выполнялась, еслиallow_suspicious_types_in_group_byотключен. Закрывает #105028. #105450 (Pavel Kruglov). - Исправлена работа настройки
input_format_json_empty_as_defaultв форматах JSONStrings*. Закрывает #104913. #105453 (Pavel Kruglov). - Исправлена вставка
NULLв столбецVariantчерез форматVALUESпри разборе выражения. Закрывает #104909. #105455 (Pavel Kruglov). - Исправлена ситуация, при которой
dictGetOrDefaultгенерировалCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN, если аргумент по умолчанию был выражениемNullable, аshort_circuit_function_evaluationвключен, при сочетании найденных и ненайденных ключей словаря. #105461 (Raúl Marín). - Исправлено незаметное усечение значений в столбцах
Dynamic, когда текстовый readerQuoted(Values) переключался наStringдля неполных автоматически выведенных типов, таких какMap(Array(Nothing), ...). Ранее при fallback сырое поле оборачивалось простой конкатенацией'...', из-за чего внутренняя одинарная кавычка (в таких fallback-сценариях она присутствует всегда) преждевременно завершала строку в кавычках, и оставшаяся часть значения терялась. #105463 (Groene AI). - Исправлен SIGSEGV при чтении подстолбцов
Dynamicиз сжатой таблицыMemoryпослеALTER. Закрывает #104901. #105464 (Pavel Kruglov). - Исправлено поведение
toFloat64/toUInt32/toString/etc. дляDynamic, при котором игнорировалсяcast_keep_nullable. Закрывает #104789. #105467 (Pavel Kruglov). skip_first_linesтеперь включен в ключ кэша схемы для форматовWithNames. Закрывает #104527. #105469 (Pavel Kruglov).- Исправлен segfault сервера в
uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(и аналогичных chain-комбинаторах надuniq) при использовании сGROUP BY ... WITH ROLLUP,WITH CUBEилиWITH TOTALSи аргументомNullable. #105470 (Groene AI). - Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCKпри сочетанииORDER BY ... WITH FILL INTERPOLATEиLIMIT N BYс включенным analyzer. Закрывает #103474. #105481 (Yakov Olkhovskiy). - Исправлены
toStartOfMillisecondиtoStartOfMicrosecond, которые для отрицательных значенийDateTime64(до эпохи Unix) возвращали результат со сдвигом почти на секунду; также исправлено signed-integer-overflow, выявляемоеUndefinedBehaviorSanitizer, вtoStartOfSecond,toStartOfMillisecondиtoStartOfMicrosecondдля входных значенийDateTime64, близких кINT64_MIN. #105482 (Groene AI). - Добавлена новая compatibility setting
analyzer_compatibility_prefer_alias_over_subcolumn(по умолчанию отключена). Когда она включена, новый analyzer для составных идентификаторов предпочитает интерпретацию с префиксом alias, а не совпадения с подстолбцамиTuple/ столбцами с точечной нотацией, восстанавливая поведение предыдущего интерпретатора. Это позволяет избежать ошибокAMBIGUOUS_IDENTIFIER(и связанных с ними), когда запрос выполняет JOIN с таблицей, имя которой совпадает с внутренней таблицей CTE/подзапроса, использующегоSELECT *поверх JOIN, и где переименованные через asterisk столбцы (например,b.id) иначе приводили бы к утечке идентификаторов внутренней таблицы во внешнюю область видимости. #105491 (Vladimir Cherkasov). - Запрос векторного поиска, выполняемый с оптимизацией index only, теперь возвращает корректное значение
L2Distance(), если оно присутствует в спискеSELECT. Ранее функция ошибочно возвращала значение расстояния L2-squared. Обратите внимание: сам запрос векторного поиска возвращал результаты с корректным ранжированием; квадрат расстояния могли увидеть только приложения, явно получавшие и интерпретировавшие значениеL2Distance(). #105495 (Shankar Iyer). - Исправлена редкая проблема в новом движке таблицы Kafka: во время переназначения партиций топика сообщения могли обрабатываться некорректно, что потенциально приводило к их пропуску после rollback смещения. #105500 (János Benjamin Antal).
- Исправлено Исключение (
Trying to execute PLACEHOLDER actionlogical error), возникавшее, когдаMATERIALIZEDCTE, тело которого представляет собой коррелированный подзапрос, использовался в правой частиIN. Теперь такой CTE отклоняется на этапе анализа, что соответствует тому, как тот же шаблон уже отклоняется, когда на CTE ссылаются напрямую вFROM. #105518 (Groene AI). - Исправлено, что сжатие для stdout/stdin не применялось, если format был указан явно. Закрывает #104441. #105528 (Pavel Kruglov).
- Исправлен SEGFAULT при десериализации
singleValueOrNullдля типаJSON. Закрывает #103630. #105535 (Pavel Kruglov). - Исправлено, что
clickhouse-format --backslashмолча отбрасывал данныеINSERTVALUES. Закрывает #103533. #105536 (Pavel Kruglov). - Исправлено, что
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=falseне перехватывал исключения во время выполнения функции. Закрывает #103484. #105543 (Pavel Kruglov). - Исправлено игнорирование
input_format_try_infer_datetimesпри вставке в общие данные вJSON. Закрывает #103221. #105544 (Pavel Kruglov). - Исправлена ошибка в
histogram, из-за которой на небольших неотсортированных входных данных возвращались неверные результаты. Закрывает #103109. #105548 (Pavel Kruglov). - Исправлено циклическое переполнение
DateTimeдля значений вне допустимого диапазона вJSONExtractи при текстовой десериализации. Закрывает #103094. #105551 (Pavel Kruglov). - Исправлено использование таблицы вставки в табличных функциях, когда включен
optimize_trivial_insert_select. Закрывает #103083. #105555 (Pavel Kruglov). - Исправлено поведение
CASEexpression, которое возвращало веткуELSEвместо соответствующегоTHEN, когда и expression, и значениеWHENбылиNULL. #105556 (Raúl Marín). - Исправлено падение
replxx, вызванное достижением ограниченияFD_SETSIZEуselect(теперь заменен наpoll). Ранее при включенном SSH или веб-терминале это могло приводить к падению сервера. #105559 (Azat Khuzhin). - Материализованы подстолбцы в
executePartitionByExpressionперед выполнением expression. Закрывает #103057. #105573 (Pavel Kruglov). - Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда выражениеTTLссылалось на подстолбец. #105578 (Pavel Kruglov). - Исправлено падение сервера (SIGSEGV), которое мог вызвать любой пользователь с правами
CREATE TABLE, отправив по HTTP или через собственный протокол запросCREATE TABLE ... TO INNER UUID '...'без clauseENGINE. Та же ошибка также приводила к падению клиента. Теперь parser сообщает корректную ошибкуBAD_ARGUMENTSвместо разыменования нулевого указателя. #105579 (Groene AI). - Исправлена ошибка, из-за которой window function
estimateCompressionRatioтеряла накопленные данные между строками. Закрывает #101738. #105581 (Pavel Kruglov). - Исправлено падение при вставке Tuple разного размера в одной clause
VALUESв столбецString. Закрывает #101727. #105582 (Pavel Kruglov). - Извлечение значений Hive partition теперь учитывает настройку
cast_string_to_date_time_modeи по умолчанию принимает временные метки ISO 8601 с суффиксами часового пояса (например,+0000,+00:00,Z) в ключах партиционирования. #105584 (Alexey Milovidov). - Исправлена ошибка
NOT_IMPLEMENTEDпри вызовеtoStringдляDateTimeс Timezone, содержащим значениеNULL. Закрывает #103712. #105587 (Yarik Briukhovetskyi). - Исправлено чтение за пределами буфера при
Native-десериализации flattened столбцаDynamic. #105666 (Pavel Kruglov). - Исправлен
LOGICAL_ERROR(Unexpected return type from if), возникавший при планировании запроса для выраженийif, у которых тип результата —Variant, а вторая или третья ветка представляет собойifс константным условием над литераломUInt64, помещающимся вInt64. Закрывает #105649. #105680 (Groene AI). - Исправлены неверные результаты при чтении Iceberg table с
iceberg_use_version_hint = 1, если перед этим другой writer (например, table functionicebergLocal/icebergS3) без этой настройки продвигал таблицу. Теперьversion-hint.textсинхронизируется каждым writer, как только файл появляется, поэтому последующие readers, использующие hint, видят актуальный снимок. #105682 (Groene AI). - Исправлен незаметный недосчёт в запросах
SELECT, когдаuse_query_condition_cache = 1(по умолчанию). Запрос видаPREWHERE pk_prefix = X WHERE non_pk IN (...)к столбцу с bloom-filter индексом пропуска данных отравлялQueryConditionCacheдля предикатаpk_prefix = X, из-за чего последующий безобидныйSELECT count() ... WHERE pk_prefix = Xвозвращал некорректный заниженный результат. Затронуты все релизы 26.x. #104781. #105686 (Groene AI). - Исправлено поведение
singleValueOrNullMerge, который возвращал конкретное значение вместоNULLпри слиянии состояния, уже содержавшего несколько различных значений. #105734 (Minh Vu). - Исправлено восстановление после ошибок во входном формате
Templateпосле некорректных строк. #105735 (Yue Ni). - Исправлен сбой в table function
mongodb, хранилище MongoDB и источнике словаря MongoDB, возникавший, когда имя collection пустое или содержит байты NUL. #105776 (Raúl Marín). - Исправлена очистка снимков
Keeperпосле неудачных writes, чтобы частичные снимки безопасно удалялись, а неудачные writes можно было повторить без продвиженияlatest_snapshot_meta. #105779 (Antonio Andelic). - Исправлено отклонение
ALTER TABLE ... CLEAR COLUMNдля явных столбцовcolumns_to_sumвSummingMergeTreeиCoalescingMergeTree. #105785 (Antonio Andelic). - Исправлен assertion в
DatabaseCatalog::tryGetDatabase(и связанная с ним ошибкаUNKNOWN_DATABASEв release-сборках) при создании parameterized view, у которого имя database передаётся через query parameter, напримерCREATE VIEW {db:Identifier}.v AS SELECT {p:UInt64}. Теперь параметры в DDL-частях оператораCREATEподставляются во время создания, а параметры в теле SELECT остаются доступными для подстановки во время вызова view. #105799 (Groene AI). - Исправлена ошибка
Bad get: has Decimal32, requested Decimal128вsumMapиsumMapWithOverflowдля столбцаNested(... Nullable(Decimal(P, S))), когда агрегатное состояние сериализуется (например, параллельные реплики,sumMapStateчерез binary-state formatter, внешняя агрегация). #105816 (Groene AI). - Исправлены ошибки
Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinality, возникавшие при использованииapply_mutations_on_fly = 1на таблице, где в очереди уже были отложенные on-flyUPDATE/DELETEМутации, добавленные до мутацииALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Raúl Marín). - При записи в Iceberg теперь сохраняются значения NULL в столбцах партиции
Nullable(T). Ранее NULL, записанный ClickHouse, при чтении через Spark или другие reader Iceberg отображался как значение по умолчанию внутреннего типа (0дляint). Закрывает #105852. #105862 (Groene AI). - Исправлен pushdown фильтров для
ParquetиORCдля predicatesIN (subquery), благодаря чему pruning по row group/page/bloom filter теперь работает при чтении изfile,url,s3и object storage. #105863 (Arsen Muk). - Исправлено чтение в порядке для таблиц
Merge(с новым analyzer). #105867 (Nikolai Kochetov). - Исправлена ошибка в Iceberg v2 merge-on-read position deletes, из-за которой возвращались неверные строки, если один delete-файл ссылался на несколько data files, а к одному и тому же data file применялось несколько таких delete-файлов. Стриминг reader (
use_roaring_bitmap_iceberg_positional_deletes = 0) теперь фильтрует строки delete-файла поfile_pathв C++ вместо того, чтобы полагаться на pruning row group в Parquet, восстанавливая инвариант возрастания позиций. #105888 (Groene AI). - Исправлена ошибка
Cannot find columnдля distributed queries с фильтромIN Array(...)в новом analyzer. #105894 (Nikolai Kochetov). - Исправлен SIGSEGV в
ALTER TABLE ... MODIFY COLUMN ... Nullable(...)на таблицахMergeTree, когда другойALTERодновременно удалял столбец соSTATISTICS. Закрывает #105912. #105917 (Groene AI). - Исправлен сбой сервера, который мог возникать, когда запрос, читающий из PostgreSQL — через table function postgresql, движок таблицы PostgreSQL или словарь с источником PostgreSQL — отменялся (например, с помощью KILL QUERY), а отменить удалённый запрос PostgreSQL не удавалось. #105949 (Rory Shanks).
- Исправлено formatting
SYSTEM INSTRUMENT ADD: теперь аргументы обработчика разделяются одним пробелом; кроме того, отклоняются некорректные списки argument для instrumentationSLEEPс более чем двумя значениями или диапазоном, где минимум больше максимума. #105984 (Pablo Marcos). - Исправлены потенциально неверные результаты для queries, которые сочетают OUTER JOIN с последующим INNER JOIN, ссылающимся на сторону outer join, поставляющую NULL. Переупорядочивание JOIN могло выбрать план, в котором условия inner join переносились в предложение ON outer join. #105992 (Vladimir Cherkasov).
- Исправлен возможный crash из-за слишком большого строкового литерала, переданного в запросе. #105996 (Nikita Taranov).
- Исправлено исключение
INVALID_WITH_FILL_EXPRESSIONпри использовании пустогоINTERPOLATE ()с префиксом сортировки вORDER BYи включенной настройкойuse_with_fill_by_sorting_prefix. Столбцы префикса сортировки теперь корректно исключаются из неявного набора интерполяции, что соответствует поведению при явном указанииINTERPOLATE (col). #106001 (Yakov Olkhovskiy). - Исправлен случай, когда операции
ALTER TABLEс партициями для ключей партиционированияBoolмолча завершались ошибкой. Закрывает #101722. #106004 (Pavel Kruglov). - Исправлены
JSONExtractRawиJSONHasдля типизированныхJSON-путей со значениями по умолчанию. Закрывает #101721. #106005 (Pavel Kruglov). - Исправлено некорректное добавление префикса ’/’ для пустых базовых путей в конфигурациях озёр данных. Закрывает #105989. #106013 (thewisenerd).
- Исправлен случай, когда движок таблицы
IcebergLocalпереходил в режим только для чтения после циклаDETACH+ATTACHили перезапуска сервера, из-за чего любой последующийINSERTзавершался ошибкойLocal object storage Local is readonly. (READONLY). #106016 (Groene AI). - Исправлены сбои
Keeperво время дозагрузки follower, когда новая очередь ответов диспетчера запросов могла заполниться до запуска потока обработки ответов. #106049 (Antonio Andelic). - Улучшена совместимость со старым анализатором. Если у таблицы есть столбцы вида
x.a Array, x.b Array, x String, дляARRAY JOIN xтеперь предпочтение отдается массивам. #106069 (Nikolai Kochetov). - Исправлен случай, когда файловый кэш молча отключался для Azure Blob Storage (например, для таблиц Delta Lake в Azure), потому что метаданные объекта не содержали blob ETag. #106091 (thewisenerd).
- Исправлен случай, когда
system.dictionariesвозвращал 0 строк при частичном отзыве праваSHOW DICTIONARIES. #106105 (Pavel Kruglov). - Исправлено падение сервера при выполнении запросов к таблицам DeltaLake с включенной настройкой
allow_experimental_delta_kernel_rs, если учетные данные или параметр содержали недопустимые байты (паника Rust FFI происходила через границуextern "C"). #106109 (Raúl Marín). - Исправлены некорректные результаты для запросов к таблицам, у которых
ORDER BYсодержит монотонно убывающую функцию, такую как(c0 / -42)илиintDiv(c0, -42). Предикаты по исходному столбцу (например,c0 < 0) могли ошибочно отсекать гранулы, содержащие подходящие строки, что приводило к отсутствию части результатов. Закрывает #106084. Закрывает #106124. Закрывает #106080. #106136 (Nihal Z. Miaji). - Исправлена поддержка использования SQL UDF
WASMв определенияхMATERIALIZED VIEW. #106161 (Yue Ni). - Iceberg partition pruning теперь корректно обрабатывает фильтры
WHERE partition_col = (SELECT ... FROM ...), где analyzer оборачивает результат scalar subquery во внутренний_CAST(Const, 'TargetType')с совпадающими исходным и целевым типами. Ранее такие фильтры отключали отсечение партиций и приводили к полному сканированию таблицы. #106204 (Groene AI). - Исправлен параметр
--query_idв clickhouse local: теперь с его помощью можно задавать пользовательский Query id. #106205 (Yue Ni). - Исправлено игнорирование класса хранилища S3 (
s3_storage_class/s3_storage_class_name) для объектов, записываемых через multipart-загрузку на дискиS3и в объектное хранилище, из-за чего крупные объекты создавались с классомSTANDARDпо умолчанию. Имя опции теперь принимается какs3_storage_class, так иs3_storage_class_nameдля дисков, объектного хранилища и резервных копий. #106214 (Alexey Milovidov). - Исправлена проблема, из-за которой Keeper иногда зависал при запуске, если настройка
nuraft_max_log_gap_in_streamбыла установлена в значение, отличное от значения по умолчанию (по умолчанию это 0, то есть конвейеризация запросовappend_entriesотключена). #106220 (Michael Kolupaev). - Добавлена проверка повреждённого состояния агрегатной функции
DDSketch(ключей bin) при вставке вместо принятия некорректных данных. #106236 (Yarik Briukhovetskyi). - Исправлено несоответствие режима coordinator, возникавшее, когда subqueries переопределяли настройки упорядоченного выполнения. #106243 (Nikita Taranov).
- Исправлена проблема, из-за которой
optimize_skip_unused_shardsне применялся (аforce_optimize_skip_unused_shardsошибочно завершался с ошибкой), когда к таблицеDistributedобращались через таблицуMergeили табличную функциюmerge, а predicate применялся уровнем выше. #106250 (Nikolai Kochetov). - Исправлена ошибка, из-за которой
INTERPOLATE ()выдавалINVALID_WITH_FILL_EXPRESSION, когда столбцамORDER BYбыли назначены псевдонимы в спискеSELECTпри использовании старого analyzer. Закрывает #106248. #106252 (Yakov Olkhovskiy). - Исправлено аварийное завершение при десериализации некорректного состояния
AggregateFunction(uniqTheta, ...)из входных данныхRowBinaryили query parameter. Теперь некорректный ввод отклоняется с ошибкойCORRUPTED_DATAвместо того, чтобы выходить наружу какstd::exceptionи аварийно завершать процесс черезabortOnFailedAssertion. #106260 (Groene AI). - Байты
IntervalKind, выходящие за допустимый диапазон, теперь отклоняются при декодировании типовRowBinaryWithNamesAndTypes(input_format_binary_decode_types_in_binary_format = 1) с понятной ошибкойINCORRECT_DATAвместо созданияDataTypeIntervalс недопустимым kind, что впоследствии могло приводить к неопределённому поведению в путях хеширования. #106261 (Groene AI). - Исправлена проблема с rollback при сбое понижения версии
SLRUв26.1+. Исправлен приоритет разделения кэшаSystem/Dataдля возможностиkeep_free_space_ratio. #106286 (Kseniia Sumarokova). - Подстолбец
nullвNullable(JSON)теперь читается как путьJSON, а не как null-map. Закрывает #106085. #106295 (Pavel Kruglov). - Исправлено поведение
RestCatalog::empty, который возвращал неверный результат, если Iceberg REST-каталог содержал таблицы. #106301 (Lefteris). - Исправлено исключение для запросов
INNER JOINс пустой левой таблицейMergeTree, когда включеныenable_parallel_replicas,query_plan_use_new_logical_join_stepиquery_plan_optimize_join_order_algorithm = 'greedy'. #106338 (Nikolai Kochetov). - Исправлено некорректное преобразование субнормальных значений
Float16вFloat32(например, при чтении из файлов Numpy.npy), вызванное сдвигом мантиссы на один бит. #106343 (Joanna Hulboj). - Исправлены сбой и возможная ошибка
NOT_FOUND_COLUMN_IN_BLOCKпри использовании оптимизации на основе ограничений (optimize_using_constraints) с correlated subqueries. #106349 (Raúl Marín). - Исправлено чтение за пределами допустимых границ в
sipHash64Keyed,sipHash128KeyedиsipHash128ReferenceKeyedпри хешировании столбца, у которого все массивы пусты, а ключ не является константой. #106355 (Raúl Marín). - Исправлено поведение
SYSTEM RELOAD CONFIG, который отбрасывал настройки Azure Blob Storage для отдельных endpoint’ов (например,use_native_copy), из-за чего настроенные параметры диска игнорировались дляBACKUP/RESTOREдо перезапуска сервера. #106357 (Julia Kartseva). - Исправлено поведение
regexpExtract(haystack, pattern): теперь шаблоны регулярного выражения без capturing group возвращают всё совпадение вместо ошибкиINDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (Groene AI). - Исправлено исключение
LOGICAL_ERRORпри predownload кэша, если удалённый объект S3 был перезаписан более коротким содержимым между получением списка и чтением. #106375 (Nikita Fomichev). - Исправлен рост использования памяти в файловом кэше. #106387 (Kseniia Sumarokova).
- Исправлены множественные чтения за пределами heap в средстве чтения формата Arrow IPC (
ArrowColumnToCHColumn). Некорректный файл Arrow мог объявлять больше строк, чем содержат его буферы, задавать длины дочерних элементов list/struct/map, не согласованные с родительским элементом, передавать немонотонные offsets list или обрезать дочерний битмап валидности, что приводило к чтению за пределами выделений в heap. Это затрагивает любого пользователя с привилегиейSELECT, использующегоfile(),format(), табличные функции или входные данные ArrowFlight. Теперь все буферы data, offsets, view-struct и validity-bitmap проверяются перед любым доступом через raw pointer, а формы и offsets list/struct/map — на согласованность. #106395 (Raúl Marín). - Исправлена ошибка, из-за которой backups завершались с
FILE_DOESNT_EXIST, когда цель REPLACE у refreshable materialized view собиралась в базе данных Replicated или Shared, а сама materialized view ещё не была создана на реплике, инициировавшей backup. #106411 (Julia Kartseva). - Исправлена logical error
Column identifier ... is already registered, возникавшая, когда предикат мутации (DELETE/UPDATE) содержит подзапросIN/EXISTS, читающий из выражения default table, вложенного в другой подзапрос. #106414 (Alexey Milovidov). - Исправлена logical error (
Left and right columns have same names) в join order optimizer, которая могла возникать для JOIN, выполняемых с параллельными репликами, когда два отношения в графе JOIN имеют одинаковые имена столбцов. #106418 (Alexey Milovidov). - Исправлена logical error при построении polygon dictionary из исходных данных, содержащих координаты точек
NaNили infinite. Такие координаты теперь отклоняются с понятной ошибкой. #106423 (Alexey Milovidov). - Исправлена ошибка, из-за которой столбцы
used_privilegesиmissing_privilegesвsystem.query_logмогли содержать строки привилегий, утекшие из не связанных с ними более ранних запросов другого пользователя, database или session. #106425 (Alexey Milovidov). - Functions
base58Encode,base58DecodeиtryBase58Decodeтеперь учитываютmax_execution_timeи отмену запроса на больших входных данных, а также отклоняют входные данные размером более 10 КБ вместо того, чтобы выполняться очень долго. Ограничение настраивается через новую настройкуfunction_base58_max_input_size(0отключает его). #106428 (Alexey Milovidov). - Исправлены редкие некорректные результаты для запросов
ORDER BY ... DESCпри чтении частей Wide в обратном порядке сread_in_order_use_virtual_row_per_block = 1и небольшимmax_block_size. #106429 (Vladimir Cherkasov). - Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCKпри выполнении запроса к таблице Iceberg или S3 table с составным предложениемWHERE, содержащимIS NOT NULLдля столбца, которого нет в спискеSELECT, при использовании Parquet V3 native reader. #106443 (Shaohua Wang). - Пользователь теперь может задавать заголовки для
HTTPDictionaryс использованием named collections. #106459 (Jan Rada). - Исправлен случай, когда worker thread мог оставаться attached к устаревшей thread group после того, как
CurrentThread::attachToGroupзавершался сбоем на одном из этапов, из-за чего последующие задачи в этом же потоке завершались ошибкойThread is already attached to a group. #106462 (Mikhail f. Shiryaev). - Исправлено Исключение, возникавшее, когда запрос векторного поиска использует vector index и другой индекс пропуска данных, например
minmax, приuse_skip_indexes_on_data_read = 1. #106473 (Shankar Iyer). - Некорректно сформированные значения enum
Avroтеперь проверяются и отклоняются с ошибкой, вместо того чтобы вызывать чтение за пределами допустимого диапазона и аварийное завершение при десериализации поврежденных данныхAvro. #106476 (Miсhael Stetsyuk). - Исправлено завышенное отображение прогресса при чтении из таблиц Iceberg с фильтрами
_fileили_path. Ранее в показателе прогрессаtotal_bytes_to_readучитывались все файлы из manifest независимо от фильтрации. #106491 (Pedro Ferreira). - Исправлено исключение
Bad cast exceptionдля словарей Redis, использующихSTORAGE_TYPE 'simple'со структуройcache/directи единственным строковым (составным) ключом; теперь такие словари работают, а для составных ключей поверх хранилищаsimpleвыводится понятная ошибка. #106501 (Vladimir Cherkasov). - Исправлена ошибка, приводившая к неверным результатам:
WHERE c0 = constне возвращал ни одной строки для таблиц сORDER BY f(c0), еслиf(const)вычислялось в NaN, напримерORDER BY sqrt(c0)с отрицательной константой. Анализ первичного ключа ошибочно отсекал все гранулы и отравлял кэш условий запроса для последующих запросов. #106507 (Groene AI). - Исправлено поведение
LIMIT WITH TIESи дробногоLIMIT WITH TIES, которые не учитывали collation изORDER BY ... COLLATEпри определении совпадающих строк. Строки, равные согласно collation (например,'1'и'01'при числовой collation), сравнивались побайтно, из-за чего некоторые строки с совпадающими значениями ошибочно исключались из результата. #106539 (Nihal Z. Miaji). - Исправлены оптимизации
DISTINCTin order иLIMIT BYin order (включая отрицательныйLIMIT BY), которые возвращали неверные результаты, когда входные данные были отсортированы с collation (ORDER BY ... COLLATE). Строки, равные согласно collation (например,'a'и'A'при регистронезависимой collation), упорядочиваются по ключу collation и поэтому не оказываются соседними по значению, так что оптимизация in order теперь пропускается при использовании collator. #106564 (Nihal Z. Miaji). - Исправлены неверные результаты для
SELECT c, count() FROM t WHERE c GROUP BY cв таблицах с неявной_minmax_count_projection, явной aggregate projection или обычной projection: раньше каждая группа схлопывалась в одну строку с константным ключом и общим числом строк. #106590 (Groene AI). - Исправлена ошибка, из-за которой нельзя было использовать scalar subqueries в первом аргументе
IN, если второй аргумент — неконстантный кортеж. #106610 (Yarik Briukhovetskyi). - Исправлено исключение
Mutation ofMemorytable produced incomplete output, возникавшее при выполнении командALTER TABLE <memory_table>, которые не влияют на данные отдельных строк в движкеMemory, а именноAPPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTIONиREWRITE PARTS. ТаблицыMemoryне содержат этих структур, поэтому такие команды теперь считаются no-op. #106621 (Groene AI). - Исправлено игнорирование
session_timezoneпри сериализации столбцовLowCardinality(DateTime)в текстовые форматы (CSV, TSV, JSONEachRow и т. д.). Ранее после первой записи столбцаLowCardinality(DateTime)на сервере каждый последующий запрос, записывавший такой столбец, выводил строковое представление локального времени в том часовом поясе, который встретился первым, независимо отsession_timezone. #106634 (Groene AI). - Исправлен
LOGICAL_ERROR“Trying to get name of not a column:ExpressionList”, возникавший в запросах, где asterisk передавался внутриmultiIfв аргумент табличной функции, напримерnumbers(multiIf(*, ...), 2). Теперь запрос отклоняет такой неразрешимый matcher сUNSUPPORTED_METHOD. #106647 (Groene AI). - Исправлена ошибка, из-за которой server не запускался с сообщением
Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0), когда у таблицыMergeTreeбыла часть skip-index с нулём гранул и непустым файлом marks на диске. #106675 (Groene AI). - Отклоняются патологические glob patterns для
file, которые могли приводить к неограниченной рекурсии при перечислении каталогов. Теперь максимальная глубина рекурсии ограничена 1000; запросы, превышающие этот предел, вызываютTOO_DEEP_RECURSIONвместо падения server из-за переполнения стека. #106676 (Groene AI). - Исправлено аварийное завершение server с ошибкой
Bad cast from type DB::ColumnNothing to DB::ColumnVector<char8_t>вFunctionIf::executeForConstAndNullableCondition, когда условиеif/multiIfсворачивается в константуConst(Nullable(Nothing))(например, при выходящем за границы индексе пустого массива, как вarraySort(x -> x, [])[toNullable(1)]). #106678 (Groene AI). - Исправлено Исключение
'Trying to read from input() twice.', возникавшее, когда table functioninputобёрнута в нематериализованный CTE, на который ссылаются из нескольких мест запроса. Теперь такой запрос отклоняется с корректной ошибкойINVALID_USAGE_OF_INPUTна этапе планирования.input— это одноразовый поток client, и он может быть использован только одним источником в плане запроса. #106682 (Groene AI). - Сделано так, чтобы
FORMATприменялся и к выводуEXPLAINвEXPLAIN ... INSERT ... SELECT ... FORMAT ..., в том числе когдаSETTINGSпредшествуетFORMATили output format —Values. Дополнение к #101772. #106686 (Alexey Milovidov). - Исправлена редкая ложная ошибка
RESOURCE_ACCESS_DENIED(“Scheduler queue with resource request is about to be destructed”) для запроса, которому на самом деле был выдан доступ к ресурсу рабочей нагрузки; причиной было повторное использование thread-local объекта request, сохранявшего сбой предыдущего request. #106690 (Alexey Milovidov). - Исправлена гонка между уничтожением объектов
INATSConsumerи вызовом для нихINATSConsumer::onMsgчерез обратный вызов в библиотеке NATS. #106692 (Miсhael Stetsyuk). - Исправлена ошибка, из-за которой
match,extract,extractAllиcountMatchesвозвращали неверные результаты для регулярных выражений, содержащих шестнадцатеричные или восьмеричные escape-последовательности. #106709 (ofeliacode). - Внутренний Raft TLS в Keeper теперь учитывает настройку
openSSL.client.verificationMode. Ранее проверка сертификатов peer-узлов всегда была включена для меж-Keeper-коммуникации Raft независимо от этой настройки, поэтомуnoneмолча игнорировалось. Теперьnoneявно отключает проверку сертификатов peer-узлов Raft, а отсутствие настройки сохраняет прежнее безопасное по умолчанию поведение. Конфигурации, в которых явно заданоnone, после upgrade перестанут проверять сертификаты peer-узлов Raft, что соответствует заданной конфигурации. #106726 (Antonio Andelic). - Исправлена logical error в startup scripts в
SYSTEM RELOAD CONFIG. Кроме того, startup scripts теперь загружаются приSYSTEM RELOAD CONFIG(пока это functionality доступно только для private). #106727 (Miсhael Stetsyuk). - Отменено изменение, из-за которого
sumMap/ комбинатор-Mapотклонял пользовательские числовые типы значений с нестандартными именами (например,SimpleAggregateFunction(sum, T)иBool) с ошибкойILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, из-за чего ломались ранее работавшие агрегации. #106729 (Nikita Fomichev). - Исправлено несколько проблем с безопасностью памяти и исчерпанием ресурсов в ридерах форматов, доступных через недоверенный ввод: чтение за пределами кучи при обработке длины уровней definition/repetition в
DataPageV2нативного ридера Parquet, переполнение стека на файлах Parquet с глубоко вложенными схемами, а также выделения памяти, игнорировавшиеmax_memory_usageпри парсинге WKB/WKT-геометрии GeoParquet и строк/байтов Avro. #106739 (Raúl Marín). - Исправлено переполнение буфера кучи (сбой сервера) в
decodeHTMLComponentпри декодировании строк, содержащих расширяющиеся HTML-сущности≫⃒или≪⃒; проблема была достижима для любого пользователя с помощью одногоSELECT. #106741 (Raúl Marín). - Теперь
CREATE TABLE,ALTER TABLE ADD INDEXиCREATE INDEXсо значениемGRANULARITY 0для индексов пропуска данных отклоняются с понятной ошибкойBAD_ARGUMENTS. Ранее это приводило к исключениюInconsistent AST formattingв debug-сборках. #106783 (Groene AI). - Исправлено поведение, при котором Azure BACKUP/RESTORE игнорировал настройки конечной точки для дисков
azure_blob_storageстарого формата. #106784 (Julia Kartseva). - Исправлено исключение
Bad castпри отсечении частей по статистикеMinMax, когда ключевой столбец имеет типLowCardinality, а константа предиката —LowCardinality(Nullable(...)). #106793 (Groene AI). - Исправлены несогласованные столбцы (которые позже приводят к
LOGICAL_ERROR) при возникновении исключения (например,MEMORY_LIMIT_EXCEEDED) во время парсинга. #106802 (Azat Khuzhin). - Исправлено поведение, при котором после настройки
keeper_server.http_control.secure_portсервер возвращал HTTP-ответ на запросы HTTPS-клиентов. #106822 (linjiayu1025-collab). - Исправлена logical error в
parseDateTimeпри обработке не-ASCII байтов во входных данных. #106856 (Pavel Kruglov). - Исправлено поведение
SHOW CREATE ROW POLICY, выводившейrestrictive/permissiveв нижнем регистре вместо верхнего, что расходилось с остальными ключевыми словами. #106865 (Valery Petrov). - Исправлен случай, когда параллельная реплика не применялась для представления с
UNIONиз-за пустой таблицы вUNION. #106900 (Igor Nikonov). - Исправлен сбой сервера (SIGSEGV) при чтении усечённых данных
Protobufсinput_format_allow_errors_num > 0. #106905 (Andrey Tsarevskiy | Андрей Царевский ). - Исправлено исключение
THERE_IS_NO_COLUMNдля distributed queries с оптимизациейoptimize_rewrite_aggregate_function_with_if, когда argument aggregate function требует приведения к типуNullable. #106908 (Yakov Olkhovskiy). - Исправлено Исключение (
LOGICAL_ERROR) в JOIN runtime filter, возникавшее, когда ключ JOIN содержит типVariantилиDynamic, вложенный вTuple,ArrayилиMap, а в правой части JOIN имеется одно уникальное значение. #106931 (Groene AI). - Исправлено переполнение знакового целого числа (неопределённое поведение) в
arrayLevenshteinDistanceWeightedиarraySimilarity, когда массивы весов содержат большие целочисленные значения. Теперь для целочисленных весов взвешенное расстояние накапливается в широком целочисленном типе, поэтому большие целочисленные веса больше не приводят к переполнению и сохраняют точность. #106934 (Groene AI). - Исправлено падение server (разыменование нулевого указателя) при выполнении
TRUNCATEилиDROPдля таблицыEmbeddedRocksDB, у которой был освобождён дескриптор RocksDB, например для таблицыread_only, каталог данных которой был очищен предыдущимTRUNCATE. #106940 (Groene AI). - Исправлено Исключение (
std::length_error, сообщавшееся какLOGICAL_ERROR) при чтении из table function*Cluster, такой какurlCluster, при очень большом значении настройкиmax_streams_for_files_processing_in_cluster_functions. Теперь число streams ограничивается разумным значением. #106946 (Groene AI). - Исправлено падение server (разыменование нулевого указателя
DB::IConnections) вRemoteQueryExecutor, когда distributed query отменяется непосредственно перед отправкой на shard. #106950 (Groene AI). - Исправлено, что
elapsed_usвсегда был равен нулю, аread_rows/read_bytesзанижались вsystem.processors_profile_logиsystem.query_logдля запросов flush асинхронной вставки (AsyncInsertFlush). #106982 (Christoph Wurm). - Исправлено падение (
Source column is not Map/SIGSEGV) при слиянии отсортированных blocks, содержащих столбецVariantс вариантомMap, у которого порядок в локальном хранилище отличается от глобального. #107011 (Groene AI). - Исправлена logical error
conflicted_part_name.has_value(), возникавшая во время синхронной вставки в таблицуReplicatedMergeTree, когда inserted block был полностью дедуплицирован, а узел дедупликации конфликтующей части уже был удалён (например, из-за конкурентной операцииDROP PARTITION). #107026 (Groene AI). - Исправлено Исключение (logical error
this->visited_views == right->visited_views) приINSERT, когда два materialized view для одной и той же исходной таблицы записывают в одну и ту же целевую таблицу, а зависимое представление читает эту целевую таблицу, при включённой настройкеmaterialized_views_squash_parallel_inserts. #107027 (Groene AI). - Исправлена logical error
Block structure mismatch in UnionStep stream(аварийное завершение server в debug/sanitizer builds,Code: 49в release builds), возникавшая, когда одна веткаUNION/INTERSECT/EXCEPTчитала столбец, сериализованный какSparse, а соседняя ветка читала тот же столбец как обычный полный (например, при отправке в materialized view). #107041 (Groene AI). - Исправлено исключение
LOGICAL_ERRORпри вставке в таблицу DeltaLake со столбцами, не соответствующими её схеме записи (например, столбецNested, разворачивающийся в подстолбцы, или table function с явным подмножеством столбцов). Теперь такие вставки завершаются пользовательской ошибкойINCOMPATIBLE_COLUMNS. Закрывает #87402. #107058 (Groene AI). - Исправлена ошибка
TYPE_MISMATCH(“Cannot convert string … to type …”) в запросахORDER BY <numeric column> ... LIMIT n, когда lazy materialization помещала другой столбец перед столбцом сортировки. Теперь порог top-K считывается из правильного столбца сортировки. #107060 (Groene AI). - Исправлена синтаксическая ошибка, возникавшая, когда предложение
FORMAT,SETTINGSилиINTO OUTFILEследует заSHOW ROW POLICIESилиSHOW MASKING POLICIES(например,SHOW ROW POLICIES FORMAT TabSeparated). #107061 (Groene AI). - Исправлен составной
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a, повторно использующий освобождённое имя столбца (то есть выполняющий “swap”) между столбцами разных типов. Materialized part записывала неверный тип столбца, из-за чего последующийSELECTзавершался ошибкойConversion between numeric types and IPv6 is not supported(или прерывался при загрузке part в debug builds). #107064 (Groene AI). - Исправлены недетерминированные результаты функции
roundDown, когда массив границ содержитNaN. Одно и то же входное значение могло возвращать конечную границу илиNaNв зависимости от соседних строк в пакете. Теперь границыNaNигнорируются, поэтому результат зависит только от конечных границ. #107065 (Groene AI). - Исправлено поведение, при котором
quantileTDigestиquantileTDigestWeightedгенерировалиDECIMAL_OVERFLOWдля аргументовDateиDateTime, если интерполированная quantile была дробной, но оставалась в допустимом диапазоне (например,quantileTDigestWeighted(date, weight)на значениях, которые все помещаются в тип). Теперь дробный результат усекается до типа результата, как вquantilesTDigestWeighted; значения, действительно выходящие за диапазон, по-прежнему вызывают ошибку. Закрывает: #106722. #107066 (Groene AI). - Исправлено поведение, при котором
trimLeft,trimRightиtrimBoth(а также псевдонимыltrim,rtrim,trim) генерировалиTOO_LARGE_STRING_SIZE, когда пользовательский набор символов обрезки был длиннее 16 символов. Теперь наборы символов обрезки любой длины снова поддерживаются. #107071 (Nikita Fomichev). - Исправлено тихое усечение выходящих за диапазон целочисленных значений в определениях типов
Enum8/Enum16. ТеперьEnum8('a' = 200)генерируетARGUMENT_OUT_OF_BOUNDвместо того, чтобы молча создаватьEnum8('a' = -56). #107081 (Groene AI). - Исправлен неправильный порядок строк (и
LOGICAL_ERROR“Rows are not sorted with permutation” в debug builds) для запросовORDER BY ... LIMITс несколькими столбцами сортировки по столбцамNullable, когда несколько строк имеют одинаковые значения в ведущих столбцах. #107094 (Groene AI). - Исправлен
LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y), возникавший при выполнении функции над столбцомDynamic, полученным через JOIN поDynamic(например, для неприсоединённых строкRIGHT/FULL JOINили для коррелированного подзапросаEXISTS, преобразованного в JOIN). #107095 (Groene AI). - Исправлено ложное пересоздание сессии ZooKeeper при перезагрузке конфигурации. #107096 (Azat Khuzhin).
- При обновлении access entities mutex больше не удерживается во время чтения из ZooKeeper. #107097 (Azat Khuzhin).
- Исправлено исключение
Logical error: Too large size passed to allocatorприINSERTв таблицуMergeTree, когдаadaptive_write_buffer_initial_sizeзадан слишком большим значением. Начальный размер адаптивного буфера записи теперь ограничивается максимальным размером буфера. #107104 (Groene AI). - Исправлен
LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality), возникавший, когда константаVariant, содержащая элементLowCardinality, сравнивалась с ключевым столбцом, чьё ключевое выражение является немонотонной детерминированной функцией (например, индекс пропуска данныхminmaxпоsipHash64(col)). #107111 (Groene AI). - Исправлена логическая ошибка
Bad cast from type DB::IColumn const* to DB::ColumnNullable const*, возникавшая, когда квалифицированная звёздочка (t.*) по ключуJOIN ... USINGпередавалась в агрегатную функцию, а на другой стороне внешнего JOIN был ключNullable(приjoin_use_nulls = 0). #107129 (Groene AI). - Исправлены пакеты
ALTER TABLE ... ON CLUSTER, в которыхMODIFY SETTING/RESET SETTINGсмешивались с изменением комментария (например,MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) и из-за этого применялись только на ведущей реплике, оставляя остальные реплики в рассинхронизированном состоянии. Также исправлена ситуация, когда позиционный или задаваемый для отдельного столбца вариантMODIFY COLUMN ... COMMENTсSETTINGSошибочно классифицировался как локальное изменение metadata, затрагивающее только комментарий, из-за чего перестановка столбцов не попадала в реплицируемые metadata и могла вызыватьINCOMPATIBLE_COLUMNSпри перезапуске реплики. #107142 (Groene AI). - Исправлен
LOGICAL_ERROR(“Table expression … data must be initialized”), возникавший, когда сопоставитель квалифицированной звёздочки (например,x.*) ссылался по имени на рекурсивное CTE внутри собственного рекурсивного члена. Теперь такие сопоставители раскрывают столбцы рекурсивной таблицы так же, как это уже происходит в этой позиции для квалифицированного столбца (x.a) или неквалифицированного сопоставителя (*). #107144 (Groene AI). - Исправлены неверные результаты запроса, вызванные кэшем условий запроса, когда on-fly мутации (
apply_mutations_on_fly) или патч-части отфильтровывали строки доPREWHERE. Запрос, выполнявшийся сapply_mutations_on_fly = 1, мог «отравить» кэш так, что последующий запрос сapply_mutations_on_fly = 0и тем же предикатом пропускал метки, которые должен был прочитать, и возвращал слишком мало строк. Это же исправление также распространяется на политики безопасности на уровне строки, которые добавляются как фильтр передPREWHERE: запрос, выполненный с ограничительной ROW POLICY, мог «отравить» кэш для последующего запроса, использующего тот же предикат, но без этой политики. #107145 (Groene AI). - Исправлена работа
BACKUPсAzureBlobStorage: при копировании файла данных внутри резервной копии объект назначения записывался вне каталога резервной копии. Проверки существования объектов резервной копии в пунктах назначенияS3теперь используют точные запросыHeadObjectвместо перечисления по префиксу, что предотвращает ложные совпадения для ключей с похожими префиксами. #107153 (Pablo Marcos). - Исправлено переполнение знакового целого числа в
quantileExactExclusive,quantilesExactExclusive,quantileExactInclusiveиquantilesExactInclusive, которое могло приводить к неверному результату для входных значенийInt64, охватывающих большой диапазон. #107154 (Groene AI). - Исправлен
LOGICAL_ERROR(“Unexpected exception in refresh scheduling”), который мог приводить сервер к циклу падений при перезапуске, если у refreshable materialized view есть зависимостьREFRESH ... DEPENDS ON <name>, чьё неквалифицированное имя совпадает с именем временной таблицы или CTE. #107156 (Groene AI). - Убрали запуск стартовых скриптов при перезагрузке config, так как это семантически неверно, неожиданно для пользователей и, как показала практика, чревато ошибками. #107187 (Miсhael Stetsyuk).
- Ограничено максимальное значение
queue_sizeдля pre-reserve. #107205 (Elian Gidoni). - Исправлена ошибка
Argument ... of GROUPING function is not a part of GROUP BY clauseдля запросов, использующих функциюgroupingпри включённой настройкеgroup_by_use_nulls. #107206 (Nikolai Kochetov). - Исправлен неверный порядок результатов для
ORDER BYнадUNION ALLпри включённомoptimize_read_in_order, когда конвейер union сужался из-за настройкиmax_streams_for_union_step; теперь сужение пропускается, если план опирается на отсортированные выходные потоки UNION. Закрывает #106880. #107208 (Vladimir Cherkasov). - Исправлено возможное разыменование нулевого указателя при разрешении конфигурации прокси на позднем этапе завершения работы сервера. #107231 (Pedro Ferreira).
- Исправлена работа запросов легковесного
UPDATEпри включённых устаревших параллельных репликах для нереплицируемых таблицMergeTree. #107246 (Groene AI). - Исправлено аварийное завершение сервера (
std::out_of_rangelogical error) при вставке в таблицуIceberg, у которой имена столбцов блока записи не совпадают с идентификаторами полей в последней версии схемы (например, если параллельный процесс записи переименовывает столбец в пределах окнаiceberg_metadata_staleness_ms). Теперь вставка завершается корректной ошибкой запроса вместо падения сервера. #107279 (Groene AI). - Исправлена ошибка зависания при завершении работы в server и local из-за того, что статические пулы потоков бесконечно удерживали неактивные потоки, если
max_*_thread_pool_free_size > 0. #107291 (Miсhael Stetsyuk). - Исправлено молчаливое игнорирование табличной функцией
s3строчного позиционного значенияpartition_strategy(например,hive). #107297 (Julia Kartseva). - Исправлена обработка
low_cardinality_allow_in_native_format=0при маршалинге параллельных блоков. #107319 (Azat Khuzhin). - Исправлены неверные (часто пустые) результаты для
ORDER BY <col> LIMIT n, когда включена оптимизацияuse_skip_indexes_for_top_kи в части с индексом пропуска данныхminmaxпо столбцу сортировки были удалены строки с помощью легковесногоDELETE. Теперь оптимизация больше не ставит устаревший minmax для частей с легковесно удалёнными строками выше частей, содержащих актуальные верхние строки. #107320 (Groene AI). - Исправлена ошибка в ClickHouse Keeper, из-за которой метаданные снимка, сообщаемые через
last_snapshot(иzk_latest_snapshot_sizeвmntr), могли откатываться назад после установки устаревшего или дублирующегося снимка. Это также могло приводить к тому, что локальный снимок с тем же индексом перезаписывал зарегистрированный файл снимка прямо на месте, пока тот ещё передавался другому узлу или загружался в S3. #107321 (Antonio Andelic). - Исправлено возможное переполнение стека сервера (crash) при чтении глубоко вложенной схемы или значения в форматах
MsgPack,BSON,ORC,Parquet,JSON,DeltaLake,IcebergиPaimon. Теперь такой глубоко вложенный вход отклоняется с исключением. #107341 (Raúl Marín). - Исправлена возможная logical error в
SYSTEM SYNC DATABASE REPLICA ... STRICT, а также сделано так, чтобы модификаторSTRICTдействительно применялся к репликам базы данных. #107344 (Pedro Ferreira). - Исправлено аварийное завершение сервера в debug/sanitizer-сборках при чтении таблицы
DeltaLake, у которой в схеме ClickHouse указан столбец, отсутствующий в сопоставлении столбцов Delta, например после переименования или удаления столбца в журнале Delta. Теперь вместо этого запрос завершается перехватываемой ошибкойINCORRECT_DATA. #107347 (Groene AI). - Исправлена ситуация, когда
ORDER BY ... WITH FILLсоздавал лишние строки, если в столбцеORDER BY, расположенном перед столбцом заполнения, использовалась collationCOLLATE. Теперь строки группируются по префиксу сортировки с использованием этой collation, в соответствии с порядком сортировки. #107365 (Groene AI). - Исправлены crash (
LOGICAL_ERRORв debug-сборках) и тихая ошибка, приводившая к неверным результатам (в release-сборках), при чтении таблицы Iceberg, чьи метаданные повторно привязывают существующийschema-idк другой схеме в разных версиях метаданных. Теперь такие метаданные отклоняются с ошибкойICEBERG_SPECIFICATION_VIOLATION. #107370 (Groene AI). - Исправлен
LOGICAL_ERROR(Variant N (T) has size X, but expected Y), возникавший, когда функция вродеtoStringилиconcatприменялась к столбцуVariantилиDynamic, содержащему один непустой вариант вместе с NULL, и при этом функция возвращала входной столбец без изменений. #107374 (Groene AI). - Исправлен
Logical error: 'Duplicate announcement received for replica number N', который мог возникать при использовании параллельных реплик, когда скалярный подзапрос содержал вложенные подзапросы, читающие одну и ту же таблицу. #107381 (Groene AI). - Исправлен
getServerSetting, чтобы он возвращал текущее фактически действующее значение для настроек сервера, изменяемых во время выполнения (таких какmax_server_memory_usage,mark_cache_size,max_concurrent_queries, размеры пула потоков и т. д.), в соответствии с тем, что показываетsystem.server_settings. #107388 (Alexey Milovidov). - Исправлена работа
arrayResizeс аргументом размера типаDecimal: теперь размер интерпретируется по его фактическому значению (например,arrayResize([1, 2, 3], 1.5::Decimal(2, 1))возвращает один элемент), а не по необработанному немасштабированному представлению. #107389 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR(block.rows() == getRows()), возникавший при асинхроннойINSERTв таблицуAlias, когда был включенuse_strict_insert_block_limits. #107400 (Groene AI). - Исправлена logical error (
Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8), возникавшая, когда оптимизация проталкивания дизъюнкции (частичного предиката) проталкивала условие через ключUSING, тип которого расширяется в результате JOIN. Также исправлен сбой server (segmentation fault) в анализаторе при разрешении идентификаторов в запросахJOIN ... USING, содержащих сворачиваемые в константы ветвиif/multiIf, ссылающиеся на неизвестные идентификаторы. #107407 (Groene AI). - Исправлено переполнение буфера кучи (сбой server) в
windowFunnelпри финализации специально сформированного состояния агрегатной функции с типом события вне допустимого диапазона; проблема была достижима для любого пользователя с помощью одногоSELECT. #107412 (uwezkhan). - Исправлено неопределенное поведение, возникавшее, когда в качестве аргумента timestamp/duration табличных функций
prometheusQuery/prometheusQueryRangeпередавалось неконечное значение с плавающей точкой (например,nanилиinf). Теперь такой аргумент вызываетBAD_ARGUMENTSвместо формирования некорректной временной метки. #107417 (Groene AI). - Исправлена ситуация, когда
MaterializedPostgreSQLмолча прекращал репликацию изменений, если имя базы данных или таблицы в PostgreSQL содержало прописные буквы (потребительpgoutputзапрашивал неэкранированное имя публикации в нижнем регистре, которое не совпадало с публикацией, сохраняющей регистр). #107423 (Alexey Milovidov). - Исправлено Исключение (
Logical error: Not-ready Set is passed as the second argument for function 'in'), возникавшее, когда ключевое выражение (ORDER BY,PRIMARY KEY,PARTITION BYили пропускающийINDEX) содержало операторINс таблицей в правой части, напримерORDER BY (x IN some_table). Теперь такие ключевые выражения отклоняются на этапе создания таблицы. #107424 (Groene AI). - Исправлены некорректные результаты оптимизации
optimize_rewrite_aggregate_function_with_ifдля агрегатных функций, сохраняющих значения полезной нагрузкиNULL(семейство*_respect_nulls:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls). Эта оптимизация больше не переписываетf(if(cond, x, NULL))в форму-Ifдля таких функций. #107430 (Groene AI). - Исправлено ложное Исключение
filesystem error: in last_write_time: No such file or directory, возникавшее при перечислении каталога Объектное хранилище на локальном диске (например, Iceberg table на дискеlocal), пока файлы параллельно заменялись. Теперь параллельно удаленная запись просто пропускается в списке вместо прерывания операции. #107432 (Groene AI). - Исправлена ошибка
THERE_IS_NO_COLUMN, возникавшая приoptimize_if_transform_strings_to_enum = 1, когда оптимизированное выражениеif/transformнад строковыми литералами является ключомGROUP BYилиORDER BYдля distributed таблицы или параллельных реплик. #107455 (Groene AI). - Исправлено редкое аварийное завершение сервера при обработке
DISTINCT, которое могло происходить, если во время инициализации множества уникальных ключей не удавалось выделить память (например, при достижении лимита памяти). #107467 (Groene AI). - Исправлен
LOGICAL_ERROR: Unexpected return type from materialize(и аналогичные ошибки несоответствия типов), возникавший при использованииapply_mutations_on_fly = 1на таблице с ожидающим on-flyUPDATE, у которого целевой столбец также считывается как входной аргумент функции более ранним on-flyUPDATE, перед мутациейALTER MODIFY COLUMN ... LowCardinality(...). #107475 (Groene AI). - Исправлено использование устаревших учетных данных AWS STS при чтении таблиц
DeltaLakeчерезS3: теперь движок при обновлении snapshot сохраняетS3-клиент со свежими учетными данными, поэтому длительные операции чтения больше не завершаются ошибкой после истечения TTL токена STS. Провайдер учетных данных STS assume-role теперь также корректно обновляет учетные данные для любого доступа кS3с использованием STS. #107480 (Elmi Ahmadov). - Исправлена ситуация, при которой
SELECT ... FINALиOPTIMIZE TABLE ... FINALвозвращали дубликаты строк после того, какCREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROMилиMOVE PARTITION ... TO TABLEпереносили части из обычногоMergeTreeвReplacingMergeTree,SummingMergeTreeилиAggregatingMergeTree. У перенесенной части теперь уровень слияния сбрасывается в 0, если движки источника и пункта назначения различаются, поэтому в пункте назначения для нее будет выполнена дедупликация при следующем слиянии. #107481 (Groene AI). - Исправлен выход за нижнюю границу диапазона целого числа в парсере PostgreSQL wire protocol: сообщение с полем длины меньше 4 вызывало переполнение в
size - 4и слишком большойresize/ignore. #107485 (uwezkhan). - Улучшено отслеживание отмены запроса во время ожидания quorum в ReplicatedMergeTree. #107513 (Nikita Taranov).
- Исправлен
Not-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR), возникавший при запросе к таблице с ключомPARTITION BYи подзапросомIN/NOT IN, обернутым в более крупное выражение, напримерWHERE (c0 IN (SELECT ...)) != 0. #107515 (Groene AI). - Исправлена ситуация, когда
currentUser(),user(),SESSION_USERиauthenticatedUser()вычислялись в пустую строку на пути сброса asynchronous insert (приasync_insert = 1). Это влияло на выражения столбцовDEFAULT/MATERIALIZEDи materialized view, которые ссылаются на эти функции: они молча сохраняли пустую строку вместо пользователя, выполняющего вставку. #107541 (Groene AI). - При
enable_analyzer = 1(по умолчанию), если таблица существует только в другой базе данных, запрос к ней по одному имени теперь подсказывает нужную таблицу; например,SELECT * FROM functionsвыводитMaybe you meant system.functions?. Ранее новый анализатор выдавал ошибкуUnknown table expression identifierбез подсказки, тогда как старый анализатор уже предлагал полезный вариант. #107550 (Groene AI). - Память, используемая библиотекой rapidjson (в
prettyPrintJSON,JSONMergePatchи JSON-парсере rapidjson), теперь учитывается трекером памяти, поэтому патологические входные данные отклоняются сMEMORY_LIMIT_EXCEEDED, а не приводят к неограниченному выделению памяти. #107555 (Raúl Marín). - Исправлен
LOGICAL_ERROR(updateFormatPrewhereInfo called more than once), возникавший при запросе к источникуfile(),url()или объектному хранилищу с явно заданнымиPREWHEREи предложениемWHERE, когда был включенoptimize_prewhere_after_pushdown. #107568 (Groene AI). - Исправлен сбой (разыменование нулевого указателя), который мог происходить, когда распределенный plan запроса выполнялся локально (
make_distributed_plan+distributed_plan_execute_locally) приlog_formatted_queries = 1. #107570 (Groene AI). - Исправлено аварийное завершение сервера (
std::terminate, сигнал 6) во время завершения распределенного запроса (make_distributed_plan = 1), когда проверка статуса worker не могла заново запланировать следующую проверку (например,CANNOT_SCHEDULE_TASKпри остановке илиMEMORY_LIMIT_EXCEEDED). Теперь запрос завершается корректно, а сервер продолжает работать. #107575 (Groene AI). - Добавлены недостающие проверки границ при разборе ELF и DWARF. #107579 (Michael Kolupaev).
- Добавлены недостающие проверки границ в ORC reader. #107580 (Michael Kolupaev).
- Исправлено Исключение (
Digest does not matchlogical error), которое могло возникать приRENAME TABLE,RENAME DATABASEилиCREATE OR REPLACE TABLE, затрагивающих таблицуTimeSeriesвнутри базы данныхReplicated. Переименование таблицыTimeSeriesтеперь поддерживается. #107583 (Groene AI). - Исправлена возможность неаутентифицированного отказа в обслуживании из-за исчерпания памяти на порту протокола MySQL. #107599 (Shaohua Wang).
- Исправлен
DROP TABLEдля таблицыTimeSeriesв базе данныхReplicated, который ранее приводил к утечке внутренних таблиц и оставлял фоновую задачу удаления бесконечно повторяться (DROP TABLE ... SYNCзависал). #107604 (Groene AI). - Исправлены две уязвимости обхода пути в протоколе получения реплицируемых part, которые позволяли вредоносной реплике записывать файлы вне каталога part. #107606 (Antonio Andelic).
- Исправлена ошибка ‘Account must be specified error’ при чтении таблицы Delta Lake через Azure. #107620 (Smita Kulkarni).
- Исправлено поведение
ALTER TABLE ... REPLACE PARTITIONдля обычной таблицыMergeTree, при котором после перезапуска сервера восстановливались замененные part, из-за чего таблица возвращала и новые строки, и устаревшие замененные строки. #107623 (Groene AI). - Исправлен сбой сервера при чтении materialized view, целевой таблицей которой является
Distributed, когда запрос выполняется сenable_analyzer = 0. #107653 (Groene AI). - Если одному и тому же пользователю или роли назначено несколько quotas, теперь они применяются одновременно (запрос отклоняется, если превышена любая из них), вместо того чтобы применялась только одна quota, выбранная недетерминированно.
SHOW QUOTAиsystem.quota_usageтеперь показывают все quotas, применяемые к current user. #107664 (Alexey Milovidov). - Исправлено поведение
s3и других табличных функций объектного хранилища, которые выдавалиLOGICAL_ERRORвместоBAD_ARGUMENTSпри дублировании аргумента в формате ключ-значение, напримерs3('http://...', format = 'CSV', format = 'TSV'). #107670 (Groene AI). - Исправлена проблема, из-за которой интерфейс MySQL не работал с
MySQL Connector/J8.2.0 и новее (включая 9.x). Полеinfoв пакетеOKтеперь кодируется с указанием длины, как на сервере MySQL, благодаря чему JDBC driver может подключаться. #107693 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR(“Input nodes size mismatch in dag”), возникавший, когда запрос сmake_distributed_plan = 1выполнял JOIN по ключу, обёрнутому в функцию, а у обеих сторон не было общего типа (например,ON intDiv(-1, t1.key) = t2.keyпри правом ключеUInt64). #107701 (Groene AI). - Чтение данных Arrow/ArrowStream с пустыми столбцами
String/Binary, созданными Apache Arrow Java < 19.0.0 (включая Apache Spark), больше не приводит кINCORRECT_DATA. #107764 (Raúl Marín). - Исправлено исключение
BAD_GET(“Bad get: has String, requested UInt64”) при оценке статистики столбцовcountmin, возникавшее, когда запрос сравнивал столбец с литералом другого типа без предварительного приведения, напримерnumeric_col IN (SELECT '5')илиstring_col IN (SELECT 5). #107793 (Groene AI). - Исправлено зависание табличных функций
odbcиjdbcна несколько минут и игнорирование отмены запроса (KILL QUERY,max_execution_time), когда bridge переставал отвечать во время определения структуры удалённой таблицы. #107809 (Alexey Milovidov). - Исправлено исключение (
Logical error: 'index >= result.start') при форматировании некорректного запроса, в котором смешивались позиционная и именованная формы secret-аргумента в табличных функцияхs3/gcs, напримерs3('url', 'a', 'b', secret_access_key = 'c'). #107818 (Groene AI). - Исправлено поведение, при котором set-индекс пропуска данных не отбрасывал гранулы для столбцов
LowCardinality. #107868 (Konstantin Bogdanov). - Исправлено, что механизм дедупликации вставки вычислял неверные хэши для столбцов
StringиArrayпри настройке сервераinsert_deduplication_version = new_unified_hash: идентичные вставки могли не дедуплицироваться, поскольку хэш дедупликации зависел от позиции строки во вставленном блоке. #107915 (Sema Checherinda). - Исправлены некорректные результаты
ORDER BYпо столбцамNullableс несколькими ключами сортировки на macOS (Apple Silicon), вызванные отсутствующим знаковым расширением в JIT-компилированном компараторе сортировки. #107973 (Raúl Marín). - Исправлена регрессия производительности при чтении столбцов
Dynamicв нескольких потоках. Вызвана #100730. Закрывает #107942. #107997 (Pavel Kruglov). - Устаревший параметр озера данных
storage_catalog_urlтеперь корректно отклоняется защитным механизмом каталога (ранее проверялись толькоstorage_catalog_typeиstorage_aws_access_key_id), а сообщение об ошибке перечисляет все устаревшие параметры. #108040 (Alexey Milovidov). - Исправлена логическая ошибка
Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>, возникавшая, когда запросLIKEчитает изtext-индекса через резервный путь direct-read fallback для столбца, хранящегося в разреженном виде. #108068 (Groene AI). - Обработчики завершения батча в кэше доступа теперь запускаются всегда, даже для пустого батча. #108124 (Azat Khuzhin).
- Исправлен
LOGICAL_ERROR(Column identifier is already registered) для некоторых запросов сUNION ALL. #100770 (Shaohua Wang). - Исправлена ошибка use-after-free мьютекса хранилища рабочей нагрузки во время остановки сервера. #101447 (Tuan Pham Anh).
- Исправлена взаимная блокировка в
ALTER DATABASE MODIFY COMMENTс каталогомShared. #103683 (Nikolay Degterinsky). - Пустой идентификатор в Unicode-кавычках теперь вызывает
SYNTAX_ERRORвместоCANNOT_PARSE_QUOTED_STRING. #104173 (leonard9893). - Сохраняются исходные типы параметров агрегатных функций
timeSeries*, чтобы типыAggregateFunctionкорректно проходили round-trip при повторном ATTACH таблицы и с параллельными репликами. #104812 (Vitaly Baranov). - Исправлен
LOGICAL_ERRORдля materialized CTE приserialize_query_planс параллельными репликами. #104896 (Igor Nikonov). - Исправлено переполнение знакового целого в функциях
timeSeries*ToGrid, когда параметр staleness (window) близок кINT64_MAX. #105319 (Groene AI). - Значение настройки
compatibilityбольше не сбрасываетapply_row_policy_after_finalвfalse, поэтому политики строк всегда корректно применяются сFINAL. #105637 (Yarik Briukhovetskyi). - Исправлен
clickhouse chdig client: теперь в заглушкеposix_spawnкорректно учитываютсяSETPGROUP/RESETIDS/SETSIGDEF. #105858 (Azat Khuzhin). - Исправлено исключение во время проверок корректности MergeTree на проекциях, когда исполнитель merge/mutate не был инициализирован. #105919 (Mikhail Artemenko).
- При анализе индексов на проекциях индекс
minmaxтеперь загружается из самой проекции, а не из родительской части, что даёт корректные результаты. #105940 (Mikhail Artemenko). - Исправлено исключение в
addMonotonicChainдляmaterialize(monotonic_chain(...)). #106050 (Nikolai Kochetov). - Исправлена ошибка, из-за которой
RESTOREзавершался сбоем на резервных копиях, содержащих зависимые объектыMASKING POLICY. #106086 (Julia Kartseva). - Исправлено возможное повреждение памяти при разворачивании SQL-пользовательских функций с включенной настройкой
prefer_column_name_to_alias. #106121 (Nikolai Kochetov). - Словарь, использующий bridge connection, теперь после перезапуска сервера перезагружается и заново устанавливает соединение. Закрывает #106151. #106152 (Pedro Ferreira).
- Исправлен файловый кэш для
LocalObjectStorage. #106239 (Kseniia Sumarokova). - Исправлен ленивый удаленный source для table functions с
use_delayed_remote_source. #106470 (Nikolay Degterinsky). - Исправлен
timeSeriesLastToGridдля временных меток до начала сетки и временных меток вне окна. #106504 (Vitaly Baranov). #106577 (Vitaly Baranov). - Исправлен
LOGICAL_ERROR(Inconsistent AST formatting) для имени функции, содержащего параметры запроса. #106635 (Vitaly Baranov). - Исправлена logical error, возникавшая, если таблица удалялась до десериализации задачи distributed plan. #106944 (Alexander Gololobov).
- Для ключей
NullableGROUP BYтеперь используется точное сравнение. #107050 (Nikolai Kochetov). - Исправлен
LOGICAL_ERROR(Trying to get name of not a column), возникавший, когда аргумент table function не был выражением столбца (например, неразрешенным сопоставителем*изmultiIf/CASE). #107411 (Alexey Milovidov). - Исправлен неограниченный рост кэша часовых поясов (
DateLUT) при обработке большого количества различных некорректных имен часовых поясов. #107464 (Alexey Milovidov). - Запись в
part_logтеперь выполняется до того, как обычная мутацияMergeTreeпомечается как завершенная. #107741 (Azat Khuzhin). arrayFoldтеперь проверяет корректность своего аргумента-массива на случай некорректного входа. #107932 (Michael Kolupaev).- Исправлена редкая data race и возможное обращение к уже освобожденной памяти в кэшированном reader архива skip-index для части
MergeTree; это могло происходить, когда запрос читал skip indices в момент перемещения или переименования части. #107995 (Raúl Marín). - Исправлена регрессия производительности для подстолбцов
MapсPREWHERE. #107988 (Pavel Kruglov). - Исправлена
parseDateTimeBestEffortс часовым поясом, выбрасывавшаяCANNOT_PARSE_DATETIMEна NULL-строках вtoString(Nullable(DateTime64)). #108310 (Yarik Briukhovetskyi). - Исправлены table function и движок
ArrowFlight, которые отклоняли named collection без необязательного ключаdatasetс ошибкойNo such key 'dataset'. #108041 (Alexey Milovidov). - Исправлена logical error
Inconsistent AST formattingдля window function без аргументов внутри объявленияCODECили движка (например,CODEC(cume_dist() OVER (...))); теперь такая функция сохраняет скобки, и запрос корректно проходит форматирование и повторный разбор. #107806 (Alexey Milovidov). - Исправлена
hasToken, которая при needle, содержащем разделитель, молча возвращала результаты через text index вместо того, чтобы выдаватьBAD_ARGUMENTS. #108189 (Jimmy Aguilar Mena). - Настройку
use_skip_indexes_on_data_readтеперь можно вернуть к значению по умолчанию, использовавшемуся до 26.1 (false), через настройкуcompatibility, что позволяет обойти регрессию производительности, при которой путь on-data-read мешает отсечению диапазонов меток skip-indexminmax/set/bloom_filter. #108330 (egor romanov). - Исправлен возможный crash (разыменование нулевого указателя), когда переопределение
database/dbв named collection, переданной вremote/remoteSecure, не является константным именем database, напримерremote(nc, database = (SELECT 1)). Теперь запрос завершается с понятной ошибкой вместо аварийного завершения. #108271 (Groene AI). - Исправлено зависание refreshable materialized view, если connection к ZooKeeper теряется в неподходящий момент. #108234 (Michael Kolupaev).
- Исправлен
Bad cast from type DB::ColumnVector<...> to DB::ColumnTupleпри чтении столбцаArray(Tuple(...)), значение которого заполнено значениями по умолчанию, например послеALTER TABLE ... ADD COLUMNили после незавершенной мутацииALTER TABLE ... CLEAR COLUMN, примененной на лету. #107232 (Groene AI). - Исправлена logical error
Bad cast from type DB::ColumnDynamic to DB::ColumnNullable, возникавшая, когда явная ссылка на ключJOIN ... USING, чей common supertype —Dynamic, передавалась в aggregate function, напримерcount(t.key) IGNORE NULLS. #107289 (Groene AI). - Исправлена незаметная потеря данных в обычном (non-replicated)
MergeTree, когдаREPLACE PARTITION,MOVE PARTITION,DETACH PARTITIONилиDETACH PARTвыполняются над партицией, для которой еще есть непримененные патчи легковесногоUPDATE. Теперь эти операции отклоняют команду, как это уже делаетReplicatedMergeTree. #107386 (Groene AI). - Исправлен crash (SIGSEGV в release builds, assertion о несоответствии типов в debug builds) в
hasдляMapс ключомDynamic, когда аргумент поиска имеет типLowCardinality, напримерhas(map('a'::Dynamic, ...), toLowCardinality('b')). #107956 (Groene AI). - Исправлен
LOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) при вставке в materialized view, у которой в целевой таблицеTOобъявлен столбец с более широкимEnum, чем выдаётSELECTпредставления. Теперь допустимое расширениеEnumприменяется корректно. #107648 (Groene AI). - Исправлена ошибка
NUMBER_OF_COLUMNS_DOESNT_MATCHпри запросе к таблицеDistributed(или при использовании параллельных реплик), если в ней есть несколько столбцовALIAS, раскрывающихся в одно и то же выражение, и к ним обращаются вместе сORDER BY/GROUP BY/HAVING. #107913 (Yakov Olkhovskiy). - Исправлено неопределённое поведение (null pointer, переданный в
memcpy) в функцияхdetectCharsetиdetectLanguageUnknown, когда входная строка больше 32768 байт и кодировку определить не удаётся. #108250 (Groene AI). - Исправлено
signed integer overflow(неопределённое поведение) вdateDiffс единицамиhourиminuteна экстремальных значенияхDateTime64, близких к границам диапазонаInt64. #108229 (Groene AI). - Исправлена ошибка
Too many marksдля текстового индекса на пустой слитой части. #106867 (Azat Khuzhin). - Исправлен
LOGICAL_ERROR(“Unexpected return type from if”) при чтении столбца сapply_mutations_on_fly = 1послеALTER UPDATE col = ... WHERE <cond>с неконстантным или ложным условием, за которым следуетALTER MODIFY COLUMN col <new type>. #108128 (Groene AI). - Исправлено аварийное завершение сервера (
Logical errorвIColumn::insertFrom) при приведенииArray(Dynamic)илиArray(Variant)кQBitс помощьюaccurateCastOrNull, напримерaccurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI). - Исправлена синтаксическая ошибка, возникавшая, когда за подзапросом в
DESCRIBE TABLE (...) AS ...следует псевдоним. #100205 (Yarik Briukhovetskyi). getClientHTTPHeaderтеперь корректно считается недетерминированной функцией, поэтому её результат больше не переиспользуется по ошибке в кэше результатов запросов. #108029 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- Собирайте
delta-kernel-rsс возможностьюdefault-engine-native-tls, чтобы его собственный HTTP client (reqwest) мог повторно использовать OpenSSL, с которым уже слинкован ClickHouse. Это лишь частичное включениеnative-tls:object_storeпо-прежнему принудительно используетreqwest/rustls-tls-native-roots, поэтому в итогеreqwestполучает оба backend’а —native-tlsиrustls.delta-kernel-rsпока остается отключенным под MSan, посколькуringвсе еще компилируется черезobject_store(как транзитивно черезrustls, так и напрямую для HMAC-подписи AWS-запросов), а его написанный вручную ассемблерный код не генерирует символы, необходимые MSan (отслеживается в upstream в arrow-rs-object-store#585). #96856 (Austin Bonander). - Добавлена постлинковочная optimization с использованием PGO (Profile-Guided Optimization) и BOLT (Binary Optimization and Layout Tool) для бинарного файла
clickhouse. Профили собираются на CI-нагрузках и применяются в релизных сборках в режиме best effort — обе стадии переключаются на неоптимизированный результат, если profile устарел или несовместим. На текущий момент PGO не дает выигрыша. #100938 (Alexey Milovidov). - Добавлен режим
--storageвclickhouse keeper-bench, который запускает бенчмаркKeeperStoragein-process (без сети, без raft, без state machine), используя те же разделы configsetup/generator, что и сетевой режим. #103081 (Michael Kolupaev). - Исправлена сборка с
ENABLE_AWS_S3=OFF. #105390 (Yue Ni). - Обновлен
mongo-cxx-driverдо r4.3.0. #105522 (Konstantin Bogdanov). - Исправлена сборка с RapidJSON. #105674 (Ilya Golshtein).
- Сборка ускорена за счет удаления транзитивных include из широко используемых заголовков base/ и удаления неиспользуемого кода из вендорного
Poco/Logger.h. #105702 (Raúl Marín). - Обновлен
libxml2с 2.15.1 до 2.15.3. #105985 (Konstantin Bogdanov). - Внутри Poco используется
expat2.8.1. #105988 (Konstantin Bogdanov). - Обновлен
thriftдоv0.23.0. #105993 (Konstantin Bogdanov). - Используется тег
postgresREL_18_4. #105994 (Konstantin Bogdanov). krb5обновлен до 1.22.2. #106076 (Konstantin Bogdanov).- Обновлен bundled
curlдо 8.20.0. #106077 (Konstantin Bogdanov). mariadb-connector-cобновлён до 3.1.29. Все относящиеся к ClickHouse патчи сохранены. #106287 (Nikita Mikhaylov).- Обновлены дайджесты distroless base image для исправления CVE в libssl3t64. #106360 (Rahul Nair).
- Используется
wasmtimev45.0.1. #106836 (Konstantin Bogdanov). opensslобновлён до 3.5.7. #106844 (Konstantin Bogdanov).- Distroless Docker build теперь также обновляет плавающие теги
:X.Y-distrolessи:X.Y.Z-distroless, а не только тег полной версии. #106932 (Rahul Nair). - Отключены неиспользуемые возможности
curl, такие как аутентификация NTLM, cookies, alt-svc, HSTS, DNS-over-HTTPS, netrc, MIME и AWS SigV4. #107226 (Konstantin Bogdanov). NuRaftобновлён с исправлением livelock при установке снимка, возникавшего, когда snapshot IO выполнялся в фоновом потоке. Параметр Keepernuraft_use_bg_thread_for_snapshot_ioпо-прежнему отключён по умолчанию; теперь CI рандомизирует его, чтобы охватить оба режима. #107338 (Antonio Andelic).- Исправлена сборка
abseil, если путь checkout ClickHouse содержит подстроку, совпадающую с расширением заголовка. #107349 (zhiqiang). - Размер L2 cache на x86_64 теперь определяется через
CPUID, а не через специфичный для glibcsysconf(_SC_LEVEL2_CACHE_SIZE), который недоступен в musl libc. #107469 (Konstantin Bogdanov). - Размер stack для сборок с musl увеличен до 8 MiB для поддержки глубоко вложенных запросов. #107470 (Konstantin Bogdanov).
- Набор символов C-библиотеки, локализуемых в статических библиотеках Rust, теперь определяется по фактическим библиотекам, на которые есть ссылки, а не по вручную поддерживаемому allowlist, благодаря чему охватываются все builtins из compiler-rt и платформенные функции libm. #107571 (Raúl Marín).
- Distroless-образы server и Keeper переведены на
gcr.io/distroless/base-nossl-debian13, чтобы они поставлялись только с теми библиотеками, с которыми ClickHouse действительно слинкован, и не подтягивали библиотеки, которые мы и так линкуем статически. #107837 (Rahul Nair). - На macOS (
arm_darwin) повторно включены 50 тестов без сохранения состояния, которые ранее пропускались как устаревшие, а для синхронизации каталогов на macOS теперь используетсяfsyncвместоF_FULLFSYNC. #107887 (Raúl Marín).
Релиз ClickHouse 26.5, 2026-05-21. Презентация, Видео
Обратно несовместимое изменение
- Значения по умолчанию для
date_time_input_formatиcast_string_to_date_time_modeизменены сbasicнаbest_effort. Запросы, в которых раньше не удавалось разобрать datetime-строки не в формате basic (например,2024 April 4,Apr 15, 2020 10:30:00), теперь по умолчанию могут выполняться успешно. Чтобы сохранить прежнее строгое поведение разбора, установите для этих настроек значениеbasic(или используйтеcompatibility). #89334 (Alexey Milovidov). - Имя элемента Tuple
nullтеперь запрещено, поскольку оно конфликтует с именем подстолбца, используемым для null map типа Nullable, что приводит к неоднозначному разрешению подстолбцов. #98377 (Alexey Milovidov). - Добавлены настройки
dynamic_disk_allow_from_env,dynamic_disk_allow_from_zk,dynamic_disk_allow_include, запрещающие использованиеfrom_env,from_zk,includeв динамических дисках. Это обратно несовместимое изменение, поскольку теперь по умолчанию запрещено поведение, которое раньше по умолчанию было разрешено. #99138 (Kseniia Sumarokova). - Больше нельзя использовать устаревшие ридер и writer Parquet на основе Arrow. Вместо них будет использоваться native-реализация. #100949 (Alexey Milovidov).
SHOW CREATE TABLE tтеперь отдает предпочтение временной таблице, если одновременно существуют постоянная и временная таблицы с именемt, а database не указана, что соответствует текущему поведениюDESCRIBE TABLE. Кроме того, теперь поддерживается синтаксисDESCRIBE TEMPORARY TABLE. #100966 (Alexey Milovidov).- Значение
http_max_fieldsпо умолчанию уменьшено с 1,000,000 до 1,000, аhttp_max_field_name_size— со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до аутентификации. Добавлены настройкиhttp_max_request_header_sizeиhttp_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda). - В
system.metric_logдобавлен вложенный столбецhistograms, который сохраняет в каждой строке снимок каждой зарегистрированной метрики гистограммы, а новая настройкаsystem_metric_log_show_zero_values_in_histogramsуправляет выводом нулевых значений. Таблицаsystem.histogram_metric_logобъявлена устаревшей. #103770 (Miсhael Stetsyuk). CASTвDateTimeилиDateTime64без явного часового пояса теперь сохраняет часовой пояс исходного аргумента (если источник —DateTime/DateTime64с явным часовым поясом), что соответствует поведению функцийtoDateTime/toDateTime64. Закрывает #55072. #104433 (Alexey Milovidov).- Удалена table function
kql. ИспользуйтеSET dialect = 'kusto', чтобы выполнять запросы в диалекте KQL. #105101 (Alexey Milovidov). - Window functions
RANKиDENSE_RANKтеперь отклоняют аргументы и генерируютNUMBER_OF_ARGUMENTS_DOESNT_MATCHв соответствии со стандартом SQL. Ранее запросы видаRANK(x) OVER (ORDER BY id)молча принимались, а аргумент игнорировался. Чтобы восстановить прежнее менее строгое поведение, установитеallow_rank_dense_rank_arguments = 1. Закрывает #49526. #104324 (Groene AI).
Новая возможность
- Добавлена новая настройка
max_bytes_ratio_before_external_join, аналогичнаяmax_bytes_ratio_before_external_group_byиmax_bytes_ratio_before_external_sort. Она задает порог spill-to-disk для hash JOIN как долю доступной памяти; вместе с абсолютным значениемmax_bytes_before_external_joinприменяется меньший из двух порогов. #103862 (Alexey Milovidov). Настройкаmax_bytes_ratio_before_external_joinтеперь включена по умолчанию со значением 0.5, аналогичноmax_bytes_ratio_before_external_group_byиmax_bytes_ratio_before_external_sort. Hash JOIN автоматически переключаются на grace hash join со spill на диск, как только объем данных с правой стороны превышает половину доступной системной памяти (если настроены лимиты памяти). #104285 (Alexey Milovidov). - Добавлена table function
filesystem. Она позволяет представлять структуру каталога в виде таблицы, а также выполнять SQL-запросы к метаданным и содержимому файлов. Изначально #42039 от @perst20. См. #42039. См. #50208. #53610 (Alexey Milovidov). - Разрешена передача имен функций без обертки в функции высшего порядка, такие как
arrayMap,arrayFilterи т. д. Например,arrayMap(negate, [1, 2, 3])теперь эквивалентенarrayMap(x -> negate(x), [1, 2, 3]). #101033 (Alexey Milovidov). - Добавлены настройка
send_table_structure_on_insert_with_inline_dataи опция клиента--inline-insert-data, чтобы server мог сам разбирать встроенные данные INSERT через собственный протокол, избегая дополнительного обмена данными для получения структуры таблицы и повышая производительность при множестве небольших вставок. #101034 (Alexey Milovidov). - Добавлены функции
tokenizeQueryиhighlightQueryдля токенизации SQL-запросов и подсветки синтаксиса.tokenizeQueryвозвращает токены лексера со смещениями в байтах и типами токенов;highlightQueryвозвращает диапазоны подсветки синтаксиса на основе parser с категориями подсветки (keyword, identifier, function, number, string и т. д.). #101054 (Alexey Milovidov). - Добавлена настройка
url_baseдля разрешения относительных URL в table functionurlи движке таблицыURLв соответствии с семантикой RFC 3986. #101113 (Alexey Milovidov). - Добавлена поддержка отрицательных значений в clause
LIMIT BY, чтобы выбирать строки с конца каждой группы, а не с начала. Например,LIMIT -2 BY idвозвращает последние две строки для каждогоid. Также поддерживаются отрицательные смещения (LIMIT -1 OFFSET -1 BY id) и смешанные знаки (LIMIT -2 OFFSET 1 BY id). #103222 (Nihal Z. Miaji). - Добавлена поддержка функции
json_valueдля вывода вtupleиarray, что повышает производительность при выполнении нескольких JSON-запросов. #78362 (kevinyhzou). Добавлена поддержка многопутевого аргумента JSONPathTuple/ArrayвJSON_VALUE,JSON_EXISTSиJSON_QUERY, от @KevinyhZou. #101102 (Alexey Milovidov). - Введён новый параметр
kafka_autodetect_client_rack. Если он задан, зона доступности определяется средствами облачной платформы и передаётся вlibrdkafkaкак параметрclient.rack, чтобы избежать межзонного обмена данными. #81323 (Ilya Golshtein). - В
system.blob_storage_logдобавлен тип событияReadдля отслеживания операций чтения из Объектного хранилища; он управляется новой настройкойenable_blob_storage_log_for_read_operations. #96867 (Alexey Milovidov). - Теперь пользователи могут видеть наблюдения ZooKeeper, установленные
clickhouse-server, с помощью новой таблицыsystem.zookeeper_watches. #99277 (Den Kalantaevskii). - Добавлено профильное событие
Shards, которое подсчитывает общее количество сегментов, участвующих в распределённых запросах, по всем таблицам. #99470 (Alexey Milovidov). WASMUDF теперь можно объявлять какDETERMINISTIC, и к ним будет применяться константная свёртка. #100005 (Vasily Chekalkin).- Добавлена настройка
parallel_replicas_prefer_local_replica: когда она отключена, параллельные реплики выбираются исключительно алгоритмом балансировки нагрузки, что позволяет направлять даже запросы сmax_parallel_replicas = 1на другой хост. #100139 (Alexey Milovidov). - Добавлены настройки сервера
{disk,storage,http}_connections_rcvbufи{disk,storage,http}_connections_sndbufдля управления размерами буферов TCP-сокетов в исходящих HTTP-соединениях, что позволяет операторам переопределять autotuning ядра и ограничивать использование памяти на одно соединение. #100478 (Sema Checherinda). - Добавлена поддержка
CREATE OR REPLACE MATERIALIZED VIEWс той же семантикой атомарной подмены, что и уCREATE OR REPLACE TABLE. Работает с внутренними таблицами, таблицамиTO,POPULATE,REFRESHиON CLUSTER. #100539 (DQ). - Добавлены метрика гистограммы
s3_read_request_duration_microsecondsиs3_read_request_bytesдля наблюдения за временем жизни соединения и объёмом прочитанных данных у S3 GET-запросов; они доступны вsystem.histogram_metricsи на конечной точке Prometheus. #102058 (Sema Checherinda). - Добавлены Движки таблиц
Paimon,PaimonS3,PaimonAzure,PaimonHDFSиPaimonLocalс поддержкой инкрементального чтения на основе отслеживания прогресса снимков Keeper. Инкрементальный режим возвращает только новые строки с момента последнего зафиксированного снимка. Доступно целевое чтение дельты снимка черезpaimon_target_snapshot_id, а ограничение числа снимков на запрос — черезmax_consume_snapshots. Фоновое обновление метаданных настраивается параметромpaimon_metadata_refresh_interval_sec. Возможность включается черезallow_experimental_paimon_storage_engine. #102343 (XiaoBinMu). - Добавлена новая настройка таблицы Kafka
kafka_map_virtual_columns_on_write. Если она включена, столбцы_key,_timestamp,_headers.nameи_headers.valueиз схемы таблицы Kafka приINSERTзаписываются как соответствующие ключ сообщения Kafka, временная метка и заголовки и исключаются из полезной нагрузки сообщения. #103243 (Alexey Milovidov). - Добавлены запросы
SYSTEM PAUSE VIEW [db.]nameиSYSTEM PAUSE VIEWSдля refreshable materialized views. В отличие отSYSTEM STOP VIEW,SYSTEM PAUSE VIEWне прерывает выполняющееся в данный момент обновление — текущему обновлению даётся завершиться, а предотвращаются только последующие обновления. Отменяется командамиSYSTEM START VIEWилиSYSTEM START VIEWS, которые теперь единообразно снимают как состояние остановки, так и состояние паузы. #103252 (Nikita Mikhaylov). - Добавлена функция
regexpPosition(с совместимыми с PostgreSQL псевдонимамиregexpInstrиregexp_instr), которая возвращает байтовую позицию N-го совпадения regex в строке. Поддерживаются начальное смещение, режим возврата позиции после совпадения, флаги regex и выбор группы захвата. #104172 (Abhinav Agarwal). - Добавлены новые функции
isPrimeиisProbablePrimeдля проверки чисел на простоту.isPrimeвозвращает точный результат для беззнаковых целых чисел вплоть доUInt64.isProbablePrimeтакже поддерживаетUInt128иUInt256; для этих более широких типов0означает точно составное число, а1— вероятно простое. Необязательный второй аргумент функцииisProbablePrime,rounds, управляет степенью достоверности (с ограничением до256); значение по умолчанию —25раундов — ограничивает вероятность ложноположительного результата для случайного составного числа уровнем ниже10^-15, аisProbablePrimeможно отменить. #104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji). clearи/clearтеперь очищают терминал в инструментах командной строки clickhouse вместо того, чтобы ошибочно выполняться как запрос. #104318 (Tyler Hannan).- Табличной функции
fileтеперь разрешено приниматьArray(String)путей в запросахSELECT. #104442 (Yue). - В таблицу
system.functionsдобавлены столбцыdeterministicиhigher_order. #104479 (Pedro Ferreira). - В
bech32Encodeдобавлен необязательный параметр варианта кодирования (bech32/bech32m), а вbech32Decode— режим raw-декодирования для кодирования не-SegWit-адресов (например, Cosmos SDK, Injective, Osmosis). #98986 (Yash ). - Теперь можно записывать данные в формат
AvroConfluent, который ранее поддерживался только для ввода. Это позволяет создавать Avro-сообщения с обрамлением Confluent Schema Registry напрямую из ClickHouse, например при записи в Kafka. Схема автоматически регистрируется в registry. Используйте новую настройкуoutput_format_avro_confluent_subject, чтобы указать имя subject. #101935 (János Benjamin Antal). - Добавлена функция
prettyPrintJSONдля форматирования строки JSON в удобочитаемый вид. Полезно для панелей мониторинга или отчётов, где для красивого форматирования раньше требовался дополнительный шаг на стороне клиента. Закрывает #62523. #102594 (Dmitry Prokofyev). - Добавлен
STRING_AGGкак регистронезависимый алиасgroupConcatдля совместимости с PostgreSQL / стандартным SQL. #105125 (Alexey Milovidov). - Результаты отдельных подзапросов теперь можно кэшировать независимо, используя
SETTINGS use_query_cache = trueдля конкретных подзапросов, без кэширования всего внешнего запроса. Новая настройкаquery_cache_for_subqueries = trueвключает массовое применениеuse_query_cacheко всем подзапросам. Note:use_query_cacheво внешнем запросе больше не распространяется на подзапросы автоматически. #99804 (Vincent Voyer). - В редактор запросов веб-интерфейса (
play.html) добавлена подсветка синтаксиса на основе лексера, выполненная по образцу цветовой схемыclickhouse-client. #105105 (Alexey Milovidov).
Экспериментальные возможности
- Добавлен экспериментальный интерфейс веб-терминала по адресу
/webterminal, предоставляющий интерактивный сеансclickhouse-clientв браузере через WebSocket. По умолчанию отключён; включается с помощью настройки сервераallow_experimental_webterminal. Посмотреть можно здесь. #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov). - Движок
Kafka2(экспериментальный, с хранением смещений на основе Keeper) теперь поддерживает прямые запросыSELECTи настройкуkafka_commit_on_select. #100276 (Alexey Milovidov). WASMUDFs теперь могут приводить больше числовых типов: меньшие целочисленные типы к более широким (например,Int8кUInt64), а любые целые — к типам с плавающей точкой (например,Int32кFloat32). #100435 (Vasily Chekalkin).- Добавлена поддержка функции
LIKEв запросеDELETE FROM system.webassembly_modules. #104397 (Vladimir Cherkasov). - Добавлена поддержка гео-типов для
Iceberg. #103113 (Konstantin Vedernikov). - Добавлена поддержка подготовленных операторов на сервере ArrowFlight SQL. #103047 (Yakov Olkhovskiy).
- Повышена устойчивость парсера KQL (для поддержки языка Kusto): глубина парсера и счётчики возвратов теперь сохраняются между этапами парсинга KQL, благодаря чему ограничения парсера для сложных запросов KQL отслеживаются согласованно. #103528 (Yakov Olkhovskiy).
Повышение производительности
- Повторно использовать кэш метаданных нижнего колонтитула Parquet при чтении локальных файлов Parquet через табличную функцию
fileили движок таблицыFile. Ранее кэш использовался только для backend-соединений объектного хранилища. #104260 (Alexey Milovidov). - Проталкивать
ORDER BY ... LIMIT nчерезLEFT/RIGHTJOIN, если ключ сортировки ссылается только на столбцы со стороны, сохраняемой JOIN, тем самым ограничивая число строк, которое входной поток с сохраняемой стороны должен сформировать до выполнения JOIN. Управляется новой настройкойquery_plan_top_k_through_join(по умолчанию включена). #104268 (Alexey Milovidov). - Включить настройки
use_top_k_dynamic_filteringиuse_skip_indexes_for_top_kпо умолчанию, чтобы повысить производительность запросовORDER BY ... LIMIT N. #99537 (Alexey Milovidov). По умолчанию ограничитьuse_top_k_dynamic_filteringстолбцами сортировки фиксированной длины, чтобы избежать регрессий в запросахORDER BY <var-length-column> LIMIT N, где затраты на сравнение порога для каждой строки превышают выигрыш по I/O. Предыдущее поведение доступно через новую настройкуuse_top_k_dynamic_filtering_for_variable_length_types. #104216 (Alexey Milovidov). - Использовать возможность oversize-arena в
jemallocдля уменьшения числа page fault. #103958 (Nikita Taranov). - Ограничить число одновременно активных streams в
UNION ALL, чтобы снизить пиковое потребление памяти. #100176 (Alexey Milovidov). - Слегка оптимизировать кэш страниц в пространстве пользователя. #100300 (Alexey Milovidov). Теперь кэш страниц в пространстве пользователя всегда лучше, чем кэш страниц ОС.
- Холодные чтения из объектного хранилища через кэш страниц в пространстве пользователя (
use_page_cache_for_object_storage = 1) теперь выполняются значительно быстрее, поскольку последовательные промахи кэша объединяются в один HTTP request вместо одного запроса на каждый блокpage_cache_block_size. #104230 (Alexey Milovidov). - Ускорить анализ индексов, включающий приведение типов и применение функций. Закрывает #55653. #100366 (Alexey Milovidov).
- Ускорить выполнение больших запросов к таблицам
Mergeповерх очень большого числа базовых таблиц. Закрывает #32465. #100369 (Alexey Milovidov). - Удалить vtable из типов полей настроек, уменьшив размер копии
Settingsпримерно в 28 раз и улучшив локальность кэша за счет структуры typed-array для всех типов настроек. #102269 (Raúl Marín). - Добавить настройки
max_threads_min_free_memory_per_threadиmax_insert_threads_min_free_memory_per_thread, чтобы автоматически снижать параллелизм запросов, когда на сервере мало свободной памяти. #100383 (Alexey Milovidov). - Снизить использование памяти в системах с небольшим объемом памяти (< 4 GiB). #100389 (Alexey Milovidov).
- Добавлен
OptimizeTrivialGroupByLimitPass. Для простых запросовSELECT ... FROM t GROUP BY k LIMIT n(безHAVING,ORDER BYи оконных функций) analyzer теперь устанавливаетmax_rows_to_group_by = n + offsetиgroup_by_overflow_mode = 'any', поэтому aggregation останавливается, как только будет полученоnразличных ключей, вместо группировки всего входного набора данных. Управляется новой настройкойoptimize_trivial_group_by_limit_query(включена по умолчанию). #104473 (Amos Bird) (Alexey Milovidov). - Неявный min-max индекс на уровне гранул для виртуальных столбцов
_part_offsetи_block_number, включая проекции. Обеспечивает быстрое pruning гранул на основе predicates виртуальных столбцов. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko). - Для семейства методов aggregation
prealloc_serializedхеши для каждой строки теперь вычисляются заранее во время прохода батч-сериализации и затем используются, чтобы (a) избежать повторного хеширования вemplaceKey/findKeyи (b) выполнять программную предварительную выборку бакета следующей строки. Это ускоряет aggregation по нескольким строковым/сериализованным ключам за счет скрытия latency промахов кэша hash table. #104475 (Amos Bird) (Alexey Milovidov). - Кэш условий запроса для таблиц
Iceberg. #102115 (Konstantin Vedernikov). - Оптимизированы
cramersV,cramersVBiasCorrected,theilsUиcontingencyпри использовании с оконными функциями. Закрывает #83521. #93384 (Nihal Z. Miaji). - Добавлена оптимизация запроса, которая переписывает
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N)вdictGet('dict', 'a', key), чтобы избежать получения ненужных атрибутов словаря. Управляется настройкойoptimize_dictget_tuple_element(включена по умолчанию). #100186 (Alexey Milovidov). - Включена buffering для шагов сортировки на initiator в distributed queries с сортировкой. #100661 (Nikita Taranov).
- Повышение производительности для
partial_mergeJOIN. #100945 (Artem Zuikov). - Незначительно уменьшено избыточное выделение памяти в
partial_mergeJOIN. #100963 (Artem Zuikov). - Оптимизированы выделение и освобождение памяти за счет кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Снижены накладные расходы на выделение памяти во время S3 multipart-загрузок за счет предварительного выделения внутренних контейнеров отслеживания. #101799 (Gagan Dhakrey).
- Добавлена программная предварительная выборка на этапе probe hash join для снижения latency доступа к памяти при работе с большими hash table; управляется настройкой
enable_software_prefetch_in_join. #102444 (Xiaozhe Yu). - Оптимизирована структура
MemoryTracker, что повышает его производительность примерно на 25%. #103464 (Azat Khuzhin). - Выполняется Rewrite предикатов
coalesce(a, b, ...) <op> constиifNull(a, b) <op> constперед анализом индексов, чтобы первичный ключ по отдельным столбцам и индекс пропуска данных для каждого аргумента могли отсеивать гранулы. Управляется новой настройкойallow_key_condition_coalesce_rewrite(включена по умолчанию). #103468 (Manuel). - Значительно улучшена производительность запросов при чтении каталогов Iceberg с большими JSON-файлами метаданных за счёт оптимизации обработки экранированных слешей. #103998 (Mohaidoss).
- Устранены накладные расходы кэша несжатых данных индекса, когда кэш отключён (настройка сервера
index_uncompressed_cache_size = 0, это значение по умолчанию). #104063 (Michael Kolupaev). - Исправлены запросы
ORDER BY ... LIMITс небольшим limit, которые в сочетании с неселективным фильтромWHEREсчитывали слишком много гранул. Раньше любой фильтр поверх упорядоченного чтения отключал разбиение задач по диапазонам меток, из-за чего конвейер не мог прерывать выполнение между гранулами и считывал всю part для каждого потока. #104112 (Vladimir Cherkasov). - Исправлено отсутствие повторного использования кэша размеров hash table после перестановки сторон JOIN. #104131 (Nikita Taranov).
- Когда
fsync_after_insertвключён, fsync файлов part теперь выполняется параллельно с использованием пула потоков IO, что ускоряет завершение вставки в wide tables. Полная загрузка ClickBenchhitsтеперь выполняется примерно на 22% быстрее. #104137 (Alexey Milovidov). - Функции
find_first_symbols,find_first_not_symbols,find_last_symbols_or_null,find_last_not_symbols_or_nullиsplitIntoвекторизованы на AArch64 с использованием NEON. Ранее эти helpers имели SIMD-путь только на x86 (SSE2 / SSE4.2), а на ARM переходили к скалярному циклу. Это ускоряет parsing TSV примерно в 2 раза, URL-функции иsplitByChar— примерно в 1,3 раза на наборе данных ClickBenchhits; parsing очень плотного JSON (поля короче 16 байт с высокой частотой) немного замедляется, что соответствует существующему компромиссу SSE2. #104228 (Alexey Milovidov). - Чтение данных через тривиальный столбец
ALIAS(например,some_alias['key'], гдеsome_alias ALIAS m) теперь использует тот же путь чтения по подстолбцам, что и при прямом обращении к исходному столбцу, вновь обеспечивая значительную экономию I/O для столбцовMap,Array,TupleиNullable, определённых через alias. #104245 (Raúl Marín). - Снижена конкуренция за блокировки на пути асинхронного чтения из удалённой FS за счёт перевода
AsyncReadCountersв lock-free режим на уровне отдельного запроса. #104374 (Nikita Mikhaylov). - Немного улучшен план запроса для упорядоченного сканирования проекций. #103723 (Mikhail Artemenko).
optimizeUseNormalProjectionsрасширен и теперь также обрабатывает частный случай, когда ничего не было отфильтровано, но ключ сортировки проекции позволяет убрать этап сортировки из плана запроса. #104680 (Mikhail Artemenko).- Разрешена корректная работа синтаксического сахара
json.path[]и явных подсказок типа для типизированных путейJSON. #99179 (Pavel Kruglov). - Оптимизировано выражение
json.path[N].nested.path(которое разворачивается вtupleElement(tupleElement(json.path[N], 'nested'), 'path')) вjson.path[].nested.path[N], что позволяет читать значительно меньше данных. #99802 (Pavel Kruglov). - Оптимизированы проверки доступа для
SHOW TABLESвsystem.parts: проверки grant на уровне database вынесены из цикла по отдельным table. #100860 (Shaohua Wang). - Удалена избыточная проверка доступа
SHOW TABLESдля каждой table в быстром путиSELECT name/SELECT database, nameдляsystem.tables. #100881 (Shaohua Wang). - Включена JIT-компиляция на macOS. #100947 (Alexey Milovidov).
- Откладывание политики строк после
FINALтеперь пропускается, если она зависит только от столбцов ключа сортировки и является детерминированной; также в этом случае пропускается связанное откладываниеPREWHERE, которое ранее вызывала политика строк. #102884 (Yarik Briukhovetskyi). - Добавлена поддержка
hasAnyиhasAllв качестве предикатов фильтра для текстовых индексов. #103266 (Anton Popov). - Долгоживущее состояние кучи MergeTree (метаданные на уровне отдельных частей и таблиц) перенесено в выделенную arena jemalloc, доступную через асинхронные метрики
jemalloc.mergetree_arena.*. Это уменьшает фрагментацию arena по умолчанию в установившемся режиме и не позволяет долгоживущим объектам отдельных частей удерживать страницы, которые иначе могли бы быть освобождены. #104136 (Raúl Marín). - Улучшена обработка тайм-аута клиента ZooKeeper под высокой нагрузкой, когда множество запросов передаются конвейером в одном сеансе. Теперь клиент ZooKeeper использует тайм-аут на основе прогресса: пока от server поступают какие-либо данные в пределах
session_timeout_ms, ожидание продлевается. При этом жесткое ограничение в3 * session_timeout_msна запрос по-прежнему ограничивает latency вызывающей стороны. Закрывает #100466. #104351 (Antonio Andelic). - Флаги трассировки для отдельных событий перенесены в отдельный массив и теперь выделяются лениво, что снижает overhead трассировки
ProfileEvents. #105030 (Azat Khuzhin). - Добавлен
compareTrackAtдляColumnDecimal, что повышает производительность сравнений для столбцовDecimal. #105110 (Artem Zuikov). - Добавлена SIMD-реализация
MD5(AVX2/AVX512), которая хеширует несколько входных данных параллельно, повышая пропускную способность. #105161 (Joanna Hulboj).
Улучшения
- Улучшен вывод справки во всех приложениях ClickHouse:
--helpтеперь всегда возвращает код выхода0, пишет вstdout, аclickhouse --helpверхнего уровня выводит список всех подкоманд. Также добавлены опция--no-sudoдляclickhouse start/restart(полезно в Docker) и подкомандаclickhouse help. Продолжение #58244 от @qoega. #98148 (Alexey Milovidov). - Значение
input_format_column_name_matching_modeпо умолчанию изменено сmatch_caseнаauto. Форматы ввода, сопоставляющие имена входных столбцов со схемой таблицы (JSONEachRow,CSVWithNames,JSONColumns,BSONEachRow,RowBinaryWithNamesи т. д.), теперь сначала пытаются выполнить регистрозависимое сопоставление, а если совпадений нет — переходят к регистронезависимому. Прежнее строгое поведение сохраняется в режимеcompatibility. #104320 (Alexey Milovidov). - Добавлен
STDDEVкак регистронезависимый псевдонимstddevSampдля совместимости с PostgreSQL/стандартом SQL. #105120 (Alexey Milovidov). - Добавлен
array_to_stringкак регистронезависимый псевдонимarrayStringConcatдля совместимости с PostgreSQL. #105121 (Alexey Milovidov). - Добавлен
unnestкак регистронезависимый псевдонимarrayJoinдля совместимости с PostgreSQL (в форме вызова функции). #105124 (Alexey Milovidov). - Индикатор выполнения в
clickhouse-clientтеперь рядом с оперативной памятью показывает объём временных данных на диске (например, при внешней сортировке, aggregation или JOIN), включая разбивку по хостам для распределённых запросов. #105190 (Alexey Milovidov). - Добавлен
system.predicate_statistics_log— новый выборочный журнал селективности фильтров-предикатов и отсечения индексных гранул MergeTree для каждого запроса. По умолчанию отключён; включается через настройку сервераpredicate_statistics_sample_rate. Нужен для автоматических рекомендаций по индексам и проекциям. #98727 (Yarik Briukhovetskyi). - Разрешено пропускать локальный сегмент с отсутствующей таблицей, если включён
skip_unavailable_shards. #100141 (Alexey Milovidov). - Добавлены предупреждения при запуске (видимые в
system.warnings), если массив Linux mdraid повторно синхронизируется или находится в деградированном состоянии, поскольку в обоих случаях это может влиять на производительность дискового IO или указывать на сбои дисков. #100941 (Alexey Milovidov). - WASM UDF теперь отображаются в
system.functionsс корректно заполненными столбцамиorigin(WasmUserDefined),syntax,argumentsиreturned_valueна основе метаданных типов ClickHouse. Ранее они либо отсутствовали, либо отображались как дубликаты с неверным значениемorigin. #101053 (Vasily Chekalkin). - Функция таблицы
generate_seriesтеперь поддерживает отрицательные значения шага для генерации убывающих последовательностей, напримерSELECT * FROM generate_series(99, 0, -1). #101056 (Alexey Milovidov). - Исправлены исключения
Context has expired, возникавшие в некоторых функциях (dotProduct,formatRow,structureToCapnProtoSchema/structureToProtobufSchema, пользовательские функции) при использовании в отложенных путях выполнения, таких как выраженияDEFAULT/MATERIALIZEDи настройки движка таблицы: теперь эти функции там, где это необходимо, удерживают сильную ссылку на контекст. #101109 (Alexey Milovidov). - Исправлены ложные логические ошибки
Cache limits violatedдля приоритетов, созданных с нулевыми лимитами (например, для приоритета файлового кэша на уровне запроса, используемого при включённомenable_filesystem_query_cache_limit). #101428 (Alexey Milovidov). - Добавлено автоматическое определение региона для конечных точек
s3express. #101520 (Pradeep Chhetri). - Добавлена поддержка идентификаторов полей для файлов данных при записи в
Iceberg. Закрывает #102322. #102362 (Konstantin Vedernikov). - Левая панель в веб-интерфейсе (
play.html) теперь прокручивается независимо, остаётся видимой при прокрутке страницы, а при нажатии на таблицу страница прокручивается к области запроса. #102498 (Alexey Milovidov). - Теперь интерфейс Play можно открыть в новой вкладке через Ctrl/Cmd/Shift+click или средний клик по логотипу ClickHouse на левой панели. #102501 (Alexey Milovidov).
- Добавлены новые метрики для отслеживания памяти, используемой первичными ключами проекций и гранулярностью индекса проекций во всех таблицах. #102587 (Narasimha Pakeer).
max_network_bandwidth_for_userиmax_network_bandwidth_for_all_usersтеперь применяются к операциям чтения/записи в удалённых файловых системах. #103080 (Azat Khuzhin).- Повышена устойчивость резервных копий в случаях, когда Refreshable Materialized Views постоянно обновляются: решения теперь принимаются на основе состояния таблиц в снимке, а не глобального состояния. #103384 (Nikita Mikhaylov).
SELECT * FROM system.databasesтеперь всегда показывает базы данных каталога озера данных независимо от настройкиshow_data_lake_catalogs_in_system_tables. Раньше по умолчанию они были скрыты, что не соответствовало поведениюSHOW DATABASES, которое всегда их показывало. #103444 (Alsu Giliazova).- Значение по умолчанию для настройки сервера
concurrent_threads_soft_limit_ratio_to_coresв коде приведено в соответствие со значением из поставляемогоconfig.xml(2), поэтому планировщик concurrent threadsmax_min_fair, используемый по умолчанию, ограничивает потоки обработки запросов уровнем 2x от числа ядер даже без использования поставляемогоconfig.xml. #103446 (Alexey Milovidov). - Повышена надёжность sanitizer в парсере и в пограничных случаях строковых функций: добавлена обработка пустого ввода в
getURLScheme, предотвращена арифметика с нулевым указателем в проверкахmax_query_sizeвLexer::nextToken, а также добавлено раннее завершение вычисления UTF-8-подпоследовательности для пустой входной строки до декодирования. #103489 (Yakov Olkhovskiy). - Повышена корректность определения монотонности для
divide(0, x)иintDiv(0, x): ранее эти функции безусловно считались монотонными, но0 / xнемонотонна на любом диапазоне, включающем 0, поскольку0 / 0не определено (NaN/Infдляdivide, исключение деления на ноль дляintDiv). Это ошибочное предположение приводило к тому, чтоKeyCondition::applyMonotonicFunctionsChainToRangeформировал диапазоны сleft > right, что вызывалоLOGICAL_ERRORInvalid binary search result in MergeTreeSetIndexв отладочных сборках, если выражениеIN/NOT INпо первичному ключу оборачивало ключ вdivide(0, key)илиintDiv(0, key). Релизные сборки не затронуты — эта проверка ограничена#ifndef NDEBUG. #103621 (Groene AI). - Асинхронные метрики
HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95}заменены на гистограмму на основе бакетовhttp_pool_tcp_buf_bytes(меткиgroup,direction) вsystem.histogram_metrics. Суммарные асинхронные метрики по группам сохранены. #103704 (Sema Checherinda). - Настройки сервера
{disk,storage,http}_connections_{rcvbuf,sndbuf}теперь отображаются вsystem.server_settingsкак изменяемые без перезапуска. Их значения можно обновлять черезSYSTEM RELOAD CONFIG; механизм применения во время выполнения уже был реализован в #100478. #103772 (Sema Checherinda). - Добавлена поддержка разрешённых символов (
Array(String)) вflameGraph. #103816 (Azat Khuzhin). - CLI-клиент теперь может указывать
<rainbow_parentheses>false</rainbow_parentheses>в своём конфиге в окружениях, где цвета терминала плохо сочетаются со скобками (аналогично, уclickhouse formatтеперь есть--no_rainbow_parentheses). #103851 (Larry Snizek). - Исправлен регистронезависимый UTF-8-поиск в
MultiVolnitsky: при сбое частичные вставкиputNGramтеперь откатываются, а неудачные шаблоны поиска переключаются на fallback-поисковики, что позволяет избежать несогласованного состояния. #103864 (Yakov Olkhovskiy). - Реализован
sched_getcpuчерезrseqTLS в glibc-совместимом musl. #104016 (Azat Khuzhin). - Replicated refreshable materialized view в режиме APPEND больше не будет обновляться дважды, если во время обновления соединение с ZooKeeper кратковременно прерывалось. #104051 (Michael Kolupaev).
- Для таблиц Distributed без явного списка столбцов теперь разрешена проверка ключей сегментирования по выведенной структуре удалённой таблицы. #104111 (Yue).
- Исправлена работа REST-каталога с путём
Azureabfss. #104120 (Konstantin Vedernikov). - Настройки аутентификации
role_arnиrole_session_nameтеперь учитываются в S3-клиенте снимков Keeper, что позволяет использовать при загрузке снимков аутентификацию на основе STSAssumeRole. #104140 (Alexey Milovidov). - Исправлена утечка памяти при выполнении запросов с
MATERIALIZEDCTE. #104153 (Alexey Milovidov). - Исправлено Исключение
lowerUTF8/upperUTF8при обработке больших наборов данных с не-ASCII-символами (например, при сборке текстовых индексов), когда накопленный выходной буфер мог превысить 2 GiB; чрезмерно длинные отдельные строки теперь отклоняются с понятной ошибкой. #104229 (Shaohua Wang). - Повышена устойчивость загрузки статистики столбцов MergeTree к временным сбоям I/O, чтобы предотвратить постоянное отключение оптимизаций на основе статистики для затронутых частей. #104372 (zoomxi).
- Для
INSERT INTO ... SELECT FROM input(...)больше не требуется grantCREATE TEMPORARY TABLE. #104470 (Alexey Milovidov). - Добавлена новая настройка MergeTree
concurrent_part_removal_threshold_for_remote_disk(по умолчанию16), которая используется вместоconcurrent_part_removal_threshold, когда хотя бы одна удаляемая часть хранится на удалённом диске. Прежнее пороговое значение100могло приводить к тому, чтоDROP TABLEи другие операции удаления частей в backend’ах Объектного хранилища зависали на десятки секунд, потому что удаления выполнялись последовательно, хотя каждое из них требует отдельного сетевого обмена. Новая настройка позволяет значительно раньше переходить к параллельному удалению на удалённом хранилище, не меняя поведение для локальных дисков. #104676 (Groene AI). - Новая настройка
defer_partition_pruning_after_final(по умолчанию1) делает введённое в 26.3 поведение, при котором приFINALне выполняется отсечение партиций, отключаемым. Установите0, чтобы вернуть отсечение партиций, как до 26.3, — это существенно быстрее для рабочих нагрузок журналов событий, где строки с одинаковым PK не могут находиться в разных партициях.compatibility = '26.2'автоматически переключает её в0. #104705 (Nikita Fomichev). - Исправлено
intExp2, возвращавшее неверные результаты для входных значений вне допустимого диапазона (сдвиги>= 64при JIT и целые числа с модулем большеINT_MAXв обоих путях выполнения). #105054 (Raúl Marín). - Добавлено заключение shell-аргументов, сформированных из CLI-опций и разобранного ввода, в кавычки в
clickhouse installиclickhouse git-import, чтобы пути, имена пользователей и групп, а также хеши коммитов, содержащие пробелы или shell-метасимволы, обрабатывались корректно. #105232 (Raúl Marín). - Движок таблицы
Aliasбольше не является экспериментальным и доступен без настройкиallow_experimental_alias_table_engine. #103488 (Alexey Milovidov). - В
clickhouse-benchmarkдобавлена опция--queries-format, позволяющая выбирать между используемым по умолчанию форматом вводаtsvс экранированием табуляций и одним запросом на строку и разбором стандартного ввода как скрипта из нескольких запросов, разделённых;(script). #99972 (Aleksandr Musorin). - Поэлементные операторы Tuple
tuplePlus,tupleMinus,tupleMultiply,tupleDivide,tupleModulo,tupleIntDivиtupleIntDivOrZeroтеперь являются вариадическими и принимают две или более Tuple одинакового размера, применяя операции поэлементно как левую свёртку. Ранее они принимали только ровно два аргумента. #104659 (Aruj Bansal). - Добавлен новый встроенный web UI по адресу
/processors-profile, который визуализирует конвейер любого ранее выполненногоSELECT-запроса в виде heatmap на основе данных изsystem.query_logиsystem.processors_profile_log. Каждый processor окрашивается в соответствии со значениемelapsed_us, а при наведении показывает статистику по processor’у (строки, байты, время ожидания). #104614 (Nikita Mikhaylov). - Настройка
query_plan_use_logical_join_step(и её aliasquery_plan_use_new_logical_join_step) теперь Obsolete и не имеет эффекта; логический шаг JOIN теперь используется всегда. #104017 (Vladimir Cherkasov). - Поле ввода
userвplay.htmlи на других встроенных веб-страницах (dashboard.html,jemalloc.html,merges.html,binary.html,webterminal.html) больше не заполняется заранее буквальным текстомdefault. Теперь оно показывает placeholderuserи по умолчанию остаётся пустым. Если оставить его пустым, страница не отправляет URL-параметрuser=(а auth JSON в WebTerminal не содержит поляuser), поэтому сервер использует обычный fallback к пользователюdefault— и HTTP credentials, переданные по другим каналам (X-ClickHouse-User, HTTP Basic, конфигурация<handler><user>для конкретного handler), больше не overridden. #105254 (Alexey Milovidov). - Reader
ORC: чтение по смещению (readBigAt) отделено отuse_prefetch, чтобы данные с EC-кодированием вHDFSможно было корректно читать даже приuse_prefetch = false(например, в Gluten). #103348 (zhanglistar). - Файлы, загружаемые из
play.htmlв форматеCSVWithNames, теперь используют расширение.csv. #103737 (JackFielding). - Улучшена валидация входных данных для каталога BigLake. #105117 (Konstantin Vedernikov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено непоследовательное форматирование: теперь система запоминает, было ли выражение заключено в скобки. #92340 (Alexey Milovidov).
- Исправлено корректное сравнение типов Decimal и Float. #94293 (zoomxi).
- Разрешены позиционные аргументы в распределенных запросах. #94359 (simonmichal).
- Исправлен сбой проверки в
DatabaseCatalog::updateDependencies, возникавший при удалении и повторном создании materialized view с тем же именем; также исправлена проблема, из-за которой зависимости представлений могли незаметно теряться приRENAME TABLEилиEXCHANGE TABLES, если ссылочные зависимости были пустыми. #98779 (Alexey Milovidov). - Исправлено аварийное завершение сервера (сбой проверки в
DatabaseCatalog::getTableImpl), происходившее при создании таблицы черезON CLUSTERс UUID, совпадающим с UUID существующей базы данных. #98861 (xiaohuanlin). - Исправлено использование индекса пропуска данных при чтении данных (при включенной настройке
use_skip_indexes_on_data_read) и существующих патч-частей, созданных легковесными обновлениями. #99543 (Alexey Milovidov). - Исправлено исключение “Not-ready Set”, возникавшее, когда оптимизатор запросов переносил фильтр с
IN (subquery)в PREWHERE. #100375 (Alexey Milovidov). - Исправлена ошибка “Cannot find column” при использовании
ADD COLUMNвместе сRENAME COLUMNв одном оператореALTER TABLE. #100387 (Alexey Milovidov). - Исправлены представления со смешанными операторами
UNIONиINTERSECT/EXCEPT, которые возвращали неверные результаты послеDETACH/ATTACHили перезапуска сервера. #100390 (Alexey Milovidov). - Исправлено исключение “Trying to execute PLACEHOLDER action”, которое могло возникать при стресс-тестировании с AST-фаззером, когда в предложении IN появлялся коррелированный подзапрос. #100398 (Alexey Milovidov).
- Исправлено исключение logical error при вставке в таблицу Iceberg со столбцом
Date, разбитым на партиции с помощью преобразованийyear,monthилиday. #100404 (Alexey Milovidov). - Исправлено использование индекса пропуска данных с несовместимыми данными после изменения типа столбца через
ALTER TABLE MODIFY COLUMN, что могло приводить к сбоям сервера в sanitizer-сборках или к неверным результатам запросов. #100526 (Alexey Milovidov). - Исправлена утечка учетных данных в
query_logдля табличных функцийpaimonCluster,paimonS3Cluster,paimonAzureClusterиdeltaLakeS3. #100529 (JIaQi Tang). - Исправлена ситуация, при которой
DROP TABLEдля таблиц с Kafka engine мог зависать на неопределенное время из-за взаимной блокировки вrd_kafka_consumer_close. #100604 (Alexey Milovidov). - Жестко заданный список
source_table_enginesзаменен на поиск во время выполнения черезStorageFactoryиDatabaseFactory. ВDatabaseFactory::EngineFeaturesдобавленsource_access_type, чтобыCREATE DATABASEс исходными движками (PostgreSQL, MySQL, S3 и т. д.) требовал тех же привилегий на source, что иCREATE TABLE. Исправлена ошибка, из-за которойGRANT TABLE ENGINE ON *завершался неудачей приtable_engines_require_grant=false. Закрывает #71544. #100746 (pufit). - Исправлен сбой сервера при чтении из таблицы, где столбец
ALIASсодержал коррелированный подзапрос, вложенный в вызов функции (например,ALIAS toString(intDivOrZero(x, (SELECT ...)))).CREATE TABLEиALTER TABLEтеперь отклоняют любые подзапросы на любой глубине в выражениях столбцовDEFAULT/ALIAS/MATERIALIZEDс ошибкойTHERE_IS_NO_DEFAULT_VALUE. Ранее поверхностная проверка пропускала вложенные подзапросы, поэтому в коррелированном случае происходил сбой при чтении, а вложенный некоррелированный случай выглядел рабочим, но мог приводить к непредсказуемому поведению; теперь оба варианта отклоняются на этапе DDL. #100753 (Groene AI). - Исправлен сбой сервера (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode), который мог возникать при использовании запросов с коррелированными подзапросами на таблицах с определениямиCONSTRAINT ... ASSUME, если включены настройкиoptimize_substitute_columnsиconvert_query_to_cnf. #100756 (Groene AI). - Исправлено исключение, которое могло возникать при вставке строки в JSON-столбец, если эта строка добавляла новое динамическое поле наряду с типизированным полем с несовместимым значением, а затем столбец использовался как ключ GROUP BY. #100758 (Jimmy Aguilar Mena).
- Исправлена ошибка, из-за которой планирование ввода-вывода для рабочей нагрузки незаметно обходилось при записи в S3/объектное хранилище через путь
DiskObjectStorageTransaction(используется дискамиs3_with_keeperи явно приuse_fake_transaction=false). Ранее INSERT-записи в таблицы семейства MergeTree на таких дисках игнорировали throttlingCREATE RESOURCE/CREATE WORKLOAD, потому что ссылка на ресурс никогда не добавлялась вWriteSettingsдля транзакционного пути записи. #100777 (JIaQi Tang). - Исправлена коллизия общего кэша схем между
ProtobufиProtobufList: чтение сообщения сначала какFORMAT Protobuf, а затем какFORMAT ProtobufListмогло завершаться ошибкой, потому чтоProtobufListпринудительно переводил кэшированную схему в формат оболочки. ТеперьProtobufListиспользует кэшированный тип сообщения, если схема оболочки недоступна. #100849 (Callum Cooper). - Исправлено переполнение буфера кучи (heap-buffer-overflow) в мосте Rust CXX из-за несовпадения ABI
std::exception. #100931 (Azat Khuzhin). FunctionVariantAdaptorтеперь выбрасываетILLEGAL_TYPE_OF_ARGUMENT, если все альтернативыVariantнесовместимы с функцией, вместо того чтобы молча возвращатьNullable(Nothing). Ранее предикатWHERE function(variant_col), в котором ни один альтернативный тип не был совместим, возвращал 0 строк без ошибки, тогда как в эквивалентном контекстеSELECTисключение уже выбрасывалось корректно. #100939 (Vasily Chekalkin).TRUNCATE ALL TABLESбольше не завершается ошибкой, если база данных содержит представления. #100943 (Alexey Milovidov).- Исправлена оптимизация
optimize_rewrite_array_exists_to_has: теперь она корректно обрабатывает случаи с несовместимыми типами (например, Date и String) и снова включена по умолчанию. #100944 (Alexey Milovidov). - Исправлен приоритет настроек S3: теперь настройки диска в
storage_configurationпереопределяют глобальную секцию<s3>, а настройки на уровне пользователя/профиля/запроса переопределяют и те, и другие. #100975 (Alexey Milovidov). - Исправлена разреженная сериализация, из-за которой для столбцов BFloat16, Float32 и Float64 терялся знак отрицательного нуля (-0.0). #100983 (Takumi Hara).
- Исправлены две ошибки в парсере геометрии WKT, используемом при чтении WKT-кодированных файлов GeoParquet и Arrow: геометрии
MULTILINESTRINGошибочно разбирались какPolygon(что вызывало исключение для типизированных столбцов и незаметное повреждение данных для смешанных столбцовGeometry), а некорректная строка WKT без ключевого слова типа приводила к неопределённому поведению вместо корректной ошибки. #100997 (Vasily Chekalkin). - Исправлены запросы
grouping/GROUPING SETSк таблицам Distributed с одним сегментом, которые завершались ошибкой “Method executeImpl is not supported for ‘grouping’ function”. #101030 (Alexey Milovidov). - Исправлена ошибка
LOGICAL_ERROR“Column identifier is already registered” в планировщике, которая могла возникать, когда одно и то же табличное выражение обрабатывалось несколько раз. #101048 (Alexey Milovidov). - Исправлено исключение LOGICAL_ERROR “Column identifier is already registered” при использовании настройки
additional_result_filterс запросами UNION или EXCEPT. #101051 (Alexey Milovidov). - Исправлен сбой сервера (Logical error: Bad cast from ColumnVector to ColumnNullable) при использовании
* APPLYс агрегатными функциями иgroup_by_use_nulls=1вместе с GROUPING SETS, ROLLUP или CUBE. #101062 (Groene AI). - Исправлен бесконечный цикл, возникавший, когда
input_format_csv_skip_first_linesилиinput_format_tsv_skip_first_linesпревышали количество строк в файле. #101111 (Alexey Milovidov). - Исправлен выход за границы в оптимизации lazy materialization, который мог вызывать исключение в debug-сборках. #101144 (Alexey Milovidov).
- Исправлен вывод типов в рекурсивных CTE: теперь типы столбцов итеративно расширяются через
getLeastSupertypeмежду нерекурсивной и рекурсивной частямиUNION ALLдо сходимости, что предотвращает целочисленное переполнение в выражениях видаx + 1. #101155 (Alexey Milovidov). - Настройки размера блоков сжатия в MergeTree (max_compress_block_size, min_compress_block_size, marks_compress_block_size, primary_key_compress_block_size) теперь ограничены значением 256 MiB, чтобы предотвратить сбой сервера при установке экстремальных значений через CREATE TABLE SETTINGS. #101159 (Groene AI).
- Исправлено аварийное завершение с LOGICAL_ERROR в
QueryAnalyzer::resolve(), когда ROW POLICY использует скалярный подзапрос в предложенииUSING(например,USING (SELECT 1)). Закрывает #100695. #101263 (Groene AI). - Исправлено неопределённое поведение в
MergeTreeDataPartWriterCompact::cancel, если не удаётся выделить stream. #101292 (Alexey Milovidov). - Исправлен случай, когда часовой пояс не учитывался при присваивании в операторе ALTER. Закрывает #101328. Связано с https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
- Исправлено аварийное завершение сервера (LOGICAL_ERROR) для запросов INSERT SELECT с ORDER BY ALL, когда конвейер SELECT создаёт несколько streams. #101443 (Groene AI).
- Исправлены некорректные результаты запроса, вызванные тем, что переупорядочивание JOIN проталкивало фильтр INNER JOIN (ссылающийся только на сохраняемую сторону OUTER JOIN) в предложение ON внешнего JOIN. #101504 (Vladimir Cherkasov).
- Отключено применение lazy materialization для планов с arrayJoin, так как это могло приводить к несоблюдению LIMIT. Закрывает #101608. #101644 (Vladimir Cherkasov).
- Исправлены некорректные результаты запросов JOIN, когда оптимизация
mergeFilterIntoJoinConditionмолча отбрасывала условие равенства из WHERE при несовпадении типов. #101652 (Xiaozhe Yu). - Исправлено, что тестовая подсказка
errorне работала для ошибок синтаксиса/разбора — раньше-- { error SYNTAX_ERROR }на некорректном запросе завершалось с “Expected server error” вместо сопоставления с клиентской ошибкой разбора. #101675 (Groene AI). - Исправлено, что
INTO OUTFILE ... TRUNCATEфактически не использовал atomic rename: запись шла напрямую в исходный файл, а не во временный, поэтому при сбое запроса исходное содержимое уничтожалось. Теперь данные записываются во временный файл и переименовываются только при успешном завершении. #101884 (Pablo Marcos). - Исправлено исключение
Unsupported DeltaLake type: varchar(n)при чтении таблиц Delta Lake, чья схема содержит типы столбцов varchar(n) или char(n). Эти типы теперь сопоставляются с String, что соответствует тому, что протокол Delta Lake хранит их в Parquet как обычные массивы байтов. #101973 (Flavio Malavazi). - Исправлена незаметная потеря данных при чтении tar-архивов из S3 с
schema_inference_mode=unionи неоднородными схемами Parquet — parquet metadata cache ошибочно повторно использовал metadata первого файла для всех последующих файлов в архиве. #101990 (Ahaan Limaye). - Исправлено аварийное завершение сервера (LOGICAL_ERROR) при выполнении ALTER TABLE UPDATE/DELETE на таблицах Iceberg, если ранее в течение текущего времени работы сервера для этой таблицы не выполнялся ни SELECT, ни INSERT. #102113 (Alexey Milovidov).
- Исправлен возможный сбой при выполнении запроса ALTER на таблицах из in-memory database (например, temporary tables). #102360 (Den Kalantaevskii).
- Исправлено поведение
formatQuery, из-за которого при форматировании обратно совместимых привилегий READ/WRITE для одного и того же source появлялись дублирующиеся grants видаGRANT FILE ON *.*, FILE ON *.* TO xвместоGRANT FILE ON *.* TO x. #102411 (Groene AI). - Исправлена потеря parallelism для aggregation после запросов read-in-order, когда
max_streams_to_max_threads_ratioбольше 1. #102467 (Alexey Milovidov). - Исправлен сбой (
LOGICAL_ERROR: Unknown virtual column) при выборке subcolumns (например,.nullдля Nullable,.size0для Array, элементов Tuple или ключей/значений Map) из таблицы с движком Buffer. #102470 (Groene AI). - Исправлено Исключение “Cannot fold actions for projection” при оптимизации перестановки JOIN, когда LEFT/RIGHT JOIN с
join_use_nullsкомбинируется с другими joins с участием более двух таблиц. #102516 (Alexey Milovidov). - Исправлено тихое overflow в scalar покомпонентных операциях над numericIndexedVector (например,
numericIndexedVectorPointwiseAdd), когда scalar выходит за допустимый диапазон. Теперь такие входные данные приводят кINCORRECT_DATAвместо возврата поврежденных значений. #102546 (FriendLey). - Исправлено неконсистентное форматирование AST для INSERT с SAMPLE и OFFSET на уровне запроса. Закрывает #102523. #102547 (zoomxi).
- Исправлено Исключение
LOGICAL_ERRORвgroupConcatпри десериализации некорректного состояния aggregate function. #102558 (Christoph Wurm). - Значения Time64 в CSV больше не принимают мусор в конце при
input_format_csv_use_default_on_bad_values=0. Закрывает #102490. #102596 (Yarik Briukhovetskyi). - Исправлено Исключение UNKNOWN_ELEMENT_OF_ENUM при вставке default value в JSON-столбец с paths типа Enum. Закрывает #102359. #102687 (Pavel Kruglov).
- Исправлено повреждение columns_substreams.txt в некоторых случаях при rename столбца. Закрывает #102259. #102689 (Pavel Kruglov).
- Исправлена вставка в тип данных Time при parsing JSON. Закрывает #102016. #102690 (Pavel Kruglov).
- Исправлено шестнадцатеричное кодирование content sample в именах файлов кэшированной схемы. Закрывает #101904. #102703 (Pavel Kruglov).
- Исправлено нарушение порядка сортировки (сбой в debug, тихая порча данных в релизной сборке) при merge в
SummingMergeTree, когда ключORDER BYпредставляет собой hash-выражение по столбцуFloat32, содержащему signaling NaN-значения. #102791 (Groene AI). - Операции
DETACH DATABASE ... SYNCи другие операции, вызывающиеwaitDetachedTableNotInUse, теперь можно отменить черезKILL QUERY, и они корректно реагируют на остановку server, что предотвращает зависания на неопределённое время, когда параллельный запрос удерживает ссылку на table. #102804 (Antonio Andelic). - Исправлен возможный некорректный результат
ANY RIGHT JOIN. #102893 (Nikita Taranov). - Исправлена ошибка, из-за которой запросы к S3 завершались с
ios_base::clear: unspecified iostream_category errorвместо повторной попытки; причиной было то, что PocoBufferedStreamBuf::flushBufferне обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda). - Исправлена ошибка, из-за которой table function
input('auto')завершалась сбоем через HTTP interface в запросах INSERT SELECT. #102902 (Miсhael Stetsyuk). - Отключена тривиальная оптимизация LIMIT с row policies/additional_table_filters (чтобы разрешить параллельный index analysis). #102921 (Azat Khuzhin).
- Скрыт secret key в SQL-функции
HMAC. Исправление #102927. #102997 (Mikhail f. Shiryaev). - Исправлено исключение
MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшее в distributed queries, которые несколько раз ссылаются на один и тот же вызовquantile(например, вSELECT,HAVINGиORDER BY) при включённомoptimize_syntax_fuse_functions. #103014 (tanner-bruce). - Исправлен случай, обнаруженный CI, когда передавался неготовый set, если filter зависел от столбца в левой части. Закрывает #102966. #103029 (Yarik Briukhovetskyi).
- Исправлена
castOrNullдля JSON в некоторых случаях. Закрывает #101818. #103036 (Pavel Kruglov). - Исправлен случай, когда
SELECT DISTINCTмолча возвращал неполные результаты, если aggregate projection соответствовала запросу, но у некоторых частей table отсутствовали данные projection (например, projection была добавлена в table, которая уже содержала данные, иMATERIALIZE PROJECTIONне был выполнен). Закрывает #102951. #103052 (Nihal Z. Miaji). - Исправлено исключение
TOO_FEW_ARGUMENTS_FOR_FUNCTION, возникавшее, когда predicate вWHERE, такой какAND(OR(A, A), A), сворачивался в единственный аргумент верхнего уровня при извлечении common expression в analyzer. #103072 (Peng). - Исправлена logical error
Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшая при вычисленииif/ifNullдля кортежей, Map и массивов, содержащих элементQBit.ColumnQBit::structureEqualsнекорректно сравнивал внутренний кортеж одного столбцаQBitс внешней обёрткой другого, из-за чего структурно идентичные столбцыQBitсчитались разными. #103084 (Groene AI). - Сделано так, чтобы
DETACH DATABASEсdatabase_atomic_wait_for_drop_and_detach_synchronouslyучитывалKILL QUERY, а не зависал на неопределённое время, когда удерживается ссылка на таблицу. #103095 (Alexey Milovidov). - Исправлен segfault при удалении модуля WASM с использованием предиката, не являющегося идентификатором (например,
WHERE 1=1). #103101 (Joe Redfern). - Исправлено нарушение обратной совместимости, из-за которого старые клиенты завершались с
UNEXPECTED_PACKET_FROM_SERVERпри вставке данных в более новый сервер черезremote()или distributed таблицы; причиной был безусловный вызовsendProgressв концеprocessInsertQuery. #103148 (Sema Checherinda). - Для
INс неконстантным вторым аргументом-кортежем нельзя приводить элементы кортежа черезCASTк типу левой части, так как это может вызвать overflow. Закрывает #103055. #103169 (Yarik Briukhovetskyi). - Исправлено использование неинициализированного значения в функции протокола. #103187 (Pavel Kruglov).
- Исправлен
LOGICAL_ERROR(Bad cast … to ColumnLowCardinality) при анализе индекса MergeTree, когда предложениеWHEREсравнивает ключевой столбецLowCardinalityс константой, приведённой к типу, содержащему вложенныйLowCardinality(например,Variant(LowCardinality(Date), String)). #103211 (Groene AI). - Исправлена
Logical error: 'index < bucket_count'в семействе aggregate functiontimeSeries*ToGrid(например,timeSeriesResampleToGridWithStaleness,timeSeriesChangesToGrid,timeSeriesResetsToGrid,timeSeriesRateToGrid) при вызове с экстремальными параметрами временных меток, которые приводили к overflow в знаковой 64-битной арифметике при вычислении числа бакетов. Кроме того, общее число бакетов сетки теперь ограничено 16 миллионами, чтобы предотвратить случайное выделение большого объёма памяти из-за вредоносных входных данных. #103223 (Groene AI). - Исправлено исключение
Logical error: 'Port is already connected', возникавшее при расширении конвейера в отложенном путиFINALдляReplacingMergeTree. Ошибка затрагивала запросы сquery_plan_optimize_lazy_final = 1, когдаReadFromMergeTree::initializePipelineвставлял внутренние преобразования (например,Resize), которые соединяли processors подконвейера между собой, из-за чегоLazyUnorderedReadFromMergeTreeSource::expandPipelineпытался подключить выходные порты, уже подключённые ранее. #103230 (Groene AI). - Исправлены неверные результаты
LIMIT BYиDISTINCT, когда входные данные представляют собойUNION ALLотсортированных подзапросов. Оптимизатор плана запроса ошибочно считал такое объединение глобально отсортированным, из-за чего возвращались лишние строки. #103231 (Nihal Z. Miaji). - Исправлено возможное падение при вычислении статистики для типа Map с отложенной репликацией. Закрывает #102390. #103273 (Pavel Kruglov).
- Исправлена гонка данных для источников словарей ClickHouse, MySQL, PostgreSQL и XDBC, где
clone() constчитает, аisModified() constзаписывает в одну и ту же строкуinvalidate_query_response. #103277 (Miсhael Stetsyuk). - Исправлено некорректное определение монотонности для
Date32. Закрывает #101265. #103283 (Yarik Briukhovetskyi). - Строки в предаутентификационном TCP-пакете Hello теперь ограничены 64 КБ; также добавлена настройка сервера
handshake_timeout_milliseconds, ограничивающая общее время рукопожатия и не позволяющая неаутентифицированным клиентам потреблять слишком много памяти или удерживать потоки неограниченно долго. #103284 (Sema Checherinda). - Исправлена ошибка в статистике Parquet ColumnIndex, при которой
min_value>max_valueдля столбцов String. #103334 (Saurabh Kumar Ojha). - Исправлена некорректная обработка строк с NULL для входных данных
Nullable(Tuple(...))вflattenTupleиtupleToNameValuePairs. ТеперьflattenTupleсохраняет внешнюю null-карту, поэтому строки с NULL остаются NULL.tupleToNameValuePairsтеперь, когда это возможно, меняет тип значения результата наNullable(T)для входных данныхNullable(Tuple(...)), поэтому строки с NULL дают[('a', NULL), ('b', NULL)]вместо[('a', 0), ('b', 0)]. Если тип элемента нельзя обернуть вNullable(например,Array), вместо NULL используются значения по умолчанию. Закрывает #103312. #103383 (Nihal Z. Miaji). - Добавлена проверка на некорректные уплощённые данные Dynamic в Native format. #103392 (Pavel Kruglov).
- Исправлен устаревший RPC, из-за которого репликация зависала после синхронизации снимка. #103406 (Seva Potapov).
- Исправлено аварийное завершение сервера из-за
LOGICAL_ERROR“Cannot pop N rows from X” (в debug- и sanitizer-сборках) при чтении некорректного BSON-документа, содержащего значение, тип BSON которого несовместим с типом целевого столбца внутри столбцаNullable(T)илиArray(Nullable(T)). Теперь некорректная строка, как и ожидалось, приводит к корректному исключениюILLEGAL_COLUMN. #103418 (Groene AI). - Исправлено аварийное завершение сервера в
arrayFillиarrayReverseFillпри применении к столбцуArray(String), у которого первая строка пуста, вместе с лямбда-функцией, всегда возвращающей false. В цикле aggregate / sub-array индексsize_tуходил вSIZE_MAXиз-за выхода за нижнюю границу диапазона, что затем вызывало чтение за пределами границ вColumnString::doInsertManyFrom. Это то же семейство ошибок, что и #12263. #103424 (Groene AI). - Исправлены ACCESS_DENIED / UNKNOWN_TABLE в нижестоящих APPEND RMV с SQL SECURITY DEFINER, когда EXCHANGE в вышестоящем REPLACE RMV переключает identity целевого хранилища в процессе разрешения. #103427 (Alexander Gololobov).
- Столбец
_timeтеперь заполняется из табличной функцииurl. #103437 (Nikita Taranov). - Исправлено потенциальное чтение за пределами буфера в пути распаковки кодека
ALPпри обработке некорректного входного потока с недопустимой битовой шириной. #103457 (Raufs Dunamalijevs). - Исправлена ошибка, из-за которой
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ...мог терять имя кэша при форматировании запроса, из-за чего удалённые узлы синхронизировали все файловые кэши, а не только запрошенный. #103469 (Asish Kumar). - Исправлена обработка URL-кодированного пути в
deltaLakeAzure. Закрывает #103509. #103525 (Smita Kulkarni). - Исправлено обращение к уже освобождённой памяти в куче при умножении состояния
AggregateFunctionна целое число (например,quantilesExactState(...) * N). В цикле возведения в степень методом двоичного разложения состояние сливалось само с собой, что не определено, еслиmergeагрегатной функции перераспределяет своё внутреннее хранилище. Закрывает STID 0988-40af. #103536 (Groene AI). - Исправлена редкая ошибка
LOGICAL_ERROR“Part X intersects previous part Y”, возникавшая при запуске таблицыReplicatedMergeTree, когда две пустые неожиданные части на диске имели пересекающиеся, но не вложенные друг в друга диапазоны блоков. Исключение прерывало поток attach таблицы и не давало таблице запуститься. #103537 (Groene AI). - Исправлена ошибка
Logical error: Incorrect mark rows for part ...(проверка только в отладочной сборке), которая срабатывала из-за мутаций в таблицахMergeTreeс неадаптивной гранулярностью индекса (index_granularity_bytes = 0), у которых последняя метка данных была неполной (надёжнее всего воспроизводилось черезDETACH/ATTACHс последующим легковеснымDELETE). #103538 (Groene AI). - Исправлена ситуация, когда
clickhouse-localмолча возвращал 0 строк при чтении из псевдофайлов/procи/sysчерез табличную функциюfile()(например,SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')). #103548 (Ashrith Bandla). - Исправлена обработка аргумента
max_string_lengthдля движка таблицыGenerateRandom. #103550 (Alex Kuleshov). - Исправлено маскирование вложенных учётных данных в журналах. #103552 (Vitaly Baranov).
- Исправлено определение SVE, использовавшее инструкции SVE, когда они недоступны. #103568 (Raúl Marín).
- Исправлен разбор аргументов хранилища
GenerateRandom. #103574 (Konstantin Bogdanov). - Исправлен бесконечный цикл в
WITH FILLдля данных, начинающихся с ±inf. #103580 (Konstantin Bogdanov). - Исправлено молчаливое усечение дробных JSON-чисел при извлечении
JSONExtractв типVariant. РанееJSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)')возвращалInt64=3, аJSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)')—Int64=3, отбрасывая дробную часть. Теперь дробное значение сохраняется без потерь: если присутствует членFloat64/Decimal, значение попадает в него, в противном случае исходный JSON сохраняется в членеString. ТипыVariant, содержащие только целочисленные члены (например,Variant(Int64, Int32)), а также прямое извлечение целых чисел (JSONExtract(json, 'Int64'),JSONExtractIntи т. д.) не изменились. #103620 (Groene AI). - Исправлена ситуация, когда
SYSTEM INSTRUMENT REMOVEбез аргументов выдавалstd::bad_optional_access(код ошибки 1001) вместоSYNTAX_ERROR(код ошибки 62). #103622 (Pablo Marcos). - Исправлены logical error и неопределенное поведение в
windowIDи оконном представленииtumbleпри вызове со строкой часового пояса в качестве 3-го аргумента. #103641 (Alexey Milovidov). - Логирование клиента S3 теперь рассматривает HTTP-ответы 400 с непустым заголовком
x-amz-bucket-region(неверный Region для подписи SigV4) как информативный случай неверного региона, с более понятной строкой в логе вместо общего пути обработки в стиле ошибки. Провайдер учетных данных STS web identity теперь добавляется в цепочку учетных данных S3 только при настроенной web identity, что уменьшает количество ложных предупреждений в развертываниях, где она не используется. Закрывает #99140. #103673 (MeltonSmith). - Исправлено поведение
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS: теперь команда молча завершается успешно, если база данных не существует, в соответствии с уже существующим поведением для отсутствующей таблицы и прецедентом, заданнымDROP TABLE IF EXISTS. Ранее запрос выдавалUNKNOWN_DATABASE, несмотря наIF EXISTS. Закрывает #103629. #103689 (Groene AI). - Исправлена logical error
Arguments of 'plus' have incorrect data types, которую выбрасывалFunctionBinaryArithmetic::executeImpl2, когда у таблицыMergeTreeв ключе сортировки былArray(LowCardinality(...)), а в предложенииWHEREиспользовалисьplus/minusмежду этим столбцом и константойArrayс другим типом элементов.KeyCondition::getMonotonicityForRangeтеперь рекурсивно удаляетLowCardinalityперед вызовом внутреннего числового dispatch. #103701 (Groene AI). - Исправлена race condition при динамическом изменении размера cache в 26.1+. #103702 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой skip-индексы
textиbloom_filterна столбцахALIAS, чье выражение содержало lambda с захваченными константами (например,arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m))), молча игнорировались. #103708 (Anton Popov). - Исправлено зависание или segmentation fault в
positionиpositionCaseInsensitiveприstart_pos, близком кUINT64_MAX, из-за переполнения арифметики указателей. #103766 (Raúl Marín). - Исправлено неопределенное поведение при разборе
dateTimeс двойной дробной частью. #103773 (Yarik Briukhovetskyi). - Исправлена регрессия корректности данных в 26.x: JIT-скомпилированные
ifиmultiIfс типом результатаDecimalи не-Decimal-литералом (целым числом или числом с плавающей точкой) в одной из ветвей могли молча возвращать значение в10^scaleраз меньше правильного. Медленный путь (без JIT) затронут не был. Обходное решение для затронутых версий:SET compile_expressions = 0. #103809 (Groene AI). - Исправлена передача токенизатора из text index в поддерживаемые функции. #103826 (Elmi Ahmadov).
- Исправлены неверные результаты из
numbers,generate_seriesи аналогичных источников, учитывающих диапазон, когда в условииWHEREиспользуетсяINилиNOT INпо кортежу, элементы которого дедуплицируются до одного ключевого столбца (например,WHERE tuple(number, number) NOT IN (tuple(1, 2))). Закрывает #103660. #103835 (Groene AI). - Реальный пик потребления памяти у hash join с автоматическим spilling теперь удерживается ниже
max_bytes_before_external_join. Ранее предварительное выделение памяти на основе статистики, удвоение hash table на месте и неограниченные in-memory бакеты вGraceHashJoinпо отдельности могли приводить к тому, что запрос превышал настроенный лимит и завершался сMEMORY_LIMIT_EXCEEDED. #103838 (Alexey Milovidov). - Исправлено зависание при завершении работы
clickhouse-local, если настроены системные журналы (например,text_logилиfilesystem_cache_log).SystemLogs::flushImplвызывалBaseDaemon::instance().flushTextLogs(), который генерируетstd::bad_castвнеclickhouse-server, из-за чего потоки сохранения продолжали работать, покаpthread_cond_destroyне блокировал уничтожение очередей системных журналов. #103874 (Alexey Milovidov). - Запросы
MATERIALIZEDCTE, у которых body в разных ссылках разрешается в разные выведенные типы столбцов, теперь отклоняются с понятной ошибкойTYPE_MISMATCHвместо аварийного завершения сервера сBad castLOGICAL_ERROR. Ранее это происходило, когда body CTE ссылался на идентификаторы из внешней области видимости (например, на alias из проекции вызывающего подзапроса), которые подставлялись как разные константы для каждой ссылки. #103879 (Groene AI). - Исправлено использование неинициализированного значения в оптимизаторах плана запроса, преобразующих JOIN (
tryConvertAnyOuterJoinToInnerJoin,tryConvertAnyJoinToSemiOrAntiJoin), когда filter надANYOUTERJOINсодержит недетерминированную функцию, такую какrand,nowилиrowNumberInAllBlocks. Оптимизатор больше не пытается выполнять constant folding для таких filter и оставляет JOIN без изменений, что также предотвращает некорректные преобразования вINNER/SEMI/ANTI JOIN, которые могли незаметно отбрасывать строки. #103880 (Groene AI). - Исправлена ошибка use-after-free в
StorageKafka2, которая могла приводить к сбою сервера, если сеанс Keeper заменялся, пока consumer удерживал эфемерные блокировки topic-partition. #103890 (Groene AI). - Исправлена
LOGICAL_ERROR“Primary key type mismatch”, возникавшая при соединении таблицыEmbeddedRocksDBчерезJOIN ... USING (key)с подзапросом, у которого ключевой столбец имеет тип, отличный от primary key хранилища (например,Nullable(UInt64),Int64,Decimal). Теперь planner отклоняетDirectKeyValueJoinпри несовпадении типов и переключается наHashJoin, который выполняет преобразование типов. #103928 (Groene AI). SET max_threads = DEFAULT(и то же дляmax_final_threadsиmax_parsing_threads) больше не теряет состояние auto. Ранее после сброса одного из этих настроекsystem.settingsпоказывал вычисленное число ядер (например,32) вместо'auto(32)', и server вёл себя так, как будто значение было явно зафиксировано. #103991 (Groene AI).- Исправлена ошибка
SIZES_OF_ARRAYS_DONT_MATCHпри чтении столбцовAggregateFunction(topK(N), String), у которых сохранённыйalpha_sizeбыл увеличен циклом deserialize+serialize в версии до 25.12. #104002 (Raúl Marín). - Исправлена уязвимость SQL injection в dictionary source PostgreSQL, Cassandra и XDBC: строковые ключи, содержащие одинарные кавычки, экранировались как
\'(обратный слеш), который эти backend-соединения трактуют как буквальный обратный слеш, а не как escape-последовательность, что позволяло внедрять произвольный SQL в запросы lookup словарей.ExternalQueryBuilderтеперь использует для этих backend-соединений стандартное для SQL экранирование''; dictionary source ClickHouse и MySQL по-прежнему используют экранирование обратным слешем. #104009 (Shaohua Wang). - Исправлено возможное несоответствие типов при aggregation, когда тип столбца изменялся на LowCardinality или обратно, а min-max projection не была пересобрана. #104013 (Nikita Taranov).
- Исправлен бесконечный цикл query optimization, вызванный тем, что при слиянии выражений не распространялся запрет на удаление неиспользуемых столбцов. #104083 (János Benjamin Antal).
- Исправлена ошибка
LOGICAL_ERRORвStreamingStorageRegistry::renameTableпри пакетном переименовании стриминговых table (S3Queue, Kafka, RabbitMQ) за счёт использования отслеживания identity на основе UUID вместо отслеживания по именам. #104101 (Nikita Taranov). - Исправлены неверные результаты в случае, когда CTE, построенный с
UNION ALL, содержал веткуSELECT DISTINCT, а внешний запрос проецировал только подмножество столбцов CTE.RemoveUnusedProjectionColumnsPassв новом analyzer некорректно удалял неиспользуемый столбец из внутренней projectionDISTINCT, из-за чего строки, которые должны были оставаться различными (одно и то же значение в проецируемом столбце, но разное значение в удалённом столбце), схлопывались в одну. #104114 (Groene AI). - Исправлено несколько проблем корректности в пограничных случаях для настройки
optimize_inverse_dictionary_lookup, из-за которых оптимизация могла незаметно отбрасывать строки или подавлять исключения. Закрывает #103270. Закрывает #103085. #104133 (Nihal Z. Miaji). - Исправлена запись за пределы буфера при десериализации состояния
quantileTiming. #104141 (Alexey Milovidov). - Исправлено неопределённое поведение при преобразовании значения
Float64вне допустимого диапазона в широкий целочисленный тип (UInt64,Int64,Int128,UInt128,Int256,UInt256). Ранее значения, равныеFloat64(numeric_limits<T>::max())(которые округлялись вверх до значения, превышающего фактический максимум), обходили проверку границ и приводили к UB при последующем CAST. Это затрагивало parsing параметров агрегатных функций (topK,histogram,uniqUpTo,groupArrayInsertAtи т. д.) и настройки целочисленного типа черезSET <setting> = <Float64>. Закрывает #103817. #104154 (Groene AI). - Исправлено исключение
LOGICAL_ERROR“Unexpected return type from comparison. ExpectedUInt8. GotConst(Nullable(UInt8))” при сравнении вложенногоTuple(Tuple(Nullable(...)))(или с более глубокой вложенностью) со строковым литералом. Возвращаемый тип сравнения теперь корректно определяется какNullable(UInt8), что соответствует поведению во время выполнения. #104171 (Groene AI). - Исправлено аварийное завершение server (
UndefinedBehaviorSanitizer: reference binding to null pointer, segfault в release-сборках) наSELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr>приquery_plan_optimize_lazy_final = 1. На этапе lazy-FINAL-чтения без пересечений столбецis_deletedисчезал из выходного header, поскольку prewhere использовал его как входной и не добавлял обратно в выходные данные. В результате следующий этапaddIsDeletedFilterразыменовывал нулевой указательActionsDAG::Node. #104177 (Groene AI). - При обращении к таблице system.failpoints использовался failpoint, из-за чего он мог отключаться. #104237 (Pedro Ferreira).
- Исправлено
MemorySanitizer: use-of-uninitialized-valueв функцияхdetectLanguage*, когда входные данные содержат символ UTF-8, заканчивающийся ровно на границе buffer. #104257 (Raúl Marín). - Исправлена logical error (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage), из-за которой прерывался разбор аргументов table function и движков для data lake (icebergS3,deltaLakeS3и т. д.) при вызове сSETTINGS disk = '...'для disk, чьё базовое Объектное хранилище обёрнуто декоратором, например файловым кэшем. Закрывает #89300. #104258 (Groene AI). - Исправлен разбор индексных выражений в скобках для столбцов с именем
values, например(values['a']), чтобы они больше не интерпретировались как табличные выражения SQLVALUES. #104312 (Desel72). - Исправлено аварийное завершение server/
LOGICAL_ERRORв фоновом потоке eviction файлового кэша (SLRUFileCachePriority::collectEvictionInfo), которое могло происходить, когдаkeep_free_space_size_ratioилиkeep_free_space_elements_ratioбыли достаточно высокими, чтобы запустить eviction, при том что все записи кэша уже были перемещены в защищённую очередь SLRU (а probationary была пуста). #104313 (Groene AI). - Исправлены исключения (
NOT_FOUND_COLUMN_IN_BLOCK,LOGICAL_ERROR,AMBIGUOUS_COLUMN_NAME) при использовании проекций с представлениями UNION ALL, window functions или конфликтами имён между alias и столбцами. Регрессия из #88798. #104317 (Amos Bird). - Исправлен возможный выход за нижнюю границу диапазона при разборе массивов Postgres. #104322 (Grant Holly).
- Функции, которые возвращают тип, отличный от
Nullable(например,Array,TupleилиMap), теперь принимают аргументы типаNullable. К затронутым функциям относятсяextractAll,extractAllGroups,extractAllGroupsHorizontal,extractAllGroupsVertical,extractGroups,splitByChar,splitByString,splitByRegexp,splitByWhitespace,splitByNonAlphaиalphaTokens. Входные строки со значениемNULLтеперь дают значение по умолчанию для результирующего типа (например, пустой массив) вместо генерации ошибки “Nested type is not allowed inside Nullable type”. #104326 (Alexey Milovidov). - Исправлена статистика Iceberg для партиционированной таблицы. Это закрывает #104321. #104329 (Konstantin Vedernikov).
- Исправлена фатальная logical error при запуске server на macOS (и в аналогичных build jemalloc), из-за которой
Jemalloc::verifySetupошибочно сообщал о несоответствииjemalloc_enable_background_threads, поскольку необязательные mallctlbackground_thread/max_background_threadsотсутствуют; теперь проверка пропускается, если эти mallctl недоступны, аgetValueбольше не оставляет выходное значение неинициализированным при сбое. Закрывает #102183. #104330 (SAYON DEEP). - Исправлена регрессия, из-за которой
SELECTзапросы сmax_rows_to_read_leafиread_overflow_mode_leaf = 'throw'могли ошибочно выдаватьTOO_MANY_ROWS, даже если индекс пропуска данных уменьшал объём чтения ниже leaf-лимита. Симметричные настройки не на уровне leaf (max_rows_to_read/read_overflow_mode) уже обрабатывались корректно. #104331 (Groene AI). toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,CASTкUUIDиNullable(UUID),accurateCastOrNullкUUID, а также входные форматы, которые разбирают UUID из текста (Avro,MsgPack,JSONExtract, …), теперь отклоняют строки правильной длины, но содержащие не шестнадцатеричные символы. Ранее такие входные данные молча превращались в поддельный UUID из-за выхода за пределы таблицы поиска шестнадцатеричных цифр; теперьtoUUIDгенерируетCANNOT_PARSE_UUID, а вариантыOr*возвращаютNULL/ нулевой UUID / переданное значение по умолчанию. #104370 (Groene AI).- Исправлен
Bad castLOGICAL_ERRORвcaseWithExpression(и SQLCASE expr WHEN ... THEN ... ELSE ...), когда супертип только для THEN и супертип для (THEN + ELSE) оказываются в разных хранилищахColumnDecimal— например, при значениях THEN(UInt16, Int8)и ELSEDecimal(9, 2). Закрывает #104335. #104378 (Groene AI). - Внутренние сбои, о которых сообщается через
logExceptionBeforeStart(flushes асинхронных вставок, refreshes materialized-view, ошибки разбора, возникающие во внутренних запросах), теперь корректно увеличивают ProfileEventsFailedInternalQuery,FailedInternalSelectQueryиFailedInternalInsertQueryнаряду с видимыми пользователю countersFailedQuery,FailedSelectQueryиFailedInsertQuery. Ранее эти внутренние counters оставались равными нулю для сбоев, происходивших до начала выполнения запроса, из-за чего занижался учёт важного класса внутренних сбоев. #104399 (Groene AI). - Исправлена ошибка
Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}, возникавшая при использовании параметра запроса в настройкеbase_backupоператораBACKUPилиRESTORE(например,BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)). Регрессия появилась в26.1.5из-за PR #99205. Закрывает #103324. #104413 (Groene AI). - Исправлено аварийное завершение сервера при записи в
IcebergLocal/IcebergS3, если послеALTER TABLE ... DROP COLUMNвыполняетсяINSERTсiceberg_metadata_staleness_msбольше нуля. ТеперьALTERинвалидирует локальный кеш файлов метаданных Iceberg, поэтому последующие чтения и записи видят новую схему. #104419 (Groene AI). - Исправлены
DROP ROLE,DROP USER,DROP SETTINGS PROFILE,DROP ROW POLICY,DROP QUOTAиDROP MASKING POLICY: теперь они удаляют ссылки на удалённую сущность из любых других объектов управления доступом, которые на неё ссылались (например, из спискаDEFAULT ROLEпользователя, спискаTOпрофиля настроек или списка grantee у политики строк), и сохраняют очистку на диск. Ранее состояние в памяти выглядело корректным, посколькуSHOW CREATEотфильтровывает неизвестные UUID, но.sql-файлы на диске сохраняли висячие записиID('<dropped-uuid>'), и ссылки восстанавливались при следующем перезапуске сервера, что приводило к ошибкамACCESS_ENTITY_NOT_FOUNDво время выполнения распределённого запроса. #104427 (Groene AI). - Исправлено аварийное завершение сервера, вызванное
azureBlobStorage, движкомAzureBlobStorageи DeltaLake-on-Azure при использовании строки подключения, в которой URLBlobEndpointсодержит пустой, нечисловой или выходящий за допустимые пределы порт (например,BlobEndpoint=http://host:abc/). Теперь сервер возвращает корректную ошибкуBAD_ARGUMENTSвместо аварийного завершения в debug/sanitizer-сборках. #104460 (Groene AI). - Теперь в качестве имени пользователя в табличных функциях
remoteиremoteSecureможно использовать идентификатор без кавычек — так же, как для аргументов базы данных и таблицы. Ранее такой запрос завершался вводящей в заблуждение ошибкой authentication со ссылкой на пользователяdefault. #104465 (Alexey Milovidov). - Исправлена
Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N), возникавшая, когда тело SQL user-defined function содержит заключённый в скобки внутреннийUNION ALL(например,CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))). #104477 (Groene AI). - Исправлено поведение
uniqThetaIntersect, при котором функция возвращала мощность первого аргумента вместо0, когда второй аргумент представляет собой пустое состояниеuniqTheta— например, результатuniqThetaMergeStateIf(s, predicate), если предикат исключает все строки. #104529 (Groene AI). - Исправлено поведение
SHOW TABLESиsystem.tables, которые молча обрезали список для баз данныхDataLakeCatalog, использующих Iceberg REST-каталоги (iceberg-rest,onelake,biglake). Когда сервер каталога разбивал на страницы ответlist-tablesилиlist-namespaces(например, в Microsoft Fabric / OneLake при более чем ~50 таблицах на пространство имен), таблицы на последующих страницах оставались незаметно невидимыми дляSHOW TABLESиsystem.tables, хотя к ним можно было обращаться через прямойSELECT.RestCatalogтеперь обрабатывает токен продолженияnext-page-token, определённый спецификацией Iceberg REST OpenAPI, как это уже делаютPaimonRestCatalogиUnityCatalog. #104531 (Groene AI). - Табличная функция
inputтеперь выводит свою структуру из окружающего предложенияFORMATзапросаINSERT, когда этот формат имеет фиксированную схему (LineAsString,RawBLOB,JSONAsStringи т. д.), поэтому пользователям больше не нужно повторно задавать структуру какinput('line String')для этих форматов. #104532. #104533 (Groene AI). - Обновлён тип данных полей в истории Iceberg с
Int32наInt64. Закрывает #94176. #104579 (Smita Kulkarni). - Исправлен
Inconsistent AST formattingLOGICAL_ERRORпри разборе вызова функции, где после запятой следует лямбда, напримерSELECT substring(x, `x` -> `x`). Ранее парсер молча объединял предыдущие аргументы с левой частью лямбды, из-за чего получался вызов с одним аргументом, который уже нельзя было повторно разобрать в то же AST. Теперь сохраняется исходная арность функции. #104626 (Groene AI). CHECK TABLE tтеперь отдаёт предпочтениеTEMPORARYтаблице перед постоянной таблицей с тем же именем, если не указан квалификатор базы данных, что соответствует приоритету, уже используемому вSHOW CREATE TABLE,DESCRIBE TABLE,OPTIMIZE TABLEиALTER TABLE. РанееCHECK TABLE tполностью игнорировал временные таблицы, поэтому завершался сUNKNOWN_TABLEдля временной таблицыLogилиFile, хотя эти движки поддерживаютCHECK. Продолжение #100966. #104637 (Groene AI).- Исправлены завершение работы Keeper и цикл перезапуска, возникавшие, когда
get /keeper/availability_zoneотправляется сquorum_reads=trueв Keeper без настроенного<placement>. #104663 (myeongjun). - Исправлена TOCTOU data race в
FutureSetFromTuple::buildOrderedSetInplace, приводившая к logical error. #104673 (Miсhael Stetsyuk). - Исправлено несколько функций, которые возвращали разные результаты для одного и того же входного значения в зависимости от того, передавались ли аргументы как столбцы или как константы:
bitRotateLeft/bitRotateRight(граничные значения сдвига),length(FixedString)/concatWithSeparatorс входамиLowCardinality(Nullable),roundDownдля NaN иrightUTF8для некорректного UTF-8. #104710 (Raúl Marín). - Исправлено поведение
anyHeavy, которая возвращала не-heavy значение, когда наиболее частым значением было значение столбца по умолчанию, а данные находились в нескольких частяхMergeTree(путь чтения разреженных столбцов). #104712 (Raúl Marín). - Исправлено несколько дефектов в обработке ограничений настроек: ограничения
MergeTreeSettings, объявленные для канонического имени настройки, можно было обойти, записав значение через псевдоним этой настройки; проверка ограниченияdisallowed_valuesвыбрасывала исключение на путях clamp (вторичные запросы, воркеры предложенияON CLUSTER, представленияSQL SECURITY DEFINER) вместо того, чтобы молча отбрасывать изменение. #104737 (Raúl Marín). - Исправлено исключение
LOGICAL_ERROR(Metadata is not initialized), возникавшее приOPTIMIZE TABLE,ALTER TABLE ... DELETE,ALTER TABLE ... ADD COLUMNи других вариантах ALTER для лениво attached-таблицIceberg/IcebergLocal/DeltaLake/Hudi, чьи metadata еще не были загружены (обычно после перезапуска сервера или после предыдущей неудачной записи metadata, оставившей на диске поврежденный файл metadata). Теперь операция либо выполняется нормально, если metadata успешно загружаются, либо показывает исходную ошибку загрузки как обычное пользовательское исключение вместо аварийного завершения сервера в отладочных сборках или сборках с sanitizer. #104738 (Groene AI). - Исправлен segfault из-за use-after-free в
AvroConfluentRowInputFormat. #104751 (Miсhael Stetsyuk). - Скалярные варианты
numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDivide,numericIndexedVectorPointwiseEqualиnumericIndexedVectorPointwiseNotEqualтеперь выдаютINCORRECT_DATA, если вызываются со скаляромUInt64, превышающимInt64::max. #104784 (FriendLey). - Исправлена ошибка, из-за которой ручное переопределение настройки через имя её псевдонима (например,
SET enable_analyzer = 1вместоSET allow_experimental_analyzer = 1) после применения настройкиcompatibilityмогло быть отменено последующим изменением настройкиcompatibility. #104829 (Raúl Marín). - Исправлена проблема, из-за которой AWS logger отключался после https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d. #104837 (Konstantin Bogdanov).
- Исправлены ещё три функции, возвращавшие разные результаты для одного и того же входного значения в зависимости от того, передавались ли argument как столбцы или как константы:
transform(иcaseWithExpressionчерез неё) с константным значением по умолчаниюDate/Date32/Enum/FixedString, операторы сравнения междуStringи константнымFixedString, а такжеif/ifNull/nullIfс веткойFixedStringпри константном условии. #104858 (Raúl Marín). - Исправлено аварийное завершение сервера
Bad cast from type DB::ColumnConst to DB::ColumnNullableво время partition pruning для таблицMergeTree, когда выражение партиционирования содержит chain функций, сворачивающуюся в одно константное значение (например,floor(NULL, toRelativeYearNum(...))). #104861 (Groene AI). - Исправлена data race, обнаруженная
ThreadSanitizer, в конструкторе копированияContextData:table_function_resultsкопировался из исходного объекта без захватаtable_function_results_mutex, поэтому конкурентная запись вContext::executeTableFunctionмогла пересечься с несинхронизированным чтением в конструкторе копирования. #104879 (Groene AI). - Исправлены проверки согласованности data part для типов с динамической структурой и добавлено обнаружение повреждённых columns_substreams.txt. Повторная отправка https://github.com/ClickHouse/ClickHouse/pull/103858 с дополнительными изменениями. #104888 (Pavel Kruglov).
- Исправлена гонка между DROP и UNDROP в DatabaseCatalog. #104915 (Azat Khuzhin).
- Исправлено динамическое изменение размера файлового кэша при наличии частично загруженных сегментов, включая восстановление учёта после неудачного вытеснения. #104921 (Antonio Andelic).
DETACH TABLEдля временной таблицы (без ключевого словаTEMPORARY) теперь корректно вызываетSYNTAX_ERROR, что соответствует поведениюDETACH TEMPORARY TABLE. Ранее команда молча устанавливала внутренний флагis_detachedи завершалась без ошибки. Чтобы удалить временную таблицу, используйтеDROP TEMPORARY TABLEилиDROP TABLE(последняя команда разрешает временную таблицу черезContext::ResolveExternal). Закрывает #103475. #104943 (Groene AI).- Исправлено поведение table function
filesystem: теперь она учитываетmax_memory_usage/max_server_memory_usageпри загрузке содержимого файла. Ранее крупные или многочисленные параллельные чтения содержимого могли превышать лимит безMEMORY_LIMIT_EXCEEDEDи в итоге завершаться из-за OOM. #104956 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR, возникавший при фильтрацииsystem.detached_tablesпоuuid(например,SELECT count() FROM system.detached_tables WHERE uuid = '...'). Теперь запрос возвращает ожидаемый результат вместо аварийного завершения сервера. #104979 (Groene AI). flattenTupleбольше не вызываетLOGICAL_ERROR, если его применить к кортежу, чья вложенная структура содержит только пустые листьяTuple()(например,Tuple(c0 Array(Tuple()))илиTuple(c0 Tuple())). Теперь такие входные данные приводят к пользовательскому исключениюILLEGAL_TYPE_OF_ARGUMENT, поясняющему, что результат разворачивания был бы пустым кортежем. #104989 (Groene AI).- Исправлены аварийное завершение сервера и ошибка, из-за которой запрос мог молча возвращать неверный результат, при выполнении
loop(remote(...))(или любогоloop(), оборачивающего хранилище, которое может откладывать aggregation) сGROUP BY. Ранее внешний planner добавлялMergingAggregatedStepна основе этапа processing, сообщаемого внутренним хранилищем, ноLoopSourceвсегда materialize свой внутренний select сQueryProcessingStage::Completeи выдаёт обычные фрагменты столбцов, поэтомуMergingAggregatedTransformприводил кLOGICAL_ERROR(Chunk info was not set for chunk in MergingAggregatedTransform) приenable_parallel_replicas = 1, а в остальных случаях молча отбрасывал внешнюю агрегацию. #105001 (Groene AI). clickhouse-benchmark --reconnect(без значения) был непреднамеренно сломан в 25.4 изменением, которое превратило--reconnectв целочисленную опцию, требующую значения. Теперь форма без значения снова работает и эквивалентна--reconnect=1(переподключение для каждого запроса). #105006 (Groene AI).- Исправлен некорректный JSON-вывод для имён столбцов, оканчивающихся неполными последовательностями UTF-8. #105012 (Pablo Marcos).
- Исправлена незаметная потеря данных после
EXCHANGE TABLESилиCREATE OR REPLACE TABLEдля исходной таблицы materialized view. Ребро зависимости между исходной таблицей и представлением дляMVтеперь сохраняется за исходным именем, поэтому оно продолжает срабатывать при вставках. Регрессия была внесена в #98779; восстановлено поведение, существовавшее до неё. #105029 (Sema Checherinda). - Исправлена ошибка
CANNOT_COMPILE_CODE Could not find symbol __fixunsdftiпри JIT-компиляции выражений, преобразующихFloatвUInt128, напримерtoUInt128(<Float64 expression>). В резолвере символов JIT отсутствовали builtin-функции compiler-rt для преобразования беззнаковых 128-битных чисел с плавающей точкой в целые. Закрывает #105031. #105048 (Raúl Marín). - Исправлено поведение, при котором
clickhouse-localне выводил сообщение лога из завершившегося ошибкой запроса, если заданsend_logs_level. #105067 (Alexey Milovidov). - Исправлены некорректные результаты, когда один и тот же parameterized view использовался в одном запросе более одного раза с разными значениями аргументов. Ранее анализатор схлопывал такие вызовы в один, молча отбрасывая все фильтры, кроме первого. #105170 (Alexey Milovidov).
- Исправлено поведение, при котором строка
TOTALSдважды отображалась внизу таблицы результатов в веб-интерфейсеplay.html. #103803 (Alexey Milovidov). - Теперь при векторном поиске отклоняются неконечные векторы (
NaN,±Inf) — как искомые, так и опорные; ранее они приводили к неопределённому поведению вusearch. #104079 (Groene AI). - PromQL: исправлен оператор агрегации для пустых векторов. #104425 (Vitaly Baranov).
- PromQL: исправлена обработка ошибок в API запросов Prometheus. #104741 (Vitaly Baranov).
- Исправлена race condition в
MergeTreeTransaction::afterCommit: после потери соединения между записьюCSNкоммита в ZooKeeper и завершением транзакции ответCOMMITмог дойти до клиента раньше, чем новыеcreation_csn/removal_csnстановились видимыми вsystem.parts. #104708 (Tuan Pham Anh). - Исправлен экспоненциальный рост потребления оперативной памяти в парсере KQL при преобразовании вложенной индексации массивов (
arr[arr[arr[...]]]). #105142 (Alexey Milovidov). - Исправлены некорректные результаты для
RIGHT ANY JOIN, когда в правой таблице одному ключу соответствовало несколько строк, а выходной block разбивался из-за ограничений по размеру. Закрывает #99431. #102064 (Vladimir Cherkasov). - Добавлена проверка на переполнение стека в
Avroreader при десериализации вложенных типов. #102417 (Pavel Kruglov). - Исправлены дублирующиеся строки в
system.completionsдля настроекMergeTree: каждое имя настройки появлялось дважды, потому что выгружались иgetMergeTreeSettings, иgetReplicatedMergeTreeSettings, хотя имена настроек у них совпадают. Закрывает #102013. #102015 (Groene AI). - Исправлено блокирование завершения работы
StorageObjectStorageQueue(S3Queue,AzureQueue) до тех пор, пока частично обработанные файлы не будут полностью прочитаны из Объектного хранилища. Теперь источник немедленно прерывает чтение при завершении работы; дедупликация гарантирует, что строки, уже переданные в целевую таблицу до завершения, не будут дублироваться при повторной обработке файла при следующем запуске. #103126 (Tuan Pham Anh). - Исправлена вставка нескольких блоков в движок таблицы
Aliasсinsert_deduplication_token, чтобы сохранялись все блоки. #103246 (Enric Calabuig). - Исправлено поведение
JSONHasиJSONExtractBoolдля нативных столбцовJSON, которые возвращали извлечённое значение (приведённое кUInt8) вместо0/1. #103313 (zxuhan7). - Входной формат
CustomSeparatedзащищён от некорректных или злонамеренных данных, в которых отсутствуетformat_custom_row_after_delimiter. Обнаружение заголовка, вывод схемы и строки с переменным числом столбцов ранее без ограничений накапливали поля и могли выделить много гигабайт памяти до сбоя. Теперь чтение завершается сINCORRECT_DATA, если одна строка содержит более 1,000,000 полей. #103404 (Groene AI). - Исправлен
RESTOREреплицируемых таблицMergeTree, чтобы при Attach восстановленных частей использовалсяbackup_restore_keeper_max_retriesвместо обычного бюджета повторных попыток Keeper для вставки. #104610 (Pablo Marcos). - Исправлены неверные результаты для
WHERE p AND <LowCardinality(Nullable(int)) constant>в таблицахMergeTree. Ранее такие запросы возвращали ноль строк, потому что оптимизация part pruning выводила значениеNULLпо умолчанию из типаLowCardinality(Nullable(...))и синтезировала защитное условиеnotEquals(x, NULL), отсекая каждую часть. #104767 (Groene AI). - Исправлен некорректный результат агрегации при группировке по неинъективной функции столбца, который также является ключом партиционирования (например,
PARTITION BY aсGROUP BY intDiv(a, 2)илиa % 2). Значения из разных партиций, попадавшие в одну и ту же группу, не сливались, что приводило к дублирующимся строкам групп приallow_aggregate_partitions_independently = 1. #104869 (Nihal Z. Miaji). - Исправлена гонка при передаче снимка
Keeper, из-за которой снимок мог быть удалён или перемещён в момент его отправки восстанавливающемуся follower. #104941 (Antonio Andelic). - Исправлена скрытая ошибка с неверным результатом в
hilbertEncodeиmortonEncode, при которой неконстантный первый аргументTuple(маска диапазона) использовал значения из строки 0’ для вычисления сдвига битов во всех строках. Теперь функции вычисляют значения маски для каждой строки, поэтому результат больше не зависит ни от того, является ли входное значение константным, ни от размера блока. #104992 (Groene AI). - Исправлено, что
clickhouse-localмолча игнорировал пользовательскую конфигурацию (profiles,users,quotas, настройки управления доступом), когда конфигурационный файл автоматически обнаруживался по путям./clickhouse-local.xml,~/.clickhouse-local/config.xmlили/etc/clickhouse-local/config.xml. Ранее эти настройки применялись только при передаче--config-fileили если./config.xmlсуществовал в текущем каталоге; теперь все пути обнаружения ведут себя согласованно. #105008 (Groene AI). - Исправлена проблема, из-за которой столбцы
BFloat16при сравнении со строковым литералом молча возвращали ноль совпадений (например,WHERE bf16_col = '49.9'). #105042 (Raúl Marín). - Исправлена обработка
CLEAR COLUMNи TTL во время слияний вSummingMergeTree,AggregatingMergeTreeиCoalescingMergeTree, когда столбцы, необходимые для слияния, отсутствуют или срок их TTL истёк. Закрывает #101953. #105203 (Antonio Andelic). - Исправлена гонка между
DNSCacheUpdater::runиContext::reloadClusterConfig: перед разыменованиемshared->clusters_configдобавлена явная проверка наnull. #105220 (Mikhail f. Shiryaev). - Исправлен
best_effort-парсинг даты и времени дляtoDateTime64с точностьюmsиns. #105233 (Kaviraj Kanagaraj). - Исправлено поведение
OSIOWaitMicroseconds, который сообщал о времени ожидания I/O за весь срок жизни потока, а не в рамках отдельного запроса. #105246 (Mikhail f. Shiryaev). - Движок таблицы
Hudiтеперь выдаётINCORRECT_DATA(обычное исключение уровня запроса) вместоLOGICAL_ERROR, если файл Parquet в каталоге таблицы не соответствует соглашению об именовании Hudi[FileId]_[FileWriteToken]_[Timestamp].[extension]. Раньше такие имена файлов вызывали исключение в debug-сборках. #105266 (Groene AI). - Исправлена взаимная блокировка в
ParallelFormattingOutputFormatпри сбое планирования: когдаscheduleFormatterThreadForUnitWithNumberгенерирует исключение (например,CANNOT_SCHEDULE_TASK), элемент оставался в состоянииREADY_TO_FORMATбез потока-форматтера для его обработки, что приводило к зависанию. Теперь вызов планирования обёрнут вtry/catch, а любой сбой передаётся черезonBackgroundException, чтобы коллектор завершался корректно. #105275 (Azat Khuzhin). - Исправлена незаметная потеря данных в
Distributedasync inserts при восстановлении после аварийного завершения: если последний файл.binв сохранённом батче был целым, а один из файлов в середине — повреждённым,DistributedAsyncInsertBatch::recoverBatchпроверял только заголовок последнего файла, после чегоsendBatchпомечал весь батч — включая неповреждённые файлы — как повреждённый, из-за чего терялись их строки. Теперь заголовок каждого файла проверяется отдельно, поэтому вbroken/перемещается только действительно повреждённый файл, а уцелевшие строки доходят до удалённого сегмента. #105281 (Groene AI). - Исправлена регрессия в
clickhouse extract-from-config --try: когда конфигурация использовала атрибутыfrom_envи не содержала элементаinclude_from(или содержала его, но он указывал на отсутствующий файл), все подстановкиfrom_envмолча отбрасывались и возвращались как пустые строки. Это ломало определение порта в Docker entrypoint в 26.2.5. Закрывает #101704. #105283 (Groene AI). - Исправлена ошибка
INSERT INTOв таблицуSQLite, из-за которой при вставке значения типаEnum,JSONилиAggregateFunction, чьё текстовое представление содержало одинарную кавычку, возникала синтаксическая ошибка SQLite. Настройкаoutput_format_values_escape_quote_with_quoteтеперь учитывается соответствующими сериализациями (раньше это работало только дляStringиFixedString). #105285 (Groene AI). - Исправлена ошибка
Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists, возникавшая в распределённых запросах сallow_push_predicate_ast_for_distributed_subqueries = 1(по умолчанию), когда кортежGLOBAL INсопоставлялся с подзапросом, в проекции которого есть дублирующиеся имена столбцов, например(x, y) GLOBAL IN (SELECT number, number FROM numbers(5)). #105290 (Groene AI). - Исправлено поведение
reinterpretдляArray(LowCardinality(...)): раньше во время выполнения возвращалась вводящая в заблуждение ошибкаNOT_IMPLEMENTED, а теперь при проверке типов возвращаетсяILLEGAL_TYPE_OF_ARGUMENT. #105301 (Raúl Marín). minMap/maxMap(форма с массивом) иminMappedArrays/maxMappedArraysтеперь обрабатываютNaNсогласованно сORDER BY:NaNсчитается последним (возвращается только если все значения —NaN). Раньше результаты зависели от позицииNaNв данных из-за семантики неупорядоченного сравнения IEEE 754 и расходились с формойMap-аргумента уminMap/maxMap, которая была исправлена в #100448. #105331 (Raúl Marín).- Исправлена утечка памяти в кэше
ColumnsDescriptionна уровне таблицы для таблиц семействаMergeTreeсо столбцамиNested. Записи никогда не вытеснялись при циклахALTER ADD COLUMN/DROP COLUMN, когдаshare_nested_offsets = 1(по умолчанию). #105376 (Groene AI). - Исправлено исключение
BAD_ARGUMENTS“It’s a bug! Only integer types are supported by__bitWrapperFunc”, возникавшее, когда вSELECTс индексом пропуска данныхTYPE set(N)атом вWHEREимел тип результатаFloat,BFloat16или любой другой нецелочисленный тип (например,WHERE c0 + 0.1илиWHERE log(c0)). В этом случае индекс пропуска данных теперь переключается на обычный путь фильтрации. #105384 (Groene AI).
Улучшения сборки/тестирования/упаковки
- Прекращено использование системных библиотек и заголовочных файлов
compiler-rt. Закрывает #91475. #102857 (Konstantin Bogdanov). - Обновлён базовый distroless-образ Docker для устранения CVE OpenSSL в
libssl3t64. #103583 (Rahul Nair). - Во время выпусков GPG-ключ теперь надёжно получается через цепочку из нескольких серверов ключей Ubuntu вместо ожидания тайм-аута на
keyserver.ubuntu.com. #103834 (Mikhail f. Shiryaev). - Удалены и запрещены проверки
CMakeна этапе сборки (check_*,try_compile,try_run). Компилятор и набор инструментов фиксированы, поэтому определение возможностей на этапе конфигурации не требуется и теперь заблокировано на уровне всего проекта; любое поведение, зависящее от версии, должно явно ограничиваться черезCMAKE_CXX_COMPILER_VERSION. #103980 (Alexey Milovidov). libarchiveобновлён с 3.8.6 до 3.8.7. #104047 (Robert Schulze).mongo-c-driverобновлён до 2.3.0. #104300 (Raúl Marín).- Обновлены зависимости LLVM для 22.x. #104381 (Joshua Carp).
- Обеспечена сборка классов embedded-client и дескриптора PTY на macOS и FreeBSD за счёт использования переносимых POSIX-функций
posix_openpt/grantpt/unlockptи удаления специфичных для Linux защитных конструкций#if. #104436 (Alexey Milovidov). librdkafkaобновлён до версии 2.14.1. #105222 (János Benjamin Antal).
Релиз ClickHouse 26.4, 2026-04-30. Презентация, Видео
Обратно несовместимое изменение
- Оператор
INтеперь использует семантику точного соответствия значений для типаBool: значениямBoolсоответствуют только0и1в наборе. Ранее числовые значения больше255в набореINпри сравнении сBoolошибочно приводились к true, поэтомуSELECT CAST(1, 'Bool') IN (256)возвращал 1. Теперь он корректно возвращает0. Закрывает #92980. #93115 (Ashrith Bandla). - Библиотека H3 обновлена до v4, что повышает точность вычисления длины, площади и других метрик. Это обратно несовместимое изменение, поскольку новые результаты отличаются от прежних. #100348 (Alexey Milovidov).
- Теперь запрещено использовать
SELECTкак некавыченный идентификатор в элементе списка выраженийWITH. #101059 (Aruj Bansal). - Этот патч меняет то, как таблица Merge обрабатывает виртуальные столбцы. Если базовая таблица содержит
_tableили_database, эти столбцы будут считываться из хранилища; в противном случае они будут заполняться после этапа чтения на шаге expression. #101742 (Mikhail Artemenko). - Оператор
INтеперь также отклоняет преобразованияDecimalс потерей точности внутри составных типов (Tuple,Array,Map), что делает его поведение согласованным со скалярными сравнениями верхнего уровня. Ранее проверки точности применялись только к скалярным значениям верхнего уровня: например,CAST('33.3', 'Decimal64(1)') IN (33.33)корректно возвращал0, ноCAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])ошибочно возвращал1, поскольку преобразование с потерей точности происходило внутриArray. Теперь в обоих случаях корректно возвращается0. #101812 (Nihal Z. Miaji). - Значения по умолчанию для
http_max_fieldsуменьшены с 1,000,000 до 1,000, а дляhttp_max_field_name_size— со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до аутентификации. Добавлены настройкиhttp_max_request_header_sizeиhttp_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda).
Новая возможность
- Добавлен автоматический сброс на диск для
hashJOIN и параллельногоhashJOIN: при достижении лимита памяти они преобразуются вgrace hashJOIN. Это поведение управляется параметромmax_bytes_before_external_join. #97813 (János Benjamin Antal). - Добавлена поддержка Arrow Flight SQL. #91170 (Yakov Olkhovskiy).
- Добавлена поддержка инкрементального чтения для движков таблиц
Paimonс отслеживанием прогресса снимков в Keeper, включая выборочное чтение дельты снимка черезpaimon_target_snapshot_id, а также расширено покрытие тестами для сопоставления типов, отсечения партиций и сценариев инкрементального чтения. #93655 (XiaoBinMu). - Функция
stemтеперь больше не экспериментальная (раньше нужно было включить настройкуallow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). Теперь с помощью функцииstemможно легко выполнять стемминг всех слов/токенов в столбцах типовString,FixedString,Array([Fixed]String),Nullable,LowCardinalityиConst. #99137 (Jimmy Aguilar Mena). - Реализовано новое поведение
max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rows,min_insert_block_size_bytesв процессе squashing в рамках настройки совместимостиuse_strict_insert_block_limits. #94207 (Kirill Kopnev). - Добавлена функция
arrayAutocorrelation(arr [, max_lag]), вычисляющая нормализованную автокорреляцию числового массива для каждого лага. Поддерживаются массивы целочисленных типов, типов с плавающей точкой и Decimal. #94776 (Wenyu Chen). - SQL-функция
obfuscateQuery. Закрывает #98010. #98305 (Xuewei Wang). - Добавлена поддержка типов Map и JSON/Object в атрибутах словаря. Теперь словари могут хранить и возвращать сложные типы, включая Map(String, String), Map(String, Array(String)), JSON и Nullable(JSON), в структурах FLAT и HASHED. #98627 (yanglongwei).
- Добавлены две новые настройки MergeTree —
replicated_fetches_min_part_levelиreplicated_fetches_min_part_level_timeout_seconds, которые позволяют репликам пропускать загрузку недавно вставленных (не слитых) частей с других реплик, снижая накладные расходы на репликацию при интенсивной ингестии. #98625 (tanner-bruce). - Добавлена поддержка индекса пропуска данных MergeTree для JSON-столбцов с использованием JSONAllPaths и типов индексов bloom_filter, tokenbf_v1, ngrambf_v1 и text (inverted), что позволяет пропускать гранулы на основе набора JSON-путей, присутствующих в каждой грануле. #98886 (Pavel Kruglov).
- Функция
printfтеперь поддерживает неконстантные строки формата, что позволяет задавать разные шаблоны формата для каждой строки в зависимости от значений столбцов. #98991 (Yash ). - Добавлен новый индекс-проекция
commit_order, переупорядочивающий данные в порядке вставки. #99004 (Mikhail Artemenko). - Добавлена функция
highlight, которая оборачивает вхождения искомых терминов в текстовой строке в HTML-теги (по умолчанию<em>/</em>). Поддерживает ASCII-сопоставление без учёта регистра, автоматическое слияние перекрывающихся совпадений и пользовательские открывающие/закрывающие теги. #99131 (Peng). - Реализованы квоты по хешу нормализованного запроса для защиты публичных сервисов ClickHouse от злоупотреблений. 1. Добавлена поддержка
NORMALIZED_QUERY_HASHв качестве типа ключа квоты — для каждого уникального нормализованного запроса создается отдельный бакет квоты, поэтомуCREATE QUOTA q KEYED BY normalized_query_hashотслеживает каждый уникальный запрос независимо. 2. Добавлена поддержкаQUERIES_PER_NORMALIZED_HASHв качестве типа ресурса квоты — ограничивает максимальное число выполнений любого отдельного нормализованного запроса в пределах интервала, поэтомуMAX queries_per_normalized_hash = 100не позволяет одному шаблону запроса выполняться более 100 раз. #99586 (Alexey Milovidov). - Теперь пользователи могут писать JOIN-запросы с использованием синтаксиса
NATURAL JOIN, который автоматически выполняет сопоставление по всем столбцам с одинаковыми именами и устраняет дубликаты этих столбцов в результате. #99840 (Peter Nguyen). - Добавлена поддержка
SET TIME ZONE 'tz'в качестве псевдонима дляSET session_timezone. #99883 (phulv94). - Добавлена поддержка параметризованных запросов в веб-интерфейсе (
play.html): параметры запроса вида{name:Type}распознаются, и для ввода их значений отображаются соответствующие поля. #100041 (Alexey Milovidov). - Поддержка стандартного предложения SQL
VALUESкак табличного выражения вFROM, например:SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). - В оператор
EXTRACTдобавлены единицы, совместимые с PostgreSQL:EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADE,MILLENNIUM. Также исправленEXTRACT(WEEK FROM date), который ранее выдавал ошибку. #100274 (Alexey Milovidov). - Добавлена поддержка составных литералов Interval по стандарту SQL с квалификаторами диапазона
TO, напримерINTERVAL '1:30' HOUR TO MINUTE. Внутри они раскладываются в суммы интервалов. #100453 (Desel72). - Добавлены асинхронные метрики памяти в буферах приёма и передачи TCP ядра (
sk_rmem_alloc,sk_wmem_alloc) для сокетов пула HTTP-соединений, представляемые в виде процентилей p50/p75/p90/p95 и суммарных значений по каждой группе соединений. #100575 (Sema Checherinda). - Добавлен веб-интерфейс jemalloc для просмотра данных профилирования ClickHouse Keeper, доступный по адресу
/jemallocна порту управления по HTTP. #100606 (murphy-4o). - Добавлена команда
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'для режимовorderedиunordered. #100709 (Bharat Nallan). - Добавлена функция
JSONAllValues, которая возвращает все значения из столбцаJSONкакArray(String); значения сериализуются в текстовое представление и упорядочиваются по именам путей. Добавлена поддержка текстового индекса для выраженияJSONAllValuesв столбцахJSON. Когда текстовый индекс создаётся дляJSONAllValues(json_column), он автоматически используется для фильтрации запросов по подстолбцамJSON(например,json_column.key1 = 'value'). #100730 (Anton Popov). - Добавляет новую настройку
input_format_column_name_matching_mode, которая позволяет задавать разную чувствительность к регистру для форматов ввода. #99346 (manerone). - Добавлена команда
watchвclickhouse-keeper-client, а в командахget,existsиls— поддержка наблюдения. #100834 (Den Kalantaevskii). - В ClickHouse Keeper добавлены запрос
getChildrenRecursive(ListRecursive) и командаlsrвclickhouse-keeper-client. Это закрывает #99916. #100998 (Konstantin Vedernikov). - Добавлена новая функция
arrayTranspose, которая принимает двумерный массив (матрицу) и транспонирует его:SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]]). #101214 (Vitaly Baranov). - У настройки
auto_statistics_types mergetreeзначение по умолчанию —'minmax, uniq'— статистики minmax и uniq теперь автоматически создаются для всех подходящих столбцов в новых таблицах - уmaterialize_statistics_on_insertзначение по умолчанию — false — статистика теперь строится во время слияний, а не при вставке, что снижает накладные расходы на вставку. ИспользуйтеSET materialize_statistics_on_insert = 1, чтобы восстановить прежнее поведение. #101275 (Han Fei). - Добавлена настройка
prefer_dependency_replicaдля обновления цепочек зависимостей materialized view, чтобы сократить потери данных из-за задержки репликации между репликами. #101591 (Seva Potapov). - Добавлена функция
hasPhrase(псевдонимmatchPhrase) для поиска по фразам (непрерывным последовательностям токенов). Поиск выполняется методом полного перебора, то есть текстовый индекс его пока не поддерживает. #101997 (Elmi Ahmadov). - Добавлены метрики-гистограммы
s3_read_request_duration_microsecondsиs3_read_request_bytes, чтобы отслеживать время жизни соединений для запросов S3 GET и объём потребляемых байтов; они доступны вsystem.histogram_metricsи в конечной точке Prometheus. #102058 (Sema Checherinda). - Значения
DateиDate32теперь можно складывать со значениямиTimeиTime64с помощью оператора+, получая результат типаDateTimeилиDateTime64. Например,SELECT toDate('2024-01-15') + toTime('14:30:25')возвращает2024-01-15 14:30:25. Результат вычисляется с учетом часового пояса сеанса, а результаты, выходящие за допустимый диапазон, обрабатываются в соответствии с настройкойdate_time_overflow_behavior. Закрывает #95914. #102421 (Nihal Z. Miaji). - Текстовый индекс теперь имеет статус GA и остается включенным независимо от настройки
compatibility, что предотвращает его неожиданное отключение при восстановлении из резервных копий или работе в режиме совместимости. #101518 (Nikita Fomichev).
Экспериментальные возможности
- Добавлена команда
ALTER TABLE ... EXECUTE remove_orphan_filesдля таблиц Iceberg, позволяющая выявлять и удалять файлы без ссылок из Объектного хранилища. #99127 (murphy-4o). - Добавлена настройка
query_plan_optimize_join_order_randomize, которая случайным образом изменяет статистику, используемую для переупорядочивания JOIN, что полезно для тестирования. #100643 (Vladimir Cherkasov). - В ClickHouse добавлена поддержка функции ИИ, позволяющая пользователям вызывать конечные точки OpenAI и Anthropic с помощью SQL.
aiGenerateстала первой такой функцией. #100831 (George Larionov). - Добавлены функции ИИ:
aiClassify,aiExtractиaiTranslateдля использования API LLM в ClickHouse. #100832 (George Larionov). - Добавлена
system.histogram_metric_log— новая системная таблица, которая периодически создает снимки всех гистограммных метрик (например, задержек S3/Azure и длительности этапов обработки запросов Keeper). Кроме того, столбецvalueтаблицыsystem.histogram_metricsизменен наFloat64, так как этот тип более гибок и лучше совместим с моделью данных Prometheus. #103046 (Miсhael Stetsyuk). Структура таблицы, вероятно, изменится в будущих релизах.
Повышение производительности
- ClickHouse теперь может исключать целые части данных в SELECT-запросах на основе статистики min/max. #94140 (zoomxi).
- Снижена конкуренция за блокировки при операциях только для чтения в таблицах ReplicatedMergeTree с завершёнными мутациями. #95771 (Eduard Karacharov).
- Параметр
optimize_read_in_orderтеперь учитывается при чтении проекций. Закрывает #89453. #95885 (Andrey Zvonov). - Небольшие улучшения в Hash JOIN и параллельном хеш-соединении. #96663 (Yarik Briukhovetskyi).
- Оптимизировано преобразование
DISTINCTза счёт отключения оптимизации для столбцовLowCardinality, если входные данные почти полностью состоят из уникальных значений. #97113 (Nihal Z. Miaji). - Оптимизация производительности запросов
LIKEиз #97723. Теперь эти запросы могут использовать текстовые индексы. #98149 (Elmi Ahmadov). - Векторизованные математические функции (
exp,log,sigmoid,tanh) теперь работают быстрее на AArch64 (с использованием NEON/SVE), а также на FreeBSD/Darwin, где раньше использовалась более медленная скалярная реализация. #98230 (Raúl Marín). - В запросах, фильтрующих по столбцам первичного ключа
MergeTreeс помощью regexp-альтернаций из строковых литералов, таких как^(abc-1|abc-2), теперь можно использовать отсечение по первичному ключу, если альтернативы имеют общий префикс. #98988 (Yash ). - Динамическая фильтрация top-k для
ORDER BY ... LIMITобобщена и теперь поддерживает типыNullable,StringиCOLLATE. #99033 (murphy-4o). - Ускорен hash JOIN по ключам
Int32иInt64с небольшим диапазоном благодаря использованию хеш-таблицы с прямой индексацией. #99275 (Hechem Selmi). - Более быстрые несмежные запросы к столбцам
LowCardinalityс одним словарём. #99285 (Ivan Babrou). - Ускорены функции
var*Stableиstddev*Stableдля столбцовFloat64благодаря девиртуализации внутреннего цикла. Примечание: это позволяет задействовать оптимизации компилятора (FMA/регистры), которые изменяют результаты вычислений с плавающей запятой на уровне ULP. #99460 (Riyane El Qoqui). - Используется оптимизированное кодирование Firedancer base58 для входных данных размером 32/64 байта (автоматически для
base58Encode). Также можно использовать оптимизированное декодирование base58, если результат декодирования имеет размер 32/64 байта (явно черезbase58Decode('...', 32)или аналогичным образом). #99461 (Joanna Hulboj). - Включены оптимизации на основе секций компоновщика (
-ffunction-sections,-fdata-sections,--icf=all) для уменьшения размера бинарного файла и более эффективного использования кэша инструкций. #99474 (Alexey Milovidov). - Исправлено ухудшение масштабируемости для коротких запросов с агрегацией на машинах с большим числом ядер. Когда запрос читает мало marks, конвейер после агрегации больше не разрастается до
max_threads, что позволяет избежать накладных расходов из-за почти пустых потоков. #99493 (Alexey Milovidov). - Повышена производительность запросов с параллельными репликами за счёт правильного выбора размера задачи чтения. #99801 (Nikita Taranov).
- Разрешена предзагрузка при чтении удалённого файла через кэш страниц в пространстве пользователя. #99919 (Alexey Milovidov).
- Устранено лишнее вычисление подстолбца String
.sizeпри перечислении подстолбцов. #99941 (Pavel Kruglov). - Сделали индикатор прогресса в clickhouse-client более плавным при работе из отеля с кластерами с очень большим количеством реплик. #100145 (Alexey Milovidov).
- Запускается
MemoryWorkerвclickhouse-local, когда включен кэш страниц, чтобы кэш страниц в пространстве пользователя действительно мог использоваться. #100306 (Alexey Milovidov). - Оптимизировано выполнение запросов за счёт переноса условия
LIMITвнутрьUNION ALL. #100364 (Alexey Milovidov). - Добавлена поддержка JIT-компиляции для сравнений столбцов
StringиFixedStringвORDER BY, что повышает производительность сортировки на фазе merge на 6–17% для ключей сортировки, в которых преобладают строковые столбцы. В соавторстве с @lgbo-ustc. #100577 (Raúl Marín). - Когда
read_in_order_use_virtual_rowвключен вместе с новой настройкойread_in_order_use_virtual_row_per_block, информация о границах виртуальных строк теперь выдается после чтения каждого блока изMergeTree, что позволяет механизму слияния на лету перераспределять приоритеты источников для частей, данные которых полностью отфильтровываются условиямиWHERE/PREWHERE/JOIN. Закрывает #99945. #100603 (Vladimir Cherkasov). - Ускорено преобразование Float в String для больших целочисленных значений за счёт расширения быстрого пути
itoaс помощью совместимого с dragonbox округления. #100649 (Raúl Marín). - Заменили
dragonboxнаzmij, что ускорило преобразование Float-to-String в 1,5–3 раза. #100650 (Raúl Marín). - Ускорено преобразование
Int128/UInt128в строку за счёт замены программного деления на редукцию Барретта и разворачивания цикла преобразования. #100671 (Raúl Marín). - Предотвращено создание лишних потоков при параллельном
mergeвuniqExact. #100686 (Jiebin Sun). - Для
uniqExactдобавлено параллельное слияние батчей. #100687 (Jiebin Sun). - Улучшена распараллелизация запросов с простыми представлениями на базе таблицы
MergeTree, выполняемых в режиме параллельных реплик. #100815 (Igor Nikonov). - Добавлена поддержка параллельных реплик для простых представлений (включая подходящие представления
UNION ALLнад таблицамиMergeTree) приparallel_replicas_allow_view_over_mergetree=1. Это позволяет распараллеливать внешний запрос представления вместо внутреннего, что повышает степень распараллеливания запросов между узлами. #100958 (Igor Nikonov). - Оптимизировано чтение в порядке первичного ключа для
full_sorting_mergeпри наличии в плане запроса фильтров сIN. #101261 (Nikita Taranov). - Оптимизация операций выделения/освобождения памяти за счёт кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Исправлена значительная регрессия производительности INSERT при
deduplicate_insert = 'enable'(по умолчанию с версии 26.2): вычисление хеша данных перенесено с этапа squashing в sink, а для хеширования столбцов батча используетсяupdateHashWithValueRange, что сокращает накладные расходы примерно с 2,5 с до 0,5 с для 5 млн строк и 22 столбцов. #101494 (Sema Checherinda). - Снизили накладные расходы на профилирование блокировок, используя
try_lock, чтобы не замерять время захватов без конкуренции, и убрали измерение времени удержания. #101502 (Antonio Andelic). - Реализована замена написанных вручную AVX-512 intrinsic-функций в
arrayDotProductна платформонезависимые автоматически векторизуемые циклы, с добавлением поддержки AVX2 и ARM NEON. #101571 (Peng). - Повышена производительность
INSERT VALUESдля столбцовMap,ArrayиTuple, когда значения передаются как экранированные строки (например,'{\'key\':1}'), что позволяет избежать ненужного переключения на парсер SQL-выражений. #102119 (Joanna Hulboj). - Исправлено чрезмерное использование CPU движком таблицы
RabbitMQ. #102711 (Jaap Elst). - Оптимизатор порядка JOIN теперь выводит транзитивные предикаты экви-соединения из существующих условий JOIN. Например, для
A.x = B.x AND B.x = C.xраспознаётся эквивалентностьA.x = C.x, что позволяет оптимизатору рассматривать Direct JOIN между таблицами, связанными транзитивно. Это может улучшить качество плана выполнения для схем «звезда» и «снежинка», где таблицы измерений соединяются через общую таблицу фактов. Эта возможность управляется новой настройкойenable_join_transitive_predicates(по умолчанию отключена). #98479 (Alexander Gololobov). - Оптимизирован
TRUNCATE DATABASE TABLES LIKEблагодаря предварительной параллельной отмене слияний. #98597 (Shaohua Wang). - Добавлена поддержка монотонности для функции multiply, что позволяет выполнять отсечение данных по первичному ключу для выражений
key * constant. #98983 (Amos Bird). - Словари cache больше не используют эксклюзивную блокировку в
hasKeys; это уменьшает конкуренцию за блокировки, так как для чтения из cache теперь используется разделяемая блокировка. #100796 (liuguangliang). - Подзапрос VIEW встроен в дерево запроса, что позволяет применять к VIEW больше оптимизаций. #100830 (Dmitry Novik).
- Ускорена загрузка кэша при запуске сервера. #101500 (Kseniia Sumarokova).
- Реализована отложенная материализация столбцов для ReplacingMergeTree с FINAL при достаточно селективном предикате. #101647 (Nikolai Kochetov).
- Снова включена оптимизация
optimize_rewrite_array_exists_to_has(по умолчанию отключена с версии 23.10). Она преобразуетarrayExists(x -> x = elem, arr)в гораздо более быстрыйhas(arr, elem)и теперь корректно пропускает такое преобразование, если тип элемента массива иelemнесовместимы дляhas(например,DateиString), поэтому запросы, которые раньше ломались, продолжают работать. Закрывает #71431. #100944 (Alexey Milovidov).
Улучшения
- Улучшен вывод EXPLAIN PLAN pretty=1: теперь выводятся выходные столбцы запроса верхнего уровня, показываются метки/обозначения отношений JOIN с оценкой числа результирующих строк и локальности, а также выходные столбцы для каждого шага JOIN/источника. Изменения охватывают часть Information Deficit из #98117. #99462 (Kirill Kopnev).
- Добавлена настройка таблицы семейства MergeTree
share_nested_offsets(по умолчаниюtrue). Если задатьfalse, столбцы типа Array с именами через точку (например,n.a,n.b) будут рассматриваться как независимые столбцы, а не совместно использовать файлы смещений и проверять равенство размеров массивов в рамках устаревшей семантикиNested. #98416 (Amos Bird). - Теперь в конфигурации users.xml/yaml можно указывать несколько методов аутентификации (в SQL это всегда было возможно). #91998 (Flip-Liquid).
- Автоматическая перезагрузка межузловых соединений Raft, использующих TLS. #93455 (Evgeny).
- Расширена поддержка
cast_keep_nullableдля типов Dynamic/JSON. Если параметр включён, приведение NULL из типов, которые могут быть Nullable, вернёт NULL; в противном случае будет сгенерирована ошибкаCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov). - Снижен объем памяти, занимаемой внутренними структурами данных (объектами
ISerialization), за счет введения пула объектов. #96563 (Nikita Mikhaylov). - Добавлена поддержка полей
passwordиidentityв XML-конфигурации клиента Keeper. #96800 (Grigorii Sokolik). - Улучшена запись в
Icebergдля Unity Catalog. #98162 (Konstantin Vedernikov). - Добавлена настройка
finalize_projection_parts_synchronously, которая позволяет синхронно финализировать части проекций при INSERT, снижая пиковое потребление памяти у таблиц с большим числом проекций и сохраняя при этом существующее асинхронное поведение по умолчанию. #98228 (Amos Bird). - Добавлен столбец
projections_duration_msвsystem.part_log, который фиксирует длительность слияния/перестроения для каждой проекции в миллисекундах. #98292 (Amos Bird). - Улучшена отмена запросов, использующих ExpressionTransform и NumbersRangedSource, с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #98908 (Roman Vasin).
- Жестко заданный список
source_table_enginesзаменен на lookup во время выполнения черезStorageFactory::getAllStorages(). Это добавляет проверки доступа для некоторых ранее отсутствовавших движков таблиц и закрывает #71544. #98984 (pufit). - Добавлена настройка для управления поведением при несовпадении типов для Variant и Dynamic (
throwили возврат NULL). #99085 (Bharat Nallan). - Улучшена совместимость
Icebergи Spark: исправлена непоследовательная обработка путей, вызванная смешением путей хранилища и путей метаданных; обеспечено, чтобы таблицыIcebergзаписывали расположение таблицы либо как URL, либо как абсолютный путь; добавлен резервный механизм для подсчета размеров файлов вAzure, поскольку некоторые средства чтения ClickHouse не поддерживают подсчет байтов после обхода; обработкаversion-hint.txtприведена в соответствие со Spark; введены абстракции на уровне типов, чтобы в будущем было сложнее перепутать типы путей; добавлены тесты дляAzureиLocal, проверяющие междвижковую совместимость без промежуточной выгрузки и загрузки; исправлено использование position deletes, которое ранее опиралось на эвристики определения путей там, где такой подход неприменим. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik). - Исправлена возможная ситуация гонки в
IPartitionStrategy::cached_result, появившаяся в https://github.com/ClickHouse/ClickHouse/pull/92844. #99400 (Arthur Passos). - Теперь типы данных ClickHouse Interval можно записывать в формате Arrow. #99519 (Peter Nguyen).
- Добавлена встроенная поддержка импорта и экспорта типов данных
UUIDв форматахArrowиParquet. Теперь пользователи могут напрямую выполнять запросы к UUID-данным и передавать их между ClickHouse и другими инструментами работы с данными без ручного преобразования в строки и других обходных решений. Автоматическое логическое определение для UUID верхнего уровня, а также поддержка явного указания схемы для вложенных UUID. #99521 (Ivan). - Поддержка архивов
7zв объектном хранилище. Закрывает #70968. #99600 (Alexey Milovidov). - Добавлены события ProfileEvents
ObjectStorageListedObjects,ObjectStorageGlobFilteredObjects,ObjectStoragePredicateFilteredObjectsиObjectStorageReadObjectsдля интроспекции конвейера перечисления и чтения файлов в объектном хранилище (S3,Azureи т. д.). #99778 (Sema Checherinda). - Исправлен сбой табличной функции
mergeс ошибкойUNKNOWN_IDENTIFIERпри запросе столбцов, присутствующих не во всех базовых распределённых/удалённых таблицах. #99833 (Alexey Milovidov). - Теперь время коммита включается в общую метрику времени выполнения мутации для ReplicatedMergeTree. Оно перестало учитываться после #96376. #99936 (alesapin).
- Добавлен журнал предзаписи для blob-объектов, ожидающих удаления в
MetadataStorageFromDisk, что повышает надёжность и согласованность метаданных с удалённым объектным хранилищем при удалении объектов. #100019 (Maksim Kita). - Отключена функция генерации SQL с помощью ИИ (
??) во встроенном клиенте (протоколы SSH и WebSocket), чтобы предотвратить доступ к переменным окружения сервера. #100290 (Alexey Milovidov). - Изменён интерфейс вставки в Iceberg через каталог. Настройки
storage_catalog_type,storage_aws_access_key_idи т. д. объявлены устаревшими. #100334 (Konstantin Vedernikov). - При вставке в
clickhouse-clientзаменять табуляцию на 4 пробела. Закрывает #100405. #100416 (Raúl Marín). - Сканирование всего удалённого каталога озера данных в поисках подсказок к таблицам «Возможно, вы имели в виду …» больше не выполняется, если
show_data_lake_catalogs_in_system_tablesотключён. #100452 (Alsu Giliazova). - Применение
distributed_index_analysis_min_indexes_bytes_to_activateпосле отсечения партиций. #100477 (Azat Khuzhin). - Исправлена ошибка assert при проталкивании bloom filter для Parquet при использовании пустых секций IN/NOT IN. #100543 (zoomxi).
- Статистика MinMax для столбцов теперь хранит минимальные и максимальные значения как типизированные Field, а не как Float64. Сериализованный формат включает имя типа столбца наряду со значениями. Версия файла статистики повышена до V2; файлы, записанные старыми версиями, требуют повторной материализации (ALTER TABLE … MATERIALIZE STATISTICS ALL). исправлено #53140. #100605 (Han Fei).
- Обновлён
cppkafka: добавлено исправление взаимной блокировки при закрытии Consumer. #100612 (Azat Khuzhin). - Информация об объекте, используемая для разбора data files в Iceberg, теперь включает количество строк в файле и размер файла в байтах, извлечённые из manifest file. #100645 (Daniil Ivanik).
- Добавлен параметр конфигурации
use_separate_cache_arena, позволяющий управлять использованием отдельной арены памяти для кэша. #100664 (Seva Potapov). - Добавлена нативная поддержка импорта типов данных Apache Arrow
StringViewиBinaryViewв столбцыStringв ClickHouse, что повышает совместимость при ингестии на базе Arrow. #100762 (Ivan). - Некоторые настройки Keeper server теперь перезагружаются без перезапуска при изменении файла конфигурации во время выполнения: max_requests_batch_size, max_requests_batch_bytes_size, max_request_size, quorum_reads. #100773 (Michael Kolupaev).
- Увеличены счётчики profile events
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytesв релизной сборке. #100899 (Pavel Kruglov). - Отслеживание памяти в Cgroupv2 теперь исключает
slab_reclaimableиз памяти ядра, обеспечивая более точную оценку использования памяти, не подлежащей освобождению. #100901 (Antonio Andelic). use_partition_pruning = 0теперь также отключает отсечение по индексуMinMaxи оптимизацию дляcountна столбцах ключа партиционирования, помимо отключения отсечения по ключам партиционирования. #100904 (Nihal Z. Miaji).pretty=1вEXPLAIN [PLAN]теперь выводит выражения в человекочитаемом формате. #100927 (Kirill Kopnev).accurateCastOrNullиaccurateCastOrDefaultтеперь поддерживают целевые типыTuple, включая вложенныеTupleс элементамиNullable. Ранее эти функции не принималиTupleв качестве целевого типа, посколькуTupleне мог находиться внутриNullable. Закрывает #100820. #100942 (Nihal Z. Miaji).- Исправлено дублирование диаграмм в интерфейсе Play при переключении между светлой и тёмной темами. #101058 (Alexey Milovidov).
- Обновлён chdig до v26.3.1 (интерфейс Perfetto, спарклайны в сводке по CPU/памяти/слияниям/запросам, system.warnings, поиск по регулярным выражениям в журналах). #101092 (Azat Khuzhin). Обновлён chdig до v26.4.3 (улучшения в Perfetto, исправления, связанные с общим доступом через pastila.nl, сравнение флеймграфов, изменение настроек в реальном времени). #103145 (Azat Khuzhin).
- Теперь перед запросом
SELECTв секцииWITHдопускается завершающая запятая. #101093 (Aruj Bansal). - Добавлена настройка MergeTree
compress_per_column_in_compact_parts, управляющая тем, как сжатые блоки организованы внутри компактных частей. Когдаtrue(по умолчанию, с сохранением текущего поведения), каждый столбец начинает новый сжатый блок, что позволяет выполнять выборочную распаковку. Когдаfalse, все столбцы в пределах гранулы упаковываются в один сжатый блок, что улучшает коэффициент сжатия и производительность чтения для рабочих нагрузок, в которых всегда читаются все столбцы. #101114 (Amos Bird). - Показывать всплывающую подсказку с информацией о таблице в интерфейсе Play только при наведении курсора на название таблицы, а не на всю строку. #101118 (Alexey Milovidov).
- Добавлены значки для конкретных движков и улучшено взаимодействие со списком таблиц на боковой панели интерфейса Play. #101134 (Alexey Milovidov).
- Добавлена поддержка
Nullable(Tuple)в форматахArrow,ArrowStream,ORCи устаревшем форматеParquet. #101272 (Nihal Z. Miaji). - Строка TOTALS теперь отображается в нижнем колонтитуле таблицы в веб-интерфейсе (play.html). #101286 (Alexey Milovidov).
- Поддержка режима работы с несколькими запросами в веб-интерфейсе (
play.html): одновременный запуск нескольких запросов с параллельным выполнением запросов типаSELECTи отдельным отображением результатов для каждого запроса. #101290 (Alexey Milovidov). - Исправлено изменение ширины столбца в веб-интерфейсе play.html после того, как таблицу результатов переработали в веб-компонент. #101295 (Alexey Milovidov).
- Добавлена возможность ограничивать количество сбросов профиля jemalloc при MEMORY_LIMIT_EXCEEDED в течение заданного интервала времени. #101396 (Azat Khuzhin).
- Добавлены настройки Keeper:
nuraft_streaming_mode(по умолчаниюfalse),nuraft_max_log_gap_in_stream,nuraft_max_bytes_in_flight_in_stream. Закрывает issue #90743. #101427 (Kseniia Sumarokova). - Добавлена асинхронная метрика
CGroupMemoryUsedWithoutPageCache, которая показывает использование памяти cgroup без учёта как кэша страниц ОС в ядре, так и кэша страниц в пространстве пользователя ClickHouse, по аналогии сMemoryResidentWithoutPageCache. Также уточнено описание метрикиCGroupMemoryUsed. #101513 (Francesco Ciocchetti). - Добавлен синтаксический сахар на уровне parser для синтаксиса стандартной SQL-функции
OVERLAY. Функцияoverlayуже существует; добавлена поддержка формы с ключевыми словамиPLACING,FROMиFORв качестве разделителей. #101681 (Desel72). - В системную таблицу
information_schema.tablesдобавлен псевдоним столбцаINDEX_LENGTH, аналогичный существующим в этой таблице псевдонимам в верхнем регистре. #101705 (Robert Schulze). - Системная таблица
information_schema.tablesтеперь не учитывает неактивные части таблицы. Благодаря этому отображаемые значения размера таблиц стали более реалистичными. #101706 (Robert Schulze). - Функция
ngramsтеперь отклоняет недопустимые значения длины n-грамм. Пример:SELECT ngrams('abc', 0)теперь возвращает ошибку. #101922 (Robert Schulze). - В продолжение #91820 и #90837: исключать неподдерживаемые алгоритмы из сообщений об ошибках; запускать тесты для FIPS в FIPS-сборках. #102067 (Mikhail f. Shiryaev).
- Высота ячеек в веб-интерфейсе (
play.html) ограничена тремя строками, с возможностью раскрытия по щелчку. #102154 (Alexey Milovidov). - Добавлена новая опция для принудительного использования стиля (virtual/path) для конечных точек S3. Решает #82019; #76007 Продолжение https://github.com/ClickHouse/ClickHouse/pull/83168. #102378 (Konstantin Vedernikov).
- Параметр
restore_replace_external_engines_to_nullтеперь также не восстанавливает базы данных с внешними движками (например,DataLakeCatalog,MySQL,PostgreSQL,S3) вместо того, чтобы завершаться ошибкой или устанавливать внешние подключения. #102400 (Nikita Fomichev). - Добавлена поддержка анализа текстового индекса для функции
hasPhraseв режимеHINT. #102438 (Elmi Ahmadov). - Считать STATISTICS доступными только для чтения в ColumnDependency, чтобы исправить LOGICAL_ERROR при MATERIALIZE STATISTICS ALL. #102627 (Konstantin Bogdanov).
- В режиме keeper-as-server теперь создаётся и заполняется
system.asynchronous_metric_log. #102664 (Miсhael Stetsyuk). - Добавлена опция config
default_system_log_flush_policy.skip_alias_columns, позволяющая исключать столбцы ALIAS из системных таблиц логов; это исправляет системные логи, использующие S3 в качестве хранилища и не принимающие столбцы ALIAS. #102669 (Miсhael Stetsyuk). - Не включайте автоматическую статистику для системных таблиц. Она им редко нужна. #102862 (Han Fei).
- Добавлена поддержка токенизатора
arrayдля оптимизации LIKE. #102880 (Elmi Ahmadov). - Отправлять MemoryAllocatedWithoutCheck даже в релизных сборках. #103064 (Azat Khuzhin).
- Появилась возможность просматривать untracked_memory для каждого потока в system.stack_trace. #103065 (Azat Khuzhin).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка
Block structure mismatch in stream, вызванная возвратом лишних столбцов при отложенной материализации. Исправляет #95191. #96682 (Nikolai Kochetov). - Исправлена логическая ошибка в запросе политики маскирования данных с
ON CLUSTER. #97594 (Bharat Nallan). - Исправлена ошибка при использовании Unity Catalog с GCS. #98456 (Melvyn Peignon).
DataLakeCatalogтеперь учитывает настройку сервераhttp_forbid_headersпри проверке параметраauth_header. #98827 (Michael Anastasakis).- Исправлены вызовы
HeadObjectпо схеме N+1 для S3 глоб-шаблонов с раскрытием фигурных скобок. #99219 (Konstantin Bogdanov). - Проверка изменений настроек в запросах CREATE, если сам движок тоже поддерживает настройки. #99279 (János Benjamin Antal).
- Исправлена ошибка, из-за которой
ALTER TABLE UPDATE/DELETEзавершался с ошибкойMissing columns, когда в таблице есть материализованный столбец, выражение которого зависит от эфемерного столбца. #99281 (Yash ). - Учетные данные в строках подключения JDBC, ODBC и NATS теперь маскируются в журнале запросов и выводе
SHOW CREATE, что предотвращает случайное раскрытие конфиденциальной информации. В строках подключения в формате URI (например,{scheme}://{user}:{password}@{host}) маскируется только пароль, а остальная часть остается видимой для удобства отладки. Настройкаnats_tokenтеперь тоже маскируется. #99344 (János Benjamin Antal). - Исправлена ошибка в
parseDateTimeBestEffort: функция неверно разбирала слова, начинающиеся с префиксов месяцев, в формате DD-month-YYYY. Закрывает #99345. #99350 (Pavel Kruglov). - Исправлено игнорирование TABLE_UUID_MISMATCH в режиме без analyzer. #99380 (Azat Khuzhin).
- Исправлена ошибка, из-за которой явные настройки, переданные вместе с
compatibilityв одном запросе, могли незаметно игнорироваться, если их значение совпадало со значением сервера по умолчанию. #99402 (Raufs Dunamalijevs). - Исправлена проблема, из-за которой числа с ведущими нулями в пути партиционирования Hive вызывали ошибки. Исправление #98801. #99458 (Yarik Briukhovetskyi).
- Исправлена ошибка heap-use-after-free, возникавшая при одновременном удалении таблицы и выполнении запроса на чтение (19 случаев в CI за последние 90 дней). #99483 (Alexey Milovidov).
- Исправлена ошибка в Keeper: запрос на чтение мог зависнуть (что приводило к тайм-ауту сеанса), если в тот же сервер в крайне неудачный момент закрывался другой, не связанный с ним сеанс. #99484 (Michael Kolupaev).
- Проверка структуры столбца перед применением патчей. #99531 (Seva Potapov).
- Исправлен сбой проверки
rows_sourcesпри вертикальном слиянии во время быстрого переключенияSYSTEM STOP/START MERGESдля таблицы со столбцамиDynamic. #99532 (Alexey Milovidov). - Исправлено некорректное отсечение партиций для
toWeek(), из-за которого запросы сWHERE toWeek(date, mode) = Nвозвращали пустой результат для недель 49–52 в таблицах, разбитых на партиции поtoYYYYMM(date). #99542 (Takumi Hara). - Исправлено исключение в функциях, работающих с ColumnReplicated при наличии строк без ссылок, созданных JOIN. #99564 (Hechem Selmi).
- Исправлена проблема, из-за которой
CLEAR COLUMNне перестраивал проекции и не выполнял повторный расчёт материализованных столбцов, зависящих от очищаемого столбца, что могло приводить к исключениям или повреждению данных при последующих слияниях. #99565 (Desel72). - Исправлено Исключение (
Bad get: has Tuple, actual type String) вConditionSelectivityEstimator, возникавшее, когда в запросе используется IN с одним скалярным параметром запроса (например,WHERE col IN ({p:String})) для таблицы, у которой есть статистика по столбцам и включенuse_statistics. #99614 (Ilya Yatsishin). - Часть с неизвестными проекциями не должна считаться безвозвратно потерянной. #99623 (Sema Checherinda).
- Исправлено редкое исключение из-за логической ошибки при Вертикальном слиянии, когда
SYSTEM STOP MERGESиSYSTEM START MERGESвыполняются одновременно. #99628 (Desel72). - Исправлена висячая ссылка в injectRequiredColumns, приводившая к сбою при слиянии. #99679 (Tuan Pham Anh).
- Исправлено неопределённое поведение в модуле чтения Avro format при чтении числовых значений, вызывающих переполнение целевого типа столбца. Теперь запросы завершаются ошибкой при переполнении вместо того, чтобы незаметно возвращать некорректные значения. #99697 (asyablue22).
- Исправлен разбор кавычек в стиле shell в аргументах табличной функции
executable. #99794 (Nikita Semenov). - Исправлено ложное срабатывание аварийного завершения в
NativeReaderпри десериализации потока в формате Native с несовпадением количества строк: код ошибки изменён сLOGICAL_ERRORнаINCORRECT_DATA, чтобы ситуация обрабатывалась как ошибка данных, а не вызывалаabort()в сборках sanitizer/debug. #99822 (Rahul Nair). - Исправлено аварийное завершение процесса при десериализации столбца
Tuple, когда тип сериализации в бинарном потоке —DETACHED. #99823 (Rahul Nair). - Исправлено ложное исключение
LOGICAL_ERROR, возникавшее при динамическом изменении размера файлового кэша из-за состояния гонки при повышении приоритета подочереди SLRU. #99850 (Alexey Milovidov). - Исправлено некорректное отображение нулевых значений
written_rows,read_rowsиresult_rowsдля запросов async insert вquery_logи выводе клиента. #99879 (Sema Checherinda). - Исправлено исключение “Неверное приведение типа X к Y” в
KILL QUERY, когда внутренний запрос к системным таблицам возвращает столбцы, обёрнутые вColumnConst. #99881 (Alexey Milovidov). - Исправлена логическая ошибка, связанная с коррелированным подзапросом в аргументе untuple. #99917 (Vladimir Cherkasov).
- Исправлено Исключение при вызове
right,rightUTF8или других функций извлечения подстроки с длиной INT64_MIN (-9223372036854775808), которое ранее приводило к неопределённому поведению из-за целочисленного переполнения. Теперь эти функции корректно возвращают ошибку ARGUMENT_OUT_OF_BOUND. #99934 (Jimmy Aguilar Mena). - Теперь ClickHouse должен корректно обрабатывать таблицы в стиле Spark (где для каждого файла указан полный абсолютный путь или относительный путь к общему пути таблицы). Исправляет #92348. #99935 (alesapin).
- Исправлено Исключение “Inconsistent AST formatting” для
ALTER TABLE ... MODIFY QUERYсо вложенными подзапросами, содержащимиSETTINGS, когда у самогоALTERтоже естьSETTINGS. #99938 (Nikita Mikhaylov). - Отменён #97114 “Перенести оценку числа строк на этапе JOIN перед проверкой на наличие 1 дочернего элемента” из-за подозрения на регрессию производительности. #99957 (Alexander Gololobov).
- Исправлена ошибка, из-за которой ClickHouse мог пропускать файлы, если в ответе на HEAD-запрос к ним отсутствовал заголовок
Content-Length(например, из-за декомпрессионного транскодирования в GCS). #99971 (Yarik Briukhovetskyi). - Исправлен сбой assert (исключение в debug-сборках, некорректные результаты в release-сборках) при умножении состояний агрегатной функции
NumericIndexedVectorна чётную целочисленную константу, вызванный self-XOR для алиасов битмапов Roaring вpointwiseAddInplace. #99976 (Desel72). - Предотвращено исключение
Unexpected return typeв устаревшем pushdown фильтров через цепочкуJOIN USING, когда типы ключей меняются после преобразований JOIN. #99999 (Alexey Milovidov). - Исправлено Исключение
LOGICAL_ERROR“Неожиданный тип узла для табличного выражения … фактически IDENTIFIER”, возникавшее при использовании скалярного подзапроса внутри неразрешённого аргумента табличной функции, например:SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1))). #100014 (Alexey Milovidov). - Исправлена ошибка, из-за которой
INSERTсVALUESзавершался сбоем, если после данных на следующей строке шёл завершающий SQL-комментарий (--или/* */). Теперь комментарий пропускается, а не разбирается как ещё одна строка. #100016 (Pratima Patel). - Исправлено исключение в
arrayRemoveпри сравнении кортежей с компонентами, равными NULL. #100017 (Alexey Milovidov). - Исправлена межпользовательская утечка данных в
system.asynchronous_inserts: любой пользователь сSELECTк таблице мог видеть ожидающие записи асинхронной вставки, принадлежащие другим пользователям. Теперь записи фильтруются по текущему пользователю, если только у него нет привилегииSHOW_USERS. #100024 (Shaohua Wang). - Исправлен случай, когда приведение Time64 к UInt64 могло обрезать значения до 24 часов. #100025 (Yarik Briukhovetskyi).
- Исправлен сбой локального сервера, когда CREATE DICTIONARY содержит определение со списочным значением, содержащим несуществующую функцию. #100036 (Yakov Olkhovskiy).
- Исправлена ошибка, из-за которой форматы
CSVиMsgPackне могли корректно разбиратьNullable(Tuple). Закрывает #99753. #100038 (Nihal Z. Miaji). - Исправлена ошибка
UNKNOWN_IDENTIFIER, из-за которойCREATE VIEWзавершался сбоем при использовании в качестве правой частиINалиаса функционального выражения вWITH(например,tuple(...)). #100042 (Peng). - Исправлена ошибка, из-за которой агрегатные функции временных рядов (например,
timeSeriesResampleToGridWithStaleness) завершались сILLEGAL_TYPE_OF_ARGUMENTпри использованииinitializeAggregationилиAggregatingMergeTreeс параллельными репликами. #100053 (Alexey Milovidov). - Исправлена обработка отрицательных значений в NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
- Исправлено: функции
accurateCastOrDefaultиto*OrDefaultне сохраняли тип Const столбца для константных входных данных. #100132 (Alexey Milovidov). - У пропущенных параметров запроса с типом
LowCardinality(Nullable(T))теперь значение по умолчанию корректно устанавливается в NULL, как и дляNullable(T). #100144 (Denys Melnyk). - Исправлена ошибка использования неинициализированного значения в StringSearcher.h. #100225 (Konstantin Bogdanov).
- Добавлена возможность отменять скалярные подзапросы и другие конвейеры, запускаемые на этапе анализа, с помощью Ctrl+C. Ранее нажатие Ctrl+C во время выполнения длительного скалярного подзапроса не давало никакого эффекта, пока подзапрос не завершался. Также исправлены индикатор прогресса и статистика в JSON, чтобы они корректно сообщали о числе прочитанных строк во время выполнения скалярного подзапроса — как в
clickhouse-client, так и вclickhouse-local. В соавторстве с @YjyJeff. #100230 (Raúl Marín). - Исправлено исключение
LOGICAL_ERRORв запросах сDynamic-столбцами,CROSS JOINи runtime-фильтрами, вызванное тем, чтоColumnVariant::filterиспользовал общие указатели на Variant-столбцы вместо их клонирования в ветке оптимизацииhasOnlyNulls. Закрывает https://github.com/ClickHouse/ClickHouse/pull/100147. #100234 (Pavel Kruglov). - Исправлена ошибка в массивах с
Variant, из-за которой при вызове функцийarrayFirst/arrayLastмог переинтерпретироваться тип данных. Например, ранееArray(Variant(Date, Bool))преобразовывался вBool, хотя фактический тип варианта —Date. #100255 (timothygk). - Несколько небольших изменений в функциях: функции
h3теперь лучше проверяют границы;readWKBтеперь проверяет ограничения на размер (новая настройкаmax_wkb_geometry_elements); функции генерации случайных чисел ограничивают максимальное число итераций при вычислениях. Дополнение к #93543. #100270 (Alexey Milovidov). - Исправлена проблема, из-за которой cutURLParameter мог некорректно пропускать параметры, если они были подстроками других параметров. #100280 (Nikita Semenov).
- Исправлено исключение, возникавшее, если в настройке пути к файлу метаданных Iceberg присутствовал null-байт. #100283 (Alexey Milovidov).
- Исправлена проблема с квадратичным ростом числа выполняемых запросов при использовании
distributed_index_analysisс предикатами, содержащимиIN-подзапросы. #100287 (Anton Popov). - Исправлено исключение “Несоответствие структуры блока” при использовании
GROUP BY ... WITH TOTALS HAVINGвместе сUNION DISTINCTи Nullable-выражениями. #100293 (Alexey Milovidov). - Исправлено Исключение LOGICAL_ERROR в
estimateCompressionRatio, возникавшее, когда параметрblock_size_bytesбыл чрезвычайно большим. #100298 (Alexey Milovidov). - Исправлено Исключение “Несогласованное форматирование AST” в отладочных сборках при использовании
GROUP BY CUBE(...) WITH ROLLUPи похожих комбинаций. #100376 (Alexey Milovidov). - Исправлено Исключение при создании представления с псевдонимами столбцов и запросами
SELECT *илиEXCEPT/INTERSECT. #100386 (Alexey Milovidov). - Исправлено зависание
DROP TABLEна неопределённое время для таблиц с движком Kafka, когда consumer’ы застревают в состоянии перебалансировки после ошибки heartbeat. #100388 (Alexey Milovidov). - Исправлено Исключение
ReadBuffer is canceled. Can't read from it.при операциях резервного копирования и восстановления с использованием zip-архивов. #100400 (Alexey Milovidov). - Исправлено Исключение
TOO_MANY_ROWSдля запросовSELECT count()сmax_rows_to_read/force_primary_key, когда данные распределены по нескольким частям с несовпадающими границами гранул. #100408 (Alexey Milovidov). - Исправлен
system.completions: теперь он корректно фильтрует базы данных, таблицы и столбцы по правам доступа во всех сочетаниях grant — на уровне таблицы, базы данных и при отзыве прав на уровне столбца. #100432 (Shaohua Wang). - Исправлен SEGFAULT в NuRaft, вызванный состоянием гонки. #100444 (Pablo Marcos).
min/max/argMin/argMaxтеперь обрабатывают NaN так же, какORDER BY: NaN всегда пропускается (возвращается только если все значения — NaN). Ранее результаты зависели от положения NaN в данных из-за семантики неупорядоченного сравнения в IEEE 754. #100448 (Raúl Marín).- Исправлена ошибка, вызванная копированием и вставкой: если
delta_lake_snapshot_end_versionзадавался безdelta_lake_snapshot_start_version, он молча игнорировался вместо того, чтобы приводить к ошибкеBAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar). StorageRabbitMQ::shutdownне является идемпотентным (он безусловно обращается к слабым указателям, а затем уничтожает соответствующие указатели с общим владением), но теперь вызывается дважды: сначала вStreamingStorageRegistry, а затем вDatabaseCatalog. Это исправление делает метод идемпотентным и добавляет защитные проверки наnull. #100455 (Miсhael Stetsyuk).- Исправлено Исключение
LOGICAL_ERROR, возникавшее при использованииaccurateCastOrNullс целевым типомQBit. #100470 (Raufs Dunamalijevs). - Исправлено исключение LOGICAL_ERROR “Stream … not found”, возникавшее при вставке в таблицу с вложенными столбцами
Array(JSON)в частях типа Wide приoptimize_on_insert=0. #100475 (Pavel Kruglov). - Проверка путей записей файлов в метаданных резервной копии для отклонения обхода путей, абсолютных путей и пустых имён при
RESTORE. #100483 (Pablo Marcos). - Исправлена ошибка, из-за которой не работал синтаксис
LIMIT m OFFSET n WITH TIES. Этот синтаксис эквивалентенLIMIT n, m WITH TIES, который уже работал. #100491 (Nihal Z. Miaji). - Исправлено исключение “No set is registered for key” при использовании
INсо столбцамиNullable(Tuple), содержащими именованные поля и элементыLowCardinality. #100523 (Alexey Milovidov). - Исправлен heap-buffer-overflow в usearch
sorted_buffer_gt::insert(), который мог вызывать сбой или незаметно повреждать память при поиске по векторному сходству. #100537 (Dustin Healy). - Исправлена ошибка, из-за которой
EXECUTE ASигнорировал секцииFORMATиINTO OUTFILE, указанные в запросе. #100538 (pufit). - Исправлено неконсистентное форматирование AST для SAMPLE с OFFSET на уровне запроса. Закрывает #100576. #100579 (Pavel Kruglov).
- Исправлена работа Polaris catalog с Azure. Начиная с версии 25.12 этот каталог для Azure начал добавлять бакет в начало пути. Например,
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path>вместоabfss://polaris-polaris@<some_url>.windows.net/<other-path>. Этот PR убирает бакет из пути. #100583 (Konstantin Vedernikov). - Исправлено исключение из-за несоответствия типов в transform, когда столбец по умолчанию является const в некоторых блоках. Закрывает #100574. #100616 (Pavel Kruglov).
- Исправляет случаи NOT_FOUND_COLUMN_IN_BLOCK, когда в части SELECT проекции есть столбцы, которых нет в исходной части SELECT запроса. Закрывает #100194. #100623 (Yarik Briukhovetskyi).
- Проверка размерностей массива в формате Npy на соответствие размеру файла и ограничениям переполнения, чтобы предотвратить отказ в обслуживании из-за специально созданных файлов
.npyс чрезмерно большими размерностями. Также отклоняются пустые формы массивов, а объём памяти на строку ограничивается 2 GiB. #100625 (Raúl Marín). - Исправлена ошибка, из-за которой
session_timezoneигнорировался при разборе значенийDateTimeво время асинхронных вставок (TCP) и всех вставок по HTTP. #100647 (Sema Checherinda). - Разрешена передача ключа сегментирования в табличные функции
cluster()иclusterAllReplicas(), когда в качестве источника используется табличная функция (например,cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy). - Исправлен сбой сервера (срабатывание assert) при использовании параметрических агрегатных функций с комбинатором Array и аргументами NULL, таких как
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot). - Исправлено исключение, возникавшее при вычислении общего супертипа для пустых и непустых кортежей при включенном
use_variant_as_common_type. #100699 (Antonio Andelic). - Сервер больше не запускается с ошибкой, если настроен диск Azure Blob Storage, а конечная точка временно недоступна (например, из-за сбоя DNS). #100701 (Raúl Marín).
- Исправлено неопределённое поведение в
positiveModulo, когда беззнаковый делитель не помещается в знаковый тип результата. #100705 (Raúl Marín). - Исправлен сбой сервера (логическая ошибка “Неожиданный тип, возвращаемый __topKFilter”), когда включен
use_top_k_dynamic_filtering, а столбец вORDER BYимеет типDynamicилиVariant. #100742 (Groene AI). - Исправлен сбой сервера при использовании функции
has()в PREWHERE/WHERE для ключа Tuple, содержащего элементы LowCardinality. #100760 (Groene AI). - Исправлено срабатывание проверки
file_offset_of_buffer_end <= getFileSize()(исключение в отладочных сборках) при чтении из таблицLogилиStripeLogв объектном хранилище S3 при одновременной записи. #100763 (Alexey Milovidov). - Исправлено исключение в оценщике селективности статистики, возникавшее, когда предложение WHERE содержит функциональное выражение (например, toDecimal64(col, 3)) в таблице со включенной статистикой. Теперь оценщик пропускает такие предикаты вместо того, чтобы пытаться выполнить недопустимое приведение типов. #100764 (Han Fei).
- Исправлен редкий случай, когда JOIN с изменением порядка мог давать неверный результат. #100790 (Yarik Briukhovetskyi).
- Исправлены некорректные типы аргументов
AggregateFunctionв оптимизированном тривиальномcount, из-за которых при выполнении запросов с выражениями вродеcount(v0 + v1)на distributed таблицах возникало ИсключениеNUMBER_OF_ARGUMENTS_DOESNT_MATCH. #100794 (YjyJeff). - Некоторые каталоги могли отображать секреты в разделе
SETTINGSрезультата запросаselect * from system.databases. Этот PR предотвращает такое поведение. #100800 (Konstantin Vedernikov). - Исправлено неопределённое поведение (переполнение знакового целого числа) в
toStartOfIntervalпри использовании интервалов Week, Quarter или Year с аргументом origin и предельными значениями интервала. #100817 (Raúl Marín). - Исправлена невозможность чтения более старых сериализованных состояний после появления
Nullable(Tuple)для комбинаторов агрегатных функцийIf,Distinct,DistinctIf,IfStateс возвращаемым типомTupleи одним или несколькими аргументамиNullable. Закрывает #98917. #100826 (Nihal Z. Miaji). - Исправлен segfault в s3Cluster и распределённых запросах, вызванный use-after-free при работе с пулом соединений. #100837 (Konstantin Bogdanov).
- Исправлен segfault из-за разыменования нулевого указателя при загрузке словарей во время остановки сервера.
Context::getUserDefinedSQLObjectsStorage(разыменовываетuser_defined_sql_objects_storage) вызывается потоками словарей одновременно с вызовомContext::shutdownв основном потоке (он устанавливаетuser_defined_sql_objects_storageв null). Нужно убедиться, что до запускаContext::shutdownв загрузчике словарей отключены дальнейшие обновления, завершены выполняющиеся запросы к словарям и потоки загрузки словарей дожидаются завершения. Аналогично тому, как это делается для обычных запросов. #100839 (Miсhael Stetsyuk). - Исправлено переполнение буфера в
ULIDStringToDateTime, возникавшее, когда входные данные содержат не-ASCII-байты. #100843 (Konstantin Bogdanov). - Исправлен сбой (
LOGICAL_ERROR) при выполнении запроса к таблицеMerge(или табличной функцииmerge()), объединяющей несколько таблиц, включая таблицуDistributed, при включенномdistributed_group_by_no_merge=1. #100859 (Groene AI). - При включенном Cast_keep_nullable при приведении dynamic null к variant исключение не будет генерироваться. #100864 (Seva Potapov).
- Исправлено поведение команд
clickhouse-keeper-clientget,existsиls: они выводили дублирующиеся сообщения об ошибкеwatch_idв stdout вместо stderr. #100893 (Mohammad Lareb Zafar). - Исправлено исключение в
intDiv/intDivOrZeroпри работе с массивами Nullable-кортежей, напримерSELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín). - Аргументы движка для
StorageAliasтеперь вычисляются перед сохранением определения, чтобы выражения вродеcurrentDatabase()преобразовывались в литералы до сохранения в базе данных. #100902 (Nikolay Degterinsky). - Исправлена ошибка в
processAndOptimizeTextIndexFunctionsприquery_plan_merge_expressions = 0, когдаExpressionStepрасположен непосредственно надReadFromMergeTree. Исправление #100879. #100909 (Jimmy Aguilar Mena). - Обновлён replxx: добавлено исправление выхода за границы массива в do_complete_line. #100925 (Azat Khuzhin).
- Исправлены неверные результаты, когда JOIN с оптимизацией сегментирования по PK использует кэш условий запроса, а некоторые части отфильтровываются на основе кэшированных условий. #100926 (Groene AI).
- Исправлена ошибка, из-за которой
divideиintDivв некоторых случаях возвращалиILLEGAL_DIVISIONпри использовании в выражениях фильтра во время анализа индексов. #100928 (Nihal Z. Miaji). - Исправлены ошибки “Целевая таблица не существует” для materialized view с внутренними таблицами при асинхронном запуске, вызванные неверным порядком инициализации зависимостей. #100946 (Nikolay Degterinsky).
- Исправлено неопределённое поведение (переполнение знакового целого числа) в parseDateTimeBestEffort при разборе строк даты и времени, содержащих более 18 цифр в дробной части секунды. #100948 (Vasily Chekalkin).
- Исправлен сбой при использовании индекса для текстового поиска с условием
IN, содержащим кортежный подзапрос, напримерWHERE (id, str) IN (SELECT (id, str) FROM ...), а также в случае, когда число столбцов в подзапросе не совпадает с кортежем в левой частиIN. #100959 (Anton Popov). - Исправлен сбой, возникавший при создании словаря Polygon из таблицы
MergeTree, использующей сериализацию разреженных столбцов. #100964 (Anton Popov). - Исправлена логическая ошибка “Invalid action query tree node” при использовании
INTERSECT ALL/UNION ALLс выражениями, свёрнутыми в константы. #100977 (Alexey Milovidov). - Исправлена агрегатная функция
sumCountOrDefault: при одном или нескольких аргументах типаNullableона не могла читать ранее сериализованные состояния после введенияNullable(Tuple). Закрывает #100882. #101021 (Nihal Z. Miaji). - Исправлен сбой (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) в алгоритмах слияния, когда отложенная репликация столбцов (enable_lazy_columns_replication) создает столбцыColumnReplicated, которые попадают в конвейеры merge-sort при позднем поступлении входных данных. #101036 (Groene AI). - Исправлена некорректная ошибка
UNKNOWN_IDENTIFIER, возникавшая, когда один и тот же псевдоним использовался для нескольких выражений вSELECT; теперь вместо неё корректно сообщается ошибкаMULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov). - Исправлена проблема со столбцами ALIAS типов
DateTime/DateTime64: преобразование часового пояса не применялось, если указанный часовой пояс отличался от часового пояса выражения. #101043 (Alexey Milovidov). - Исправлена проблема, из-за которой политики строкового доступа не записывались в
query_logдля представлений, подзапросов иINSERT ... SELECT. Хотя политики строкового доступа применялись при планировании запросов, они не передавались от вложенных планировщиков в родительский планировщик для записи в журнал. Теперь политики строкового доступа (только для журналирования) хранятся вQueryAccessInfo, чтобы их могли заполнять и планировщики, и вложенные планировщики. #101044 (Narasimha Pakeer). - Исправлено Исключение в
DirectJoinMergeTreeEntity, когда блоки конвейера содержат столбцыColumnConst, которые объединяются с обычными столбцами. #101046 (Alexey Milovidov). - Исправлен лишний пробел в оформлении псевдонима столбца в CTE (
WITH t (a, b)→WITH t(a, b)). #101049 (Alexey Milovidov). - Исправлена ошибка, из-за которой табличные функции
remote/clusterне работали с вложенными табличными функциями, такими какmerge, при включенном анализаторе. #101055 (Alexey Milovidov). - Исправлено двойное применение
OFFSETв распределённых запросах приprefer_localhost_replica=1, из-за чего возвращалось меньше строк, чем ожидалось. #101071 (Nihal Z. Miaji). - Исправлен сбой, возникавший при использовании формата
Regexpс некорректным регулярным выражением в настройкеformat_regexp. #101074 (Nihal Z. Miaji). - Исправлена ошибка “Недопустимый тип Decimal64 для параметра start” в агрегатных функциях временных рядов при использовании
serialize_query_plan=1с параллельными репликами. #101083 (Groene AI). - Исправлено исключение в
optimizeLazyMaterialization, возникавшее при использовании проекции с PREWHERE вместе сORDER BY ... LIMIT. #101115 (Anton Popov). - Исправлен сбой сервера (SIGABRT) при использовании агрегатных функций с внутренним комбинатором
Null(например,sumNull,avgNull) и включенной настройкойaggregate_functions_null_for_empty = 1. #101147 (Groene AI). - Исправлена ошибка use-after-free при записи в файловый кэш, которая могла приводить к чтению из уже освобождённой памяти при логировании завершённых сегментов файла (обнаружена с помощью MemorySanitizer в BuzzHouse). #101161 (Groene AI).
- Исправлен сбой сервера с сообщением “Попытка подключить внешнюю таблицу к готовому Set без явных элементов”, который возникал, когда распределённый анализ индексов сталкивался с предикатом GLOBAL IN, чей Set был построен без явных элементов. #101178 (Groene AI).
- Исправлены агрегатные функции
MAX/MINдля столбцовDecimal, возвращавшие некорректные результаты при включенной JIT-компиляции (после достижения порога компиляции). #101203 (Raúl Marín). - Исправлена проблема, из-за которой оптимизации
minmax_count_projectionи тривиальногоCOUNT(*)оставались навсегда отключёнными после легковесного удаления, даже когда все части с маской легковесного удаления уже были слиты. #101212 (Anton Popov). - Исправлен сценарий, который мог приводить к логической ошибке
Having zero bytes, ...в кэше: удалённый объект мог быть перезаписан в промежутке междуlistиread, из-за чего ранее возникали устаревшие метаданные объекта. #101219 (Kseniia Sumarokova). - Исправлен сбой сервера (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) при запросе к таблице семейства MergeTree с
ORDER BY CAST(lc_column, 'Type'), гдеlc_columnимеет тип LowCardinality. #101220 (Groene AI). - Исправлена очистка устаревших узлов обработки в
S3Queue. #101230 (Kseniia Sumarokova). - Исправлено UB в mergeTreeAnalyzeIndexes() при недопустимом значении аргумента optimizations. #101253 (Azat Khuzhin).
- Исправлено Исключение
Logical error: 'partitions_count > 0', возникавшее при последовательном выполненииALTER TABLE UPDATEдля секционированной таблицы Iceberg. #101278 (Desel72). - Исправлены неверные результаты запроса, когда большая целочисленная константа (например, 256, 2147483648) используется как булевый предикат в предложении WHERE с оператором AND в таблицах семейства MergeTree. Например,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648ошибочно возвращал 0 вместо того, чтобы учитывать все строки. #101287 (Groene AI). - Исправлен INSERT SELECT из кластера Delta Lake с ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
- Исправлен сбой с сообщением “Логическая ошибка: чтение из материализованного CTE до материализации”, возникавший, когда скалярный подзапрос ссылался на цепочку зависимых материализованных CTE. #101305 (Groene AI).
- Исправлена гонка данных с
storage_idвIStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky). - Исправлены форматирование и клонирование AST для BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
- Исправлен сбой LOGICAL_ERROR “Текущий компонент пуст”, возникавший при запросе к
system.part_moves_between_shards, когда включенenforce_keeper_component_tracking. #101462 (Groene AI). - Исправлено падение из-за segmentation fault в DataTypeDynamic::create(), когда фаззер генерирует некорректный AST типа Dynamic. #101464 (Groene AI).
- Выдавать ошибку, если настройки
delta_lake_snapshot_versionили версии CDF используются без включенного DeltaKernel, вместо того чтобы незаметно возвращать некорректные данные. #101489 (Desel72). - Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее при использовании ARRAY JOIN с JOIN USING и включенной настройкеanalyzer_compatibility_join_using_top_level_identifier. Закрывает #101240. #101507 (Vladimir Cherkasov). - Исправлена ошибка в цикле повторных попыток Iceberg INSERT, возникавшая, когда таблица была создана с
iceberg_metadata_file_path, а целевая версия метаданных уже существовала. #101548 (Groene AI). - Убрали Nullable из результирующего столбца в arrayIntersect и связанных функциях, чтобы избежать несоответствия при сериализации/десериализации. #101569 (George Larionov).
- Исправлен сбой сервера (LOGICAL_ERROR) при выполнении SELECT-запроса к materialized view, использующему движок таблицы IcebergLocal. #101577 (Groene AI).
- Исправлено некорректное сообщение об ошибке при вызове
intExp10с аргументом NaN — в нём было указаноintExp2вместоintExp10. #101582 (Krishna Chaitanya). - Исправлено:
allow_statistics=0не блокировал выполнениеALTER TABLE ADD STATISTICSиALTER TABLE DROP STATISTICSпосле рефакторинга в #100288. #101585 (Krishna Chaitanya). - Исправлена ошибка
KeeperMapпри выполненииCREATE TABLEс сообщением “Cannot create metadata for table”, возникавшая, когда в оставшихся узлах ZooKeeper после неполного удаления в версиях до 25.1 отсутствовал узелdrop_lock_version. #101623 (Antonio Andelic). - Устранена возможная логическая ошибка при чтении подстолбцов типа Map. Закрывает #100769. Закрывает #101336. #101641 (Pavel Kruglov).
- Исправлен приоритет точного совпадения подстолбца над совпадением по префиксу в
getSubcolumnData, чтобы избежать возможного падения. Закрывает #101271. #101645 (Pavel Kruglov). - Исправлен сбой (LOGICAL_ERROR: “ColumnUnique не может содержать значения NULL”) при сравнении столбца
LowCardinalityс NULL-константойVariant, когдаuse_variant_default_implementation_for_comparisonsотключён. #101690 (Groene AI). - Что: В Bzip2ReadBuffer добавлена проверка на пустой поток, благодаря которой он возвращает EOF вместо UNEXPECTED_END_OF_FILE, если внутренний поток пуст. #101691 (ClickGap AI Bot).
- Что: Исправлено перепутанное описание столбца
alterableвsystem.s3_queue_settingsиsystem.azure_queue_settings— значения0и1поменяны местами в соответствии с фактическим поведением кода. #101703 (ClickGap AI Bot). - Исправлена ошибка, из-за которой для
positiveModulo(tuple, number)ошибочно вызывалось деление вместо операции взятия по модулю. #101709 (ClickGap AI Bot). - Исправляет сбой, возникавший при настройке
thread_pool_sizeна диске с кэшем. РанееFileCacheSettings::loadFromConfig()отклонялthread_pool_sizeкак неизвестную настройку, из-за чего сервер не мог запуститься. Эта настройка является допустимым параметромIDisk, который определяет количество потоков, используемых для операций копирования с диска на диск при фоновом перемещении частей. #101712 (Francisco). - Исправлено поведение, при котором при создании словаря
RANGE_HASHEDмолча принимался несуществующий атрибут диапазонаMAX, а также использовалась неверная конфигурация типов, если атрибуты минимального и максимального диапазона имели разные типы. Причиной ошибки была опечатка из-за копирования и вставки вbuildRangeConfiguration: для максимального атрибута искалсяmin_attr_nameвместоmax_attr_name. #101732 (Yakov Olkhovskiy). - Исправлено аварийное завершение, вызванное use-after-free в планировщике аренды CPU, когда таймер ожидания живёт дольше, чем воркер-поток, на
ProfileEvents::Countersкоторого он ссылается. #101761 (Antonio Andelic). - Исправлена ошибка в функциях arrayLevenshteinDistanceWeighted и arraySimilarity. Закрывает #101725. #101767 (Mikhail f. Shiryaev).
- Исправлена ошибка, из-за которой Prometheus Query API игнорировал тела POST-форм. #101794 (James Cunningham).
- Исправлен выход исключения из деструктора S3
Client::~Client, приводивший к аварийному завершению сервера. #101798 (Gagan Dhakrey). - Исправлена ошибка use-after-scope при параллельной десериализации динамических путей типа
Object, которая могла приводить к сбоям при чтении таблиц с большим количеством таких путей. #101823 (Antonio Andelic). - Исправлен некорректный вывод в функции
formatDateTimeдля форматтера%Wпри определённых (не используемых по умолчанию) настройках форматирования. #101847 (Robert Schulze). - Исправлено ложное срабатывание
shouldPatchFunctionвSYSTEM INSTRUMENT ADD, когда искомая строка впервые встречается внутри аргумента Template в деманглированном имени символа. #101885 (Pablo Marcos). - Исправлена потеря реестра UDF при истечении сеанса ZooKeeper во время периодического обновления — все пользовательские функции могли становиться недоступными, пока не завершится успешное полное обновление. #101891 (Nikita Fomichev).
- Исправлено описание
system.codecsдляAES_256_GCM_SIV: теперь указываетсяAES-256, а неAES-128. #101917 (Jimmy Aguilar Mena). - Исправлено использование некорректных экстремумов в min-max индексе, созданном для JSON-столбца, что приводило к неверному результату запроса. Закрывает #101700. #101918 (Pavel Kruglov).
- Токенизатор
splitByStringтеперь не принимает пустые строки в качестве разделителя. #101928 (Robert Schulze). - Исправлено поведение, при котором
materialize_skip_indexes_on_merge=falseне подавлял текстовые (полнотекстовые) индексы при слиянии. Ранее подавлялись только нетекстовые индексы пропуска данных (minmax, set, bloom_filter); текстовые индексы продолжали строиться, что приводило к напрасному расходу CPU и I/O. #101932 (Groene AI). - Токенизатор
sparseGramsгенерировал токены, длина которых превышала заданный максимум (это было связано с жёстко прописанным+2в реализации). #101934 (Elmi Ahmadov). - Исправлен SIGSEGV в
MergeTreeDataPartWriterWide::cancel, возникавший, когда конструктор потока выбрасывает исключение во времяaddStreams, из-за чего вcolumn_streamsоставался null-элемент. #101936 (Antonio Andelic). - Исправляет исключение при запросе к таблицам Merge или Distributed с полнотекстовым индексом и комбинированными условиями фильтрации, в которых
has*Tokensсочетается с LIKE, когда включенquery_plan_direct_read_from_text_index. #101939 (Jimmy Aguilar Mena). - Исправлено неопределённое поведение при разборе пакетов запроса собственного протокола с некорректными значениями
QueryProcessingStage. #101972 (Raúl Marín). - Закрывать TCP-соединение при возникновении исключения на этапе начального разбора запроса, чтобы предотвратить чтение мусорных данных из рассинхронизированного потока. #101989 (Raúl Marín).
- Исправлена ошибка гонки в SLRU в файловом кэше 26.1+, которая может приводить к логической ошибке при резервировании места. В отладочной сборке это также может приводить к срабатыванию assert:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.. #101991 (Kseniia Sumarokova). - Исправлено исключение при приведении строки с лишними данными в конце к пустому типу
Tuple(). #102011 (Alexey Milovidov). - Исправляет неправильный порядок строк в запросах, использующих ORDER BY с алгоритмом JOIN grace_hash. Затронутые запросы могли возвращать результаты в неверном порядке, что незаметно приводило к некорректному выводу. #102036 (János Benjamin Antal).
- Исправлена ошибка LOGICAL ERROR (Unexpected size of index type), которая могла возникать в запросах RIGHT JOIN и FULL JOIN, когда был настроен параметр
max_bytes_in_join. #102042 (Jimmy Aguilar Mena). - Исправляет случаи, когда
Timeс отрицательными значениями возвращал неверный результат при сравнении с типом DateTime. Закрывает #101670. #102056 (Yarik Briukhovetskyi). - Исправлен сбой при обновлении UDF, вызванный тем, что
ZooKeeperRetriesControlвыполнял повторную попытку с устаревшим (истекшим) сеансом ZooKeeper, не обновляя его. #102059 (Nikita Fomichev). - Исправлено отсутствие пробелов при форматировании unlock snapshot. Закрывает https://github.com/clickhouse/clickhouse/issues/101723. #102063 (Han Fei).
- Исправлен crash (SIGSEGV) при выполнении запроса к представлению с предложением WHERE, когда внутренний запрос возвращает столбцы с типами, отличающимися от метаданных представления (например, Nullable из LEFT JOIN с
join_use_nulls). #102085 (Miсhael Stetsyuk). - Исправлена ошибка, из-за которой записи в
VectorSimilarityIndexCacheне вытеснялись после удаления части из-за несоответствия ключей кэша. #102152 (Seva Potapov). - При использовании хранилища RabbitMQ для повреждённых сообщений теперь отправляется NACK. #102157 (Seva Potapov).
- Исправлена логическая ошибка при разборе некорректной строки с пустым кортежем. #102289 (Nihal Z. Miaji).
- Исправлены некорректные результаты агрегации (дублирующиеся строки) при использовании
optimize_aggregation_in_order=1, если столбцы в GROUP BY упорядочены иначе, чем ключ сортировки таблицы. #102299 (Groene AI). - Исправлен сбой в
IcebergLocalпри выполненииALTER TABLE ... UPDATEс использованием формата Avro: типы-обёрткиLowCardinality/Nullableне разворачивались перед сериализацией. #102337 (Desel72). - Исправлена ошибка сегментации в мутациях для материализованных столбцов без выражения. Закрывает #102185. #102342 (zoomxi).
- Исправление в Coalescing merge tree для типа Array. Это закрывает #89509. #102384 (Konstantin Vedernikov).
- Исправлен segfault (или LOGICAL_ERROR в отладочных сборках) при чтении файлов Parquet с включённым проталкиванием bloom filter и условиями равенства/неравенства в предложении WHERE. Сбой происходил из-за обращения к памяти за пределами допустимых границ при получении данных bloom filter в механизме предвыборки Parquet, а также мог приводить к непредсказуемо неверным результатам запроса. #102385 (Groene AI).
- Исправлено прерывание с
LOGICAL_ERRORпри динамическом изменении размера SLRU файлового кэша, вызванное общей статистикой вытеснения для подочередей и некорректным путём восстановления для кандидатов, завершившихся ошибкой. #102396 (Antonio Andelic). - Исправлен сбой инициализации на новой реплике таблиц-алиасов без целевой таблицы в базе данных Replicated. Закрывает #101320. #102397 (Nikolay Degterinsky).
- Исправлено чтение за пределами буфера в функциях поиска по строкам (
countSubstrings,positionи т. д.) при поиске подстроки, состоящей целиком из null-байтов. #102401 (Raúl Marín). - Настройки полнотекстового индекса (
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read) больше не отключаются, если настройкаcompatibilityуказывает на версию старее 26.1. Ранее из-за этогоSharedDatabaseCatalogмог не создавать таблицы с текстовыми индексами. #102422 (Nikita Fomichev). - Исправлено чтение за пределами буфера в
printfпри завершающем%. #102472 (Raúl Marín). - Исправлено исключение chassert
ReadBuffer is canceledв отладочных сборках AsynchronousMetrics, вызванное тем, что rewind не сбрасывал флаг отмены буфера. #102524 (Yuri Fedoseev). - Исправлены
hasToken/hasTokenOrNullдля искомых подстрок, состоящих только из разделителей (например,'()','!!!'), в столбцах с текстовым индексом: ранее индекс молча пропускал все гранулы вместо того, чтобы сгенерироватьBAD_ARGUMENTS(дляhasToken) или вернутьNULL(дляhasTokenOrNull). #102544 (Jimmy Aguilar Mena). - Исправлены OOM-ситуации на огромных
multi-запросах в Keeper. Для трассировки OpenTelemetry мы безусловно выделяли >1 KiB для OpenTelemetry spans в объектахZooKeeperRequest— то есть для действительно огромныхmulti-запросов пытались дополнительно выделить >10 GiB памяти. Чтобы это исправить, теперь мы храним общие данные в статической памяти и используемstd::unique_ptrвместоstd::optionalвZooKeeperOpentelemetrySpans. #102586 (Miсhael Stetsyuk). - Исправлено завышение CurrentMetric для
NamedCollectionиз-заCREATE NAMED COLLECTION IF NOT EXISTSна уже существующих коллекциях, а также отсутствие инициализации для коллекций, загружаемых из конфигурации или SQL-хранилища при запуске. Закрывает #102507. #102598 (Pablo Marcos). - Исправлено Исключение в
getStructureOfRemoteTable, когда локальный сегмент возвращает пустой список столбцов из-за параллельного DDL. #102604 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR, возникавшее, когда несколько параллельных запросовCREATE TABLE IF NOT EXISTSбыли направлены к одной и той же таблицеS3Queueв базе данных Shared. #102610 (Nikita Taranov). - Исправлен сбой LOGICAL_ERROR “Неожиданное количество строк в подфрагменте столбца” в нативном считывателе Parquet V3 при чтении столбцов с типом Nullable с фильтром WHERE. #102628 (Groene AI).
- Исправлено описание события профиля
AzureWriteMicroseconds: вместо “write” было указано “read”. #102639 (Miсhael Stetsyuk). - Ошибка в политике строк, из-за которой в ряде особых случаев возникает исключение ‘Not found column in block’. #102648 (Yarik Briukhovetskyi).
- Исправлено серверное исключение в ClusterDiscovery, возникавшее, когда в статическом кластере (заданном в config) временно не оставалось доступных узлов. #102661 (Kseniia Sumarokova).
- Исправлен неверный вывод типа данных Date при переполнении после поправки на часовой пояс. Закрывает #102601. #102674 (Pavel Kruglov).
- Исправлено бесконечное зависание
SYSTEM WAIT VIEW, если refreshable materialized view удаляется в процессе ожидания. #102681 (Nikolay Degterinsky). - Исправлена ошибка в
CASEс выражением Dynamic, из-за которой для всех строк возвращалсяELSE. Закрывает #102511. #102684 (Pavel Kruglov). - Исправлена сериализация уплощенного типа Dynamic для бинарно закодированных типов данных. Закрывает #101911. #102692 (Pavel Kruglov).
- Исправлена проблема, из-за которой format_schema_source=‘query’ молча игнорировал результаты, содержащие несколько строк. Закрывает #101905. #102698 (Pavel Kruglov).
- Передаётся фактический код выхода через SSH-клиент вместо того, чтобы сопоставлять все ошибки с
1. Закрывает #101741. #102700 (Konstantin Bogdanov). - Исправлена потеря HTTP-заголовков в обработчиках динамических/предопределённых запросов. Закрывает #101846. #102706 (Konstantin Bogdanov).
- Добавлена поправка на пуассоновское сэмплирование для свёрнутых профилей кучи jemalloc, чтобы привести их в соответствие с выводом jeprof. Ранее свёрнутый формат занижал фактические объёмы выделения памяти, поскольку не учитывал вероятность сэмплирования. #102759 (Antonio Andelic).
- Исправлен сбой в функции
hasPhraseпри аргументеNULL. #102802 (Nikita Taranov). - Исправлен сбой сервера (SIGSEGV) при чтении файлов Avro с рекурсивными схемами, содержащими циклические символьные ссылки на типы. Теперь такие схемы выявляются и отклоняются с понятным сообщением об ошибке, а не приводят к аварийному завершению. #102853 (Groene AI).
- Исправлен сбой сервера (assertion
LOGICAL_ERROR), возникавший, когда функция, применяемая к столбцуVariant, достигала лимита памяти или вызывала другое исключение, не связанное с преобразованием типов, при приведении результата вFunctionVariantAdaptor. Теперь исключение корректно пробрасывается, а не ошибочно классифицируется как внутренняя ошибка. #102855 (Groene AI). - Исправлен сбой сервера в отладочных сборках и сборках с sanitizer при возникновении
std::length_errorво время автоматического определения схемы (например, из-за экстремальных значенийinput_format_msgpack_number_of_columnsили некорректных входных данных). #102859 (Groene AI). - Исправлено представление null при сериализации реплицируемых и разреженных столбцов: теперь оно учитывает настройки (например, format_tsv_null_representation). #102888 (Hechem Selmi).
- Бэкпортировано в #103499: исправлена проблема, из-за которой запросы к S3 завершались ошибкой
ios_base::clear: unspecified iostream_category errorвместо повторной попытки; причина была в том, что PocoBufferedStreamBuf::flushBufferне обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda). - Исправлена ошибка, из-за которой оптимизации
minmax_count_projectionи тривиальногоCOUNT(*)навсегда отключались после легковесного удаления, даже если все части с маской легковесного удаления уже были слиты. #102900 (Anton Popov). - Исправлены случайные падения jemalloc из-за LTO. #102913 (Azat Khuzhin).
- Оптимизировано преобразование OR-цепочек в IN в политиках доступа к строкам в новом анализаторе. #102915 (Azat Khuzhin).
- Исправлено повреждение метаданных jemalloc, вызванное освобождением кэша страниц с неправильным выравниванием, что могло приводить к аварийным завершениям. #102918 (Azat Khuzhin).
- Обычные INSERT без materialized view больше не запрашивают чрезмерное количество слотов ConcurrencyControl и потоков (
max_threadsвместоmax_insert_threads), что предотвращает дефицит слотов CC и лавинообразный рост числа потоков в кластерах с высокой пропускной способностью INSERT. #102961 (Sema Checherinda). - Повторно введён ArrowMemoryPool, чтобы можно было сгенерировать MEMORY_LIMIT_EXCEEDED и избежать OOM ядра. #102999 (Azat Khuzhin).
- Исправлено игнорирование
cast_string_to_date_time_modeприCASTвNullable(DateTime). Закрывает #101840. #103035 (Pavel Kruglov). - Добавлена поддержка столбцов
ALIASв оптимизации прямого чтения текстового индекса. #103037 (Anton Popov). - Бэкпортировано в #103454: исправлена ошибка, из-за которой
SELECT DISTINCTнезаметно возвращал неполные результаты, когда агрегатная проекция соответствовала запросу, а у некоторых частей таблицы отсутствовали данные проекции (например, если проекцию добавили в таблицу, в которой уже были данные, иMATERIALIZE PROJECTIONне запускали). Закрывает #102951. #103052 (Nihal Z. Miaji). - Исправлены неверные результаты, возвращаемые
WHERE x AND toNullable(N)в таблицахMergeTree, когдаN— целое число ширеUInt8(например,256,65535,2147483648или любое отрицательное целое число). Фильтр ошибочно отбрасывал все строки, потому чтоsplitFilterNodeForAllowedInputsиспользовал нулевойNULLпри преобразованииNullable-остатка сокращённогоANDв булевый тип, из-за чего сравнение превращалось вNULLв рамках трёхзначной логики. #103077 (Groene AI). - Исправлено некорректное указание типа аргумента в сообщениях об ошибках функций поиска в строках (например,
locate,position), когда аргументы передаются в обратном порядке (locate(needle, haystack)приfunction_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov). - Исправлено зависание waitForPause на неопределённое время, когда disableFailPoint вызывается, а ни один поток не приостановлен в failpoint. #103119 (Shaohua Wang).
- Ограничен размер строк в TCP-пакете Hello до аутентификации до 64 КБ и добавлена настройка сервера
handshake_timeout_milliseconds, чтобы ограничить общее время рукопожатия и не позволить неаутентифицированным клиентам потреблять чрезмерный объём памяти или удерживать потоки сколь угодно долго. #103284 (Sema Checherinda). - Исправлена ошибка в статистике min_value > max_value в Parquet ColumnIndex для столбцов String. #103334 (Saurabh Kumar Ojha).
- Проверка некорректно сформированных уплощённых данных Dynamic в формате Native. #103392 (Pavel Kruglov).
- Заполнение столбца
_timeданными из табличной функцииurl. #103437 (Nikita Taranov). - Исправлено определение SVE: инструкции SVE больше не используются, если они недоступны. #103568 (Raúl Marín).
Улучшения сборки/тестирования/упаковки
- Зависимость Libstemmer (Snowball) теперь использует более новую версию — v3.0.1. #99256 (Jimmy Aguilar Mena).
- Рандомизированы настройки в clickhouse-test:
use_skip_indexes_for_top_k,use_top_k_dynamic_filtering,query_plan_max_limit_for_top_k_optimization. #91782 (Nikita Fomichev). - Реализован стресс-тест для функций, проверяющий корректность различных свойств функций. #93543 (Michael Kolupaev).
- Добавлена собственная конфигурация CMake для
llvm-projectвместо импорта конфигурации из upstream. #97453 (Konstantin Bogdanov). - В тестовой инфраструктуре сделали более случайными настройки
optimize_*, чтобы улучшить покрытие этапов оптимизации запросов. #97547 (Alexey Milovidov). - Используйте тулчейн Rust nightly-2026-03-22. #98602 (Konstantin Bogdanov).
- Используется
wasmtimev42.0.1. #98603 (Konstantin Bogdanov). - Использование
llvm-project22.1.1. #98882 (Konstantin Bogdanov). - Заменили
SANITIZE_COVERAGE(пользовательские обратные вызовы sanitizer, гранулярность на уровне символов) на покрытие на основе исходного кода LLVM (WITH_COVERAGE,-fprofile-instr-generate -fcoverage-mapping) для ночного конвейера покрытия по отдельным тестам. Теперь сервер при запуске считывает собственную карту покрытия из секций ELF и собирает кортежи(file, line_start, line_end)для каждого теста через новую командуSYSTEM SET COVERAGE TEST 'name'. Выбор тестов в таргетированных CI-проверках использует запросы по диапазонам строк к новой таблице CIDBchecks_coverage_linesи ранжирует тесты-кандидаты по числу покрываемых ими изменённых строк в diff. #99513 (Nikita Fomichev). - Исправлена ошибка линковки llvm-libc в сборке с -O0. #100023 (Zheguang Zhao).
- Исправлены два сообщения об ошибках при запуске контейнера, если в конфигурации отсутствовали параметры
logger.logиlogger.errorlog(например, когда все сообщения лога должны выводиться в STDOUT/STDERR). #100239 (Simon). - Предпочтительнее использовать
ld64.lldвместоldот Apple (cctools-port ld64) для сборок macOS. Это должно значительно сократить время компоновки на Darwin, посколькуld64из cctools-port работает очень медленно с-ffunction-sectionsи-dead_strip. Еслиld64.lldнедоступен, используетсяld. #100275 (Alexey Milovidov). - Тесты, гарантирующие, что в каталогах не обнаруживаются никакие секретные данные (REST + Glue). #100307 (Konstantin Vedernikov).
- Повторное выполнение недавно изменённых тестов с разными случайными настройками. #100385 (Alexey Milovidov).
- Отслеживание зависимостей файлов
#embedв CMake и включение режима depend в ccache для корректной пересборки. #100411 (Alexey Milovidov). - Добавлены тесты на корректность для запросов TPC-H. #100580 (Raufs Dunamalijevs).
- Используется
aws-sdk-cpp1.11.771. #100582 (Konstantin Bogdanov). - XML-файлы тестов производительности теперь могут ссылаться на внешние файлы SQL-запросов и настройки через атрибут file. #100747 (Raufs Dunamalijevs).
- Исправлена компиляция с
-march=x86-64-v4: вLowerUpperImpl.hдобавлен отсутствующий includeTargetSpecific.h. #100932 (Alexey Milovidov). - Исправлена сборка на Gentoo за счёт добавления —no-default-config в cxxflags. #100973 (Isak Ellmer).
- Добавлен
utils/auto-bisect/— shell-фреймворк для бисекции, который загружает готовые бинарные файлы CI и запускает пользовательский тестовый скрипт, чтобы найти первый коммит, в котором появилась регрессия, без необходимости локальной сборки. #100989 (Nikita Fomichev). - ThinLTO в CMake теперь по умолчанию отключён, чтобы в локальных сборках разработчиков он больше не включался неявно. Это не влияет на релизные сборки CI, поскольку в них параметр
-DENABLE_THINLTO=1передаётся явно. #101041 (Alexey Milovidov). - В набор тестов производительности добавлен бенчмарк TPC-DS SF1. #101209 (Raufs Dunamalijevs).
- Добавлены тесты без сохранения состояния для легковесных удалений в MergeTree, охватывающие: жизненный цикл флага
has_lightweight_delete, корректностьCOUNT(*)сoptimize_trivial_count_query, целостность столбцовMATERIALIZED/DEFAULT, восстановление флага вReplicatedMergeTree,read_in_orderс удалёнными строками, несколько циклов удаления и слияния, скрытие столбца_row_exists, различные предикаты и применение RBAC кALTER DELETE. #101792 (Nikita Fomichev). - Теперь для тегированных релизов публикуются distroless Docker-образы в вариантах ubuntu и alpine. #101941 (Rahul Nair).
- Трассировки стека теперь показывают чистые относительные пути (например,
src/Common/Exception.cpp) вместо путей, засорённых каталогом сборки (например,./ci/tmp/fast_build/./src/Common/Exception.cpp). #102000 (Raúl Marín). - Добавлена проверка стиля CI, отклоняющая файлы размером более 5 МБ, закоммиченные в репозиторий, со списком разрешённых исключений для существующих корректных тестовых данных. Удалён неиспользуемый файл
zookeeper_log.parquetразмером 14 МБ. #102080 (Raúl Marín). - Удалено ~400 неиспользуемых директив
#includeиз заголовочных файлов, что сокращает время компиляции. #102585 (Raúl Marín). - Используется
wasmtimev43.0.1. #102603 (Konstantin Bogdanov). - Используется
openssl3.5.6. #102606 (Konstantin Bogdanov). - Используйте
xz5.8.3. #102607 (Konstantin Bogdanov). - Базовый distroless Docker-образ обновлён с Debian 12 (glibc 2.36, OpenSSL 3.0) до Debian 13 (glibc 2.41, OpenSSL 3.5), что свело поверхность CVE к нулю достижимых уязвимостей. #101678 (Rahul Nair).
Релиз ClickHouse 26.3 LTS, 2026-03-26. Презентация, Видео
обратно несовместимое изменение
- Понижение версии после обновления может привести к потере данных. Версии сериализации типов данных теперь распространяются на вложенные типы данных. Например, раньше версия сериализации String
with_size_streamприменялась только к столбцам String верхнего уровня и элементам Tuple. Теперь она применяется к любому типу String внутри любого вложенного типа, такого какArray/Map/Variant/JSON/и т. д. Это поведение управляется настройкой MergeTreepropagate_types_serialization_versions_to_nested_types, которая теперь включена по умолчанию. После этого изменения вновь созданные части данных не могут читаться старыми версиями, но старые части без проблем читаются новой версией. Обновление безопасно, а вот понижение версии — нет: если вам потребуется откатиться после обновления до 26.3, данные, записанные версией 26.3 в столбцы с вложенными типами, будут нечитаемы! Подробности см. в #101429. #94859 (Pavel Kruglov). - Удалён тип индекса пропуска данных
hypothesis. Это была малоизвестная экспериментальная возможность с ограниченной практической ценностью. При создании таблиц сINDEX ... TYPE hypothesisтеперь будет возникать ошибка. #96874 (Alexey Milovidov). - Удалена экспериментальная функция
detectProgrammingLanguage. #99567 (Alexey Milovidov). - Исправлен приоритет оператора
NOTв соответствии со стандартом SQL: теперьNOTимеет более низкий приоритет, чемIS NULL,BETWEEN,LIKEи арифметические операторы. Например,NOT (x) IS NULLтеперь разбирается какNOT (x IS NULL), а не как(NOT x) IS NULL. Это может изменить результат запросов, которые зависели от прежнего (нестандартного) поведения. #97680 (Alexey Milovidov). - Исправляет метаданные обычных проекций, чтобы проекции с ключами сортировки по нескольким столбцам распознавались корректно. Основано на #90429. #91352 (Amos Bird).
- Исправлены файлы индекса пропуска данных, которые не учитывали настройку replace_long_file_name_to_hash, из-за чего возникали ошибки “Имя файла слишком длинное” и нарушалось чтение индексов с длинными именами. Теперь имена файлов индекса пропуска данных хешируются, если они превышают max_file_name_length, аналогично файлам столбцов. Изменение обратно совместимо (новые серверы читают старые части), но при откате версии (или если во время rolling-обновления используются старые серверы) индексы с длинными именами могут игнорироваться. #97128 (Raúl Marín).
- async insert теперь включён по умолчанию. Теперь ClickHouse по умолчанию будет объединять все небольшие вставки в батчи. Этот параметр задаётся через compatibility. Если установить
compatibility=<version less than 26.2>, то значением по умолчанию останется прежнее —false. Вы можете включать и отключать async inserts на нескольких уровнях: в конфигурации профилей пользователей, для сеанса, для запроса или для таблицы семейства MergeTree. #97590 (Sema Checherinda). - Изменено значение
mysql_datatypes_support_levelпо умолчанию: вместо пустого теперь используетсяdecimal,datetime64,date2Date32, что по умолчанию обеспечивает корректное сопоставление MySQLDATEсDate32,DECIMAL/NUMERIC— сDecimal, аDATETIME/TIMESTAMPс точностью — сDateTime64. Ранее столбцы MySQLDATEсопоставлялись сDate, который не может представлять даты до 1970-01-01, что приводило к повреждению данных. #97716 (Alexey Milovidov). - Поддержка массива имён частей вместо regexp для
mergeTreeAnalyzeIndexes{,UUID}, поскольку regexp работает медленно (экспериментальная возможность). #98474 (Azat Khuzhin). - Изменено значение
stderr_reactionпо умолчанию сthrowнаlog_lastдля исполняемых UDF. UDF, записывающие предупреждения в stderr, больше не завершаются с ошибкой, если код выхода равен 0. Исключения, связанные с кодом выхода, теперь включают содержимое stderr. #99232 (Xu Jia).
Новая возможность
- Добавлена сериализация Map по бакетам для столбцов Map в MergeTree (
map_serialization_version = 'with_buckets'). Ключи распределяются по бакетам на основе хеша, так что при чтении одного ключа (m['key']) считывается только один бакет, а не весь столбец, что дает ускорение в 2–49 раз для lookup по одному ключу в зависимости от размера Map. Количество бакетов и стратегию бакетирования можно настраивать с помощью новых настроек MergeTree:map_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficientиmap_buckets_min_avg_size. #99200 (Pavel Kruglov). - Добавлена поддержка материализованных CTE. Это позволяет вычислять CTE только один раз во время выполнения запроса и сохранять их результаты во временных таблицах. Закрывает #53449. #94849 (Dmitry Novik).
- Разрешена поддержка некоторых стандартных SQL-функций без скобок для совместимости, например
NOW. Закрывает #52102. #95949 (Aly Kafoury). - Теперь функцию natural sort key можно использовать как
naturalSortKey(s). #90322 (Nazarii Piontko). - Теперь для функций JSONExtract можно использовать нативный ввод JSON/Object. Закрывает #88370. #96711 (Fisnik Kastrati).
- Если параметр запроса имеет тип
Nullableи не задан, мы будем считать, что его значение —NULL. #93869 (Vikash Kumar). - Добавлена поддержка дополнительного ZooKeeper для базы данных
Replicated. #95590 (RinChanNOW). - Поддержка функции
hasдля типа JSON, чтобы проверять существование пути, аналогично Map. #96927 (DQ). - Добавлена табличная функция
mergeTreeTextIndex(database, table, index), которая позволяет читать данные напрямую из текстового индекса. Эту функцию можно использовать для интроспекции или выполнения агрегаций на основе данных текстового индекса. #97003 (Anton Popov). - Добавлена настройка MergeTree
table_readonly, позволяющая помечать таблицы как только для чтения, чтобы предотвратить вставку и другие изменения. #97652 (Alexey Milovidov). - Добавлена новая настройка
use_partition_pruningи алиасuse_partition_key. Установите значениеfalse, чтобы отключить отсечение партиций по ключу партиционирования. #97888 (Nihal Z. Miaji). - Реализована поддержка
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')для таблиц Iceberg. #97904 (murphy-4o). #99130 - Для каждой записи
type=httpв<protocols>теперь можно указать пользовательский ключ<handlers>, указывающий на отдельный раздел config<http_handlers_*>, что позволяет задавать разные правила HTTP-маршрутизации для разных портов. #98414 (Amos Bird). - Добавлена опция
pretty=1вEXPLAINдля вывода в виде дерева с отступами, а такжеcompact=1для сворачивания шаговExpression, что делает планы запросов более читаемыми. #98500 (Kirill Kopnev). - Добавлена настройка сервера
restore_access_entities_with_current_grants. Когда она включена, у пользователей/ролей, восстанавливаемых из резервных копий, привилегии ограничиваются тем, какие привилегии пользователь, выполняющий восстановление, имеет право выдавать (та же семантика, что и уGRANT CURRENT GRANTS), вместо завершения с ошибкойACCESS_DENIED. #98795 (pufit). - Добавлены функции
caseFoldUTF8иremoveDiacriticsUTF8для свёртки регистра Unicode и удаления диакритических знаков. #98973 (George Larionov). - Добавлена строковая функция
normalizeUTF8NFKCCasefoldдля Unicode-нормализации NFKC_Casefold, которая сочетает нормализацию NFKC со свёрткой регистра. #99276 (George Larionov). - Добавлен токенизатор
unicode_wordдля полнотекстовых индексов и функцииtokens. Он разбивает текст по правилам границ слов Unicode: ASCII-слова могут включать символы-соединители (подчёркивание, двоеточие, точка, одинарная кавычка), а символы Unicode вне ASCII становятся односимвольными токенами. Примечание: в версии 26.3 этот токенизатор принимается только под именемunicode_word; в версии 26.4 он был переименован вasciiCJK. #99357 (Amos Bird). - Добавлены настройки
max_skip_unavailable_shards_numиmax_skip_unavailable_shards_ratio, чтобы ограничить число сегментов, которые можно незаметно пропустить, когда включенskip_unavailable_shards. Если число или доля недоступных сегментов превышает заданный порог, генерируется исключение вместо молчаливого возврата неполных результатов. #99369 (Alexey Milovidov). - Теперь можно использовать ключевое слово
SOMEв выражениях с подзапросами. Оно работает так же, какANY. #99842 (Artem Kytkin). - Добавлена настройка
output_format_trim_fixed_string, которая удаляет завершающие null-байты из значенийFixedStringв текстовых форматах вывода. #97558 (NeedmeFordev). - Добавлена поддержка заключённых в скобки выражений JOIN таблиц в предложении FROM, например
SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - Реализована функция
toDaysInMonth: она возвращает количество дней в месяце для указанной даты. #99227 (Vitaly Baranov).
Экспериментальные возможности
- Добавлена экспериментальная поддержка пользовательских функций (UDF) на базе WebAssembly, позволяющая реализовывать пользовательскую логику функций в WebAssembly и выполнять её внутри ClickHouse. Отдельная благодарность Alexey Smirnov за вклад в поддержку бэкенда Wasmtime. #88747 (Vladimir Cherkasov). Инкрементальные улучшения поддержки WASM UDF. #99373 (Vasily Chekalkin).
- Добавлена поддержка внешних SQL-диалектов с использованием библиотеки
polyglot. #99496 (Alexey Milovidov). - Добавлен кодек сжатия чисел с плавающей точкой
ALP(без fallback-механизма ALP_rd для несжимаемых значений double). #91362 (Nazarii Piontko). - Добавлены экспериментальные ленивые подсказки типов для столбцов
JSON. При включении черезallow_experimental_json_lazy_type_hintsкомандаALTER TABLE ... MODIFY COLUMN json JSON(path TypeName), которая только добавляет или изменяет подсказки типов, выполняется мгновенно как операция, затрагивающая только метаданные, без перезаписи исторических данных. Подсказки типов применяются во время выполнения запроса для старых частей и материализуются во время INSERT и фоновых слияний. #97412 (tanner-bruce). - Включено параллельное чтение из движка таблицы YTsaurus. #97343 (MikhailBurdukov).
Повышение производительности
- Повышена производительность озер данных. В предыдущих версиях при чтении из объектного хранилища конвейер не масштабировался по числу потоков обработки. Это дает прирост производительности на порядки (~40x) на многоядерных машинах. #99548 (Alexey Milovidov).
- Теперь связь между
enable_parallel_replicasиautomatic_parallel_replicas_modeтакова. Запрос может использовать параллельные реплики, только еслиenable_parallel_replicas > 0. Кроме того, еслиautomatic_parallel_replicas_mode=1, решение о том, использовать ли параллельные реплики, принимается на этапе планирования на основе ранее собранной статистики. Еслиautomatic_parallel_replicas_mode=0, параллельные реплики будут использоваться для всех поддерживаемых запросов независимо от наличия статистики. Одно из заметных исключений — распределённый insert-select с параллельными репликами: в этом случае запросы всегда будут выполняться так, как если быautomatic_parallel_replicas_mode=0. #97517 (Nikita Taranov). - Разрешено отсечение партиций, если предикат содержит любой оператор сравнения (
=,<,>,!=), а ключ партиционирования обёрнут в детерминированную цепочку функций (например, приPARTITION BY xпредикаты видаcityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026илиtoYYYYMM(x) != 2026будут использовать ключ партиционирования для отсечения). Закрывает #28800. #98432 (Nihal Z. Miaji). - Разрешена оптимизация чтения в порядке сортировки и отсечение по первичному ключу, если целевой тип
CAST—Nullable, а преобразование монотонно; например, приPRIMARY KEY xClickHouse может использовать оптимизацию чтения в порядке сортировки дляORDER BY x::Nullable(UInt64)и отсечение по первичному ключу для таких предикатов, какWHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji). - Теперь поддерживаются отсечение по индексу и pushdown фильтров, когда целочисленный столбец сравнивается с литералом с плавающей запятой; например, предикаты вида
WHERE x < 10.5теперь могут использовать первичный ключ для отсечения, а фильтры вродеprime < 1e9илиnumber < 1e5теперь проталкиваются в табличные функцииprimes()иnumbers()вместо того, чтобы приводить к неограниченному выполнению. Закрывает #85167. #98516 (Nihal Z. Miaji). - Добавлен новый SLRU-кэш для метаданных Parquet, который повышает производительность чтения, устраняя необходимость повторно загружать файлы только для чтения метаданных. #98140 (Grant Holly).
- Добавлена возможность менять местами стороны ANTI-, SEMI- и FULL JOIN на основе статистики оптимизатора. #97498 (Hechem Selmi).
- Оптимизирован пропуск гранул для
pointInPolygonпри работе с большими полигонами, а также исправлена ошибка, из-за которой анализ индексаpointInPolygonгенерировал исключение при отсечении по первичному ключу. #91633 (Nihal Z. Miaji). - Повышена производительность функции
levenshteinDistance. #94543 (Joanna Hulboj). - Оптимизировано преобразование батчей типа Decimal за счёт отказа от вызовов функций для каждого элемента. #95923 (Konstantin Bogdanov).
- Таблицы Iceberg теперь поддерживают асинхронную предзагрузку metadata через настройку таблицы
iceberg_metadata_async_prefetch_period_ms, которая периодически заранее заполняет кэш metadata. Кроме того, настройка запросаiceberg_metadata_staleness_msпозволяет запросам SELECT использовать кэшированные metadata, если они не старше указанного порога устаревания, что исключает обращения к каталогу Iceberg при обработке запроса. #96191 (Arsen Muk). S3Queueв режиме ordered использует S3 ListObjectsV2 StartAfter, чтобы не выполнять повторный вывод всей истории префикса, уменьшая число вызовов ListObjects. #96370 (Venkata Vineel ).- Снижено использование памяти при дедупликации вставок. В общем случае для дедупликации нужен исходный блок, но для sync insert можно обойтись без него и тем самым заметно сократить расход памяти. #96661 (Sema Checherinda).
- Использовать зависящее от архитектуры значение размера строки кэша вместо жёстко заданного значения 64. #97357 (Nikita Taranov).
- Незначительно оптимизировано чтение из словаря текстового индекса, что повысило общую производительность анализа текстового индекса. #97519 (Anton Popov).
- Ускорена декомпрессия
LZ4для 16-байтных блоков на ARM. #97774 (Raúl Marín). - Переработана токенизация: добавлен новый высокопроизводительный интерфейс, заменяющий старый API в стиле итератора, с поддержкой SIMD и токенизаторов с сохранением состояния. Часть #90268. #97871 (Amos Bird).
- Повышена производительность анализа текстового индекса для запросов с составными условиями, включающими как индексированные, так и неиндексированные столбцы. Ранее в таких случаях оптимизация раннего выхода при анализе индекса была ошибочно отключена. #98096 (Anton Popov).
- Повышена производительность запросов с константными выражениями, генерирующими очень длинные массивы или значения типа Map. #98287 (Alexey Milovidov).
- Исправлен анализ условий ключа для
DateTime64в первичных ключах при сравнении с целочисленными константами, из-за чего ранее не выполнялось отсечение гранул. #98410 (Amos Bird). - Параметр
optimize_syntax_fuse_functionsпо умолчанию включён. #98424 (Alexey Milovidov). - Оптимизирована агрегатная функция
avgWeighted: использование локальных аккумуляторов вместо построчной передачи через агрегатное состояние повышает производительность до 27% для входных данных типа Nullable. #98793 (Antonio Andelic). - Повышает производительность и снижает использование памяти для параллельных оконных функций в некоторых сценариях, а также для рабочих нагрузок
arrayFoldс большими массивами. Это также может уменьшить давление page fault и повысить стабильность затронутых запросов при жёстких ограничениях по памяти. #98892 (filimonov). - Повышена производительность слияний с сортировкой. #99013 (Artem Zuikov).
- Оптимизация
INTERSECT ALLиEXCEPT ALL. #99097 (Raufs Dunamalijevs). - Добавлена поддержка оптимизации
read_in_order_use_virtual_rowдля чтения в обратном порядке. #99198 (Vladimir Cherkasov). - Снижена конкуренция за кэш в
RIGHTиFULLJOIN-ах за счёт проверки того, установлен ли JoinUsedFlags, перед записью. #99274 (Hechem Selmi). - Оптимизирован
PrefetchingHelper::calcPrefetchLookAheadза счёт замены вычислений с плавающей запятой на чисто целочисленную арифметику, что улучшает размещение в кэше инструкций и снижает накладные расходы в циклах агрегации. #99327 (Riyane El Qoqui). - Снижено потребление памяти в Keeper за счёт замены
absl::flat_hash_setнаCompactChildrenSetдля хранения дочерних узлов. Новый контейнер хранит 0–1 дочерний узел inline, без выделения памяти в куче, что характерно для большинства узлов Keeper. Это уменьшает размерKeeperMemNodeсо 144 до 128 байт. #99860 (Antonio Andelic). - Агрегатные проекции теперь корректно поддерживаются в представлениях. Исправлено #32753. #88798 (Amos Bird).
- Реализована оптимизация преобразования OUTER JOIN в INNER JOIN при использовании
join_use_nulls. Закрывает #90978. #95968 (Vladimir Cherkasov). - Улучшено чтение подстолбцов благодаря корректному вычислению размеров перед чтением. Это снижает использование памяти и ускоряет чтение подстолбцов. #96251 (Pavel Kruglov).
- Кэши меток, несжатых данных и страниц переведены на использование отдельной arena jemalloc, чтобы избежать фрагментации памяти, когда кратковременные выделения памяти, например для queries и HTTP-запросов, смешиваются с более долгоживущими выделениями для кэшей. #96812 (Seva Potapov). #98812. #99021
- Таблицы с правилами
DELETE TTLтеперь могут использовать алгоритм Вертикального слияния. #97332 (murphy-4o). - Индексы пропуска данных теперь применяются при распределённом анализе индексов. #97767 (Azat Khuzhin).
- Метки вторичных индексов теперь заранее прогреваются, если включена настройка
prewarm_mark_cache(они загружаются в кэш меток индекса во время получения частей данных и при запуске таблицы). #97772 (Anton Popov). - Снижено число блокировок при управлении доступом. #97894 (Nikita Taranov).
- Если включен apply_row_policy_after_final или apply_prewhere_after_final, составные условия с AND в политиках строкового доступа и PREWHERE теперь раскладываются так, чтобы извлекать атомарные условия по ключу сортировки для анализа индекса первичного ключа. Ранее, если отложенный фильтр содержал смесь предикатов по ключу сортировки и не по ключу сортировки (например, x > 1 AND y != ‘foo’), всё выражение исключалось из анализа индекса. Теперь атомарные условия по ключу сортировки (например, x > 1) извлекаются и используются для отсечения гранул, в том числе из вложенных выражений с AND. #98513 (Yarik Briukhovetskyi).
- Уменьшена конкуренция за блокировку в MergeTreeBackgroundExecutor за счёт освобождения ресурсов задачи без захвата блокировки. Закрывает #93620. #98604 (Dmitry Novik).
- Исправлено чрезмерное использование памяти (~514 MiB) при автоопределении формата во время чтения данных не в формате Arrow (например, JSON из
urlилиfileбез явно указанного формата), вызванное тем, что средство чтения ArrowStream ошибочно интерпретировало первые байты как чрезмерно большую длину metadata. #98893 (Konstantin Bogdanov).
Улучшения
- Добавлена возможность разбирать файлы GeoParquet, содержащие разные типы Geo в одном и том же столбце. #97851 (Mark Needham).
- Добавлена SQL-функция
tokensForLikePattern, которая разбивает шаблоны LIKE на токены с учетом семантики подстановочных символов:%и_трактуются как подстановочные символы, экранированные подстановочные символы (\%,\_) трактуются как литералы, а токены, примыкающие к неэкранированным подстановочным символам, отбрасываются. #97872 (Amos Bird). - Добавлен заполнитель
{_schema_hash}для движка таблицы S3, добавляющий в путь S3 хеш определений столбцов таблицы. #98265 (Miсhael Stetsyuk). SymbolIndex,addressToSymbol,system.symbolsиbuildIdтеперь работают в macOS благодаря разбору таблиц символов Mach-O. #99014 (Alexey Milovidov).- Таблица
system.stack_traceтеперь работает в macOS, позволяя просматривать трассировки стека всех потоков сервера. #98982 (Alexey Milovidov). - Добавлена опция LDAP-конфигурации для каждого сервера
<follow_referrals>(по умолчаниюfalse), позволяющая управлять тем, переходит ли LDAP-клиент по рефералам. Отключение перехода по рефералам позволяет избежать тайм-аутов и зависаний при поиске от base DN корня домена Active Directory. Сообщения лога, связанные с рефералами, перенесены изwarnвtrace. #96765 (paf91). - Теперь в таблице query_log в новом столбце
skip_indicesмы отслеживаем все индексы пропуска данных, которые использовались при выполнении запроса. Исправляет #78676. Исходный автор — @pheepa. #87862 (Grant Holly). - Подсказки ACCESS_DENIED больше не раскрывают имена столбцов, если пользователь не может видеть все необходимые столбцы; имена базы данных/таблицы по-прежнему видны в подсказке. #91067 (filimonov).
- Добавлен отдельный поток очистки для MergeTree, чтобы избежать задержек очистки при высокой нагрузке на слияние. Это устраняет #86181. #91574 (Amos Bird).
- Перезагружать конфигурацию кластера, если изменились IP-адреса hostname локального сервера, а не какого-либо хоста. Исправляет #81215, #70156 и #65268. #93726 (Zhigao Hong).
- Обеспечена корректная оптимизация агрегатных функций в запросах GROUPING SETS с помощью optimize_aggregators_of_group_by_keys. #93935 (Xiaozhe Yu).
- Keeper-bench: отображать ошибки в метриках и генерировать JSON-файл с метриками для режима —input-request-log. #95748 (Mohammad Lareb Zafar).
- В CREATE USER добавлена новая клауза ROLE. #97074 (Vitaly Baranov).
- Теперь можно задавать настройки internal_replication для кластера, созданного с помощью базы данных Replicated. #97228 (Pervakov Grigorii).
- новая настройка
allow_nullable_tuple_in_extracted_subcolumnsопределяет, будут ли извлечённые подстолбцыTuple(...)изTuple,Variant,DynamicиJSONвозвращаться какNullable(Tuple(...))(NULLдля отсутствующих строк) или какTuple(...)(значения кортежа по умолчанию для отсутствующих строк). По умолчанию эта настройка отключена; изменить её можно только перезапуском сервера. #97299 (Nihal Z. Miaji). - Добавлена информация об отложенных фильтрах в виде отдельного элемента в выводе запроса EXPLAIN (при использовании Row Policies/PREWHERE с FINAL). Связано: #91065. #97374 (Yarik Briukhovetskyi).
- Параметр
type_json_allow_duplicated_key_with_literal_and_nested_objectтеперь включён по умолчанию. Это позволяет избежать ошибок о дублирующихся ключах при разборе JSON, таких как{"a" : 42, "a" : {"b" : 42}}, которые ClickHouse может формировать из исходных JSON-данных{"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov). - Улучшения Keeper:
find_super_nodes— очень полезная команда для отладки неожиданного роста количества узлов в Keeper. К сожалению, если суперузлов несколько, найти больше одного почти невозможно, потому что команда навсегда зависает при обходе дочерних узлов первого найденного суперузла. Этот PR запрещает обход дочерних узлов суперузлов. #97819 (pufit). - Базовая поддержка автодополнения для
clickhouse-keeper-client. #97828 (Konstantin Bogdanov). - Сбрасывать буферы асинхронного логирования при аварийном завершении. #97836 (Azat Khuzhin).
- Возможность impersonate теперь включена по умолчанию (см. EXECUTE AS target_user). #97870 (Vitaly Baranov).
- Улучшено прерывание запросов для движка таблицы SQLite с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #97944 (Roman Vasin).
- Добавлена настройка сервера
jemalloc_profiler_sampling_rateдля управленияlg_prof_sampleв jemalloc; она также доступна как асинхронная метрикаjemalloc.prof.lg_sample. #97945 (Antonio Andelic). - Добавлена поддержка весов в реализации ограниченной очереди с конкурентным доступом. #97962 (Daniil Ivanik).
- Добавлен
sslmodeв список допустимых ключей для источников словарей PostgreSQL. Ранееsslmodeотсутствовал в списке допустимых значенийdictionary_allowed_keysвPostgreSQLDictionarySource.cpp, из-за чего было невозможно настроить режим SSL для подключений словарей к PostgreSQL. В результате словари не могли подключаться к серверам PostgreSQL, где требуется SSL (например, к AWS RDS, где SSL обязателен по умолчанию), поскольку подключение не проходило согласование TLS, а сервер отклонял незашифрованный резервный вариант. #98014 (mcalfin). - Показывать понятную ошибку “no such file” при передаче несуществующего пути к файлу в
clickhouseилиclickhouse-localвместо сбивающего с толку общего сообщения. #98048 (Raúl Marín). - Текстовые индексы теперь можно создавать для столбцов
Nullable([Fixed]String)иArray(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena). - Не удаляйте именованные коллекции, от которых зависят источники словарей. #98127 (Pablo Marcos).
- Включена поддержка алгоритма JOIN
grace_hashдля запросов с итогами. #98144 (János Benjamin Antal). - Раннее прекращение фоновых слияний при DROP DATABASE для обычного shared merge tree. #98161 (Shaohua Wang).
- Улучшена отмена запросов к MongoDB и MySQL с помощью KILL QUERY и сочетания Ctrl+C в clickhouse-client. #98187 (Roman Vasin).
- Удалён NetlinkMetricsProvider, и для сбора метрик taskstats по отдельным потокам теперь используется только procfs. Сбор через Netlink создаёт проблемы в контейнеризированных средах и сильнее ухудшает tail latency при конкуренции за ресурсы. #98229 (Amos Bird).
- Переработана обработка файлов манифеста в Iceberg, чтобы устранить проблемы с кэшированием файлов манифеста. #98231 (Daniil Ivanik).
- Теперь мы учитываем случаи, когда ключ сортировки таблицы может быть выражением вроде
toDate(time), и можем решать, не откладывать ли вычисление таких выражений, если они входят в фильтры. #98237 (Yarik Briukhovetskyi). - Добавлена новая метрика
MaxAllocatedEphemeralLockSequentialNumber— максимальный последовательный номер, выделенный для эфемерных lock znode в ZooKeeper. #98243 (Miсhael Stetsyuk). - ClickStack обновлён до версии 2.20.0. #98252 (Aaron Knudtson).
- Добавлено новое событие профиля
KeeperRequestTotalWithSubrequests, которое учитывает каждый подзапрос в составе мультизапроса отдельно, обеспечивая лучшую видимость фактической рабочей нагрузки Keeper. Существующее событиеKeeperRequestTotalпо-прежнему учитывает каждый мультизапрос как один запрос. #98348 (Antonio Andelic). SYSTEM RELOAD DICTIONARIESтеперь перезагружает словари в порядке топологической сортировки, поэтому словари, использующие другие словари в качестве источника, после перезагрузки получают актуальные данные. #98356 (Alexey Milovidov).- Перезапускайте кеш статистики после изменения настройки MergeTree. #98520 (Han Fei).
- Только “живые” реплики (доступные для подключения) участвуют в распределённом анализе индексов. #98521 (Azat Khuzhin).
- Добавлена настройка
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(по умолчанию отключена/разрешена), которая запрещает использовать профили настроек, заданные в конфигурации (кроме профиляdefault), для пользователей, определённых через SQL. #98662 (Alexander Tokmakov). - Число узлов, используемых в автоматической эвристике параллельных реплик, теперь ограничивается фактическим числом узлов в кластере (а не только настройкой
max_parallel_replicas). #98668 (Nikita Taranov). - Реализованы хеджированные запросы и асинхронное чтение для распределённого анализа индексов. #98724 (Azat Khuzhin).
- Для десериализации бинарных состояний
AggregateFunctionтеперь необходимо полностью прочитать входные данные. Если в конце присутствуют лишние байты, ClickHouse генерирует исключение вместо того, чтобы принимать некорректные данные состояния. #98786 (Nihal Z. Miaji). - Сделать так, чтобы TRUNCATE DATABASE поддерживал отмену запроса. #98828 (Shaohua Wang).
- Улучшен
keeper-bench: добавлены конвейерная обработка запросов, период прогрева, статистика по каждой операции, воспроизводимые seed и улучшенная обработка ошибок. #98906 (Antonio Andelic). - Поддержка предложения SAMPLE при распределённом анализе индексов. #98931 (Azat Khuzhin).
- Показывать заголовок диаграммы на панели мониторинга, даже если запрос возвращает пустой результат или завершается ошибкой. #98975 (Yash ).
- Сообщения об ошибках анализатора больше не перечисляют все столбцы таблицы (что могло приводить к исключениям размером более 150 КБ). Теперь списки столбцов ограничиваются 10 элементами. #99002 (Yash ).
- Корректно возвращается статистика столбцов из подзапросов с JOIN, чтобы родительский запрос мог использовать её для изменения порядка JOIN. #99096 (Alexander Gololobov).
- Помечать сеанс ZooKeeper как истёкший сразу после начала финализации, а не ждать завершения потока отправки. Это позволяет другим потокам без задержки устанавливать новый сеанс. #99102 (Raúl Marín).
- Теперь используется больше математических функций из LLVM-libc:
exp,exp2,expm1,fabs,fabsl,floor,fmodl,log,log2,logf,pow,scalbn,scalbnl,copysignl,nan,nanf,nanlи общие константыexplogxf. #99118 (Konstantin Bogdanov). - Снизили использование памяти и устранили возможное дублирование вывода в collapsed-формате
system.jemalloc_profile_text. #99121 (Antonio Andelic). - Добавлен столбец
is_subrequestвsystem.aggregated_zookeeper_log, чтобы отделить отдельные запросы от подзапросов внутри запросов Multi/MultiRead. Ранее подзапросы агрегировались в те же бакеты, что и отдельные запросы, и поскольку каждая подоперация записывалась с общей длительностью мультизапроса, средняя задержка получалась некорректной. Теперь у подзапросов нулевая задержка. #99169 (Miсhael Stetsyuk). - Разрешена команда
ALTER TABLE MODIFY COLUMN x TTL ...без указания типа столбца. #99208 (Nikolay Degterinsky). - Пропускаются устаревшие запросы Keeper для сеансов, которые уже отключились, что позволяет избежать лишних обменов с Raft. Число отслеживаемых завершённых сеансов ограничивается настройкой coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic). - Добавлена поддержка текстового индекса, построенного на
mapValues(map), для оператораIN. #99286 (Anton Popov). - Поддержка shell-подобного автодополнения в clickhouse keeper-client (автодополнение аргументов в кавычках, то есть
'foo ba', обработка экранированных аргументов, то естьfoo\ ba,lsтеперь выводит узлы в кавычках, если они содержат пробелы). #99312 (Azat Khuzhin). - Предотвращено зависание команды Keeper
mntrиз-за конфликтов блокировок. #99472 (Antonio Andelic). - Снизить конкуренцию за блокировки в диспетчере Keeper, вызывая обратные вызовы и обрабатывая запросы на чтение вне области действия мьютекса, а также добавить профилированные lock guard’ы для обсервабилити. #99751 (Antonio Andelic).
- Допускается отсутствие заполнения в конце последнего блока файлов Parquet. #99857 (Seva Potapov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено сохранение целевого объекта таблицы Alias как зависимости DDL, если он указан не полностью: теперь используется база данных таблицы Alias, а не база данных сеанса. #95175 (Enric Calabuig).
- Исправлены неверный результат или исключение при чтении подстолбцов у столбцов ALIAS. #95408 (Pavel Kruglov).
- Исправлено отсутствие столбца при использовании нестандартного алиаса идентификатора в JOIN со старым анализатором. Исправляет #25594, #47288 и #53263. #95679 (Zhigao Hong).
- Исправлен сбой в функциях диалекта Kusto
bin(),bin_at(),extract()иindexof(), возникавший при передаче пустых аргументов. #95736 (NeedmeFordev). - Запрещает монтировать local_object_storage (которое используется для озёр данных поверх локальной файловой системы и, возможно, для LocalDisk) где-либо, кроме user_files_path, в clickhouse-client. #96201 (Daniil Ivanik).
- В движке таблицы
DeltaLakeисправлена логическая гонка при смене версии снимка и устранены избыточные ресурсоёмкие перезагрузки снимка. #96226 (Kseniia Sumarokova). - Исправлена логическая ошибка при присоединении части в MergeTree, если между её отсоединением и присоединением происходило несколько последовательных переименований. #96351 (Alexey Milovidov).
- Исправлена ошибка, из-за которой явные настройки, отправленные вместе с
compatibilityв том же запросе, могли незаметно игнорироваться, если их значение совпадало со значением по умолчанию на сервере. #97078 (Raufs Dunamalijevs). - Исправлено поведение клиента: при столкновении
INSERTс параллельным разбором с недопустимыми данными он сообщал об ошибкеNETWORK_ERRORвместо фактической ошибки разбора (с правильным номером строки). #97339 (Alexey Milovidov). - Исправлена ошибка, из-за которой агрегатная функция
sumCountне могла читать сериализованные состояния старого формата после введенияNullable(Tuple). Закрывает #97370. #97502 (Nihal Z. Miaji). - Исправлено исключение при сравнении кортежей, содержащих элементы типа
Nothing(например, при сравнении с элементами кортежаNULL), при использованииGROUPING SETSиORDER BY. #97509 (Alexey Milovidov). - Исправлено недетерминированное вычисление
uncompressed_hashдля частей Compact MergeTree при использовании нескольких кодеков сжатия, что могло приводить к некорректной дедупликации. #97522 (Alexey Milovidov). - Исправлена логическая ошибка, связанная с отсутствием stream при INSERT SELECT с JSON и бакетами в общих данных. Закрывает #97331. #97523 (Pavel Kruglov).
- Исправлены случаи, когда исключения
MEMORY_LIMIT_EXCEEDEDво время слияний SummingMergeTree и CoalescingMergeTree ошибочно регистрировались какCORRUPTED_DATA. #97537 (János Benjamin Antal). - Исправлено исключение “Context has expired” для коррелированных подзапросов, содержащих табличные функции, например
url(). #97544 (Alexey Milovidov). - Исправлены исключения и некорректное поведение в
optimize_syntax_fuse_functionsпри работе с агрегатными проекциями, типами Date и сохранением имён столбцов. #97545 (Alexey Milovidov). - Убрано некорректное переписывание запроса с
replaceRegexpOneнаextract, которое приводило к неверным результатам, если регулярное выражение не находило совпадений; также исправлено Исключение при использованииreplaceRegexpOneсGROUP BY ... WITH CUBEиgroup_by_use_nulls=1. #97546 (Alexey Milovidov). - Исправлено бесконечное зависание
DROP DATABASEпри использованииdatabase_atomic_wait_for_drop_and_detach_synchronously, если запрос был принудительно завершён. #97586 (Alexey Milovidov). - Исправлено:
KILL QUERYне мог завершать запросы, зависшие при генерацииWITH FILL, загрузке словаря черезdictGetили выполненииALTER DELETEсmutations_sync=1наReplicatedMergeTree. #97589 (Alexey Milovidov). - Табличная функция
loopвызывалаinner_storage->read()напрямую, в обход слоя интерпретатора, где применяются политики уровня строк, привилегии на уровне столбцов и другие проверки безопасности. Это позволяло пользователю, ограниченному политиками уровня строк, читать все строки черезloop(table), даже если прямой SELECT не возвращал ни одной строки. #97682 (pufit). - Исправлено некорректное отсечение партиций при использовании DateTime64 со значениями до эпохи Unix в функции
toDate(). #97746 (Yarik Briukhovetskyi). - После этого патча
hasPartitionIdбудет возвращать false, если в наборе data part есть другая партиция с более высоким идентификатором партиции. #97748 (Mikhail Artemenko). - Исправлены возможные сбои при чтении пустых гранул в расширенных общих данных в JSON. Закрывает #97563. #97778 (Pavel Kruglov).
- Исправлена ошибка
Cannot schedule a fileLOGICAL_ERRORприINSERTвDistributed, возникавшая из-за состояния гонки междуDROPиINSERT. #97822 (Azat Khuzhin). - Исправлены аварийное завершение работы сервера ClickHouse и срабатывание assert при вызове
mapContainsKey/mapContainsKeyLikeс индексом пропуска данныхtokenbf_v1. #97826 (Shankar Iyer). - Исправлены исключения LOGICAL_ERROR, возникавшие из-за
LowCardinalityвнутри составных типов (Variant,Dynamic,Tuple) вconcatWithSeparator,format,IN-подзапросах,GLOBAL INи JOIN с runtime-фильтрами. #97831 (Raúl Marín). - Исправлено Исключение
LOGICAL_ERRORChunk info was not set for chunk in MergingAggregatedTransform, возникавшее при использованииARRAY JOINс table functionmerge()для нескольких distributed таблиц в сочетании сGROUP BY. #97838 (Raúl Marín). - Исправлен сбой сервера (
std::terminate), вызванный неперехваченным исключением в деструкторе пула HTTP-соединений, когда при высоком параллелизме достигался жёсткий лимит группы соединений. ИсключениеHTTP_CONNECTION_LIMIT_REACHEDмогло пробрасываться из~PooledConnectionпри возврате соединения в пул, что приводило кSIGABRT. #97850 (Antonio Andelic). - Исправлен некорректный результат при использовании алгоритма
grace_hashс неэквивалентными JOIN, когда левый блок не удаётся обработать полностью из-за ограничений на размер результата JOIN. #97866 (János Benjamin Antal). - Исправлена проблема низкой производительности при сканировании metadata DeltaLake, возникшая после #96686. #97880 (Kseniia Sumarokova).
- Исправлена гонка данных в клиенте ZooKeeper между
sendThreadиreceiveThread. #97887 (Pablo Marcos). - Исправлена ошибка, из-за которой было невозможно использовать CTE в распределённых INSERT SELECT. Продолжение https://github.com/ClickHouse/ClickHouse/pull/87789. Закрывает #95837. #97889 (Yarik Briukhovetskyi).
- Исправлено исключение в
CachedOnDiskReadBufferFromFile::readBigAt. Закрывает #97325. #97890 (Kseniia Sumarokova). - Исправлено исключение
LOGICAL_ERRORв движкеAliasпри работе с материализованными столбцами, вызванное несоответствием столбцов. Закрывает #97907. #97921 (Kai Zhu). - Исправлена потеря данных Keeper после перезапуска при использовании Azure Blob Storage с метаданными
s3_plainв качестве хранилища журнала. #97987 (Antonio Andelic). - Исправлена ошибка JIT-компиляции функции
signдля целочисленных типов с разрядностью выше, чем уInt8— для значений вне диапазона -128..127 знак мог определяться неверно. #98012 (Alexey Milovidov). - Исправлены исключение
DUPLICATE_COLUMNи неявное появление NULL при чтении таблиц Delta Lake, использующих режим сопоставления столбцов “name”, с полями struct, имена которых содержат точки (например,STRUCT<`a.foo`: STRING, `b.foo`: STRING>). #98013 (Caio Ishizaka Costa). - Исправлена мутация после легковесного обновления и при использовании вторичных индексов. #98044 (Raúl Marín).
- Исправлен некорректный результат FINAL-запросов при сочетании индексов пропуска данных по первичному и не по первичному ключу. #98097 (Raúl Marín).
- Обеспечено выполнение проверок прав READ ON FILE для скалярной функции file() и DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
- Исправлен сбой, из-за которого запрос к файлам с glob-шаблоном (например,
file('dir/**', 'LineAsString')) приводил к необрабатываемому исключению файловой системы (STD_EXCEPTION), если каталог содержал битую символическую ссылку. Теперь такие символические ссылки молча пропускаются, и запрос возвращает результаты по всем корректным файлам. #98143 (Mark Andreev). - Исправлен сбой сегментации при оптимизации плана запроса во время преобразования OUTER JOIN в INNER JOIN с
arrayJoinв выражении фильтра. #98147 (Alexey Milovidov). - Исправлена ошибка, из-за которой формат
ProtobufListне работал с движком Kafka, поскольку состояние чтения не сбрасывалось между сообщениями. #98151 (Alexey Milovidov). - Исправлена логическая ошибка в analyzer_compatibility_join_using_top_level_identifier и ARRAY JOIN, закрыт #98164. #98179 (Vladimir Cherkasov).
- Для ответов наблюдения в
aggregated_zookeeper_logтеперь задаётся компонентWatchвместо пустого значения. #98202 (Antonio Andelic). - Если столбцы ключа партиционирования не входят в ключ сортировки, то отсечение партиций может ошибочно пропустить партиции, содержащие строки, которые должны были бы остаться после дедупликации FINAL. #98242 (Yarik Briukhovetskyi).
- Исправлена логическая ошибка “Bad cast from type DB::ColumnConst to DB::ColumnArray” в
kql_array_sort_asc/kql_array_sort_descпри вызове с аргументами в виде константных массивов. #98251 (Alexey Milovidov). - Исправлен выход за границы при обращении к
ColumnConst::getExtremes, который мог вызывать сбой при включенномextremes = 1. #98263 (Alexey Milovidov). - Исправлена потенциальная взаимная блокировка, возникавшая, когда две параллельные операции
MOVE PARTITIONработают с одной и той же парой таблиц в противоположных направлениях. #98264 (Alexey Milovidov). - HTTP-сервер теперь возвращает сообщение об ошибке в теле ответа на запросы с ответом 400 Bad Request, вызванные некорректными заголовками, вместо пустого тела. #98268 (Alexey Milovidov).
- Исправлены ошибки, приводившие к некорректным результатам при использовании распределённого анализа индексов (экспериментальная возможность) и кэша условий запроса. #98269 (Azat Khuzhin).
- Исправлено исключение LOGICAL_ERROR “Недопустимый результат двоичного поиска в
MergeTreeSetIndex”, вызванное преобразованиемtoDateдля столбцов ключа, когда данные переходили через границу 65535. #98276 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR, возникавшее, когда RIGHT JOIN, обёрнутый в CROSS JOIN, переставлялся оптимизациейquery_plan_join_swap_tableв устаревшем коде шага JOIN. #98279 (Alexey Milovidov). - Добавлена проверка повреждённых данных при десериализации
DDSketch, чтобы предотвратить segfault’ы, исключения, бесконечные циклы и OOM при чтении повреждённых состояний агрегатной функцииquantilesDD. #98284 (Alexey Milovidov). - Исправлен LOGICAL_ERROR “Trying to execute PLACEHOLDER action”, возникавший при обращении к коррелированным столбцам из внешних запросов внутри лямбда-функций, таких как
arrayMap. #98285 (Alexey Milovidov). - Исправлено исключение «Logical error» в
caseWithExpression, когда выражениеCASEвключаетmaterialize(NULL)или другие аргументыNullable(Nothing). #98290 (Alexey Milovidov). - Исправлено ошибочное исключение преобразования типов при фильтрации по виртуальному столбцу
_tableв табличной функцииmerge. #98291 (Alexey Milovidov). - Исправлен редкий сбой дедупликации, из-за которого повторные вставки ошибочно дедуплицировались из-за несогласованного порядка очистки каталогов ZooKeeper
blocks/иdeduplication_hashes/. #98293 (Alexey Milovidov). - Исправлено Исключение, возникавшее при одновременном использовании
ORDER BY ... WITH FILLиLIMIT BY. #98361 (Alexey Milovidov). - Исправлено скрытое повреждение данных при вставке столбца Parquet/Arrow
Dateв столбецEnum— теперь несовместимое преобразование типов корректно отклоняется, вместо того чтобы сохранять недопустимые значения enum. #98364 (Alexey Milovidov). - Исправлено исключение при чтении файла Arrow со столбцом
Arrayв таблицу со столбцомNested. #98365 (Alexey Milovidov). - Исправлены мутации
MATERIALIZE INDEXиMATERIALIZE PROJECTION, которые застревали, если индекс или проекция удалялись до завершения мутации. #98369 (Alexey Milovidov). - Исправлено исключение при чтении из
Nullable(Tuple(...)), когда имя элемента Tuple совпадает с подстолбцомnullу Nullable. #98372 (Alexey Milovidov). - Исправлено исключение “Столбец …: у узла дерева запроса нет корректного узла-источника” при выполнении JOIN между таблицей
Merge(оборачивающей таблицуDistributed) и другой таблицей. #98376 (Alexey Milovidov). - Исправлено некорректное преобразование
Boolиз Parquet вFixedStringв нативном ридере V3, из-за которого возвращались raw bytes вместо строкового представления. #98378 (Alexey Milovidov). - Исправлено:
tryGetColumnDescriptionтеперь фильтрует подстолбцы по виду родительского столбца, аналогично другим методам поиска столбцов. #98391 (Alexey Milovidov). - Принимать учетные данные Base64 без паддинга в HTTP Basic Auth. Некоторые HTTP-клиенты опускают завершающие символы паддинга
=в заголовкеAuthorization: Basic, что ранее приводило к ошибкам аутентификации. #98392 (Amos Bird). - Исправлены некорректные результаты отсечения партиций после слияния частей со столбцами ключа партиционирования типа
Nullable, вызванные неверными границами индекса min-max. #98405 (Amos Bird). - Исправлено редкое Исключение в исполнителе конвейера, которое могло проявляться сообщением
Received signal 6(только в отладочных сборках), когда расширение конвейера происходило одновременно с отменой запроса. #98428 (Alexey Milovidov). - Исправлено исключение “Column identifier is already registered” при использовании
count_distinct_optimizationс предложениемQUALIFY. #98433 (Alexey Milovidov). - Исправлено исключение “cannot be inside Nullable type”, возникавшее при использовании
IN/NOT INс аргументами-столбцами типаLowCardinality(например,a NOT IN (b), гдеaимеет типLowCardinality(String)). #98443 (Alexey Milovidov). - Исправлено исключение “Pipeline stuck” в JOIN-операциях
full_sorting_merge, вызванное взаимной блокировкой вPingPongProcessor, возникавшей, когда оптимизацияFilterBySetOnTheFlyсоздавала циклическую зависимость сMergeJoinTransform. #98454 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR“Проекция не может увеличить количество строк в блоке”, возникавшее при слиянии частей с TTL, удаляющим все строки, и агрегирующей проекцией с константным ключомGROUP BY. #98458 (Alexey Milovidov). - Исправлено исключение с логической ошибкой при совместном использовании
CROSS JOINиINNER JOIN USING. #98459 (Alexey Milovidov). - Исправлено обращение к нулевому указателю в
dictGetOrDefault, когда аргумент ключа имеет типNullable. #98460 (Alexey Milovidov). - Исправлено исключение в запросах
DISTINCT, возникавшее при использовании агрегатных проекций, еслиmaterializeприводил к различиям в типахLowCardinalityмежду запросом и проекцией. #98462 (Alexey Milovidov). - Исправлено исключение LOGICAL_ERROR, возникавшее при использовании
arrayJoinв выражении фильтра с OUTER JOIN и включенномjoin_use_nulls. #98464 (Alexey Milovidov). - Исправлено Исключение из-за логической ошибки “Реплика решила читать в режиме WithOrder, а не в ReverseOrder” при использовании параллельных реплик с
optimize_aggregation_in_order. #98467 (Alexey Milovidov). - Исправлено отключение Java-клиентов ZooKeeper от ClickHouse Keeper после запроса
addWatch. Java-клиент ожидает 4-байтовое телоErrorResponseв ответе наaddWatch, но Keeper отправлял пустое тело, из-за чего возникалоEOFExceptionи разрывался сеанс. Из-за этого переставали работатьCuratorCacheв Apache Curator и любые Java-приложения, использующие постоянные наблюдения. Исправляет #98079. #98499 (Antonio Andelic). - Исправлено поведение, при котором метрики Keeper
zk_followersиzk_synced_followersне уменьшались при отказе follower. В четырёхбуквенную командуmntrдобавлены новые метрикиzk_learnersиzk_synced_non_voting_followers. Исправляет #54173. #98504 (Antonio Andelic). - Исправлено исключение
LOGICAL_ERRORвrenameAndCommitEmptyParts, которое могло возникнуть при одновременном выполненииTRUNCATE TABLEиOPTIMIZE TABLEс использованием транзакций MergeTree. #98508 (Alexey Milovidov). - Исправлено поведение, при котором защищённый raft-порт Keeper игнорировал параметры
cipherListиdhParamsFileиз конфигурацииopenSSLи всегда использовал значения по умолчанию вместо заданных пользователем. Закрывает #51188. #98509 (Antonio Andelic). - Исправлены вводящие в заблуждение сообщения лога Keeper, такие как “Receiving request for session X took 9963 ms”, где указанное время на самом деле уходило на ожидание в состоянии бездействия в
poll()между heartbeat-сообщениями, а не на выполнение самой операции. Исправление #79026. #98510 (Antonio Andelic). - Исправлен неожиданный результат при использовании read_in_order_use_virtual_row и монотонных функций; закрыт #97837. #98514 (Vladimir Cherkasov).
- Исправлена ошибка
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'при использованииPREWHEREс подзапросом вINв таблицах семейства MergeTree. #98522 (Alexey Milovidov). - Исправлены TCP-соединения Keeper, из-за которых сервер не мог корректно завершить работу, поскольку они не реагировали на сигнал завершения. #98525 (Alexey Milovidov).
- Исправлено исключение “Столбец сортировки не найден среди выходов ActionsDAG” при включенном
query_plan_convert_join_to_inиquery_plan_merge_expressions = 0. #98526 (Alexey Milovidov). - Исправлена проблема, из-за которой источник словаря MongoDB не работал с именованными коллекциями. Закрывает #97840. #98528 (Pablo Marcos).
- Исправлен LOGICAL_ERROR, возникавший, если после подстановки параметров Identifier оказывался пустым. #98530 (Pervakov Grigorii).
- Исправлена взаимная блокировка конвейера при одновременном использовании
sort_overflow_mode = 'break'и оконных функций. #98543 (Alexey Milovidov). - Исправлен откат столбца в движке Buffer при обработке исключения, возникающего при добавлении нового блока. Прежняя логика могла приводить к повреждению состояния столбцов в памяти. #98551 (Pavel Kruglov).
- Исправлено исключение
Bad cast from type ColumnConst to ColumnDynamicпри null-safe сравнении (<=>/IS NOT DISTINCT FROM) с константными столбцамиDynamicилиVariantиNULL. Также исправлена ошибка, из-за которойIS DISTINCT FROMдляDynamic/Variantпри сравнении сNULLвсегда ошибочно возвращал 0. #98553 (Alexey Milovidov). - Исправлено использование текстового индекса вместе с другими индексами пропуска данных. Ранее при одновременном использовании фильтром запроса текстового индекса и других обычных индексов пропуска данных могли возникать логические ошибки, такие как “Trying to get non-existing mark”. #98555 (Anton Popov).
- Исправлена логическая ошибка “TABLE_FUNCTION is not allowed in expression context”, которая возникала, когда табличная функция с псевдонимом использовалась несколько раз в пределах одной и той же области видимости запроса (например, в секциях
PREWHEREиQUALIFY). #98557 (Alexey Milovidov). - Исправлен распределённый анализ индексов для выражений (а не только для столбцов) в PK (из-за ошибки на удалённых репликах не отфильтровывались избыточные гранулы). #98561 (Azat Khuzhin).
- Запретить удаление столбца, если его подстолбцы используются в выражениях default/alias других столбцов, и использовать анализатор для выражений default при выполнении alter drop column. #98569 (Nikita Mikhaylov).
- Исправлены некорректные повторные попытки выполнения запросов S3 при ошибках, не допускающих повторной попытки (включая
HTTP_CONNECTION_LIMIT_REACHED), в HTTP-клиенте. #98598 (Sema Checherinda). - Исправлено переполнение Decimal при отсечении партиций с DateTime64. #98628 (Yarik Briukhovetskyi).
- Исправлены две ошибки в JIT-компиляции выражений: ошибка copy-paste в проверке типов
nativeCast, из-за которой ветви приведения integer-to-integer и float-to-float были недостижимы, а также передача некорректногоnullptrдля TargetMachine в LLVMPassBuilder, из-за чего не регистрировались специфичные для целевой платформы этапы оптимизации. #98660 (Alexey Milovidov). - Исправлен обход RBAC, который позволял пользователям выполнять DESCRIBE для любой таблицы через
remote(),remoteSecure(),cluster()илиclusterAllReplicas(), указывая на localhost, без привилегииSHOW_COLUMNS. #98669 (pufit). - Исправлено исключение
BAD_GETи некорректные результаты запроса, возникавшие, когда небулево выражение (например,sin(col)) использовалось одновременно в WHERE и SELECT с JOIN из-за того, что оптимизация проталкивания фильтра повреждала общие узлы DAG. #98681 (Alexey Milovidov). - Исправлен LOGICAL_ERROR “Реплика решила читать в режиме Default, а не WithOrder” при использовании
read_in_order_through_joinс параллельными репликами. #98685 (Alexey Milovidov). - Исправлено Исключение “Неверное приведение типа
DB::TableFunctionNodeкDB::QueryNode” при использовании табличной функцииinputв качестве аргумента функцииremote. #98694 (Alexey Milovidov). - Исправлено повторное появление устаревших частей данных, вызванное некорректной очисткой пустых перекрывающих частей. #98698 (Shaohua Wang).
- Исправлено исключение в
LogicalExpressionOptimizerPass, возникавшее, если булева функция в сравненииequalsвозвращала типVariant. #98712 (Alexey Milovidov). - Исправлен некорректный разбор функцией
parseDateTimeBestEffortслов, начинающихся с префиксов названий месяцев/дней недели. Закрывает #97965. #98742 (Pavel Kruglov). - Исправлено исключение
UNKNOWN_IDENTIFIER, возникавшее при выполнении запросов к табличной функцииmerge()или движкуMergeдля таблиц с JSON-столбцами с разными параметрами (например, разными полямиSKIP) и столбцамиALIAS, ссылающимися на подпути JSON, при включенном новом анализаторе. Закрывает #97812. #98753 (Pavel Kruglov). - Исправлена работа оптимизации
optimize_skip_unused_shardsс анализатором при использовании хранилищаDistributedвView. #98754 (Nikolai Kochetov). - Исправлен доступ по имени к подстолбцам кортежа (например,
SELECT x.aдляTuple(a UUID, b Int32)) во внешних таблицах, передаваемых через--externalвclickhouse-client. Закрывает #96925. #98755 (Pavel Kruglov). - Исправлено Исключение
reverseUTF8при некорректном (усечённом) вводе UTF-8. #98770 (Alexey Milovidov). - Исправлено определение применимости индекса пропуска данных типа set для предиката с OR и false (то есть
or(x, 0)). #98776 (Azat Khuzhin). - Исправлено исключение
LOGICAL_ERROR(несоответствие структуры блока вremoveUnusedColumns), которое могло возникать приFINAL+PREWHERE+ константном выраженииWHERE+ не зависящих от столбцов агрегатах, таких какcount(). #98778 (Alexey Milovidov). - Записи
system.trace_logдля автоперезагрузки словарей ClickHouse теперь имеют непустые идентификаторы запросов. #98784 (Miсhael Stetsyuk). - Исправлен crash, при котором мог происходить доступ по нулевому указателю в system tables, созданных в промежутке между созданием снимка таблиц при вызове
IDatabaseTablesIterator::table()и изменением таблиц в другом потоке во время последующей итерации. #98792 (Grant Holly). - Исправлена ошибка, из-за которой
SYSTEM START REPLICATED VIEWне активировала задачу обновления. #98797 (Pablo Marcos). - Исправлено исключение “Inconsistent table names” при использовании табличной функции
view(), содержащей JOIN-операции внутри другого JOIN (только со старым анализатором). #98809 (Alexey Milovidov). - Исправлена корректировка RLIMIT_SIGPENDING (через pending_signals). #98829 (Azat Khuzhin).
- Исправлено исключение при комбинировании
loopс табличными функциями кластера. #98860 (Konstantin Bogdanov). - LEFT ANTI JOIN по нескольким столбцам ключа JOIN возвращал некорректные результаты, когда
enable_join_runtime_filters=1(значение по умолчанию). #98871 (Alexander Gololobov). - Исправлено поведение, из-за которого
WITH FILL STALENESSсоздавал лишние заполненные строки при чтении данных несколькими фрагментами (например, при небольшомindex_granularity). #98895 (Alexey Milovidov). - Исправлена ошибка LOGICAL_ERROR «RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B». #98900 (Azat Khuzhin).
- Исправлена рассинхронизация учёта памяти, вызванная тем, что при неудачных выделениях памяти не выполнялся откат, неопределённым поведением
nallocx(0)и ошибкой на единицу при отслеживании глобального пика. Отслеживание расширено и теперь охватывает кольцевые буферыio_uring. #98915 (Antonio Andelic). - Запретить выполнение Attach для таблиц локального озера данных вне пользовательских путей, а не только их создание. #98936 (Daniil Ivanik).
- Исправлено состояние гонки, которое могло вызывать исключение “ReadBuffer is canceled” в запросах, использующих
urlClusterили аналогичные кластерные табличные функции. #98955 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORв финансовых функциях (financialNetPresentValue,financialInternalRateOfReturnи т. д.), возникавшее при передаче аргументов типаBFloat16. #98958 (Alexey Milovidov). - Исправлена ошибка, из-за которой индексы пропуска данных (и условия по первичному ключу) не применялись к столбцам ALIAS, когда слияние выражений в плане запроса отключено (query_plan_merge_expressions = 0 или query_plan_enable_optimizations = 0). #98960 (Peng).
- Для асинхронных вставок теперь увеличивается ProfileEvent
InsertQuery. Закрывает #98626. #98962 (Narasimha Pakeer). - Исправлено исключение “Inconsistent KeyCondition behavior” в отладочных сборках, когда первичный ключ содержит значения NaN с плавающей запятой:
accurateLessиaccurateEqualsтеперь обрабатывают NaN согласованно с порядком сортировки ClickHouse. Закрывает #98075. #98964 (Alexey Milovidov). - SummingMergeTree больше не суммирует столбцы типа Bool (и других доменных типов). Значения Bool теперь сохраняются как есть, а не суммируются арифметически. #98976 (Yash ).
- Исправлено исключение Scalar doesn’t exist, возникавшее при выполнении запроса к удалённому сегменту с включённым
optimize_const_name_sizeиenable_scalar_subquery_optimization= 0. Крупные константы, заменённые в удалённом запросе ссылками__getScalar, не отправлялись в сегмент, из-за чего запрос завершался ошибкой. #98979 (andriibeee). - Исправлено
NOT_FOUND_COLUMN_IN_BLOCKдля некоторых запросов сGROUP BYи выражениями, включающими обратный поиск в словаре, сравнения при преобразованииDate/DateTimeи сравнения кортежей. Закрывает #98888. #98980 (Nihal Z. Miaji). - Исправлено неопределённое поведение (разыменование нулевого указателя) при изменении столбца version/sign/is_deleted в
EPHEMERALилиALIASв движках MergeTree. Такие изменения теперь корректно отклоняются. #98985 (Alexey Milovidov). - Исправлена проблема, из-за которой в
system.grantsотсутствовали параметры регулярного выражения для привилегийURLиS3в столбцеaccess_object. #98987 (DQ). - Исправлено чтение из Iceberg BigLake: учетные данные ADC теперь передаются S3-клиенту GCS (что устраняет ошибки 403), учетные данные OAuth2 перед отправкой теперь URL-кодируются (что устраняет сбои аутентификации для токенов со специальными символами), а обход пространства имен больше не прерывается при получении от BigLake ответов HTTP 400. #98998 (Nikita Fomichev).
- Исправлена ошибка, из-за которой
clickhouse-clientне переключал часовой пояс, если переменная окруженияTZзадавалась в виде пути к файлу POSIX (например,TZ=:/etc/localtime). #99000 (Yash ). - Исправлено некорректное или недостаточное отсечение, когда
startsWith,LIKE,NOT LIKEиспользуются со столбцомFixedString. Кроме того, функция приведенияFixedStringкStringтеперь может отсекать гранулы, если применяется к ключевому столбцу. Закрывает #98940. #99001 (Nihal Z. Miaji). - Исправлена ошибка, из-за которой
windowFunnelсstrict_deduplicationвозвращал неверный уровень при обнаружении дубликата события. #99003 (Yash ). - Исправлена ошибка, из-за которой EXISTS игнорировал секции LIMIT и OFFSET в подзапросах, что приводило к некорректным результатам, если подзапрос не возвращал ни одной строки из-за OFFSET или LIMIT со значением 0. Закрывает #88722. #99005 (andriibeee).
- Исправлено исключение “Block structure mismatch”, возникавшее, когда при оптимизации проталкивания фильтра выражение AND сводилось к константе из-за короткого замыкания при использовании
GROUPING SETS. #99010 (Alexey Milovidov). - Исправлено Исключение при чтении патч-частей (легковесные обновления), если в плане запроса отсутствует столбец
_part_offset. #99023 (Alexey Milovidov). - Запрос вида
SELECT * FROM table WHERE pk_id = '', гдеpk_id— первичный ключ типаString, теперь будет корректно использовать индекс первичного ключа для фильтрации гранул. #99027 (Shankar Iyer). - Исправлено исключение
DEPENDENCIES_NOT_FOUNDв движке Kafka, возникавшее, когда materialized view было отсоединено, пока фоновый поток передавал данные. #99028 (Alexey Milovidov). - Исправлено Исключение при создании таблицы со столбцом
EPHEMERAL, у которого то же имя, что и у виртуального столбца (например,_part_offset). #99031 (Alexey Milovidov). - Исправлено вводящее в заблуждение сообщение “inflate failed: buffer error” при чтении несуществующих сжатых файлов через табличную функцию
url()с глоб-шаблонами. Теперь при включенномhttp_skip_not_found_url_for_globs, как и ожидается, возвращается пустой результат. #99034 (Alexey Milovidov). - Исправлен сбой сервера (std::terminate) при выполнении
ALTER TABLE ... DROP PARTдля patch part после изменения схемы (например, ADD COLUMN). Сбой был вызван отсутствием системных столбцов (_part) в метаданных пустой coverage part, что приводило к неперехваченному исключению внутри NOEXCEPT_SCOPE. #99036 (Peng). - Процесс сервера ClickHouse мог аварийно завершиться, если во время чтения с кэш-диска возникало исключение о превышении лимита памяти. Теперь это исправлено. #99042 (Shankar Iyer).
- Исправлен
LOGICAL_ERRORпри запросе к таблице, в которой есть и ROW POLICY, и столбец ALIAS, с использованиемdictGet. Проблема была вызвана преждевременным обращением к табличному выражению при разрешении столбца ALIAS в новом анализаторе. #99065 (Peng). - Исправлена ошибка выхода за границы, возникавшая, когда пользователь пытался выполнить запрос только к виртуальным столбцам таблицы Iceberg с форматом данных Avro. Это крайне редкий сценарий, поэтому он не помечен как критический. Закрывает #88238. #99080 (alesapin).
- Исправлен segfault в рекурсивном CTE с
remote()+view(). #99081 (Konstantin Bogdanov). - Пропускается лишний анализ индексов, если применяется оптимизация чтения в порядке сортировки. #99084 (Vladimir Cherkasov).
- Исправлен сбой, вызванный исключением по ограничению памяти при применении patch part. #99086 (Anton Popov).
- Исправлено срабатывание отладочного assert в
DDLWorker, вызванное неактуальнымfirst_failed_task_nameпосле удаления записи ZooKeeper в ходе восстановления после повторной инициализации. #99099 (Antonio Andelic). - Исправлена проблема с перестроением текстовых индексов при слияниях с TTL. #99107 (Anton Popov).
- Исправлен сбой при выполнении запроса
ALTER TABLE ... REMOVE SETTINGSдля движка таблицы Iceberg. Исправляет #86330. #99108 (alesapin). - Исправлена ошибка в оптимизации
query_plan_convert_any_join_to_semi_or_anti_join, из-за которой для строк без совпадений возвращался некорректный результат. Связано: https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi). - Исправлено Исключение LOGICAL_ERROR в
ASTColumnsExceptTransformer::transform. #99119 (Pablo Marcos). - Исправлен обход RBAC, который позволял пользователям получать структуру таблицы через
DESCRIBE TABLEилиCREATE TABLE ASдля табличных функций (mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc()и т. д.) без необходимых привилегий доступа к источнику. Для функций, которые автоматически определяют схему по удалённым серверам, это также позволяло без авторизации инициировать исходящие соединения (SSRF). #99122 (pufit). - Исправлен сбой Keeper (segfault в NuRaft) во время динамической реконфигурации и передачи лидерства. #99133 (JIaQi Tang).
- Исправлен сбой при использовании таблицы Buffer с SAMPLE, если пункт назначения его не поддерживает. #99141 (Kseniia Sumarokova).
- Исправлена ошибка LOGICAL_ERROR, вызванная несоответствием порядка столбцов в патч-частях. #99164 (Pablo Marcos).
- Исправлено очень редкое аварийное завершение, возникавшее, когда таблица Iceberg содержит файлы смешанных форматов (ORC и Parquet). Исправление #88126. #99168 (alesapin).
- Исправлено неприменение max_execution_time при резервном копировании и восстановлении. #99205 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой
insert_deduplication_tokenмолча игнорировался в запросахINSERT SELECTбезORDER BY ALL. Ранее для несортированныхINSERT SELECTдедупликация была полностью отключена, даже если был явно указан пользовательский токен. Теперь для включения дедупликации достаточно указатьinsert_deduplication_tokenнезависимо отORDER BY ALL. #99206 (Desel72). - Исправлены избыточные проверки доступа при оптимизации
InverseDictionaryLookupPass: теперь grantCREATE_TEMPORARY_TABLEпроверяется один раз перед проходом, а не для каждого посещаемого узла. #99210 (Mikhail Artemenko). - Исправлена проблема, из-за которой
clickhouse format --obfuscateвыдавал некорректный SQL при обфускации типов индекса пропуска данных, имён кодеков сжатия, имён движков баз данных и определений структуры/источника словаря. #99260 (Raúl Marín). - Исправлена ошибка, из-за которой в некоторых случаях сравнение типов Time[64] и DateTime[64] могло вызывать путаницу; теперь в таких случаях значения Time[64] приводятся к DateTime[64] с добавлением
1970-01-01в качестве даты. #99267 (Yarik Briukhovetskyi). - Ограничение значений настроек допустимыми пределами в DDL-воркере для распределённых DDL-запросов. #99317 (Pablo Marcos).
- Исправлены незначительные проблемы с аутентификацией TOTP: обработка пустого пароля в опции CLI
--one-time-password, проверка значений конфигурации<digits>и<period>. #99322 (Vladimir Cherkasov). - Исправлена логическая ошибка
unordered_map::at: key not foundв формате вывода Avro при сериализации столбцовEnum8/Enum16со значениями, отсутствующими в определении enum. #99332 (Desel72). - Исправлен
CHECK TABLEдля разреженной сериализации в Tuple с Dynamic. Закрывает #96588. #99351 (Pavel Kruglov). - Исправлена излишне строгая проверка предобработчика текстового индекса. #99359 (Anton Popov).
- Исправлена проблема совместимости при обновлении реплицированных таблиц с неявными индексами minmax с версии 25.10 на более новые версии. #99392 (Raúl Marín).
- Удалена поддержка функций с отрицанием (
notEquals,notLike,notIn) при анализе текстового индекса. Эти функции никогда не позволяли пропускать ни одной гранулы, поэтому их анализ в индексе лишь создавал дополнительную нагрузку, не принося никакой пользы. #99393 (Anton Popov). - Исправлена работа
optimize_skip_unused_shardsв новом анализаторе в случае, когда таблицаDistributedиспользовалась внутри подзапроса с IN. #99436 (Nikolai Kochetov). - Исправлена ошибка heap-use-after-free в
INTERSECT/EXCEPT, когда запрос возвращает повторяющиеся имена столбцов. #99471 (Alexey Milovidov). - Исправлена логическая ошибка в
ALTER TABLE ... DROP PART, когда в качестве имени части используется типизированный параметр запроса. #99489 (Alexey Milovidov). - Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда предикат текстового индекса (например,hasAllTokens) использовался в секцияхSELECTиWHEREчерез псевдоним. #99504 (Anton Popov). - Исправлены некорректные результаты при использовании
hasAllTokensс оператором OR между столбцами, для которых созданы отдельные текстовые индексы. #99505 (Anton Popov). - В
clickhouse-localинициализирован кэш страниц, чтобы начала действовать настройкаpage_cache_max_size. #99510 (Alexey Milovidov). - Исправлена редкая ошибка, из-за которой часть данных некорректно помечалась как повреждённая и отсоединялась после запроса
DETACH/ATTACH TABLE. #99529 (Anton Popov). - Исправлено исключение
std::length_error, возникавшее при запросе пустых системных таблиц в формате Pretty через HTTP-интерфейс. #99541 (Alexey Milovidov). - Исправлен
LOGICAL_ERRORпри использованииALTER TABLE ADD COLUMNдля созданияEPHEMERAL-столбца с тем же именем, что у виртуального столбца (например,_part_offset). #99549 (Alexey Milovidov). - Исправлена ошибка, из-за которой записи
VectorSimilarityIndexCacheникогда не вытеснялись после удаления части данных из-за несовпадения ключей кэша. #99575 (Seva Potapov). - Запретить чтение учетных данных Google из локального файла. Эта настройка небезопасна, поскольку позволяет читать и другие учетные данные, если известен путь к файлу. #99584 (Konstantin Vedernikov).
- Устранена деградация производительности в анализаторе. Из ARRAY JOIN исключены неиспользуемые столбцы. #99587 (Dmitry Novik).
- Исправлено чтение текстового индекса в таблице при наличии легковесных удалений и политик доступа на уровне строк. #99661 (Anton Popov).
- Исправлено разыменование nullptr в ридере Parquet, когда в ветке filter-in-decoder встречаются отфильтрованные страницы. Закрывает #99676. #99677 (Alexey Milovidov).
- Исправлен некорректный переход seek в AsynchronousReadBufferFromFileDescriptor с O_DIRECT. Закрывает #99358. #99678 (Pavel Kruglov).
- Исправлены переполнение буфера в куче в
CompressionCodecT64и аварийное завершение процесса вCompressionCodecMultipleпри распаковке повреждённых сжатых данных. Обе проблемы были обнаружены новыми таргетами libFuzzer. Теперь кодеки генерируют исключение вместо сбоя. #99680 (Rahul). - Откладывать обработку, пока сервер не завершит загрузку всех таблиц. #99700 (Seva Potapov).
- Исправлен обход
RemoteHostFilterисточником словаря MySQL при использовании встроенных параметров DDL. #99720 (Shaohua Wang). - Исправлена логическая ошибка при обходе таблиц озёр данных в
system.tables. #99739 (Konstantin Vedernikov). - Исправлен анализ предикатов с функцией
INдля текстового индекса с предобработчиком. Исправлена коллизия искомых токенов в текстовом индексе, которая могла приводить к некорректным результатам. #99755 (Anton Popov). - Исправлен бесконечный цикл при чтении файлов формата
Npyс отрицательными значениями размерностей в shape. #99812 (Desel72). - Исправлен global-buffer-overflow в функции
CRC32на аргументахFixedString, возникавший при вычислении с нулевым числом строк во время расчёта заголовка плана запроса. #99835 (Alexey Milovidov). - Исправлен сбой (обращение по нулевому указателю) при выполнении
ALTER TABLE ... MODIFY COLUMN ... COMMENTдля таблиц Iceberg. #99838 (Desel72). - Исправлена настройка
aggregate_functions_null_for_empty: теперь она работает с агрегатными функциями, возвращающими типы, отличные отNullable, такие какArrayилиMap(например,groupArray,sumMap). #99839 (Alexey Milovidov). - Исправлено исключение LOGICAL_ERROR в функции
midpoint, которое возникало при вызове со смешанными знаковыми и беззнаковыми целочисленными типами. #99867 (Alexey Milovidov). - Исправлено Исключение “Block structure mismatch” в запросах с предложением HAVING, где выражение фильтра содержит и агрегатную функцию, обёрнутую в функцию, возвращающую NULL, и
materialize(0). #99915 (Alexey Milovidov). - Исправлена ошибка assertion failure в
sipHash128Keyed(и аналогичных хеш-функциях с ключом), когда аргумент data имеет тип Map с ключами-массивами или другими вложенными типами массивов. #99921 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR“Not-ready Set” в функцииINпри оптимизации плана выполнения запроса сconvertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- Сокращено время компиляции за счёт удаления тяжёлых включений заголовочных файлов и переноса затратных инстанцирований шаблонов из заголовков. #97893 (Raúl Marín).
- Сокращено время компиляции арифметических функций и связанных с ними заголовочных файлов за счёт уменьшения матриц диспетчеризации шаблонов и удаления тяжёлых включений. #98204 (Raúl Marín).
- Используется
mongo-c-driver2.2.2. #98304 (Konstantin Bogdanov). - Используется
postgresREL_18_3. #98306 (Konstantin Bogdanov). - Для сборок UBSan включён jemalloc allocator, чтобы избежать накопления RSS из-за неэффективного возврата памяти в glibc malloc. #98444 (Alexey Milovidov).
- Используется манглинг символов Rust v0, а из библиотеки PRQL удалены внутренние символы, чтобы сократить разрастание имён символов из библиотек combinator для parser. #98446 (Alexey Milovidov).
- В
tests/benchmarksдобавлены набор бенчмарков TPC-H и README для TPC-DS. #98495 (Raufs Dunamalijevs). - Добавлены тесты корректности для всех 99 запросов TPC-DS. #99204 (Raufs Dunamalijevs).
- Добавлен интеграционный тест, воспроизводящий баг с DDL CREATE TABLE + ALTER при офлайн-реплике (#44070); он помечен как ожидаемо завершающийся с ошибкой. #99259 (Raufs Dunamalijevs).
- Интегрирован jemalloc с префиксом
je_, удалено использование--wrapкомпоновщика. #99342 (Azat Khuzhin).
Релиз ClickHouse 26.2, 2026-02-26. Презентация, Видео
обратно несовместимое изменение
- Дедупликация по умолчанию включена для всех вставок. Раньше она была отключена для асинхронных вставок и MV, но включена для синхронных вставок. Цель — сделать одинаковые значения по умолчанию для обоих способов вставки. Если в вашем кластере дедупликация явно отключена, чтобы сохранить прежнее поведение, нужно явно установить
deduplicate_insert='backward_compatible_choice'. То же самое касаетсяdeduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda). - Улучшен формат хранения статистики: теперь вся статистика хранится в одном файле. #93414 (Anton Popov). Если вы не включали статистику таблиц явно, этот пункт можно проигнорировать.
- Ограничен объём метаданных S3(Azure)Queue, хранимых в памяти. Системные таблицы переименованы:
azure_queueвazure_queue_metadata_cache, аsystem.s3queue— вs3queue_metadata_cache. #95809 (Kseniia Sumarokova). - Ранее при применении функции к столбцу
Variantпри несовместимости подтипа variant с функцией молча возвращались значения NULL; теперь генерируется исключение, что может нарушить работу запросов, которые опирались на такое поведение с молчаливым возвратом NULL. #95811 (Bharat Nallan). - Столбцы
DATEиз PostgreSQL теперь в ClickHouse автоматически определяются какDate32(в предыдущих версиях они определялись какDate, что приводило к переполнению значений за пределами узкого диапазона). Разрешена вставка значенийDate32обратно в PostgreSQL. Закрывает #73084. #95999 (Alexey Milovidov). - Семантика настройки
do_not_merge_across_partitions_select_finalстала понятнее. Ранее эта возможность могла включаться автоматически, даже если настройка не была явно задана в конфигурации. Это неоднократно вызывало путаницу и, к сожалению, приводило к проблемам в продакшне. Теперь правила проще:do_not_merge_across_partitions_select_final=1безусловно включает эту возможность. Еслиdo_not_merge_across_partitions_select_final=0, автоматический режим используется только приenable_automatic_decision_for_merging_across_partitions_for_final=1, а в противном случае не используется. Чтобы максимально сохранить прежнее поведение, значения по умолчанию были установлены следующими:do_not_merge_across_partitions_select_final=0иenable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov). - При создании таблицы S3 с явно указанными столбцами ClickHouse теперь проверяет, что эти имена столбцов действительно присутствуют в схеме удалённого файла. Запросы, которые раньше работали при несовпадении имён столбцов, теперь будут завершаться ошибкой уже на этапе создания таблицы. Это закрывает #96089. #96194 (Konstantin Vedernikov).
- Запрещено использование подзапросов в ORDER BY и других ключевых выражениях таблицы. #96847 (Alexey Milovidov).
- По умолчанию включить
apply_row_policy_after_final. Изначально, когдаoptimize_move_to_prewhere_if_final=0, и ROW POLICY, и PREWHERE учитывали FINAL и применялись после FINAL. Это поведение было нарушено в #87303, где для фильтра ROW POLICY игнорировался параметрoptimize_move_to_prewhere_if_final. Чтобы это исправить, в данном PR включается настройкаapply_row_policy_after_final, добавленная в #91065. При включенномapply_row_policy_after_finalROW POLICY, как и раньше, по умолчанию продолжает учитывать FINAL. Этот PR вносит несовместимое изменение, поскольку меняет поведение дляoptimize_move_to_prewhere_if_final=1. Теперь, чтобы ROW POLICY применялся до FINAL, следует использоватьapply_row_policy_after_final, а неoptimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov). - Тип
Dateтеперь сериализуется как встроенный тип Arrowdate32в форматах Arrow/ArrowStream вместоuint16. Инструменты вроде PyArrow теперь будут корректно распознавать столбец как тип даты. Прежнее поведение можно восстановить с помощью настройкиoutput_format_arrow_date_as_uint16. Чтение старых файлов Arrow, в которых для столбцовDateиспользовалсяuint16, по-прежнему поддерживается. #96860 (Alexey Milovidov).
Новая возможность
- Теперь пользователи могут напрямую использовать ClickStack (интерфейс обсервабилити) из ClickHouse, что удобно для отладки и локальной разработки. #96597 (Aaron Knudtson).
- Добавлена поддержка одноразовых паролей на основе времени (TOTP) в качестве метода аутентификации. #71273 (Vladimir Cherkasov).
- Добавлена настройка базы данных
lazy_load_tables. Когда она включена, таблицы не загружаются при запуске базы данных — вместо них создается легковесныйStorageTableProxy, а настоящий движок таблицы материализуется при первом обращении. #96283 (xiaohuanlin). - Добавлена настройка
input_format_max_block_wait_ms, позволяющая выдавать блоки данных по тайм-ауту, а также разрешена обработка оставшихся данных при неожиданном закрытии HTTP-соединения. #94509 (Mostafa Mohamed Salah). - Интеграция с каталогом Google BigLake. Закрывает #95339. #97104 (Konstantin Vedernikov).
- Добавлена системная таблица
system.tokenizers, содержащая список всех доступных токенизаторов. #96753 (Robert Schulze). - Добавлена новая системная таблица
system.user_defined_functionsдля мониторинга статуса загрузки UDF и настроек. #90340 (Xu Jia). - Добавлена таблица
system.jemalloc_stats, показывающая статистику аллокатора памяти jemalloc (черезmalloc_stats_print) для диагностики использования памяти на серверах, собранных с jemalloc. Также в HTTP-интерфейс ClickHouse добавлена HTTP-конечная точка/jemalloc.htmlдля интерактивной визуализации этой статистики. #97077 (Antonio Andelic). - Добавлена таблица
system.jemalloc_profile_textдля чтения и анализа профилей кучи jemalloc. Формат вывода задается настройкойjemalloc_profile_text_output_format(raw, symbolized или collapsed; по умолчанию — collapsed). Разрешение inline-фреймов задаетсяjemalloc_profile_text_symbolize_with_inline(если параметр включен, inline-фреймы включаются ценой более медленной символизации; если отключен, они пропускаются для более быстрого вывода). Для формата collapsed параметрjemalloc_profile_text_collapsed_use_countопределяет, взвешиваются ли стеки по числу активных аллокаций (true) или по объему активных байт (false, по умолчанию). Это упрощает профилирование памяти и визуализацию флеймграфов для профилей кучи jemalloc. Исправляет #93248. #97218 (Antonio Andelic). - Добавлена настройка
default_dictionary_database, которая позволяет ClickHouse искать внешние словари, указанные без имени базы данных, в заданной базе данных по умолчанию. Это упрощает миграцию с глобальных словарей, определённых в XML, на словари отдельных баз данных, определённые в SQL, позволяя существующим запросам к словарям (например, dictGet(‘name’, …)) продолжать работать без изменений. #91412 (Dmitrii Plotnikov). - Добавлена поддержка дополнительного ZooKeeper для
DatabaseReplicated. #91683 (RinChanNOW). - Добавлены новая табличная функция
primesи новая системная таблицаsystem.primes, содержащая простые числа в порядке возрастания. Закрывает #90839. #92776 (Nihal Z. Miaji). - Асинхронные вставки поддерживают параллельный кворум. Вставленные данные реплицируются до достижения кворума. Если обнаруживаются дубликаты, запрос ожидает, пока ранее вставленные данные тоже не будут реплицированы. #93356 (Sema Checherinda).
- Добавлены функции
colorOKLABToSRGBиcolorSRGBToOKLABдля преобразования значений из sRGB в OKLAB и обратно. #93361 (Pranav Tiwari). - Новая настройка
deduplicate_insert, переопределяющаяinsert_deduplicateиasync_insert_deduplicate. #94413 (Sema Checherinda). - Настройка сервера
insert_deduplication_versionпозволяет выполнять переход на единый хеш дедупликации. #95409 (Sema Checherinda). - Добавлена функция хеширования
xxh3_128. #96055 (Raúl Marín). - Добавлен запрос
OPTIMIZE <table> DRY RUN PARTS <part names>для имитации слияний без коммита результирующей части. Это может быть полезно при тестировании: для проверки корректности слияний в новой версии, детерминированного воспроизведения ошибок, связанных со слияниями, и надёжного бенчмаркинга производительности слияний. #96122 (Anton Popov). - Добавлена новая проверка, по умолчанию включенная настройкой
check_named_collection_dependencies, чтобы предотвратить удаление именованных коллекций, используемых таблицами. #96181 (Pablo Marcos). - Добавлен
system.fail_pointsдля просмотра существующих failpoint’ов в сервере и проверки, включены они или нет. Это поможет автоматизировать тестирование. #96762 (Pedro Ferreira). - Добавлена поддержка ролевого доступа к каталогу Glue. Используйте настройки
aws_role_arnи, при необходимости,aws_role_session_name. #90825 (Antonio Andelic). - Добавлен параметр
add_minmax_index_for_temporal_columns, который при включении автоматически создает индексы MinMax для всех столбцовDate,Date32,Time,Time64,DateTimeиDateTime64. #93355 (Michael Jarrett). - Поддержка расширенных псевдонимов таблиц в JOIN (запросы вида
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b). Закрывает #95131. #95331 (Yarik Briukhovetskyi). - Добавлена поддержка
ALTER TABLE RENAME COLUMNдля таблиц Iceberg. Ранее поддерживались толькоADD COLUMN,DROP COLUMNиMODIFY COLUMN. #97455 (murphy-4o).
Экспериментальные возможности
- Текстовый индекс теперь доступен в статусе GA. #96794 (Robert Schulze).
- Тип данных
QBitдля хранения векторов в квантованном битово-упакованном формате (используется для приближенного поиска ближайших соседей) теперь общедоступен и больше не требует включения экспериментальной настройки. #95358 (Raufs Dunamalijevs). - Векторный поиск в ClickHouse теперь может использовать реплики в кластере, чтобы распределять нагрузку и поиск по частям векторного индекса. Это позволяет ClickHouse поддерживать крупные векторные индексы, которые превышают объем памяти одной VM. #95876 (Shankar Iyer).
- Добавлен AST-фаззер на стороне сервера, управляемый настройками
ast_fuzzer_runsиast_fuzzer_any_query. Когда он включен, сервер после обычного выполнения каждого запроса запускает его случайные мутации, отбрасывая результаты. #97568 (Alexey Milovidov). - В экспериментальный диалект KQL добавлена функция
iif. #94790 (happyso). - Автоматическое определение схемы теперь учитывает
allow_experimental_nullable_tuple_type. Когда эта возможность включена, выведенные типы кортежей могут бытьNullable(Tuple(...)), поэтому отсутствующие вложенные объекты могут становитьсяNULLвместо кортежа из элементовNULL. #95525 (Nihal Z. Miaji). - Настройка
use_statistics_cacheтеперь включена по умолчанию, поэтому статистика столбцов кэшируется в памяти для ускорения оптимизации запросов без необходимости заново загружать ее из каждой части. #95950 (Han Fei).
Повышение производительности
- Теперь для пропуска данных можно использовать любое детерминированное выражение в первичном ключе (например,
ORDER BY cityHash64(user_id)/ORDER BY length(user_id)). Для детерминированных выражений ClickHouse может применить выражение к константам запроса и использовать результат в индексе первичного ключа для предикатов=,INиhas. Если выражение также инъективно (например,ORDER BY hex(p)илиORDER BY reverse(tuple(reverse(p), hex(p)))), индекс можно эффективно использовать и для отрицательных форм:!=,NOT INиNOT has. Закрывает #10685. Закрывает #82161. #92952 (Nihal Z. Miaji). - Улучшен формат хранения статистики. Теперь вся статистика сохраняется в одном файле. #93414 (Anton Popov).
- Разрешено параллельное чтение для удалённых движков таблиц/функций в файловом кэше. #71781 (Kseniia Sumarokova).
- Добавлена возможность использовать кэш страниц в пространстве пользователя с локальными файлами и табличными функциями объектного хранилища. #77874 (Michael Kolupaev).
- Исключены ненужные
memcpyв кэше страниц в пространстве пользователя. #77884 (Michael Kolupaev). - Теперь для
concurrent_threads_schedulerпо умолчанию используетсяmax_min_fairвместоfair_round_robin. Это повышает справедливость при высокой нагрузке, отдавая приоритет запросам, которым выделено меньше слотов, поэтому короткие запросы не страдают из-за длинных. #95300 (Sergei Trifonov). - Если запрос
FINALиспользовал для фильтрации условие по первичному ключу, а затем индекс пропуска данных для других условий, то шаг обработкиPrimaryKeyExpandтеперь будет проверять на пересечение только изначально отобранные диапазоны первичного ключа. #94903 (Shankar Iyer). - При использовании параллельных реплик с табличными функциями, такими как
s3(...), запросы, в которых табличная функция обёрнута в один подзапрос, теперь автоматически распараллеливаются по репликам, тогда как раньше распараллеливались только прямые обращения к табличным функциям. Закрывает #92264. #96332 (phulv94). - Добавлена возможность разделять данные и системные файлы в кэше на отдельные сегменты. #87834 (MikhailBurdukov).
- Некоторые операции hash join ускорены за счёт реализации динамической диспетчеризации для
ColumnVector::replicate. #79573 (Raúl Marín). - Повышение производительности параллельного hash JOIN в случаях со сложными предикатами. Ранее строки, не вошедшие в JOIN, обрабатывались в одном потоке, что неоптимально; суть этой оптимизации — распараллелить обработку таких строк между несколькими потоками. Можно включать и отключать с помощью настройки
parallel_non_joined_rows_processing. Включено по умолчанию. #92068 (Yarik Briukhovetskyi). - Немного оптимизирован парсинг типа JSON. #93614 (Pavel Kruglov).
- Уменьшено потребление памяти AST. Оптимизация оправдана, поскольку поля не используются, если не используется подсветка и не выполняется парсинг VALUES. #93974 (Ilya Yatsishin).
- Оптимизировано потребление памяти объектами AST для именованных Tuple. Имена столбцов теперь хранятся в объекте Tuple как строки, а не в универсальных узлах литералов AST. #94704 (Ilya Yatsishin).
- Девиртуализация улучшена за счёт дополнительных параметров компоновщика. #94737 (Nikita Taranov).
- Повышена производительность клонирования реплики в таблицах ReplicatedMergeTree с большим числом частей благодаря пакетированию запросов ZooKeeper. #94847 (c-end).
- Когда на шаге чтения уже были фильтры PREWHERE, добавить новый фильтр было невозможно. Это изменение откладывает оптимизацию PREWHERE до оптимизации runtime filter для JOIN, чтобы runtime filters тоже можно было перенести в PREWHERE. #95838 (Alexander Gololobov).
- Ускорено сжатие кодеком
T64благодаря использованию динамической диспетчеризации на x86. #95881 (Raúl Marín). - Ускорен
uniqдля числовых типов за счёт батчинга вставок, когда это возможно (без NULL, без-If, безGROUP BY, без IPv6 и String). #95904 (Raúl Marín). - Низкоуровневые оптимизации для Keeper: было выявлено, что
ZooKeeper::observeOperationsпотребляет >20% CPU потока приёма ZooKeeper. Это изменение решает проблему следующим образом: 1. ДляAggregatedZooKeeperLog::statsиспользуетсяCityHash64вместоSipHash, что более чем в 10 раз быстрее. 2. ДляCoordination::ErrorCounterиспользуетсяstd::array<std::atomic<UInt32>, N>вместоstd::unordered_mapиstd::mutex. #95962 (Miсhael Stetsyuk). - Убрано 64-байтовое выравнивание для ProfileEvents::Counter, чтобы сэкономить память. #96097 (Azat Khuzhin).
- Оптимизация памяти: размер структуры
CachedOnDiskReadBufferFromFileсокращён в 50 раз. #96098 (Azat Khuzhin). - Не копировать старые данные при изменении размера пустой хеш-таблицы. #96180 (Raúl Marín).
- Добавлена поддержка JOIN Runtime Filters для
RIGHT OUTERJOIN. #96183 (Hechem Selmi). - Оптимизация
enable_join_runtime_filtersтеперь включена по умолчанию. #89314 (Alexey Milovidov). - Ранее оптимизация прямого чтения для текстового индекса применялась только в том случае, если во всех частях был материализованный текстовый индекс. В этом PR добавлена частичная поддержка: если материализованный текстовый индекс есть только в некоторых частях, он будет использоваться для них, а для частей без материализованного текстового индекса будет выполняться исходное выражение фильтра. #96411 (Anton Popov).
- Добавлены вторичные индексы
minmaxдля временных столбцов и индексыbloom_filterдля столбцовquery_id/initial_query_idв системных таблицах логов, чтобы ускорить фильтрацию. #96712 (Alexey Milovidov). - Оптимизация отложенной материализации теперь применяется ко всем ветвям запроса
UNION ALL, а не только к первой. Запросы, которые объединяют несколько отсортированных и ограниченных чтений из разных таблицMergeTreeчерезUNION ALL, теперь будут использовать отложенное чтение столбцов в каждой ветви, снижая I/O. #96832 (Federico Ginosa). - Оптимизировано вычисление индекса пропуска данных minmax при INSERT: устранено лишнее копирование данных и добавлен векторизованный расчёт min/max для числовых столбцов. #97392 (Raúl Marín).
- Движок
DeltaLakeтеперь берет результатcount()из метаданных delta lake и показывает корректную статистику таблицы в system.tables (общее число байт/строк). #96190 (Kseniia Sumarokova). - Неиспользуемые столбцы также исключаются из этапа чтения при чтении из MergeTree. Это особенно полезно, когда фильтр переносится в
PREWHERE. #89982 (János Benjamin Antal). - Улучшена обработка запроса
SHOW TABLES: теперь извлекаются только имена таблиц; также улучшен getLightweightTablesIterator, чтобы он возвращал структуру, содержащую только имена таблиц. Исправляет #93835. #94467 (Smita Kulkarni). - Улучшены
assumeNotNull,coalesceиifNull, чтобы задействовать отсечение по первичному ключу и индексу пропуска данных для диапазонных предикатов, когда столбцы ключа обёрнуты в эти функции. Закрывает #94689. #94754 (Nihal Z. Miaji). - В запрос Keeper getChildren добавлены расширения with_data и with_stat. Это позволяет за одну операцию получать не только список дочерних узлов, но и их
statи/илиdata. #94826 (Nikolay Degterinsky). - Анализ индексов выполняется только один раз (в большинстве случаев), независимо от того, будет ли в итоге выполняться локальный план или план с параллельными репликами. #94854 (Nikita Taranov).
- Добавлена возможность включать распределённый анализ индексов в зависимости от количества частей (
distributed_index_analysis_min_parts_to_activate) и размера индексов (distributed_index_analysis_min_indexes_size_to_activate). #95216 (Azat Khuzhin). - Включена PREWHERE optimization для таблиц Iceberg. #95476 (Konstantin Vedernikov).
- Уменьшено потребление памяти у некоторых классов AST. #95514 (Raúl Marín).
- Ограничено число потоков конвейера, создаваемых при включенной настройке
split_intersecting_parts_ranges_into_layers. Это помогает избежать чрезмерного потребления памяти. #96478 (Nikita Taranov). - Реализована оптимизация эквивалентных наборов для нескольких JOIN. Запросы с несколькими последовательными операциями
INNER JOINтеперь выигрывают от улучшенной оптимизации pushdown фильтров. Когда таблицы объединяются по эквивалентным столбцам (например,t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), фильтры, применённые к любой таблице в цепочке, автоматически проталкиваются для всех таблиц. Закрывает #96550. #96596 (Vladimir Cherkasov). - Оптимизировано сканирование метаданных Delta Lake. Использованы изменения из PR delta-kernel https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
- В базе данных Replicated больше не обновляется кэш кластера для каждого фиктивного запроса. #96897 (Tuan Pham Anh).
- Используйте индекс первичного ключа при использовании фильтра
startsWithUTF8, если префикс содержит только символы ASCII. #97055 (vkcku).
Улучшения
- Добавлена трассировка OpenTelemetry для запросов Keeper. #91332 (Miсhael Stetsyuk).
- Новые параметры конфигурации:
logger.startup_console_levelиlogger.shutdown_console_level, позволяющие переопределить уровень логирования в консоль во время запуска и завершения работы ClickHouse соответственно. #95919 (Garrett Thomas). - Учитывать переопределения из командной строки при перезагрузке конфигурации. Закрывает #80294. #80295 (Alexey Milovidov).
- Разрешены переопределения параметров именованной коллекции в формате ключ-значение в табличной функции
mongodb. #89616 (vanchaklar). - Оптимизация чтения в порядке сортировки для таблиц Iceberg теперь работает со сложными функциями сортировки, такими как
icebergBucketиicebergTruncate, а не только с простыми ссылками на столбцы. #90256 (Konstantin Vedernikov). - Добавлен новый столбец parts_postpone_reasons в system.mutations для улучшения диагностики; в нем отображаются причины отложенной обработки частей. #92206 (Shaohua Wang).
- Отслеживание изменений числа строк для чтения (из-за вставок/удалений или использования кэша условий запроса) в
DataflowStatisticsCache. #93636 (Nikita Taranov). - Добавлена поддержка запроса SYSTEM RESET DDL WORKER [ON CLUSTER]. Он сбрасывает состояние DDLWorker в основном потоке. Это полезно для обновления активной реплики при изменении идентификаторов хостов. #93780 (Tuan Pham Anh).
- Добавлена поддержка
mutation_idsвsystem.part_logдля типов событийMUTATE_PARTиMUTATE_PART_START. #93811 (Shaohua Wang). - Фоновые операции (Mutate, Merge) теперь можно настраивать независимо через профиль ‘background’. Ранее для таких операций использовались те же настройки, что и для обычных запросов, через профиль ‘default’. #93905 (Arsen Muk).
- В
system.crash_logдобавлено больше информации. #94112 #95857 (Miсhael Stetsyuk). - Добавлена новая метрика
QueryNonInternalдля отслеживания количества выполняющихся не внутренних запросов. Эта метрика публикуется какClickHouseMetrics_QueryNonInternalи помогает операторам контролировать параллелизм запросов относительно ограниченияmax_concurrent_queries, которое применяется только к не внутренним запросам. #94284 (Ashwath Singh). - Добавлена поддержка сбора статистики входных байтов для столбцов из компактных частей в
RuntimeDataflowStatisticsCacheUpdater. #94626 (Nikita Taranov). - Добавлена проверка на некорректную конфигурацию Keeper, приводящую к сбоям при формировании кластера. Закрывает #60932. #94682 (Konstantin Bogdanov).
- Улучшена десериализация JSON-префиксов при загрузке части. #94848 (Pavel Kruglov).
- Переработана операция записи с использованием полного конвейера INSERT, который запускает materialized views для целевой таблицы. #94890 (Kai Zhu).
- Используйте оптимизации плана поиска по векторному сходству только при наличии индекса для столбца поиска. #94998 (Eduard Karacharov).
- Проверять общий лимит памяти перед аутентификацией пользователя и выдавать
(total) memory limit exceeded, если общий лимит превышает допустимое значение. #95003 (Nikolai Kochetov). - Добавлен параметр конфигурации
throw_on_unmatched_row_policies, который во включенном состоянии генерирует исключение, если пользователь выполняет запрос к таблице, для которой заданы политики строк, но ни одна из них к нему не применяется, — это предотвращает неоднозначное поведение, при котором из-за неправильной настройки управления доступом возвращаются все строки. #95014 (Vitaly Baranov). - Динамическое обновление токенов доступа S3 в длительных запросах при использовании Unity Catalog. Это закрывает #93981. #95069 (Konstantin Vedernikov).
- Отключается механизм decay для dirty page в jemalloc, если ClickHouse испытывает длительное давление по памяти в течение
memory_worker_decay_adjustment_period_msмиллисекунд. Механизм decay для dirty page в jemalloc снова включается, если ClickHouse работает в нормальных условиях в течение того же промежутка времени. #95145 (Antonio Andelic). - Поддержка дополнительного Zookeeper в S3Queue при использовании настройки
keeper_pathиз s3Queue. #95203 (Diego Nieto). - Учитывается
max_parts_to_merge_at_onceпри TTL-слияниях частей сdrop. #95315 (Kseniia Sumarokova). - Добавлены
connection_addressиconnection_portв query_log для отображения физического соединения (addressиportподменяются при подключении через прокси и auth_use_forwarded_address=1). #95471 (Yakov Olkhovskiy). - Исправлен некорректный учёт памяти для кэша условий запроса. Основная проблема заключалась в том, что не учитывался ключ кэша, состоящий из нескольких строк (например, part_name, идентификатора таблицы и всего SQL-условия). #95478 (Nikita Mikhaylov).
- Сервер, запущенный со встроенной конфигурацией, позволит управлять пользователями и привилегиями и сохранять их в каталоге
access, как и при обычной конфигурации. Это упрощает тестирование. Также во встроенной конфигурации и в clickhouse-local были включены все улучшения access_control. #95481 (Alexey Milovidov). - Улучшены сообщения об ошибках аутентификации S3: теперь при отказе в доступе они содержат подсказку проверить учетные данные. #95648 (Gerald Latkovic).
- Включён кэш статистики, а период его обновления установлен на 300 с. #95841 (Han Fei).
- В
system.aggregated_zookeeper_logдобавлено имя компонента. #95882 (Antonio Andelic). - Не выполнять чтение из объектного хранилища при запросах к таблицам
DeltaLakeчерезsystem.tables. #95899 (Antonio Andelic). enable_max_bytes_limit_for_min_age_to_force_mergeтеперь включён по умолчанию, если значение настройкиcompatibility—26.2или выше. #95917 (Christoph Wurm).- Delta Lake теперь доступен на macOS. Закрывает #95979. #95985 (Alexey Milovidov).
- В предыдущих версиях при объединении конфликтующих выражений ALTER с UPDATE и RENAME COLUMN вместо корректного исключения возникала логическая ошибка. Закрывает #70678. #96022 (Alexey Milovidov).
- Улучшен вывод справки для всех приложений ClickHouse, добавлена опция —no-sudo и внесено несколько исправлений. Это продолжение #58244 от Ilya Yatsishin. #96025 (Alexey Milovidov).
- Добавлен алиас
distanceCosineдляcosineDistance, так как у всех остальных функций расстояния уже есть алиасы в таком формате. #96065 (Raufs Dunamalijevs). - Добавлена поддержка расширения Keeper
with_dataдля улучшения получения таблиц в Database Replicated. #96090 (Nikolay Degterinsky). - chdig обновлён до v26.2.1 (новые возможности и поддержка macOS). #96113 (Azat Khuzhin).
- Улучшен pushdown фильтра для
numbersиprimes. Теперь ClickHouse может определять консервативные границы значений по условиямWHERE, когда точные границы определить невозможно, и соответственно ограничивать генерацию последовательности (например, дляWHERE number % 5 < 2 AND number > 100 AND number < 300ClickHouse будет генерировать только числа от 100 до 300, а затем применять предикат), избегая сканирования без ограничений. Закрывает #84853. Закрывает #93913. #96115 (Nihal Z. Miaji). - Ранее форматтер заключал SELECT в круглые скобки при наличии секции
COMMENT, чтобы избежать неоднозначности при разборе. Вместо этогоCOMMENTтеперь выводится передAS SELECT, что устраняет неоднозначность без круглых скобок. #96293 (Alexey Milovidov). - Параметр конфигурации
allow_impersonate_userтеперь находится в разделеaccess_control_improvements, а не задается как отдельная настройка сервера. #96451 (Vitaly Baranov). - Параметр конфигурации
core_dump.size_limitтеперь поддерживает горячую перезагрузку, поэтому для применения изменений конфигурации больше не требуется перезапускать серверы. #96524 (Miсhael Stetsyuk). - Улучшена совместимость профилировщиков CPU и реального времени с тайм-аутами сокетов. #96601 (Sergei Trifonov).
- Предотвращено повторное появление удалённых данных, если ADD COLUMN выполняется вскоре после мутации DROP COLUMN. #96713 (Alexey Milovidov).
- Изменён тип
function_idвsystem.instrumentationс LowCardinality(Int32) на Int32. #96726 (Copilot). - При синхронном ожидании мутаций теперь учитываются отмена запроса и ограничения по времени. #96756 (Alexey Milovidov).
- Добавлена системная команда
SYSTEM RELOAD DELTA KERNEL TRACING <level>для изменения логирования delta-kernel, что может быть полезно при отладке. #96763 (Kseniia Sumarokova). - Фильтрация по семейству IP-адресов, то есть настройки
dns_allow_resolve_names_to_ipv4/ipv6, применяется даже при отключённом DNS-кэше. #96810 (c-end). - Улучшена диагностика jemalloc. #96840 (Azat Khuzhin).
- Исправлена ошибка
QUERY_CACHE_USED_WITH_SYSTEM_TABLEв веб-интерфейсе/playпри выполнении запросов к системным таблицам. #96869 (Alexey Milovidov). - Улучшен веб-интерфейс: favicon теперь меняется, показывая, что запрос выполняется; ошибки вспомогательных запросов (при загрузке баз данных и таблиц) теперь отображаются, а не молча игнорируются. Закрывает #85055. #96883 (Alexey Milovidov).
- Левую панель в интерфейсе
/playсделали кликабельной, чтобы показывать и скрывать список баз данных. #96884 (Alexey Milovidov). DROP DATABASEтеперь удаляет таблицы в порядке, обратном зависимостям, что повышает устойчивость к сбоям, если в базе данных есть таблицы с зависимостями при загрузке (например, таблицыDistributed, использующиеjoinGet). #97057 (Alexey Milovidov).- Обновлён yaml-cpp, чтобы исключить пропуск некорректного YAML. #97333 (Azat Khuzhin).
- Показывать индикатор загрузки на боковой панели
play.html, пока таблицы подгружаются. #97531 (Alexey Milovidov). - Добавлена кнопка копирования в буфер обмена для неформатированных результатов запроса во встроенном веб-интерфейсе (play.html). #97532 (Alexey Milovidov).
- Исправлен обфускатор запросов (
clickhouse-format --obfuscate), чтобы он в большем числе случаев генерировал SQL, который можно разобрать. #97584 (Alexey Milovidov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- После
ALTER, изменяющих только метаданные, например при расширении списка значений Enum, оптимизация агрегации с проекцией может завершиться исключением. #84143 (Alexey Milovidov). - Materialized views теперь используют базу данных, в которой они были созданы, в качестве контекста выполнения, то есть: - можно не указывать базу данных явно в именах, используемых в
select-запросе представления - если база данных явно не указана, подразумевается та же база данных, в которой было создано materialized view. #88193 (Dmitry Kovalev). - Исправлена подстановка параметров запроса в методах аутентификации CREATE USER при использовании предложения ON CLUSTER. Параметры запроса в методах аутентификации (например, password) не подставлялись, что приводило к ошибкам UNKNOWN_QUERY_PARAMETER на удалённых узлах. #92777 (xiaohuanlin).
- Исправлены несоответствия при анализе текстового индекса для функций
has,mapContainsKeyиmapContainsValue. Ранее запросы с этими функциями могли возвращать разные результаты в зависимости от того, вычислялось ли выражение с использованием текстового индекса или без него. #93578 (Anton Popov). - Исправлен сбой при подключении таблицы к базе данных
MaterializedPostgreSQL, еслиdropReplicationSlotгенерирует исключение при раскрутке стека. #96871 (Alexey Milovidov). - Сервер мог аварийно завершаться, если одновременно запускалось много резервных копий, конфликтующих из-за одних и тех же файлов. #93659 (Alexey Milovidov).
- Исправлена работа запросов с параллельными репликами и JOIN с таблицей non-MT. Закрывает #92056. #93902 (Igor Nikonov).
- Исправлена проблема, из-за которой столбцы Iceberg с точками в именах возвращали NULL в качестве значений. #94335 (Mikhail Koviazin).
- Исправлена обработка строк в кодировке UTF8 в
stringJaccardIndexUTF8и повышена производительность. #94613 (Joanna Hulboj). - Исправлены возможные переполнения в
WITH FILL STALENESS(они приводили к UB и/или бесконечным циклам). Исправлен возможный бесконечный цикл из-за больших скачков. Добавлена поддержка старого анализатора (в основном для стресс-тестов). #94663 (Azat Khuzhin). - Исправлено возможное зависание распределённых запросов, когда имена хостов разрешаются в несколько адресов, а удалённая реплика перестаёт отвечать. #94726 (c-end).
- Исправлен некорректный результат при выполнении JOIN нескольких табличных выражений, когда самое левое табличное выражение представляет собой табличную функцию
-Cluster. Устраняет проблему #89996. #94748 (Konstantin Bogdanov). - Исправлено некорректное отсечение по первичному ключу и индексу пропуска данных для предикатов, включающих
toWeek,toYearWeek,toStartOfWeek,toLastDayOfWeekиtoDayOfWeek, а также устранены исключения в некоторых из этих функций для корректных запросов сLowCardinality(String). #94816 (Nihal Z. Miaji). - Удалена ненужная возможность пропуска проверки разрешений в запросах
ATTACHдля представления с безопасностью SQL. Это предотвращает потенциальное повышение привилегий, когда пользователь подключает представление сdefinerбез проверки необходимого доступа. #94865 (pufit). - Исправлен сбой при запуске
ReplicatedMergeTree, вызванный одновременным удалением каталоговdelete_tmp_*. #94892 (myeongjun). - Исправлена проблема с
INSERTв таблицы Iceberg с materialized views, из-за которой терялась информация о дедупликации и возникало исключение. #94938 (Daniil Ivanik). - Исправлена ошибка, из-за которой
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>удалял весь кэш во всём кластере. #94978 (Rory Crispin). - Сохраняется постоянная гранулярность индекса (use_const_adaptive_granularity) после вертикальных слияний (v2 с исправлением для Nested и в целом). #95013 (Azat Khuzhin).
- Исправлена состояние гонки в файловом кэше в версии 26.1 после [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764). #95042 (Kseniia Sumarokova).
- Исправлена отмена выполнения табличной функции postgresql() с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #95136 (Roman Vasin).
- Исправлен вывод типов для квалифицированных столбцов исходных таблиц при использовании нескольких JOIN с предложением
USING. Ранее последующие JOIN некорректно обновляли типы исходных столбцов до общего супертипа, даже если столбец не участвовал в этом JOIN (например, вSELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a)столбецt2.aиспользуется только в первом JOIN, поэтому его тип должен быть супертипомt1.aиt2.a, без учётаt3.a). Это могло приводить к логическим ошибкам или сбоям, когда функции ожидали одни типы столбцов, а в плане выполнения фактически оказывались другие. #95157 (Vladimir Cherkasov). - Преобразование столбца теперь выполняется только один раз при получении содержимого списка manifest .avro и файлов. #95164 (Daniil Ivanik).
- Исправлен некорректный расчёт размеров JSON-столбцов, который мог приводить к избыточному использованию памяти или некорректной статистике столбцов. #95207 (Azat Khuzhin).
- Исправлен неточный учёт памяти при применении крупных патч-частей после легковесных обновлений. Ранее применение крупных патчей могло приводить к чрезмерному использованию памяти, из-за чего процесс сервера мог быть принудительно завершён OOM killer’ом. #95231 (Anton Popov).
- Исправлено неопределённое поведение, которое могло приводить к некорректным результатам или к исключению, если распределённый запрос с
max_parallel_replicasво время анализа индексов переключался на локальную реплику. #95263 (Azat Khuzhin). - Исправлена агрегация разреженных столбцов для
sumи временных рядов приgroup_by_overflow_mode = any. #95301 (Mikhail Koviazin). - Исправлена проблема с надёжностью в политике диска
plain_rewritable: сетевая ошибка в середине удаления файла метаданных могла привести к тому, что хранилище оставалось в несогласованном состоянии. #95302 (Mikhail Artemenko). - Заменён Date на Date32 для Iceberg. #95322 (Konstantin Vedernikov).
- Значение аргумента password табличной функции
redisтеперь будет маскироваться в журнале и системных таблицах (например, вquery_log). #95325 (János Benjamin Antal). - Исправлена ошибка, из-за которой таблицы можно было удалить или изменить, пока по ним ещё выполнялся распределённый запрос, что могло приводить к исключениям или некорректным результатам. #95356 (Azat Khuzhin).
- Исправлена логическая ошибка, возникавшая в некоторых случаях при использовании отрицательного
LIMIT/OFFSETв распределённых запросах. #95357 (Nihal Z. Miaji). - Исправлена ошибка, из-за которой clickhouse-client при подключении по SSH дважды запрашивал пароль. #95372 (Isak Ellmer).
- Устранена гонка данных в S3(Azure)Queue. #95385 (Kseniia Sumarokova).
- Исправлена ошибка в фильтре prewhere, вызванная лямбда-выражениями в prewhere. #95395 (Xiaozhe Yu).
- Исправлено
optimize_syntax_fuse_functions:sum/count/avgбольше не переписываются вsumCount(), если аргумент агрегатной функции имеет типNullable. Закрывает #95390. #95441 (Nihal Z. Miaji). - Предотвращено возможное аварийное завершение при отмене распределённых запросов. #95466 (Aleksandr Musorin).
- Исправлена дедупликация при стриминге из движка S3(Azure)Queue. #95467 (Kseniia Sumarokova).
- Исправлено обновление политик строкового доступа, назначенных исходному пользователю, при распределённых запросах. #95469 (Vitaly Baranov).
- Исправлена проверка зашифрованных дисков поверх plain_rewritable (устраняет возможную ошибку
It is not possible to register multiple plain-rewritable disks with the same object storage prefix). #95470 (Azat Khuzhin). - У табличной функции
mergeTreeProjectionотсутствовала проверка прав доступа, из-за чего пользователи без разрешения SELECT для таблицы (но с правами на табличные функции) могли читать данные из её проекций. В этом исправлении добавлена та же проверка прав доступа, которая уже есть уmergeTreeIndexиmergeTreeAnalyzeIndexes. #95480 (Alexey Milovidov). - Исправлена возможная логическая ошибка при чтении подстолбца size из динамических подстолбцов типов Dynamic/JSON. #95573 (Pavel Kruglov).
- Исправлена регрессия в (экспериментальной) zero‑copy-репликации, появившаяся после #94262, из‑за которой разделяемые части могли быть удалены до того, как другие реплики завершали их получение. #95597 (filimonov).
- Исправлен сбой при применении
tupleElementк массивам JSON. Закрывает #95581. #95647 (Pavel Kruglov). - Исправлено исключение logical error, возникавшее при использовании сопоставителя (
*) внутри лямбда-функции в предложении VALUES в JOIN с USING. Закрывает #93675. #95661 (Vladimir Cherkasov). - Исправлена логическая ошибка
There was an error: Cannot obtain error message, возникавшая при ожидании распределённой DDL-операции и одновременном удалении базы данных Replicated. Исправление #95539. #95664 (Alexander Tokmakov). - Исправлена ошибка, из-за которой функция
INвозвращала некорректные результаты со значениямиNULLпри включенномtransform_null_in. Закрывает #65776. #95674 (Nihal Z. Miaji). - Корректно обрабатываются типы LowCardinality Nullable в
CASTпри включенной настройкеcast_keep_nullable. Закрывает #95670. #95747 (Alexey Milovidov). - Исправлено укрупнение партиционированных данных Delta Lake. #95773 (Kseniia Sumarokova).
- Исправлено состояние гонки для JOIN-столбца типа Nullable в runtime-фильтрах. #95775 (Hechem Selmi).
- Исправлена возможная логическая ошибка в запросе с matcher (
*,table.*) иanalyzer_compatibility_join_using_top_level_identifier, когда столбецUSINGимеет разные типы в таблицах и в списке SELECT. Закрывает #90477. #95808 (Vladimir Cherkasov). - Исправлены ошибки, связанные с безопасностью памяти, в операциях, выполняемых в параллельном пуле потоков (резервное копирование, агрегация, распределённые запросы), которые могли приводить к исключениям при возникновении ошибки во время планирования задач. #95818 (Raúl Marín).
- Исправлен сбой при выполнении DROP WORKLOAD одновременно с выполнением запросов, использующих удаляемую рабочую нагрузку. #95856 (Alexey Milovidov).
- Исправлена медленная работа при выполнении запросов к системным таблицам от имени пользователя с ограниченными привилегиями во множестве баз данных. Закрывает #89371. #95874 (pufit).
- Исправлено выполнение функции tupleElement для JSON с вложенными путями: ранее это могло приводить к неверному результату запроса. #95907 (Pavel Kruglov).
- Исправлена ошибка
NOT_SUPPORTED, которая могла возникнуть при использовании алгоритма JOINdirectс пустой таблицей семейства MergeTree. #95935 (Vladimir Cherkasov). - Исправлено: клиент не предлагал и не автодополнял имена алиасов для настроек, закрывает #92190. #95945 (phulv94).
- Исправлено поле event_date в system.asynchronous_metric_log. #95947 (Raúl Marín).
- Исправлена обработка skipping paths в типе данных JSON. Ранее при
JSON(SKIP path)пропускались все ключи JSON с префиксомpath, включая ключи вроде"pathpath", что могло приводить к потере данных при вставке. Теперь это исправлено: пропускается только ключ"path". #95948 (Pavel Kruglov). - Часть с неизвестными проекциями не должна считаться безвозвратно утерянной. #95952 (Mikhail Artemenko).
- Исправлена ошибка, из-за которой пустая строка превращалась в
NULLв таблицеJoinс ключомNullable(String). Закрывает #71414. #96002 (Alexey Milovidov). - Теперь движок PostgreSQL может корректно читать
BOOLEAN[]. Закрывает проблему #72754. #96006 (Alexey Milovidov). - Исправлен формат
ProtobufListдля чтения из пустого файла. Закрывает #70059. #96007 (Alexey Milovidov). - Исправлена ошибка в формате
ProtobufList, из-за которой для пустых таблиц создавалась фантомная запись. Закрывает #72596. #96010 (Alexey Milovidov). - Исправлено несоответствие типов
UInt64иInt32в функцииifв редком случае распределённых запросов и PREWHERE при выводе типов. Закрывает #70017. #96012 (Alexey Milovidov). - Исправлены
JIT-скомпилированные запросы, использующие типBool. #96013 (Alexey Milovidov). - Исправлена логическая ошибка при чтении столбца UUID из текстового столбца SQLite TEXT. Закрывает #71263. #96016 (Alexey Milovidov).
- Исправлено преобразование типов в движке SQLite для
DateTime,Date,UUIDи других типов. Закрывает #73481. #96017 (Alexey Milovidov). - Значения
FixedStringнекорректно экранировались в запросах к внешним базам данных SQLite и PostgreSQL. Закрывает #73519. В соавторстве с @jh0x. #96019 (Alexey Milovidov). - Исправлен сбой из-за ошибки assert в WindowTransform при большом смещении PRECEDING. Закрывает #75852. #96026 (Alexey Milovidov).
- Исправлена ошибка, из-за которой могло происходить повреждение данных, когда параллельные асинхронные вставки используют одинаковые имена параметров, но содержат разные значения. #96035 (Seva Potapov).
- Исправлен период для глобальных профилировщиков (задаётся параметрами
global_profiler_real_time_period_nsиglobal_profiler_cpu_time_period_ns). Вместо заданного значения использовалось усечённое, из-за чего профилировщик срабатывал чаще, чем предполагалось. #96048 (Antonio Andelic). - Ранее, если в записи файла манифеста Iceberg для position delete присутствовала ссылка на файл данных, но имела значение NULL, мы не получали корректные границы для соответствующих файлов данных. Этот PR исправляет эту ошибку. #96061 (Daniil Ivanik).
- Исправлена проблема с отзывом ролей по умолчанию. #96103 (Vitaly Baranov).
- Исправлена ошибка use-after-free при анализе индекса в редком случае, когда
use_primary_keyотключен и имеется очень большое количество дизъюнкций условий, использующих индекс. #96112 (Alexey Milovidov). - Исправлена регрессия в кодеке
Gorilla, возникавшая, когда явно указанный размер не соответствовал размеру типа данных, а размер буфера был слишком мал. В предыдущих версиях это приводило к исключению при декомпрессии. Закрывает #78253. #96118 (Alexey Milovidov). - Предотвращена взаимная блокировка при загрузке словарей, когда один словарь ссылается на таблицу Merge, которая рекурсивно ссылается на него. Закрывает #78360. #96120 (Alexey Milovidov).
- Исправлено использование неинициализированного значения в
formatDateTimeпри использовании форматтеров переменной ширины, таких как в стиле MySQL и JODA. #96133 (Alexey Milovidov). - Сочетание настроек
use_const_adaptive_granularityиindex_granularity_bytes(что означает “неадаптивную гранулярность”) приводило к неверному вычислению количества строк для чтения и возникновению исключения. #96143 (Alexey Milovidov). - Выполнение некорректной мутации ALTER UPDATE на файлоподобных таблицах в объектном хранилище, таких как S3 и Azure, могло приводить к разыменованию nullptr. Закрывает #92994. #96162 (Alexey Milovidov).
- Исправлено некорректное поведение
AccessRights::contains, из-за которого при частичном отзыве привилегий возвращались неверные результаты. #96170 (pufit). - Исправлена коллизия хэша в кэше условий запроса для свернутых констант CTE, которая могла приводить к ошибочному результату запроса. Закрывает #96060. #96172 (Alexey Milovidov).
- Исправлена возможная взаимная блокировка в ProcessList. Она может возникнуть из-за инверсии блокировок, если трекер оверкоммита памяти срабатывает в момент добавления задачи в механизм проверки отмены. #96182 (Antonio Andelic).
- Исправлена ошибка, из-за которой запросы с OUTER JOIN (LEFT, RIGHT или FULL) в сочетании с несколькими INNER JOIN могли возвращать некорректные результаты из-за недопустимого изменения порядка JOIN. Если условие ON в OUTER JOIN ссылалось на столбцы из нескольких ранее присоединённых таблиц, оптимизатор не учитывал все зависимости между таблицами и мог неправильно изменить порядок JOIN, из-за чего часть строк терялась. Закрывает #95972. #96193 (Vladimir Cherkasov).
- Если для таблицы не определена статистика, ClickHouse не должен пытаться её загружать. Это позволяет избежать дополнительных накладных расходов (100+ мс) на проверку наличия файлов статистики. (тикет #96068). #96233 (Han Fei).
- Исправлено
optimize_syntax_fuse_functions: теперьsum/count/avgне переписываются вsumCount(), если аргумент агрегатной функции имеет типLowCardinality(Nullable). Закрывает #95390. #96239 (Nihal Z. Miaji). - Исправлено некорректное отсечение партиций для
not INи функцииnot hasв некоторых случаях. #96241 (Nihal Z. Miaji). - Исправлена ошибка
stack-use-after-scopeв индексе векторного сходства. #96259 (Alexey Milovidov). - Исправлено: средство запуска тестов не распознавало комментарии с подсказкой об ошибке, если запросу предшествовал SQL-комментарий. #96336 (Yakov Olkhovskiy).
- Исправлена логическая ошибка в KeyCondition, возникавшая, когда у таблицы primary key имеет тип Nullable, а в запросе используется функция
coalesce, у которой первый аргумент — константа. #96340 (Alexey Milovidov). - Взаимодействие
GROUPING SETS,group_by_use_nullsи типа данныхTupleсLowCardinalityвнутри него могло приводить к неожиданной структуре блока в конвейере выполнения запроса, что вызывало логическую ошибку. Это стало проявляться после добавленияNullableTuple-ов. #96358 (Alexey Milovidov). - Можно было создать таблицу, использовав пустое выражение
()в качестве индекса, что приводило к некорректному обращению к памяти. #96363 (Alexey Milovidov). - Исправлен сбой в старом анализаторе при JOIN и повторяющихся псевдонимах. #96405 (Ilya Golshtein).
- Исправлена ошибка
Nested columns sizes are inconsistent with local_discriminators, вызванная некорректной оптимизацией фильтрации на месте для столбцов Variant. #96410 (Alexey Milovidov). - Исправлена ошибка, из-за которой
CREATE TABLE ... CLONE AS ...игнорировал полный квалификатор исходной таблицы. #96415 (Hasyimi Bahrudin). - Исправлена отмена выполнения табличной функции
mysqlс помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #96437 (Roman Vasin). - Исправлено состояние livelock в потоке проверки отмены для запросов с высокими значениями
max_execution_time. #96450 (Sergei Trifonov). - Исправлена логическая ошибка, которая в некоторых случаях возникала при использовании дробного
LIMIT/OFFSETв распределённых запросах. #96475 (Nihal Z. Miaji). - Исправлена ошибка разыменования нулевого указателя в некоторых выражениях с лямбда-функциями. #96479 (Alexey Milovidov).
- Исправлены некорректные результаты при преобразовании столбцов
LowCardinalityвNullable. #96483 (Nihal Z. Miaji). - Исправлен сбой при создании таблицы Iceberg с секцией
ORDER BY, ссылающейся на несуществующий столбец или использующей позиционный аргумент. Закрывает #93280. #96484 (Konstantin Vedernikov). - Исправлено исключение runtime filter для столбцов Tuple с Nullable-подполями. #96509 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERRORво встроенном считывателе Parquet V3, когда столбец фильтраPREWHEREсодержит небулевы значения UInt8. #96594 (Alexey Milovidov). - Исправлена неявная перестройка индекса в реплицируемых таблицах при изменении метаданных. #96600 (Raúl Marín).
- Исправлена гонка данных при DROP WORKLOAD. #96614 (Sergei Trifonov).
- Исправлена ошибка при записи в таблицы Iceberg, из-за которой при вставке в партиционированные таблицы данные могли некорректно распределяться по файлам партиций. #96620 (Konstantin Vedernikov).
- Исправлена ошибка
heap-use-after-freeвCREATE TABLEс ограничениями constraints. #96669 (Nikita Taranov). - Проверка witness version в bech32 во избежание переполнения буфера. #96671 (Raúl Marín).
- Исправлена проблема, из-за которой
system.tablesвозвращала ошибки, если REST-каталог озера данных создавался с недопустимым параметромauth_header. #96680 (Han Fei). - Исправлено поведение, при котором
min(timestamp)возвращал значение эпохи (1970-01-01) в_minmax_count_projectionпосле TTL-слияния, если все строки в блоке были отфильтрованы. #96703 (Raquel Barbadillo). - Улучшена проверка параметра
iceberg_metadata_file_path, чтобы предотвратить обход каталогов и убедиться, что указанный файл метаданных находится в каталоге таблицы. #96754 (Daniil Ivanik). - Исправлен сбой в
ifNullпри использовании аргументаVariantвGROUP BY. #96790 (Alexey Milovidov). - Исправлены коллизии ключей кэша между таблицами при настройке
table_disk=1. #96818 (Raufs Dunamalijevs). - Исправлено зависание потока очистки MemoryWorker, вызванное состоянием гонки. #96819 (Antonio Andelic).
- Не записывать в журнал данные с учетными данными из каталогов Iceberg. #96831 (Konstantin Vedernikov).
- Исправлен код возврата
clickhouse-clientпосле ошибки сервера. #96841 (Vitaly Baranov). - Запросы с CROSS JOIN и включенными параллельными репликами могли возвращать неверный результат. Исправлено в #74337. #96848 (Igor Nikonov).
- Исправлена ошибка, из-за которой запросы
ALTER TABLE DROP COLUMNзавершались сбоем, если ранее для того же столбца уже выполнялось легковесное обновление. #96861 (Anton Popov). - Исправлено переполнение стека (аварийное завершение) при создании резервных копий в архивном формате (
.zip,.tzst) на диске объектного хранилищаplain_rewritable. #96872 (Alexey Milovidov). - Исправлено аварийное завершение сервера, возникавшее, когда резервное копирование завершалось с ошибкой из-за нехватки места на диске или других ошибок ввода-вывода в файловой системе пункта назначения. #96873 (Alexey Milovidov).
- Исправлены
EXCEPT ALLиINTERSECT ALL, которые игнорировали кратность строк и работали как их вариантыDISTINCT. #96876 (Alexey Milovidov). - Исправлено исключение
std::terminateвindexOfAssumeSorted, возникавшее при вызове с несовместимыми типами (например, для массиваIPv4и целочисленного искомого значения). #96877 (Alexey Milovidov). - Исправлено Исключение
Bad cast from type DB::ColumnNullable to DB::ColumnString, возникавшее при использовании оконных функций сgroup_by_use_nulls = 1и CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov). - Исправлены некорректные результаты, возникавшие при преобразовании JIT-скомпилированными выражениями
DateTimeвDateTime64(например, вCASE/if/multiIfсо смешанными типами DateTime). Значение переинтерпретировалось вместо корректного масштабирования, из-за чего после включения компиляции выражений получались неверные временные метки. #96879 (Alexey Milovidov). - Исправлено исключение из-за логической ошибки в
CoalescingMergeTree, возникавшее, когда выражение индекса пропуска данных создаёт константный столбец (например,bloom_filterдляifNotFinite(1, c0)в случае целочисленного столбца). #96880 (Alexey Milovidov). - Исправлен неверный номер порта в сообщении об ошибке при ошибочном подключении по HTTP к порту собственного протокола с включенным TLS. #96881 (Alexey Milovidov).
- Исправлено, что
SETTINGS, заданные для отдельных подзапросов, не применялись к табличным функциям, таким какfile, в CTE и подзапросах. #96882 (Alexey Milovidov). - Исправлена утечка памяти в объектах BIO при чтении сертификатов X509. #96885 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERRORв анализаторе запросов, возникавшее, если лямбда-выражение передавалось там, где ожидалось конкретное значение (например, в качестве аргумента аккумулятора дляarrayFold). #96892 (Alexey Milovidov). - Исправлено исключение
ColumnNullable is not compatible with originalпри приведении сложных вложенных типов (Array, состоящего из Nullable Tuple, содержащего Map со значениями типа Nullable Enum). #96924 (Alexey Milovidov). - Устранено состояние гонки при параллельной загрузке сегментированного словаря
HASHED, которое иногда приводило к тому, что некоторые строки не загружались. #96953 (Alexey Milovidov). - Исправлено состояние гонки между
REPLACE PARTITIONи фоновыми мутациями, из-за которого после замены могли быть одновременно видны старые и новые данные. #96955 (Alexey Milovidov). - Исправлена ошибка в функции
arrayJoin, из-за которой при использовании с INNER JOIN и предложением WHERE возникали дублирующиеся строки; причиной была оптимизация частичного проталкивания предикатов, которая ошибочно проталкивала фильтры сarrayJoinниже JOIN. #96989 (Alexey Milovidov). - Исправлен сбой (SEGFAULT) в
clearCaches, вызванный тем, чтоBlockIO::operator=не перемещалquery_metadata_cache, что приводило к преждевременному уничтожению кэшированных снимков хранилища и обращению к хранилищуMergeTreeDataпосле освобождения памяти. #96995 (Alexey Milovidov). - Исправлена ошибка assertion в
IfTransformStringsToEnumPass, когда функцияifилиtransformвозвращаетNullable(String)(например, приGROUP BY ... WITH CUBEиgroup_by_use_nulls = true). #97002 (Alexey Milovidov). - Исправлена ошибка, из-за которой при
INSERT ... SELECTсUNION ALLиJOINв константные строковые столбцы после укрупнения блоков могли записываться неверные значения. #97019 (Hasyimi Bahrudin). - Исправлено исключение
assert_cast(или скрытое повреждение данных в релизных сборках) при построении статистики столбцов после изменения типа столбца командойALTER TABLE MODIFY COLUMN. #97027 (Alexey Milovidov). - Исправлено чтение из неинициализированной памяти в Azure Blob Storage, протоколе SSH и интерфейсах Arrow Flight. #97053 (Alexey Milovidov).
- Исправлены случаи, когда индексы влияли на результат запросов с ROW POLICY/PREWHERE и FINAL. #97076 (Yarik Briukhovetskyi).
- Исправлено оставшееся условие гонки между
REPLACE PARTITIONи фоновыми мутациями в таблицахMergeTree, из-за которого старые данные могли снова появляться. #97105 (Alexey Milovidov). - Исправлена работа неявных индексов со столбцами-псевдонимами; теперь перед их созданием выполняется полная проверка. #97115 (Raúl Marín).
- Исправлена логическая ошибка в
FunctionVariantAdaptorдля функций, которым требуются константные аргументы, таких какarrayROCAUC. #97116 (Bharat Nallan). - Исправлены зависшие мутации в случае, когда
PartCheckThreadповторно ставит в очередьGET_PARTдля части, уже обработанной мутацией, оставляя фантомные записи вparts_to_do. #97162 (Alexey Milovidov). - Исправлена оценка числа строк в плане запроса для подзапросов с
ORDER BY ... LIMIT, из-за которой оптимизатор мог выбирать неоптимальный порядок JOIN. #97193 (Alexander Gololobov). - Исправлено исключение
LOGICAL_ERRORвFunctionVariantAdaptor, возникавшее, когда функция, работающая со столбцами Variant, возвращает типNothing, что может происходить с пустыми массивами в запросахUNION ALL. #97213 (Alexey Milovidov). - Исправлено состояние гонки при операциях многокомпонентного копирования в S3 (например, при
BACKUP/RESTOREв S3), которое могло вызывать исключения при одновременном доступе. #97227 (Azat Khuzhin). - Исправлено исключение
LOGICAL_ERROR, возникавшее, когдаarrayJoinв секцииWHEREссылался на столбцы с обеих сторонJOIN. #97239 (Alexey Milovidov). - Исправлено Исключение
LOGICAL_ERRORпри чтении подстолбца.sizeу разреженногоNullable(String)вTupleс PREWHERE. #97264 (Alexey Milovidov). - Исправлено исключение “Количество строк в отложенном фрагменте не совпадает с количеством смещений” в
LazyMaterializingTransformпри чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) с использованиемORDER BY ... LIMIT. #97270 (Alexey Milovidov). - Исправлена потеря таблицы из базы данных при
SYSTEM RESTART REPLICA, если повторное создание таблицы завершается исключением, не связанным с ZooKeeper (например, из-за лимита памяти), что приводило к несовпадению дайджестов metadata вDatabaseReplicated. #97276 (Alexey Milovidov). - Поле
readonlyвsystem.merge_tree_settingsтеперь корректно отражает, что некоторые настройки MergeTree (например,index_granularity) всегда доступны только для чтения. #97277 (Robert Schulze). - Исправлен сбой при оптимизации
count()для таблицMergeTree, когда снимок хранилища создавался без данных. #97281 (Pablo Marcos). - Исправлено возможное аварийное завершение при определении имён функций по отладочной информации для трассировок стека. #97294 (Azat Khuzhin).
- Исправлена логическая ошибка, связанная с analyzer_compatibility_join_using_top_level_identifier и столбцами ALIAS. Закрывает #96228. #97297 (Vladimir Cherkasov).
- Исправлено исключение
LOGICAL_ERRORвapplyOrderпри использовании столбцов с текстовым индексом в предложенииQUALIFY. #97313 (Alexey Milovidov). - Системная таблица
system.functionsтеперь для внутренних функций отображаетcategories = 'Internal'вместоcategories = ''. #97315 (Robert Schulze). - Запрос с цепочкой RIGHT JOIN и включенными параллельными репликами может давать некорректный результат. Исправлено в #74341. #97316 (Igor Nikonov).
- Исправлены ложные ошибки
TABLE_UUID_MISMATCH, которые могли возникать в refreshable materialized view и других сценариях при переименовании таблиц. #97323 (Azat Khuzhin). - Исправлен segfault при резервном копировании
StorageKeeperMap, вызванный use-after-free висячего указателя на хранилище в отложенном батче резервного копирования. #97336 (Alexey Milovidov). - Исправлена функция
existsсо скалярным подзапросом внутриALTER UPDATE/DELETE, когда включен параметрmutations_execute_subqueries_on_initiator. Скалярный подзапрос вычислялся некорректно, что могло привести к ошибке или к повреждённой команде мутации, из-за которой таблица не загружалась при следующем перезапуске сервера. #97347 (Kirill Kopnev). - Исправлено логическое исключение
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8))), возникавшее при сравнении NULL со столбцом Variant, содержащим типы LowCardinality. #97379 (Alexey Milovidov). - Исправлена возможная гонка при выполнении
EXCHANGE TABLESпараллельно с включенным сегментированным кэшем запросов. #97411 (Konstantin Vedernikov). - Исправлено исключение
LOGICAL_ERRORпри преобразовании из Array вQBit, когдаnullable_sourceиз внешней обёрткиTupleзаменяет преобразуемый столбец типа Array на столбец несовместимого типа. Закрывает #97389. #97413 (Alexey Milovidov). - Исправлена неконсистентность при повторном форматировании AST для литералов кортежей с алиасом в скобках: например,
(('a', 'b') AS x)ошибочно переформатировалось вtuple(('a', 'b') AS x). #97418 (Alexey Milovidov). - Исправлено исключение при асинхронных вставках с дедупликацией, возникавшее, когда ошибка парсинга приводила к созданию пустого блока без строк. #97460 (Sema Checherinda).
- Исправлено исключение “Количество строк в отложенном фрагменте не соответствует количеству смещений” в
LazyMaterializingTransformпри чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) при использованииORDER BY ... LIMIT. #97482 (Alexey Milovidov). - Исправлены настройки вставки в Iceberg. Добавлен алиас для настройки
allow_experimental_insert_into_iceberg. #97483 (Konstantin Vedernikov). - Исправлена ошибка
ACCESS_DENIEDдля пользователей без разрешенияCREATE TEMPORARY TABLE, когда оптимизацияoptimize_inverse_dictionary_lookupпреобразует предикатыdictGet(...). Теперь ClickHouse пропускает это преобразование и выполняет исходное выражение. Закрывает #97269. #97484 (Nihal Z. Miaji). - Исправлен сбой assert (исключение в отладочных сборках и сборках с санитайзерами) в
SetиMergeTreeIndexSetпри обработке столбцов с внутренними разреженными подстолбцами (например, столбцовTupleиз частей MergeTree с разными профилями разреженной сериализации). #97493 (Alexey Milovidov). - Исправлено возможное обращение к памяти после её освобождения в StorageKafka2. #97520 (Bharat Nallan).
- Исправлена работа
INTO OUTFILEсTRUNCATEи настройкойinto_outfile_create_parent_directories, когда путь вывода содержит каталоги. #97549 (Alexey Milovidov). - Исправлена ошибка
BAD_ARGUMENTSпри запросах к таблицам с лямбда-выражениями в столбцах ALIAS через табличную функциюmerge()при включенном анализаторе. #97551 (Alexey Milovidov). - Исправлено исключение
system.zookeeper_info, если zxid в Keeper равен 0. #97553 (Alexey Milovidov). - Исправлена возможная логическая ошибка в словаре
ip_trie, если тип ключа отличается от String. #97555 (Bharat Nallan). - Исправлена ошибка, из-за которой OAuth-аутентификация REST-каталога не работала для базового
RestCatalog(она работала только для производных каталогов, таких какOneLakeCatalog). Из-за этого REST-каталог по умолчанию перестал работать после добавления каталога BigLake. #97561 (Konstantin Vedernikov). - Функции Geometry (
perimeterSpherical,areaSphericalи т. д.) теперь принимают отдельные подтипы геометрии (Polygon,Ring,Pointи т. д.) помимо вариативного типаGeometry. #97571 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORпри использованииisNull/isNotNullдля подстолбцов типовNullable(Tuple(... Nullable(T) ...)). Закрывает #97224. #97582 (Alexey Milovidov). - Исправлено разыменование нулевого указателя при применении патч-частей в ходе легковесных обновлений. #97583 (Alexey Milovidov).
BaseSettings::readBinaryпередаёт индекс изaccessor.findвfield_infos[]без проверки на специальное значение «не найдено» (то есть-1), что может привести к выходу за границыstd::vector. Проблему удалось выявить благодаря механизмам защиты libcxx. Вероятно, это происходило при десериализации плана запроса, когда более новый сервер отправляет настройку, неизвестную более старому серверу. Метод чтения на основе строк уже обрабатывает этот случай корректно; вreadBinaryтакой же проверки не было. #97585 (Miсhael Stetsyuk).- Исправлены некорректные результаты запросов
UNION ALL, в которых одна ветвь содержала предикат, всегда равный false: такая ветвь ошибочно читала данные вместо того, чтобы ничего не возвращать. #97620 (Bharat Nallan). - Исправлена ошибка
UNSUPPORTED_METHOD, возникавшая приIN (col)с единственной ссылкой на столбец. #97646 (Alexey Milovidov). - Исправлено Исключение логической ошибки при
GROUP BY ... WITH ROLLUP/CUBE, когда ключи содержатLowCardinality(Nullable(...))внутриNullable(Tuple(...)). #97647 (Alexey Milovidov). - Исправлена несогласованность в форматировании AST для
NOT (1, 1, 1), которая могла приводить кLOGICAL_ERRORв отладочных сборках. #97653 (Alexey Milovidov). - Исправлено исключение
keeper-converterпри обработке пустых файлов журнала транзакций ZooKeeper. #97673 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- ClickHouse теперь можно собирать с помощью clang-23 (master). #95578 (Alexey Milovidov).
- Исправлено принудительное выставление
is_localв false при настроенномbind_host; вместо этого добавлен интеграционный тест. Дополнение к #74741. #93109 #96018 (Zhigao Hong). - Стресс-тесты: исправлены стресс-тесты и тесты обновления в CI. теги
no-{build}теперь игнорируются. добавлена рандомизация совместимости. #94693 (Nikita Fomichev). - Опубликован бинарный файл parser_memory_profiler из сборки. Инструмент можно использовать для анализа потребления памяти деревом AST. #95826 (Ilya Yatsishin).
- Добавлен флаг
--symbolizeдля инструментаparser_memory_profiler, который создаёт файлы.heap.symс разрешёнными именами символов в результатах. #96477 (Ilya Yatsishin). - Зафиксированы версии сторонних Docker-образов в интеграционных тестах. #96500 (Alexey Milovidov).
- Восстановлена возможность динамической линковки
OpenSSL. Это не рекомендуется и не используется ни в каких продакшн-сборках, но такая возможность всё ещё остаётся для энтузиастов из интернета. #96506 (Govind R Nair). - Диапазон
magic_enumуменьшен с [-100, 1000] до значения по умолчанию [-128, 127] с использованием специализацииCoordination::OpNumдля конкретного типа, что сокращает время сборки. #96632 (Alexey Milovidov). - Удалены лишние шаблоны C++ из классов Function, чтобы сократить время сборки. #96646 (Alexey Milovidov).
- Перенесли генерацию
StorageSystemLicensesна этап конфигурации, чтобы повысить параллелизм сборки. #96697 (Alexey Milovidov). - Распараллелено сканирование лицензий. #96727 (Raúl Marín).
- Добавлен функциональный тест без сохранения состояния для поддержки протокола SSH. #96996 (Alexey Milovidov).
- Kafka 3.9.0 добавлена в инфраструктуру функциональных тестов без сохранения состояния, что позволяет напрямую тестировать движки таблиц Kafka и Kafka2, где ClickHouse Keeper используется вместо ZooKeeper. Шесть новых тестов без сохранения состояния охватывают базовые сценарии записи и чтения, виртуальные столбцы, INSERT, несколько форматов, обработку повреждённых сообщений и хранение смещений через Keeper. #96997 (Alexey Milovidov).
- Добавлен CI-процесс для сборки оптимизированного тулчейна clang с PGO+BOLT. #96991 (Alexey Milovidov).
- В CI используется оптимизированная с помощью PGO сборка LLVM/Clang, что должно ускорить сборку на 20..30%. #97031 (Alexey Milovidov).
- Заменены математические функции glibc на реализации из llvm-libc. #90151 (Konstantin Bogdanov).
- Boost обновлён с 1.83 до 1.90, что исправляет сбой из-за срабатывания assert в
devectorв отладочных сборках. #97037 (Alexey Milovidov). - Обновлён
postgresдо версии REL_18_1. #95189 (Konstantin Bogdanov). - Используется
libexpat2.7.3. #95218 (Konstantin Bogdanov). - Используется
OpenSSL3.5.5. #95345 (Konstantin Bogdanov). - Используется
simdjsonv4.2.4. #97129 (Konstantin Bogdanov). - Используется
libarchive3.8.5. #97131 (Konstantin Bogdanov). - Используется
fast_floatверсии 8.2.3. #97133 (Konstantin Bogdanov). - Использовать
abseil-cpp20260107.1,s2geometryv0.13.1. #97134 (Konstantin Bogdanov). - Обновили
libxml2до версии 2.15.1. #95574 (Robert Schulze). - Обновлены 7 Docker-образов для интеграционных тестов уровня 3: устаревшие (EOL) или удалённые базовые образы заменены на актуальные поддерживаемые версии. #97314 (Rahul).
- Добавлены запросы из бенчмарка TPC-DS. #97349 (Raufs Dunamalijevs).
- Отдельные cmake-опции для наборов инструкций x86 (
ENABLE_SSSE3,ENABLE_AVX2,NO_SSE3_OR_HIGHER,ARCH_NATIVEи т. д.) заменены одной числовой опциейX86_ARCH_LEVEL(1/2/3/4), соответствующей стандартным уровням микроархитектуры x86-64, которые уже используются системой диспетчеризации во время выполнения. #97354 (Raúl Marín). - Устранено инстанцирование вариантов шаблона
division_by_nullable=trueдля операций, не связанных с делением, вFunctionBinaryArithmetic, что сокращает время компиляции и размер бинарного файла. #97496 (Raúl Marín). - Уменьшена зависимость от
Exception.h: этот файл убран из часто используемых заголовков, таких какtypeid_cast.h,assert_cast.h,Context_fwd.h,IDataType.hи различных заголовочных файлов Column. #97497 (Raúl Marín). - Всегда используйте заголовочные файлы из комплекта
compiler-rt(интерфейсы sanitizer и XRay) вместо заголовков системного компилятора и по умолчанию собирайте библиотекиcompiler-rtиз исходников. #97499 (Raúl Marín). - Исключено включение заголовков boost/multiprecision в
wide_integer_impl.hна платформах с достаточно точнымlong double, что ускоряет сборку. #96633 (Alexey Milovidov). - Реализован джоб LLVM Code Coverage; на первом этапе он включён для ветки master. #90952 (Alexey Bakharew).
- В релизных сборках включён быстрый режим защиты libcxx. В основном это нужно для проверок выхода за границы. Судя по результатам тестов производительности, заметного влияния на производительность не ожидается. #94757 (Miсhael Stetsyuk).
Релиз ClickHouse 26.1, 2026-01-29. Презентация, Видео
обратно несовместимое изменение
- Исправлено несогласованное форматирование, вызванное некорректной подстановкой псевдонимов в форматтере. Это закрывает #82833. Это закрывает #82832. Это закрывает #68296. Это изменение потенциально нарушает обратную совместимость: когда анализатор отключен, некоторые запросы CREATE VIEW с IN, ссылающимся на псевдоним, не могут быть обработаны. Чтобы избежать этой несовместимости, включите анализатор (по умолчанию он включен начиная с версии 24.3). #82838 (Alexey Milovidov).
- Кодеки
DEFLATE_QPLиZSTD_QATбыли удалены. Пользователям рекомендуется до обновления перекодировать существующие данные, сжатые с помощьюDEFLATE_QPLилиZSTD_QAT, в другой кодек. Обратите внимание: для использования этих кодеков должны были быть включены настройкиenable_deflate_qpl_codecиenable_zstd_qat_codec. #92150 (Robert Schulze). - Улучшена отладка UDF: включён захват stderr в
system.query_log.exception. Ранее stderr из UDF записывался только в файлы и не отображался в журнале запросов, из-за чего отладка была невозможна. Теперь stderr по умолчанию вызывает исключения и полностью накапливается (до 1 МБ) перед тем, как сгенерировать исключение, поэтому полные трассировки Python и сообщения об ошибках появляются вsystem.query_log.exception, что упрощает диагностику. #92209 (Xu Jia). - Пустой список столбцов в условии
JOIN USING ()теперь считается синтаксической ошибкой. Ранее предполагалось, что во время выполнения запроса это будетINVALID_JOIN_ON_EXPRESSION. В некоторых случаях, например при JOIN с хранилищемJoin, это приводило кLOGICAL_ERROR; исправление закрывает #82502. #92371 (Vladimir Cherkasov). - По умолчанию для SKIP REGEXP в типе JSON используется частичное совпадение. Закрывает #79250. #92847 (Pavel Kruglov).
- Отменено изменение “Allow INSERT into simple ALIAS columns” (отменяет ClickHouse/ClickHouse#84154). Оно не работает с пользовательскими форматами, и для него нет отдельной настройки. #92849 (Azat Khuzhin).
- Настройка, вызывающая ошибку, если каталог озера данных не имеет доступа к объектному хранилищу. #93606 (Konstantin Vedernikov).
- Движок базы данных
Lazyудалён и больше не доступен. Закрывает #91231. #93627 (Alexey Milovidov). - Удалён режим
transposed_with_wide_viewдляmetric_log— из-за ошибки он неработоспособен. Задатьsystem.metric_logв этом режиме больше нельзя. Это частично отменяет #78412. #93867 (Alexey Milovidov). - Теперь для рабочих нагрузок по умолчанию используется вытесняющее планирование CPU. См. настройку сервера
cpu_slot_preemption. #94060 (Sergei Trifonov). - Экранировать имена файлов индексов, чтобы избежать повреждения частей. После этого изменения ClickHouse не сможет загружать индексы с не-ASCII-символами в имени, созданные в предыдущих версиях. Для этого можно использовать настройку MergeTree
escape_index_filenames. #94079 (Raúl Marín). - Настройки формата
exact_rows_before_limit,rows_before_aggregation,cross_to_inner_join_rewrite,regexp_dict_allow_hyperscan,regexp_dict_flag_case_insensitive,regexp_dict_flag_dotallиdictionary_use_async_executorтеперь переведены в разряд обычных настроек (не настроек формата). Это исключительно внутреннее изменение и не имеет заметных для пользователя побочных эффектов, кроме (маловероятного) случая, когда вы указали какие-либо из этих настроек в определениях движков таблиц Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog или NATS. В таких случаях эти настройки раньше игнорировались, а теперь при таких определениях генерируется ошибка. #94106 (Robert Schulze). - Функции
joinGet/joinGetOrNullтеперь требуют наличия привилегииSELECTдля базовой таблицы Join. После этого изменения для выполненияjoinGet('db.table', 'column', key)требуется, чтобы у пользователя была привилегияSELECTкак для столбцов ключа, определённых в таблице Join, так и для извлекаемого столбца-атрибута. Запросы без этих привилегий будут завершаться ошибкойACCESS_DENIED. Для перехода предоставьте необходимые разрешения с помощьюGRANT SELECT ON db.join_table TO userдля полного доступа к таблице илиGRANT SELECT(key_col, attr_col) ON db.join_table TO userдля доступа на уровне столбцов. Это изменение затрагивает всех пользователей и приложения, использующиеjoinGet/joinGetOrNull, если явные привилегииSELECTранее не были настроены. #94307 (Vladimir Cherkasov). - Для запросов
CREATE TABLE ... AS ...теперь проверяетсяSHOW COLUMNS. Ранее проверялсяSHOW TABLES, но для такой проверки разрешений это некорректный grant. #94556 (pufit). - Формат вывода
Hashтеперь не зависит от размеров блоков. #94503 (Alexey Milovidov). Обратите внимание, что из-за этого хеш-значения в выводе будут отличаться от предыдущих версий.
Новая возможность
- HTTP API и встроенный веб-интерфейс для ClickHouse Keeper. #78181 (pufit и speeedmaster).
- Дедупликация async insert теперь работает с зависимыми materialized views. При коллизии по block_id исходный блок фильтруется: из него удаляются строки, связанные с block_id, а оставшиеся строки преобразуются всеми соответствующими SELECT-запросами materialized views; в результате исходный блок пересобирается без конфликтующих строк. #89140 (Sema Checherinda). Теперь можно использовать дедупликацию с async inserts, когда задействованы materialized views. #93957 (Sema Checherinda).
- Добавлены новый синтаксис и новый механизм, упрощающие и расширяющие функциональность индексов-проекций. Это продолжение работы из https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
- Добавлена поддержка текстовых индексов для столбцов
Array. #89895 (Jimmy Aguilar Mena). - Параметр
use_variant_as_common_typeтеперь включён по умолчанию, что позволяет использовать несовместимые типы внутриArray, в запросахUNIONи в ветвяхif/multiIf/case. #90677 (Alexey Milovidov). - Добавлена новая системная таблица
zookeeper_info. Реализовано в #88014. #90809 (Smita Kulkarni). - Добавлена поддержка типа
Variantво всех функциях. #90900 (Bharat Nallan). - Добавляет метрику
ClickHouse_Infoв конечную точку Prometheus/metrics, содержащую в основном информацию о версии, что позволяет строить графики и отслеживать подробные сведения о версии с течением времени. #91125 (Christoph Wurm). - Добавлена новая четырёхбуквенная команда
rcfgдля Keeper, позволяющая изменять конфигурацию кластера. Эта команда предоставляет более широкие возможности изменения конфигурации, чем стандартный запросreconfigure. В качестве аргумента команда принимает строкуjson. Полный набор байтов, отправляемых в TCP-интерфейс, должен выглядеть так:rcfg{json_string_length_big_endian}{json_string}. Вот как могут выглядеть некоторые примеры команды:{"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin). - Добавлена функция
reverseBySeparator, которая меняет порядок подстрок в строке, разделённой указанным разделителем, на обратный. Закрывает #91463. #91780 (Xuewei Wang). - Добавляет новую настройку
max_insert_block_size_bytes, которая позволяет точнее управлять формированием вставляемых блоков. #92833 (Kirill Kopnev). - DDL-запросы с предложением
ON CLUSTERможно выполнять для базы данных Replicated, если включена настройкаignore_on_cluster_for_replicated_database. В этом случае имя кластера будет проигнорировано. #92872 (Kirill). - Добавлена функция
mergeTreeAnalyzeIndexes. #92954 (Azat Khuzhin). - Добавлена новая настройка
use_primary_key. Установите её вfalse, чтобы отключить отсечение гранул по первичному ключу. #93319 (Nihal Z. Miaji). - Добавлена табличная функция
icebergLocalCluster. #93323 (Anton Ivashkin). - Добавлена функция
cosineDistanceTransposed, которая приблизительно вычисляет косинусное расстояние между двумя точками. #93621 (Raufs Dunamalijevs). - Добавлен столбец
filesв таблицу system.parts, показывающий количество файлов в каждой части данных. #94337 (Match). - Добавлен max-min-справедливый планировщик для управления параллелизмом. Обеспечивает более справедливое распределение ресурсов при высокой переподписке, когда множество запросов конкурируют за ограниченные слоты CPU. Короткие запросы не страдают из-за длительных запросов, которые со временем накопили больше слотов. Включается значением
max_min_fairнастройки сервераconcurrent_threads_scheduler. #94732 (Sergei Trifonov). - В клиенте ClickHouse появилась возможность переопределять TLS SNI при подключении к серверу. #89761 (Matt Klein).
- Добавлена поддержка временных таблиц в вызовах функции
joinGet. #92973 (Eduard Karacharov). - Поддержка векторов удаления в движке таблицы
DeltaLake. #93852 (Kseniia Sumarokova). - Добавлена поддержка deletion vectors в
deltaLakeCluster. #94365 (Kseniia Sumarokova). - Поддержка Google Cloud Storage для озер данных. #93866 (Konstantin Vedernikov).
Экспериментальные возможности
- Перевести
QBitиз экспериментальных возможностей в бета-статус. #93816 (Raufs Dunamalijevs). - Добавить поддержку
Nullable(Tuple). Чтобы включить её, установитеallow_experimental_nullable_tuple_type = 1. #89643 (Nihal Z. Miaji). - Добавить поддержку Paimon REST-каталога в продолжение https://github.com/ClickHouse/ClickHouse/pull/84423. #92011 (JIaQi Tang).
Повышение производительности
- Параметр
use_skip_indexes_on_data_readтеперь включен по умолчанию. Этот параметр позволяет выполнять фильтрацию в потоковом режиме одновременно с чтением, что улучшает производительность запросов и сокращает время запуска. #93407 (Shankar Iyer). - Повышена производительность
DISTINCTдля столбцовLowCardinality. Закрывает #5917. #91639 (Nihal Z. Miaji). - Оптимизирована агрегатная функция
distinctJSONPaths: теперь она читает только JSON-пути из частей данных, а не весь JSON-столбец. #92196 (Pavel Kruglov). - В JOIN теперь проталкивается больше фильтров. #85556 (Nikita Taranov).
- Поддержано больше случаев проталкивания из условия ON в JOIN, когда фильтр использует входные данные только с одной стороны. Поддерживаются JOIN
ANY,SEMI,ANTI. #92584 (Dmitry Novik). - Разрешено использовать эквивалентные множества для проталкивания фильтров при
SEMI JOIN. Закрывает #85239. #92837 (Dmitry Novik). - Пропускаем чтение левой стороны hash JOIN, если правая сторона пуста. Раньше левая сторона читалась до первого непустого блока, что могло приводить к большому объёму лишней работы при интенсивной фильтрации или агрегации. #94062 (Alexander Gololobov).
- Использование метода “fastrange” (Daniel Lemire) для партиционирования данных внутри конвейера выполнения запроса. Это может улучшить параллельную сортировку и JOIN-операции. #93080 (Alexey Milovidov).
- Повышена производительность оконных функций, когда PARTITION BY совпадает с ключом сортировки или является его префиксом. #87299 (Nikita Taranov).
- Внешний фильтр теперь проталкивается в представления, что позволяет применять PREWHERE на локальных и удалённых узлах. Устранена проблема #88189. #88316 (Igor Nikonov).
- Реализована JIT-компиляция для ещё большего числа функций. Закрывает #73509. #88770 (Alexey Milovidov совместно с Taiyang Li).
- Если индекс пропуска данных, используемый в запросе
FINAL, построен по столбцу, входящему в первичный ключ, дополнительный этап проверки пересечения по первичному ключу с другими частями не требуется и больше не выполняется. Устраняет #85897. #93899 (Shankar Iyer). - Улучшены производительность и использование памяти при дробных
LIMITиOFFSET. #91167 (Ahmed Gouda). - Исправлено использование более быстрой логики произвольного чтения в префетчере ридера Parquet V3. Закрывает #90890. #91435 (Arsen Muk).
- Повышена производительность
icebergCluster. Закрывает #91462. #91537 (Yang Jiang). - Не выполнять фильтрацию по виртуальным столбцам для константных фильтров. #91588 (c-end).
- Снижено использование памяти при INSERT и слияниях с частями Wide в очень широких таблицах за счёт включения адаптивных буферов записи. Добавлена поддержка адаптивных буферов записи для зашифрованных дисков. #92250 (Azat Khuzhin).
- Повышена производительность полнотекстового поиска с текстовым индексом и токенизатором
sparseGramsза счёт сокращения числа токенов, по которым выполняется поиск в индексе. #93078 (Anton Popov). - Функция
isValidASCIIбыла оптимизирована для случаев с положительным результатом, то есть для входных значений, полностью состоящих из ASCII. #93347 (Robert Schulze). - Оптимизация read-in-order теперь распознаёт случаи, когда столбцы ORDER BY являются константами из-за условий WHERE, что позволяет эффективно читать данные в обратном порядке. Это полезно для многотенантных запросов, таких как
WHERE tenant='42' ORDER BY tenant, event_time DESC, которые теперь могут использовать InReverseOrder без необходимости полной сортировки.”. #94103 (matanper). - Добавлен специализированный класс AST для Enum, который хранит значения параметров в виде пар (string, integer) вместо дочерних элементов ASTLiteral для оптимизации потребления памяти. #94178 (Ilya Yatsishin).
- Распределённый анализ индексов на нескольких репликах. Полезно при использовании совместно используемого хранилища и очень больших объёмов данных в кластере. Это применимо к SharedMergeTree (ClickHouse Cloud) и может быть применимо к другим типам таблиц MergeTree с совместно используемым хранилищем. #86786 (Azat Khuzhin).
- Снижены накладные расходы на JOIN Runtime Filters за счет их отключения в следующих случаях: - в фильтре Блума установлено слишком много битов - на этапе выполнения отфильтровывается слишком мало строк. #91578 (Alexander Gololobov).
- Используйте буфер в памяти для входных данных коррелированных подзапросов, чтобы не вычислять их многократно. Часть #79890. #91205 (Dmitry Novik).
- Разрешить всем репликам при чтении с использованием параллельных реплик параллельно перехватывать осиротевшие диапазоны. Это улучшает балансировку нагрузки и снижает задержки на длинном хвосте. #91374 (zoomxi).
- Внешняя агрегация/сортировка/JOIN теперь учитывают настройку запроса
temporary_files_codecво всех контекстах. Исправлена проблема с отсутствующими profile events для grace hash join. #92388 (Vladimir Cherkasov). - Сделали более надёжным определение использования памяти запросом при сбросе на диск во время агрегации/сортировки. #92500 (Azat Khuzhin).
- Оценка общего числа строк и статистики NDV (числа различных значений) для столбцов ключа агрегации. #92812 (Alexander Gololobov).
- Оптимизировано сжатие списка postings с помощью simdcomp. #92871 (Peng Jian).
- Переработана обработка режима Ordered в S3Queue с использованием бакетов. Это также должно повысить производительность за счёт сокращения числа запросов к Keeper. #92889 (Kseniia Sumarokova).
- Функции
mapContainsKeyLikeиmapContainsValueLikeтеперь могут использовать текстовый индекс дляmapKeys()иmapValues()соответственно. #93049 (Michael Jarrett). - Снижено использование памяти в не-Linux-системах (включена немедленная очистка «грязных» страниц jemalloc). #93360 (Eduard Karacharov).
- Реализована принудительная очистка арен jemalloc, если отношение объёма грязных страниц к
max_server_memory_usageпревышаетmemory_worker_purge_dirty_pages_threshold_ratio. #93500 (Eduard Karacharov). - Снижено использование памяти для AST. #93601 (Nikolai Kochetov).
- В некоторых случаях мы замечали, что ClickHouse не соблюдает лимит памяти при чтении из таблицы. Это исправлено. #93715 (Nikita Mikhaylov).
- Расширения Keeper
CHECK_STATиTRY_REMOVEтеперь включены по умолчанию. #93886 (Mikhail Artemenko). - Разбор нижних и верхних границ имён файлов для позиционных удалений из записей manifest file в Iceberg для более точного выбора соответствующих файлов данных. #93980 (Daniil Ivanik).
- Добавлены ещё две настройки для управления максимальным количеством динамических подстолбцов в JSON-столбце. Первая — настройка MergeTree
merge_max_dynamic_subcolumns_in_compact_part(аналогично уже добавленнойmerge_max_dynamic_subcolumns_in_wide_part), которая ограничивает количество динамических подстолбцов, создаваемых при слиянии в Compact part. Вторая — настройка уровня запросаmax_dynamic_subcolumns_in_json_type_parsing, которая ограничивает количество динамических подстолбцов, создаваемых при разборе JSON-данных; она позволяет задавать этот лимит при вставке. #94184 (Pavel Kruglov). - В некоторых случаях немного оптимизировано укрупнение блоков для JSON-столбцов. #94247 (Pavel Kruglov).
- Уменьшен размер очередей пула потоков с учетом опыта эксплуатации в продакшне. Добавлена явная проверка потребления памяти перед чтением каких-либо данных из MergeTree. #94692 (Nikita Mikhaylov).
- Сделано так, чтобы при нехватке CPU планировщик отдавал предпочтение потоку MemoryWorker, поскольку это защищает процесс ClickHouse от критической угрозы. #94864 (Nikita Mikhaylov).
- Очистка грязных страниц jemalloc теперь выполняется в отдельном потоке, а не в основном потоке MemoryWorker. Если очистка выполняется медленно, это может задерживать обновление использования RSS, что может приводить к аварийному завершению процесса из-за нехватки памяти. Добавлен новый параметр конфигурации
memory_worker_purge_total_memory_threshold_ratio, чтобы запускать очистку грязных страниц в зависимости от доли общего использования памяти. #94902 (Antonio Andelic).
Улучшения
system.blob_storage_logтеперь поддерживается для Azure Blob Storage. #93105 (Alexey Milovidov).- Реализован
blob_storage_logдля Local и HDFS. Исправлена ошибка, из-за которойS3Queueиспользовал для записи вblob_storage_logне имя диска. Вblob_storage_logдобавлен столбецerror_code. Тестовый файл конфигурации разделён, чтобы упростить локальное тестирование. #93106 (Alexey Milovidov). clickhouse-clientиclickhouse-localбудут подсвечивать группы цифр (тысячи, миллионы и т. д.) внутри числовых литералов во время ввода. Это закрывает #93100. #93108 (Alexey Milovidov).- В
clickhouse-clientдобавлена поддержка аргументов командной строки с пробелами вокруг знака равенства. Закрывает #93077. #93174 (Cole Smith). - С
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>CLI-клиент теперь может, как и раньше, использовать Ctrl-R для обычного поиска, а Ctrl-T — для нечёткого поиска. #87785 (Larry Snizek). - Оператор очистки кэша
SYSTEM DROP [...] CACHEсоздавал ложное впечатление, что этот оператор отключает кэш. ClickHouse теперь поддерживает операторSYSTEM CLEAR [...] CACHE, который звучит понятнее. Старый синтаксис по-прежнему доступен. #93727 (Pranav Tiwari). - Поддержка составного первичного ключа в
EmbeddedRocksDB. Закрывает #32819. #33917 (usurai). - Теперь можно использовать неконстантный IN со скалярами (запросы вида
val1 NOT IN if(cond, val2, val3)). #93495 (Yarik Briukhovetskyi). - Предотвращена передача заголовков
x-amz-server-side-encryptionв S3-запросахHeadObject,UploadPartиCompleteMultipartUpload, поскольку они не поддерживаются. #64577 (Francisco J. Jurado Moreno). - Отслеживание hive-партиционирования в режиме ordered в S3Queue. Закрывает #71161. #81040 (Anton Ivashkin).
- Оптимизировано резервирование места в файловом кэше.
FileCache::collectCandidatesForEvictionтеперь будет выполняться без уникальной блокировки. #82764 (Kseniia Sumarokova). - Добавлена поддержка составной стратегии ротации (размер + время) для журнала сервера. #87620 (Jianmei Zhang).
- CLI-клиент теперь может использовать
<warnings>false</warnings>вместо параметра командной строки--no-warnings. #87783 (Larry Snizek). - Добавлена поддержка агрегатной функции
avg, принимающей в качестве аргументов значения типов Date, DateTime и Time. Закрывает #82267. #87845 (Yarik Briukhovetskyi). - Оптимизация
use_join_disjunctions_push_downпо умолчанию включена. #89313 (Alexey Milovidov). - Добавлена поддержка большего числа движков таблиц и типов источников данных в коррелированных подзапросах. Закрывает #80775. #90175 (Dmitry Novik).
- Если схема параметризованного представления явно задана, она отображается. Закрывает #88875, #81385. #90220 (Grigorii Sokolik).
- Корректная обработка пропуска в записях журнала Keeper, если они находятся до последнего зафиксированного индекса. #90403 (Antonio Andelic).
- Улучшена работа настройки
min_free_disk_bytes_to_perform_insertс томами JBOD. #90878 (Aleksandr Musorin). - Добавлена возможность указывать настройку
storage_class_nameв именованных коллекциях для движка таблицыS3и табличной функцииs3. #91926 (János Benjamin Antal). - Добавлена поддержка вставки в auxiliary ZooKeeper через
system.zookeeper. #92092 (RinChanNOW). - Добавлены новые метрики для Keeper: события профиля
KeeperChangelogWrittenBytes,KeeperChangelogFileSyncMicroseconds,KeeperSnapshotWrittenBytesиKeeperSnapshotFileSyncMicroseconds, а также гистограммные метрикиKeeperBatchSizeElementsиKeeperBatchSizeBytes. #92149 (Miсhael Stetsyuk). - Добавлена новая настройка
trace_profile_events_list, которая ограничивает трассировку с помощьюtrace_profile_eventуказанным списком имён событий. Это позволяет точнее собирать данные при высоких рабочих нагрузках. #92298 (Alexey Milovidov). - Добавлена поддержка SYSTEM NOTIFY FAILPOINT для приостанавливаемых failpoint. — Добавлена поддержка SYSTEM WAIT FAILPOINT fp PAUSE/RESUME. #92368 (Shaohua Wang).
- В
system.data_skipping_indicesдобавлен столбецcreation(неявный/явный). #92378 (Raúl Marín). - Разрешена передача описания столбцов dyn-таблиц YTsaurus в источник словаря. #92391 (MikhailBurdukov).
- В #63985 мы добавили возможность указывать все параметры, необходимые для настройки TLS, отдельно для каждого порта (см. composable protocols), так что теперь не нужно полагаться на глобальную конфигурацию TLS. Однако реализация по-прежнему неявно требует наличия глобального раздела конфигурации
openSSL.server, что конфликтует со сценариями, где для разных портов нужны разные настройки TLS. Например, в развертываниях keeper-in-server нам нужны отдельные конфигурации TLS для взаимодействия между узлами Keeper и для подключений клиента ClickHouse. #92457 (Miсhael Stetsyuk). - Добавлена новая настройка
input_format_binary_max_type_complexity, которая ограничивает общее число узлов типов, декодируемых в бинарном формате, чтобы предотвратить передачу вредоносных полезных нагрузок. #92519 (Raufs Dunamalijevs). - В
system.background_schedule_pool{,_log}теперь отражаются выполняющиеся задачи. Добавлена документация. #92587 (Azat Khuzhin). - Выполнять текущий запрос при поиске по Ctrl+R в клиенте, если в истории не найдено совпадений. #92749 (Azat Khuzhin).
- Добавлена поддержка
EXPLAIN indices = 1в качестве алиаса дляEXPLAIN indexes = 1. Закрывает #92483. #92774 (Pranav Tiwari). - Ридер Parquet теперь позволяет читать столбцы Tuple или Map в формате JSON:
select x from file(f.parquet, auto, 'x JSON')работает, даже если тип столбцаxвf.parquet— Tuple или Map. #92864 (Michael Kolupaev). - Поддержка пустых Tuple в ридере Parquet. #92868 (Michael Kolupaev).
- Переход к копированию с возможностью чтения и записи для Azure Blob Storage, если нативное копирование завершается ошибкой BadRequest (например, из-за недопустимого списка блоков). Ранее это выполнялось только для ошибки Unauthorized, которая наблюдалась при копировании blob между разными аккаунтами хранилища. Однако иногда также возникает ошибка “The specified block list is invalid”. Поэтому теперь условие обновлено так, чтобы переходить к чтению & записи при любых сбоях нативного копирования. #92888 (Smita Kulkarni).
- Исправлено ограничение частоты запросов к конечной точке метаданных EC2 при выполнении большого числа параллельных S3-запросов с учетными данными профиля экземпляра EC2. Ранее каждый запрос создавал собственный
AWSInstanceProfileCredentialsProvider, из-за чего к сервису метаданных EC2 отправлялись параллельные запросы, что могло приводить к тайм-аутам и ошибкамHTTP response code: 403. Теперь поставщик учетных данных кэшируется и используется всеми запросами совместно. #92891 (Sav). - Переработана настройка
insert_select_deduplicate, чтобы сохранить обратную совместимость. #92951 (Sema Checherinda). - Логировать фоновые задачи, которые выполняются медленнее среднего (
background_schedule_pool_log.duration_threshold_milliseconds=30), чтобы избежать избыточного логирования задач. #92965 (Azat Khuzhin). - В предыдущих версиях некоторые имена функций C++ в
system.trace_logиsystem.symbolsотображались некорректно («искажёнными»), а функцияdemangleплохо с ними справлялась. Закрывает #93074. #93075 (Alexey Milovidov). - Добавлена настройка резервного копирования
backup_data_from_refreshable_materialized_view_targets, позволяющая не включать в резервную копию refreshable materialized view. RMV со стратегией обновления APPEND всегда резервируются. #93076 (Julia Kartseva). #93658 (Julia Kartseva) - Использовать минимальную отладочную информацию вместо её полного отсутствия для тяжёлых единиц трансляции, таких как функции. #93079 (Alexey Milovidov).
- Добавлена поддержка совместимости MinIO в AWS S3 C++ SDK благодаря реализации сопоставления кодов ошибок для специфических ошибок MinIO. Это изменение позволяет ClickHouse корректно обрабатывать ошибки сервера MinIO и выполнять повторные попытки при использовании развертываний MinIO вместо AWS S3, повышая надежность для пользователей, использующих Объектное хранилище в самоуправляемых кластерах MinIO. #93082 (XiaoBinMu).
- Запись символизированных профилей jemalloc (без необходимости использовать бинарный файл при создании профиля кучи). #93099 (Azat Khuzhin).
- Восстановлена работа инструмента
clickhouse git-import— ранее он не работал с большими и некорректными коммитами. См. https://presentations.clickhouse.com/2020-matemarketing/. #93202 (Alexey Milovidov). - Не показывать пароли из URL-хранилища в журнале запросов. #93245 (Konstantin Vedernikov).
- Добавлена поддержка типа
GeometryдляflipCoordinates. #93303 (Bharat Nallan). - Улучшен UX команды SYSTEM INSTRUMENT ADD/REMOVE: для имён функций теперь используются строковые литералы String, исправлены все соответствующие функции, а также разрешено использовать function_name в
REMOVE. #93345 (Pablo Marcos). - Добавлена новая настройка
materialize_statistics_on_merge, которая включает или отключает материализацию статистики при слиянии. Значение по умолчанию —1. #93379 (Han Fei). - ClickHouse теперь может разбирать
SELECTв запросахDESCRIBE SELECTбез круглых скобок. Закрывает #58382. #93429 (Yarik Briukhovetskyi). - Добавлена рандомизация проверок корректности кэша с заданной вероятностью. #93439 (Kseniia Sumarokova).
- Добавлена настройка
type_json_allow_duplicated_key_with_literal_and_nested_object, позволяющая использовать дублирующиеся пути в JSON, где один является литералом, а другой — вложенным объектом, например{"a" : 42, "a" : {"b" : 42}}. Некоторые данные могли быть созданы до добавления этого ограничения на дублирующиеся пути в https://github.com/ClickHouse/ClickHouse/pull/79317, и дальнейшие манипуляции с такими данными теперь могут приводить к ошибкам. С этой настройкой такие старые данные по-прежнему можно использовать без ошибок. #93604 (Pavel Kruglov). - Не выводить значения простых типов в Pretty JSON на отдельных строках. #93836 (Pavel Kruglov).
- При большом количестве операторов
alter table ... modify setting ...может не удаваться получить блокировку за 5 секунд. Лучше возвращатьtimeout, а неlogical error. #93856 (Han Fei). - Предотвращён избыточный вывод при синтаксической ошибке. До этого изменения выводился весь SQL-скрипт, который мог содержать множество запросов. #93876 (Alexey Milovidov).
- Реализован корректный расчёт размера в байтах для запроса
checkсо статистикой в Keeper. #93907 (Mikhail Artemenko). - Добавлен параметр
use_hash_table_stats_for_join_reordering, который определяет, использовать ли статистику размера хеш-таблицы во время выполнения для изменения порядка JOIN. Этот параметр по умолчанию включен, что сохраняет существующее поведениеcollect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov). - Теперь пользователи могут частично просматривать вложенные глобальные настройки сервера в таблице
system.server_settings(например,logger.level). Это применимо только к настройкам с фиксированной структурой (без списков, перечислений, повторяющихся элементов и т. д.). #94001 (Hechem Selmi). QBitтеперь можно проверять на равенство. #94078 (Raufs Dunamalijevs).- Когда Keeper обнаруживает поврежденный снимок или несогласованные журналы изменений, он генерирует исключение вместо того, чтобы требовать ручного прерывания или автоматически очищать файлы. Это должно сделать поведение Keeper более безопасным, поскольку оно теперь опирается на ручное вмешательство. #94168 (Antonio Andelic).
- Исправлена ситуация, когда при сбое
CREATE TABLEмогли оставаться артефакты. #94174 (Azat Khuzhin). - Исправлена ошибка доступа к неинициализированной памяти (ошибка в OpenSSL) при использовании защищённого паролем TLS-ключа. #94182 (Konstantin Bogdanov).
- Обновлён chdig до v26.1.1. #94290 (Azat Khuzhin).
- Добавлена поддержка более общего партиционирования для режима ordered в S3Queue. #94321 (Bharat Nallan).
- Добавлен алиас
use_statisticsдля настройкиallow_statistics_optimize. Это лучше соответствует существующим настройкамuse_primary_keyиuse_skip_indexes. #94366 (Robert Schulze). - Включена настройка
input_format_numbers_enum_on_conversion_errorдля проверки существования элемента при преобразовании чисел в Enum. #94384 (Elmi Ahmadov). - В режиме
orderedдля S3(Azure)Queue очистка сбойных узлов теперь выполняется с учётом лимитов отслеживания (раньше это делалось только в режимеunordered— и для сбойных, и для обработанных узлов; теперь это будет выполняться и дляordered, но только для сбойных узлов). #94412 (Kseniia Sumarokova). - В
clickhouse-localдля пользователяdefaultвключено управление доступом. У пользователяdefaultвclickhouse-localотсутствовала привилегия access_management, из-за чего операции вродеDROP ROW POLICY IF EXISTSзавершались ошибкойACCESS_DENIED, хотя у этого пользователя не должно быть ограничений. #94501 (Alexey Milovidov). - Добавлена поддержка named collection для словарей и таблиц YTsaurus. #94582 (MikhailBurdukov).
- Добавлена поддержка именованных коллекций, определяемых в SQL, в BACKUP/RESTORE для S3 и Azure Blob Storage. Закрывает #94604. #94605 (Pablo Marcos).
- Добавлена поддержка бакетизации на основе ключа партиционирования для S3Queue в режиме ordered. #94698 (Bharat Nallan).
- Добавлена асинхронная метрика, показывающая время выполнения самого долгого слияния. #94825 (Raúl Marín).
- Добавлена проверка принадлежности файла перед применением позиционного удаления с использованием IcebergBitmapPositionDeleteTransform. #94897 (Yang Jiang).
- Теперь
view_duration_msпоказывает время, в течение которого группа была активна, а не суммарную длительность потоков в ней. #94966 (Sema Checherinda). - Снято ограничение на максимальное количество поисковых токенов в функциях
hasAnyTokensиhasAllTokens, которое ранее составляло 64. Пример:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);Этот запрос приводил бы к ошибкеBAD_ARGUMENTS, поскольку содержит 65 поисковых токенов. В этом PR ограничение полностью снято, и тот же запрос будет выполняться без ошибки. #95152 (Elmi Ahmadov). - Добавлена настройка
input_format_numbers_enum_on_conversion_errorдля преобразования чисел в Enum с проверкой наличия элемента. Закрывает: #56144. #56240 (Nikolay Degterinsky). - Ресурсы парсера формата теперь совместно используются при чтении data file и position delete file в таблицах Iceberg, что позволяет сократить число выделений памяти. #94701 (Yang Jiang).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка, из-за которой в обработчиках предопределённых запросов пробельные символы в конце интерпретировались как данные при вставке. #83604 (Fabian Ponce).
- Исправлена ошибка INCOMPATIBLE_TYPE_OF_JOIN в хранилище Join при применении оптимизации преобразования outer join в inner join. Исправляет #80794. #84292 (Vladimir Cherkasov).
- Исправлено исключение “Invalid number of rows in Chunk” при использовании hash JOIN с включенным
allow_experimental_join_right_table_sorting. #86440 (yanglongwei). - Теперь в MergeTree имена файлов всегда заменяются хешами, если файловая система нечувствительна к регистру. Ранее в системах с нечувствительной к регистру файловой системой (например, macOS) это могло приводить к повреждению данных, если несколько имён столбцов/подстолбцов различались только регистром. #86559 (Pavel Kruglov).
- Добавлена полная проверка разрешений на этапе создания для запроса, лежащего в основе materialized view. #89180 (pufit).
- Исправлен сбой в функции
icebergHashпри константном аргументе. #90335 (Michael Kolupaev). - Исправлена логическая ошибка, из-за которой мутация вне транзакции изменяла части в активной транзакции, которая в итоге откатывалась. #90469 (Shaohua Wang).
system.warningsтеперь корректно обновляется после преобразования обычной базы данных в базу данных atomic. #90473 (sdk2).- Исправлено срабатывание assertion при чтении из файла Parquet, если часть выражения prewhere используется в другой части запроса. #90635 (Max Kainov).
- Исправлен сбой в одноузловом кластере при чтении из Iceberg в режиме split-by-buckets. Закрывает #90913. #91553 (Konstantin Vedernikov).
- Исправлена возможная логическая ошибка в движке Log при чтении подстолбцов. Закрывает #91710. #91711 (Pavel Kruglov).
- Исправлена логическая ошибка: ‘Хранилище не поддерживает транзакции’ при ATTACH AS REPLICATED. #91772 (Shaohua Wang).
- Исправлена некорректная работа runtime-фильтров, когда у LEFT ANTI JOIN есть дополнительное постусловие. #91824 (Alexander Gololobov).
- Исправляет ошибку в null-safe сравнении с типом Nothing. Закрывает #91834. Закрывает #84870. Закрывает #91821. #91884 (Yarik Briukhovetskyi).
- Исправлены ошибки декодирования DELTA_BYTE_ARRAY в нативном ридере Parquet, которые затрагивали строковые данные с высокой степенью повторяемости. #91929 (Daniel Muino).
- Кэшировать схему в глоб-шаблонах только для того файла, по которому она была определена, а не для всех файлов при определении схемы. Закрывает #91745. #92006 (Pavel Kruglov).
- Исправлена ошибка
Couldn't pack tar archive: Failed to write all bytes, вызванная некорректным заголовком с размером записи в архиве. Исправляет #89075. #92122 (Julia Kartseva). - Поток запроса в insert select теперь освобождается, чтобы предотвратить закрытие HTTP-соединения. #92175 (Sema Checherinda).
- Исправлена логическая ошибка в запросах с несколькими JOIN, использующих предложение
USINGиjoin_use_nulls. #92251 (Vladimir Cherkasov). - Исправлена логическая ошибка при изменении порядка JOIN с join_use_nulls, закрыт https://github.com/clickhouse/clickhouse/issues/90795. #92289 (Vladimir Cherkasov).
- Исправлено неконсистентное форматирование AST для arrayElement с отрицательным литералом. Закрывает #92288 Закрывает #92212 Закрывает #91832 Закрывает #91789 Закрывает #91735 Закрывает #88495 Закрывает #92386. #92293 (Pavel Kruglov).
- Исправлен возможный сбой при использовании настройки
join_on_disk_max_files_to_merge. #92335 (Bharat Nallan). - Связанный issue #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
- Исправлено отсутствие проверки прав доступа в
SYSTEM SYNC FILE CACHE. Закрывает #92101. #92372 (Kseniia Sumarokova). - Исправлен проход
count_distinct_optimizationдля оконных функций и нескольких аргументов. #92376 (Raúl Marín). - Исправлена ошибка “Невозможно записать в финализированный буфер”, возникавшая при использовании некоторых агрегатных функций с оконными функциями. Закрывает #91415. #92395 (Jimmy Aguilar Mena).
- Исправлена логическая ошибка в
CREATE TABLE ... AS urlCluster()и движке базы данныхReplicated. Исправление закрывает #92216. #92418 (Kseniia Sumarokova). - Наследовать настройки информации о сериализации исходной части во время мутации в MergeTree. Это исправляет возможный некорректный результат запроса к мутированной части после изменений в сериализации типов данных. #92419 (Pavel Kruglov).
- Исправлен возможный конфликт между столбцом и подстолбцом с одинаковым именем, приводивший к использованию некорректной сериализации и ошибкам запросов. Закрывает #90219. Закрывает #85161. #92453 (Pavel Kruglov).
- Исправлены
LOGICAL_ERROR, вызванные нежелательным изменением плана запроса при преобразовании OUTER JOIN в INNER JOIN. Также ослаблены требования к оптимизации, чтобы её можно было применять в случаях, когда к ключам агрегации в JOIN применяются инъективные функции. #92503 (János Benjamin Antal). - Исправлена возможная ошибка
SIZES_OF_COLUMNS_DOESNT_MATCHпри сортировке пустого столбца типа tuple. Закрывает #92422. #92520 (Pavel Kruglov). - Добавлена проверка несовместимых типизированных путей в типе JSON. Закрывает #91577. #92539 (Pavel Kruglov).
- Исправлена взаимная блокировка в
SHOW CREATE DATABASEдля базы данных Backup. #92541 (Azat Khuzhin). - Использовать корректный код ошибки при проверке индекса hypothesis. #92559 (Raúl Marín).
- Исправлено разрешение подстолбцов типа Dynamic в псевдонимах столбцов в анализаторе. Ранее подстолбец типа Dynamic в псевдониме столбца оборачивался в
getSubcolumnи в некоторых случаях вообще не разрешался. Закрывает #91434. #92583 (Pavel Kruglov). - Предотвращён сбой в
tokens()приNULLво втором аргументе. #92586 (Raúl Marín). - Исправлено потенциальное падение, вызванное изменением на месте базовых константных столбцов PREWHERE. Это могло произойти при уменьшении размера столбца (
IColumn::shrinkToFit) или фильтрации (IColumn::filter), которые могли параллельно выполняться в нескольких потоках. #92588 (Arsen Muk). - Создание и материализация текстовых индексов для таблиц, содержащих крупные части (более 4 294 967 295 строк), временно отключены. Это ограничение предотвращает некорректные результаты запросов, поскольку текущая реализация индексов пока не поддерживает части такого размера. #92644 (Anton Popov).
- Исправляет логическую ошибку
Too large size (A) passed to allocatorпри выполнении операций JOIN. Закрывает #92043. #92667 (Yarik Briukhovetskyi). - Исправлена ошибка, из-за которой индексы
ngrambf_v1с длиной n-граммы (1-й параметр) > 8 приводили к исключению. #92672 (Robert Schulze). - Исправлено неперехваченное исключение при фоновой перезагрузке named collections при использовании хранилища ZooKeeper. Закрывает https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
- Исправляет некорректную логику проверки grant с подстановочными символами. Предыдущая попытка https://github.com/ClickHouse/ClickHouse/pull/90928 устраняла критическую уязвимость, но в итоге оказалась слишком строгой, из-за чего некоторые операторы
GRANTс подстановочными символами завершались ошибкой из-за несвязанных отзывов привилегий. #92725 (pufit). - Исправлена ошибка в логике пропуска данных: при использовании
not match(...)вWHEREвозвращались некорректные результаты. Закрывает #92492. #92726 (Nihal Z. Miaji). - Не пытайтесь удалять временные каталоги при запуске, если таблица семейства MergeTree создана на диске в режиме только для чтения. #92748 (Alexey Milovidov).
- Исправлена ошибка “Невозможно добавить действие в пустую ExpressionActionsChain” для ALTER TABLE REWRITE PARTS (v2). #92754 (Azat Khuzhin).
- Предотвращён сбой при чтении из разорванного
Connection. #92807 (Raufs Dunamalijevs). - Исправлена логическая ошибка
Failed to set file processing within 100 retriesв хранилищеS3Queueв режимеOrdered. Теперь вместо неё выводится предупреждение. Эта ошибка могла возникать в версиях до 25.10, если истекал сеанс Keeper, однако в версиях 25.10+ она по-прежнему будет возникать лишь как предупреждение, поскольку теоретически её всё ещё можно получить при высоком параллелизме обработки в режимеOrdered. #92814 (Kseniia Sumarokova). - Ранее некоторые запросы, использовавшие сегментирование по PK при ложном условии, завершались с ошибкой. Теперь это исправлено. Необходимо для https://github.com/ClickHouse/ClickHouse/pull/89313. #92815 (Yarik Briukhovetskyi).
- Исправлен расчёт несжатых размеров текстовых индексов в таблице
system.parts. #92832 (Anton Popov). - Исправлено использование первичного индекса в легковесных обновлениях с оператором
IN, содержащим подзапросы в предикатеWHERE. #92838 (Anton Popov). - Исправлено создание подсказки типа для path ‘skip’ в JSON. Исправление закрывает #92731. #92842 (Pavel Kruglov).
- В движке таблицы S3 не следует кэшировать ключ партиционирования, если используются недетерминированные функции. #92844 (Miсhael Stetsyuk).
- Исправлена возможная ошибка
FILE_DOESNT_EXISTпосле выполнения мутации разреженного столбца сratio_of_defaults_for_sparse_serialization=0.0. Закрыт #92633. #92860 (Pavel Kruglov). - Исправлено определение схемы Parquet в старом ридере Parquet (по умолчанию не используется), когда JSON-столбец идет после столбца Tuple. Исправлена ошибка в старом ридере Parquet (по умолчанию не используется), из-за которой он завершался с ошибкой на пустых Tuple. #92867 (Michael Kolupaev).
- Исправлена логическая ошибка при использовании нескольких JOIN с постоянным условием и
join_use_nulls, закрыт #92640. #92892 (Vladimir Cherkasov). - Исправлена возможная ошибка
NOT_FOUND_COLUMN_IN_BLOCKпри вставке в таблицу с подстолбцом в выражении партиционирования. Закрывает #93210. Закрывает #83406. #92905 (Pavel Kruglov). - Исправлена ошибка
NO_SUCH_COLUMN_IN_TABLEв движке Merge при работе с таблицами, использующими псевдонимы. Закрывает #88665. #92910 (Pavel Kruglov). - Исправлен случай, когда NULL != NULL, для full_sorting_join на столбце LowCardinality(Nullable(T)). #92924 (Vladimir Cherkasov).
- Исправлено несколько сбоев, возникавших при слиянии текстовых индексов в таблицах
MergeTree. #92925 (Anton Popov). - При необходимости во время TTL-агрегации восстанавливаются обертки LowCardinality для результатов выражений SET, чтобы избежать исключений при оптимизации таблицы. #92971 (Seva Potapov).
- Исправлена логическая ошибка при анализе индекса, возникавшая при использовании пустого массива в функции
has. Закрывает #92906. #92995 (Nihal Z. Miaji). - Исправлено возможное зависание при завершении работы фонового пула планировщика (может приводить к зависанию сервера при остановке). #93008 (Azat Khuzhin).
- Исправлена возможная ошибка FILE_DOESNT_EXIST после мутации разреженного столбца при изменении значения
ratio_of_defaults_for_sparse_serializationна1.0с помощью ALTER. #93016 (Pavel Kruglov). - Исправлена ошибка в логике пропуска данных, из-за которой использование
not materialize(...)илиnot CAST(...)в WHERE приводило к некорректным результатам. Закрывает #88536. #93017 (Nihal Z. Miaji). - Исправлено возможное использование устаревших частей из-за TOCTOU-гонки для общих частей. #93022 (Azat Khuzhin).
- Исправлен crash при десериализации некорректного aggregate state
groupConcatсо смещениями, выходящими за допустимые границы. #93028 (Raufs Dunamalijevs). - Исправлено состояние, при котором после предварительной отмены распределённых запросов соединение оставалось в неисправном состоянии. #93029 (Azat Khuzhin).
- Исправлен результат JOIN, когда ключ JOIN с правой стороны — разреженный столбец. Это закрывает #92920. Мне удалось воспроизвести ошибку только с
set compatibility='23.3'. Не уверен, нужно ли делать бэкпорт. #93038 (Amos Bird). - Устранена возможная ошибка
Cannot finalize buffer after cancellationвestimateCompressionRatio(). Исправлено: #87380. #93068 (Azat Khuzhin). - Исправлено слияние текстовых индексов, построенных на основе сложных выражений (таких как
concat(col1, col2)). #93073 (Anton Popov). - Исправлено применение проекции, если фильтр содержит подстолбцы. Закрывает #92882. #93141 (Pavel Kruglov).
- Исправлена логическая ошибка, которая в некоторых случаях возникала при добавлении JOIN runtime-фильтров в план запроса. Причиной было некорректное возвращение дублированных константных столбцов с одной из сторон JOIN. #93144 (Alexander Gololobov).
- Специальная функция
__applyFilter, используемая JOIN Runtime Filters, в некоторых допустимых случаях возвращала ILLEGAL_TYPE_OF_ARGUMENT. #93187 (Alexander Gololobov). - Предотвращено схлопывание разных интерполированных столбцов в один и тот же столбец блока, когда такие столбцы фактически являются псевдонимами одного и того же столбца. #93197 (Yakov Olkhovskiy).
- Не добавлять runtime filter при выполнении JOIN с уже заполненной правой таблицей. #93211 (Alexander Gololobov).
- Исправлена очистка постоянных наблюдений в Keeper после завершения неактивного сеанса. Закрывает #92480. #93213 (Konstantin Vedernikov).
- Исправлен ORDER BY для кортежа в Iceberg. Закрывает #92977. #93225 (Konstantin Vedernikov).
- Исправлена ошибка, связанная с настройкой S3Queue
s3queue_migrate_old_metadata_to_buckets. Закрывает #93392, #93196, #81739. #93232 (Kseniia Sumarokova). - Удаляются неиспользуемые столбцы при перестроении проекции во время слияния. Это снижает использование памяти и уменьшает число временных частей. #93233 (Nikolai Kochetov).
- Исправлено удаление неиспользуемых столбцов из подзапросов при наличии скалярного коррелированного подзапроса. До этого исправления столбец мог быть удалён, если использовался только в коррелированном подзапросе, из-за чего запрос завершался ошибкой
NOT_FOUND_COLUMN_IN_BLOCK. #93273 (Dmitry Novik). - Исправлено возможное отсутствие подстолбца в MV при изменении исходной таблицы. Закрывает #93231. #93276 (Pavel Kruglov).
- Исправлено планирование запросов для движка таблицы
Mergeпри использовании анализатора, из-за которого при слиянии локальных и удалённых/Distributed таблиц дляhostName()могла возникать ошибка ILLEGAL_COLUMN. Закрывает #92059. #93286 (Jinlin). - Исправлен случай, при котором
NOT INс неконстантными аргументами в виде массивов возвращал неверное значение + добавлена поддержка неконстантных функций Array. Закрывает #14980. #93314 (Yarik Briukhovetskyi). - Исправлена ошибка
Not found columnв оптимизацииuse_top_k_dynamic_filtering. Исправление #93186. #93316 (Nikolai Kochetov). - Исправлена проблема с пересборкой текстовых индексов, созданных поверх подстолбцов. #93326 (Anton Popov).
- Исправлена обработка пустого массива при передаче его вторым аргументом в функциях
hasAllTokensиhasAnyTokens. #93328 (Anton Popov). - Исправлена логическая ошибка при использовании runtime filters в запросе с totals для таблицы в правой части. #93330 (Alexander Gololobov).
- Сервер больше не падает, если функция
tokensвызывается с неконстантными параметрами токенизатора (2-м, 3-м и 4-м параметрами), например,SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze). - Исправлена уязвимость, связанная с переполнением целого числа при десериализации состояния
groupConcat, которая могла приводить к нарушениям безопасности памяти при использовании специально сформированных состояний агрегатной функции. #93426 (Raufs Dunamalijevs). - Исправлен анализ текстового индекса для столбцов типа Array в случаях, когда индекс не содержит токенов (все массивы пусты или все токены пропускаются токенизатором). #93457 (Anton Popov).
- Позволяет избежать oauth-входа в клиенте ClickHouse, если имя пользователя и пароль указаны в строке подключения. #93459 (Krishna Mannem).
- Исправлена поддержка предоставляемых учетных данных Azure ADLS Gen2 в DataLakeCatalog: разбор ключей
adls.sas-token.*из REST-каталогов Iceberg и исправлен разбор URL ABFSS. #93477 (Karun Anantharaman). - Исправлена поддержка GLOBAL IN в анализаторе (ранее множество заново создавалось на удалённом узле). #93507 (Azat Khuzhin).
- Исправлено извлечение подстолбца при десериализации непосредственно в разреженные столбцы. #93512 (Pavel Kruglov).
- Исправлена ошибка прямого чтения из текстового индекса при дублирующихся поисковых запросах. #93516 (Anton Popov).
- Исправление ошибки NOT_FOUND_COLUMN_IN_BLOCK при включенном runtime filter, если в таблицах, участвующих в JOIN, один и тот же столбец возвращается несколько раз (например, SELECT a, a, a FROM t). #93526 (Alexander Gololobov).
- Исправлена ошибка, из-за которой clickhouse-client при подключении по ssh дважды запрашивал пароль. #93547 (Isak Ellmer).
- Убедитесь, что ZooKeeper корректно завершается при остановке (исправлено возможное зависание при остановке в крайне редких случаях). #93602 (Azat Khuzhin).
- Исправлена LOGICAL_ERROR при восстановлении ReplicatedMergeTree из-за состояния гонки при дедупликации. #93612 (Pablo Marcos).
- Исправлена работа с разреженным столбцом при обновлении TTL во время прямой десериализации в разреженные столбцы в некоторых входных форматах. Это устраняет возможную логическую ошибку
Unexpected type of result TTL column. #93619 (Pavel Kruglov). - Исправлены функции работы с индексом H3, которые иногда аварийно завершались или зависали при вызове с недопустимыми входными данными. #93657 (Michael Kolupaev).
- Использование индекса
ngram_bfдля данных в кодировке не UTF-8 приводило к чтению неинициализированной памяти, значения из которой могли попасть в результирующую структуру индекса. Закрывает #92576. #93663 (Alexey Milovidov). - Проверка соответствия размера распакованного буфера ожидаемому значению. #93690 (Raúl Marín).
- Предотвращена возможность получать список столбцов таблицы через движок таблицы
mergeбез проверки разрешенияSHOW COLUMNS. #93695 (János Benjamin Antal). - Исправлена материализация индексов пропуска данных, созданных на основе подстолбцов. #93708 (Anton Popov).
- Мы сохраняем shared pointers на хранилища в
QueryPipeline::resources::storage_holders, чтобы объектыIStorageне уничтожались, пока существуетPipelineExecutor. #93746 (Miсhael Stetsyuk). - Исправлено подключение существующих БД Replicated, если межсерверный хост менялся после перезапуска. #93779 (Tuan Pham Anh).
- Исправлен assert
!read_until_positionвReadBufferFromS3, возникавший при включенном кэше. #93809 (Kseniia Sumarokova). - Исправлена логическая ошибка в редком случае, когда пустой кортеж используется со столбцом типа
Map. Закрывает #93784. #93814 (Nihal Z. Miaji). - Исправлено повреждение
_part_offset, возникавшее при перестроении проекций во время слияний, а также оптимизирована обработка проекций за счёт устранения лишнего чтения столбца_part_offsetи пропуска ненужных столбцов при вычислении проекций. Это продолжает оптимизации, начатые в #93233. #93827 (Amos Bird). - Убрана обработка ‘Bad version’. #93843 (Anton Ivashkin).
- Исправлена проблема, из-за которой
optimize_inverse_dictionary_lookupне работал с распределённым запросом, когда ключ имеет знаковый целочисленный тип. Закрывает #93259. #93848 (Nihal Z. Miaji). - Исправлена проблема, из-за которой
lag/leadне работали с распределённым запросомremote(). Закрывает #90014. #93858 (Nihal Z. Miaji). - Исправлена ошибка диспетчеризации системного инструмента. #93937 (Pablo Marcos).
- В https://github.com/ClickHouse/ClickHouse/pull/89173 мы добавили дополнительное поле в структуру, которую
TraceSenderотправляет через внутренний канал. Однако размер буфера не был обновлён (здесь), поэтому в буфер записывается больше данных, чем допускаетbuffer_size, что приводит к нескольким сбросам. А посколькуTraceSender::sendвызывается из разных потоков, сбросы из разных потоков могут чередоваться, нарушая инвариант, на который полагается принимающая сторона (TraceCollector). #93966 (Miсhael Stetsyuk). - Исправлено приведение типов к супертипу при выполнении операции JOIN для хранилища
Joinс предложениемUSING. Исправляет #91672. Исправляет #78572. #94000 (Dmitry Novik). - Исправлена ошибка, из-за которой FilterStep добавлялся некорректно при применении runtime filter для JOIN к таблице Merge. #94021 (Alexander Gololobov).
- Запрос
SELECT, содержащий предикат по нескольким столбцам с индексами пропуска данных bloom filter, при наличии условийORиNOTмог возвращать некорректные результаты. Теперь это исправлено. #94026 (Shankar Iyer). - Исправлена операция CLEAR для столбца с зависимыми индексами. #94057 (Raúl Marín).
- Исправлено использование неинициализированного значения в
ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov). - Исправлена некорректная проверка типизированных путей в JSON. Эта проверка была добавлена в https://github.com/ClickHouse/ClickHouse/pull/92842 и может вызывать ошибку при запуске существующих таблиц. #94070 (Pavel Kruglov).
- Исправлен crash при анализе filter в присутствии OUTER JOIN. Исправляет #90979. #94080 (Dmitry Novik).
- Исправлена точность
uniqThetaпри параллельном использовании ключей агрегации UInt8 (max_threads> 1 — по умолчанию). #94095 (Azat Khuzhin). - Исправлен сбой, вызванный исключением, возникшим при вызове
socket.setBlocking(true)внутриSCOPE_EXIT. #94100 (Miсhael Stetsyuk). - Устранена потеря данных, возникавшая, когда
DROP PARTITIONудалял части, созданные более поздними записями журнала в ReplicatedMergeTree. #94123 (Tuan Pham Anh). - Исправлена ошибка в ридере Parquet v3 при обработке массивов, пересекающих границы страниц. Это происходит, например, с файлами, записанными Arrow без включённой статистики страниц или индекса страниц. Затрагивает только столбцы типа Array. Вероятный симптом — примерно один массив на каждый ~1 МБ данных оказывается усечённым. До этого исправления в качестве обходного решения используйте следующую настройку:
input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev). - Исправлено избыточное количество наблюдений в ReplicatedMergeTree при ожидании записи в журнале. #94133 (Azat Khuzhin).
- Функции
arrayShuffle,arrayPartialShuffleиarrayRandomSampleтеперь материализуют константные столбцы, чтобы разные строки получали разные результаты. #94134 (Joanna Hulboj). - Исправлена гонка данных при вычислении табличных функций в materialized views. #94171 (Alexey Milovidov).
- Исправлено разыменование nullptr в движках баз данных
PostgreSQL(при некорректном запросе). Закрывает #92887. #94180 (Alexey Milovidov). - Исправлена утечка памяти в refreshable materialized view при использовании запросов
SELECTс несколькими подзапросами. #94200 (Antonio Andelic). - Исправлено состояние гонки данных между
DataPartStorageOnDiskBase::removeиsystem.parts. Закрывает #49076. #94262 (Alexey Milovidov). - Удалён неверный спецификатор
noexceptу оператора присваивания копированием HashTable, который мог приводить к аварийному завершению (std::terminate) при исключениях из-за нехватки памяти. #94275 (Nikita Taranov). - Ранее при создании проекции с дублирующимися столбцами в GROUP BY (например,
GROUP BY c0, c0) и вставке данных возникала ошибкаstd::length_error, если включенoptimize_row_order. Закрывает #94065. #94277 (Alexey Milovidov). - Исправлена трудноуловимая ошибка в клиенте ZooKeeper при подключении, которая приводила к зависаниям и аварийным завершениям. #94320 (Azat Khuzhin).
- Исправлена ошибка, из-за которой оптимизация преобразования функций в подстолбцы не применялась к подстолбцам. #94323 (Pavel Kruglov).
- Исправлен потенциально некорректный результат во вложенных RIGHT JOIN при включённом
enable_lazy_columns_replication. Из-за ошибки все строки в реплицируемых столбцах некорректно возвращали одно и то же значение вместо своих собственных значений. Закрыто #93891. #94339 (Vladimir Cherkasov). - Исправлен pushdown фильтра для SEMI JOIN с использованием множеств эквивалентности. Pushdown фильтра не выполняется, если типы аргументов изменились. Исправляет #93264. #94340 (Dmitry Novik).
- Исправлено использование DeltaLake CDF с движком базы данных DataLake (интеграция каталогов Delta Lake). Закрывает #94122. #94342 (Kseniia Sumarokova).
- Исправлено некорректное значение метрики
FilesystemCacheSizeLimitпри использовании политики кэшаSLRU. #94363 (Kseniia Sumarokova). - При создании движка базы данных Backup с менее чем двумя аргументами теперь возвращается более понятное сообщение об ошибке (
Wrong number of argumentsвместоstd::out_of_range: InlinedVector::at(size_type) const failed bounds check.). #94374 (Robert Schulze). - Игнорирует невозможный отзыв глобальных привилегий на уровне базы данных для привилегий с grant option. #94386 (pufit).
- Исправлено чтение разреженных смещений в компактных частях. Закрывает #94385. #94399 (Pavel Kruglov).
- Не запрещать ALTER столбцов с неявными индексами, даже если используется режим
throwпараметраalter_column_secondary_index_mode. #94425 (Raúl Marín). - Исправлен сбой в
TCPHandlerпри чтенииProtocol::Client::IgnoredPartUUIDsнесколькими вызовамиreceivePacketsExpectQuery. #94434 (Miсhael Stetsyuk). - Исправлено маскирование чувствительных данных в
system.functions. #94436 (Vitaly Baranov). - Исправлено разыменование nullptr при отключённой опции
send_profile_events. Эта возможность была недавно добавлена в Python-драйвер ClickHouse. Закрывает #92488. #94466 (Alexey Milovidov). - Исправлена несовместимость файлов .mrk текстового индекса при слиянии. #94494 (Peng Jian).
- Когда
read_in_order_use_virtual_rowвключён, код обращался к столбцам индекса, исходя из полного размера первичного ключа, не проверяя, был ли индекс усечён, что приводило к использованию освобождённой / неинициализированной памяти. Закрывает #85596. #94500 (Alexey Milovidov). - Исправлена ошибка, возникавшая из-за несоответствия типов при отправке внешних таблиц в подзапросах с GLOBAL IN, если используются типы Nullable. Закрывает #94097. #94511 (Alexey Milovidov).
- В предыдущих версиях запросы с несколькими условиями индекса для одного и того же выражения могли ошибочно генерировать исключение
Not found column. Закрывает #60660. #94515 (Alexey Milovidov). - Исправлена некорректная обработка столбца JOIN типа Nullable в runtime-фильтрах. #94555 (Alexander Gololobov).
- Создание рабочей нагрузки внутри другой рабочей нагрузки, которая в данный момент используется, больше не приводит к сбою. #94599 (Sergei Trifonov).
- Исправлен сбой при оптимизации ANY LEFT JOIN, когда
isNotNullвычисляется для отсутствующего столбца. #94600 (Molly). - Исправлено вычисление выражения по умолчанию при обращении к другим столбцам с вычисляемыми значениями по умолчанию. #94615 (Alexey Milovidov).
- Исправлены проблемы с разрешениями при операциях BACKUP/RESTORE. #94617 (Pablo Marcos).
- Исправлен сбой из-за некорректного приведения типов, когда тип данных —
Nullable(DateTime64). #94627 (Miсhael Stetsyuk). - Исправлена ошибка, из-за которой некоторые распределённые запросы с
ORDER BYмогли возвращать столбцыALIASс переставленными значениями (то есть столбецaпоказывал данные столбцаb, и наоборот). #94644 (filimonov). - Исправлена запись результатов keeper-bench в файл. #94654 (Antonio Andelic).
- Исправлены некорректные оценки в статистике типа MinMax, когда столбец содержит отрицательные числа с плавающей точкой. #94665 (zoomxi).
- Исправлено чтение файлов Parquet, когда ключом в map является struct. #94670 (Konstantin Vedernikov).
- Исправлен потенциально некорректный результат RIGHT JOIN при использовании сложных условий ON. Закрыт #92913. #94680 (Vladimir Cherkasov).
- Сохранение постоянной гранулярности индекса (
use_const_adaptive_granularity) после вертикальных слияний. #94725 (Azat Khuzhin). - Исправлена ошибка мутаций со скалярными подзапросами и зависимостями таблицы. Если у таблицы были зависимости (индекс или проекции), связанные со столбцом, скалярные подзапросы могли вычисляться и кэшироваться без данных, что приводило к некорректным изменениям. #94731 (Raúl Marín).
- Исправлено переключение AsynchronousMetrics cpu_pressure на резервный вариант при возникновении ошибки. #94827 (Raúl Marín).
- В функции
getURLHostRFCотсутствовали проверки выхода за границы перед разыменованием указателей. При передаче пустой строки вdomainRFCпроисходило чтение неинициализированной памяти, что приводило к ошибкам MSan. #94851 (Alexey Milovidov). - Исправлен режим «только для чтения» у зашифрованных дисков. #94852 (Azat Khuzhin).
- Исправлена логическая ошибка при дробных
LIMIT/OFFSETпри использовании старого анализатора с distributed таблицами. Закрывает #94712. #94999 (Ahmed Gouda). - Исправлено падение в некоторых случаях, когда JOIN Runtime Filters включены по умолчанию. #95000 (Alexander Gololobov).
- Улучшено маскирование паролей в URL-адресе, используемом в движке таблицы
URL()и табличной функцииurl(). #95006 (Vitaly Baranov). - Функция
toStartOfIntervalтеперь работает так же, какtoStartOfX, гдеX— этоDay, Week, Month, Quarter, Year, если включёнenable_extended_results_for_datetime_functions. #95011 (Kirill Kopnev). - Исправлены сравнения с константными строками, которые не учитывали настройки
cast_string_to_date_time_mode,bool_true_representation,bool_false_representationиinput_format_null_as_default. Закрывает #91681. #95040 (Nihal Z. Miaji). - Исправлено состояние гонки в файловом кэше. #95064 (Alexey Milovidov).
- Исправлено редкое проявление состояния гонки в ридере Parquet. #95068 (Alexey Milovidov).
- Исправлено падение в оптимизации top K, когда
LIMITравен нулю. Закрывает #93893. #95072 (Alexey Milovidov). - При преобразовании из DateTime/целых чисел в Time64 с помощью
toTimeизвлекается компонент времени суток, но эта функция не является монотонной. ШаблонToDateTimeMonotonicityошибочно утверждал, что это преобразование монотонно, из-за чего в отладочных сборках возникало Исключение “Invalid binary search result in MergeTreeSetIndex”. #95125 (Alexey Milovidov). - Список записей в файле манифеста пересоздавался только при необходимости (раньше это происходило на каждой итерации). #95162 (Daniil Ivanik).
Улучшения сборки/тестирования/упаковки
- Добавлен набор инструментов для профилирования выделений памяти в парсере ClickHouse SQL с использованием возможностей jemalloc по профилированию кучи. #94072 (Ilya Yatsishin).
- Добавлен инструмент, упрощающий отладку выделений памяти в парсере. Он использует метрику jemalloc
stats.allocatedдо и после разбора запроса в AST-представление, чтобы показать, какая память была выделена. Также поддерживается режим профилирования памяти, который выгружает профиль до и после, чтобы строить отчёты о местах, где происходили выделения. #93523 (Ilya Yatsishin). - Удалены транзитивные включения libc++. #92523 (Raúl Marín).
- Некоторые последовательные тесты переведены в параллельный режим: https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df. #93030 (Nikita Fomichev).
- Приведены в порядок некоторые флаги сборки. #93679 (Raúl Marín).
- c-ares обновлён с v1.34.5 до v1.34.6. Это исправляет
CVE-2025-62408в c-ares, которая не затрагивает ClickHouse. #94129 (Govind R Nair). - Используется
curl8.18.0. #94742 (Konstantin Bogdanov).