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

Список изменений 2026

Релиз 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).
  • Больше нельзя использовать устаревшие ридер Parquet и writer на базе Arrow. Вместо них будет использоваться нативная реализация. #100949 (Alexey Milovidov).
  • SHOW CREATE TABLE t теперь отдает предпочтение временной таблице, если существуют и постоянная, и временная таблица с именем t, а база данных не указана, что соответствует текущему поведению 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).
  • Удалена табличная функция kql. Используйте SET dialect = 'kusto', чтобы выполнять запросы в диалекте KQL. #105101 (Alexey Milovidov).
  • Оконные функции 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. Она задает порог выгрузки на диск для hash JOIN в виде доли доступной памяти; вместе с абсолютным значением max_bytes_before_external_join применяется меньший из двух порогов. #103862 (Alexey Milovidov). Настройка new 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 с выгрузкой на диск, как только объем данных в правой части превышает половину доступной системной памяти (если настроены ограничения памяти). #104285 (Alexey Milovidov).
  • Добавлена табличная функция 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, чтобы сервер мог самостоятельно разбирать встроенные данные INSERT по собственному протоколу без дополнительного запроса структуры таблицы, что повышает производительность при большом числе небольших вставок. #101034 (Alexey Milovidov).
  • Добавлены функции tokenizeQuery и highlightQuery для токенизации SQL-запросов и подсветки синтаксиса. tokenizeQuery возвращает токены лексера со смещениями в байтах и типами токенов; highlightQuery возвращает диапазоны подсветки синтаксиса на основе парсера с категориями подсветки (ключевое слово, идентификатор, функция, число, строка и т. д.). #101054 (Alexey Milovidov).
  • Добавлена настройка url_base для разрешения относительных URL в табличной функции url и движке таблицы URL в соответствии с правилами RFC 3986. #101113 (Alexey Milovidov).
  • Поддерживаются отрицательные значения в выражении 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). Добавлена поддержка многопутевого аргумента JSONPath типа Tuple/Array в JSON_VALUE, JSON_EXISTS и JSON_QUERY, от @KevinyhZou. #101102 (Alexey Milovidov).
  • Добавлен новый параметр kafka_autodetect_client_rack. Если он задан, зона доступности определяется средствами облачной инфраструктуры и передаётся в librdkafka как параметр client.rack, чтобы избежать межзонного обмена данными. #81323 (Ilya Golshtein).
  • Добавлен тип события Read в system.blob_storage_log для отслеживания операций чтения из Объектного хранилища; он управляется новой настройкой enable_blob_storage_log_for_read_operations. #96867 (Alexey Milovidov).
  • Теперь пользователи могут видеть наблюдения ZooKeeper, установленные clickhouse-server, в новой таблице system.zookeeper_watches. #99277 (Den Kalantaevskii).
  • Добавлено событие профиля Shards, которое подсчитывает число сегментов, задействованных в распределённых запросах, в сумме по всем таблицам. #99470 (Alexey Milovidov).
  • WASM пользовательские функции (UDF) можно объявлять как 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-соединениях, что позволяет операторам переопределять автонастройку ядра и ограничивать использование памяти для каждого соединения. #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-го совпадения регулярного выражения в строке. Поддерживаются начальное смещение, режим возврата позиции после совпадения, флаги регулярного выражения и выбор группы захвата. #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 добавлен необязательный parameter варианта кодирования (bech32 / bech32m), а в bech32Decode — режим декодирования raw для кодирования адресов, не относящихся к SegWit (например, Cosmos SDK, Injective, Osmosis). #98986 (Yash ).
  • Теперь вы можете записывать данные в формате AvroConfluent, который ранее поддерживал только ввод. Это позволяет формировать Avro-сообщения в формате Confluent Schema Registry непосредственно из ClickHouse, например при записи в Kafka. Схема автоматически регистрируется в реестре. Используйте новую настройку 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 ко всем подзапросам. Примечание: 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).
  • WASM UDF теперь поддерживают приведение большего числа числовых типов: меньших целочисленных — к более широким целочисленным (например, Int8 к UInt64), а любых целочисленных — к числам с плавающей точкой (например, Int32 к Float32). #100435 (Vasily Chekalkin).
  • Добавлена поддержка функции LIKE в запросе DELETE FROM system.webassembly_modules. #104397 (Vladimir Cherkasov).
  • Добавлена поддержка Geo-типов для Iceberg. #103113 (Konstantin Vedernikov).
  • В сервер ArrowFlight SQL добавлена функциональность подготовленных операторов. #103047 (Yakov Olkhovskiy).
  • Повышена устойчивость парсера KQL (для поддержки языка Kusto): теперь глубина парсера и счётчики бэктрекинга сохраняются между этапами парсера KQL, благодаря чему ограничения парсера согласованно отслеживаются для сложных запросов KQL. #103528 (Yakov Olkhovskiy).

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

  • Чтение одного большого локального файла Parquet через движок file / File теперь распараллелено между несколькими источниками, каждый из которых обрабатывает подмножество групп строк. Это устраняет узкое место Resize 1 → N в конвейере и приближает производительность ClickBench на одном файле к варианту с разбиением на партиции — Q23 ускоряется с ~1.4s до ~0.55s, Q22 — с ~0.9s до ~0.48s, Q27 — с ~1.6s до ~0.54s на 96 vCPU. #104251 (Alexey Milovidov).
  • Кэш метаданных нижнего колонтитула Parquet теперь повторно используется при чтении локальных файлов Parquet через табличную функцию file или движок таблицы File. Ранее кэш использовался только для объектных хранилищ. #104260 (Alexey Milovidov).
  • Проталкивание ORDER BY ... LIMIT n через LEFT/RIGHT JOIN, когда ключ сортировки ссылается только на столбцы со стороны, сохраняемой при 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, чтобы снизить число страничных отказов. #103958 (Nikita Taranov).
  • Ограничено количество одновременно активных потоков в UNION ALL для снижения пикового использования памяти. #100176 (Alexey Milovidov).
  • Слегка оптимизирован кэш страниц в пространстве пользователя. #100300 (Alexey Milovidov). Теперь кэш страниц в пространстве пользователя всегда эффективнее, чем кэш страниц ОС.
  • Холодные чтения из объектного хранилища через кэш страниц в пространстве пользователя (use_page_cache_for_object_storage = 1) теперь выполняются значительно быстрее, поскольку несколько последовательных промахов кэша объединяются в один HTTP-запрос, а не в отдельный запрос для каждого блока 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 или оконных функций) анализатор теперь устанавливает max_rows_to_group_by = n + offset и group_by_overflow_mode = 'any', так что агрегация прекращается, как только будет сформировано n различных ключей, вместо группировки всего входного набора данных. Управляется новой настройкой optimize_trivial_group_by_limit_query (включена по умолчанию). #104473 (Alexey Milovidov).
  • Неявный min-max-индекс на уровне гранул для виртуальных столбцов _part_offset и _block_number, в том числе для проекций. Обеспечивает быстрое отсечение гранул на основе предикатов виртуальных столбцов. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko).
  • Для семейства методов агрегации prealloc_serialized хеши для каждой строки заранее вычисляются во время прохода батч-сериализации и затем используются, чтобы (a) избежать повторного хеширования в emplaceKey/findKey и (b) выполнить программный prefetch бакета следующей строки. Это ускоряет агрегацию по нескольким ключам для строковых/сериализованных данных, маскируя задержки из-за промахов кэша хеш-таблицы. #104475 (Alexey Milovidov).
  • Добавлен тип статистики NullCount для точного подсчета NULL-значений в столбцах Nullable. Это улучшает оптимизацию PREWHERE и повышает эффективность отсечения частей данных. #102356 (zoomxi). Статистику NullCount для столбцов теперь можно использовать для отсечения частей данных. Запросы с предикатами IS NULL или IS NOT NULL по столбцам Nullable, для которых собрана статистика NullCount, могут пропускать целые части данных, если статистика показывает, что подходящих строк в них нет. #104214 (zoomxi).
  • Кэш условий запроса для таблиц 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).
  • Включена буферизация для этапов сортировки на инициаторе в распределённых запросах с сортировкой. #100661 (Nikita Taranov).
  • Улучшена производительность partial_merge JOIN. #100945 (Artem Zuikov).
  • Немного уменьшено избыточное выделение памяти при partial_merge JOIN. #100963 (Artem Zuikov).
  • Оптимизированы выделение и освобождение памяти за счёт кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
  • Снижены накладные расходы на выделение памяти при multipart-загрузках в S3 за счёт предварительного выделения внутренних контейнеров для отслеживания. #101799 (Gagan Dhakrey).
  • Добавлена программная предварительная выборка на этапе probe в hash JOIN для снижения задержки доступа к памяти при работе с большими хеш-таблицами; управляется настройкой enable_software_prefetch_in_join. #102444 (Xiaozhe Yu).
  • Оптимизирована структура MemoryTracker, благодаря чему его производительность выросла примерно на 25%. #103464 (Azat Khuzhin).
  • Предикаты 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 считывали слишком много гранул. Ранее любой фильтр поверх упорядоченного чтения отключал разбиение задач по диапазонам mark, поэтому конвейер не мог прерывать чтение между гранулами и считывал весь кусок данных для каждого потока. #104112 (Vladimir Cherkasov).
  • Исправлено отсутствие повторного использования кэша размеров хеш-таблиц после перестановки сторон JOIN. #104131 (Nikita Taranov).
  • Когда включен fsync_after_insert, fsync для файлов частей теперь выполняется параллельно с использованием пула потоков ввода-вывода, что ускоряет завершение вставки в широких таблицах. Полная загрузка ClickBench hits теперь выполняется примерно на 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. Ранее у этих вспомогательных функций SIMD-путь был только на x86 (SSE2 / SSE4.2), а на ARM выполнение переходило к скалярному циклу. Это ускоряет разбор TSV примерно в 2 раза, а URL-функции и splitByChar — примерно в 1,3 раза на наборе данных ClickBench hits; при очень плотном разборе JSON (менее 16 байт на поле) наблюдается небольшая регрессия, что соответствует существующему компромиссу SSE2. #104228 (Alexey Milovidov).
  • Чтение данных через простой столбец ALIAS (например, some_alias['key'], где some_alias ALIAS m) теперь выполняется по тому же пути чтения по подстолбцам, что и при прямом обращении к исходному столбцу, что вновь обеспечивает существенную экономию I/O для столбцов-псевдонимов Map, Array, Tuple и Nullable. #104245 (Raúl Marín).
  • Снижена конкуренция за блокировки на пути асинхронного чтения из remote-FS за счёт перевода AsyncReadCounters для каждого запроса на работу без блокировок. #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: проверки прав на уровне базы данных вынесены из цикла по таблицам. #100860 (Shaohua Wang).
  • Убрана избыточная проверка прав SHOW TABLES для каждой таблицы в быстром пути SELECT name / SELECT database, name для system.tables. #100881 (Shaohua Wang).
  • В macOS включена JIT-компиляция. #100947 (Alexey Milovidov).
  • Не откладывать применение политики строк после FINAL, если она зависит только от столбцов ключа сортировки и является детерминированной, а также не откладывать соответствующий PREWHERE, к чему в этом случае приводила политика строк. #102884 (Yarik Briukhovetskyi).
  • Добавлена поддержка hasAny и hasAll в качестве предикатов фильтра в текстовых индексах. #103266 (Anton Popov).
  • Исправлена оценка селективности для столбцов типа Nullable: x IS NULL OR x > 50 OR y IS NULL , и подобные предикаты теперь корректно следуют трёхзначной логике SQL и исключают строки с NULL из селективности значения TRUE. #103949 (Han Fei).
  • Направьте долгоживущее состояние кучи MergeTree (метаданные на уровне частей и таблиц) в выделенную arena jemalloc; это отражается в асинхронных метриках jemalloc.mergetree_arena.*. Это уменьшает фрагментацию арены по умолчанию в установившемся состоянии и не даёт долгоживущим объектам на уровне частей удерживать страницы, которые иначе могли бы освободиться по decay. #104136 (Raúl Marín).
  • Улучшена обработка тайм-аутов клиента ZooKeeper при высокой нагрузке, когда в одном сеансе по конвейеру отправляется множество запросов. Теперь клиент ZooKeeper использует тайм-аут, зависящий от прогресса: пока от сервера в пределах session_timeout_ms поступают какие-либо данные, ожидание продлевается. При этом жёсткое ограничение в 3 * session_timeout_ms на каждый запрос по-прежнему ограничивает задержку на стороне вызывающего кода. Закрывает #100466. #104351 (Antonio Andelic).
  • Переместили флаги трассировки для каждого события в отдельный массив и выделяют память под них по мере необходимости, снижая накладные расходы на трассировку 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 теперь показывает объём временных данных на диске (например, при внешней сортировке, агрегации или 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 выполняется ресинхронизация или он находится в деградированном состоянии, поскольку и то и другое может снижать производительность дискового ввода-вывода или указывать на отказ дисков. #100941 (Alexey Milovidov).
  • WASM UDFs теперь отображаются в 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), чтобы планировщик конкурентных потоков max_min_fair, используемый по умолчанию, ограничивал потоки обработки запросов значением 2× числа ядер сразу после установки, даже если поставляемый config.xml не используется. #103446 (Alexey Milovidov).
  • Повышена устойчивость санитайзера в пограничных случаях парсера и строковых функций: добавлена обработка пустого ввода в 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_ERROR Invalid 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, а для подстрок, обработка которых завершилась ошибкой, выполняется переключение на резервные поисковики, что исключает несогласованное состояние. #103864 (Yakov Olkhovskiy).
  • Реализована поддержка sched_getcpu через rseq TLS в glibc-совместимом musl. #104016 (Azat Khuzhin).
  • Реплицируемая refreshable materialized view в режиме APPEND больше не будет обновляться дважды, если во время обновления соединение с ZooKeeper кратковременно прерывалось. #104051 (Michael Kolupaev).
  • Разрешить distributed таблицам без явного списка столбцов проверять ключи сегментирования по автоматически определённой структуре удалённой таблицы. #104111 (Yue).
  • Исправлена работа REST-каталога с путём abfss в Azure. #104120 (Konstantin Vedernikov).
  • Клиент Keeper для S3-снимков теперь учитывает параметры аутентификации role_arn и role_session_name, что позволяет использовать при загрузке снимков аутентификацию STS на основе AssumeRole. #104140 (Alexey Milovidov).
  • Исправлена утечка памяти в запросах с MATERIALIZED CTE. #104153 (Alexey Milovidov).
  • Исправлено исключение в lowerUTF8 / upperUTF8 при обработке больших наборов данных с не-ASCII-символами (например, при построении текстовых индексов), когда суммарный буфер вывода мог превысить 2 GiB; чрезмерно длинные отдельные строки данных теперь отклоняются с понятной ошибкой. #104229 (Shaohua Wang).
  • Повышена устойчивость загрузки статистики столбцов MergeTree к кратковременным сбоям ввода-вывода, чтобы предотвратить необратимое отключение оптимизаций на основе статистики для затронутых частей. #104372 (zoomxi).
  • INSERT INTO ... SELECT FROM input(...) больше не требует права CREATE 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).
  • В clickhouse install и clickhouse git-import shell-аргументы, сформированные из параметров CLI и разобранного ввода, теперь берутся в кавычки, чтобы пути, имена пользователей/групп и хэши коммитов, содержащие пробелы или метасимволы оболочки, обрабатывались корректно. #105232 (Raúl Marín).
  • Движок таблицы Alias теперь больше не является экспериментальным и доступен без настройки allow_experimental_alias_table_engine. #103488 (Alexey Milovidov).
  • Добавлена опция --queries-format для clickhouse-benchmark, позволяющая выбирать между используемым по умолчанию входным форматом с экранированием табуляции, в котором каждый запрос находится на отдельной строке (tsv), и разбором стандартного ввода как скрипта из нескольких запросов, разделённых ; (script). #99972 (Aleksandr Musorin).
  • Поэлементные операторы Tuple tuplePlus, tupleMinus, tupleMultiply, tupleDivide, tupleModulo, tupleIntDiv и tupleIntDivOrZero теперь являются вариативными и принимают два или более Tuple одинакового размера, применяя операцию поэлементно в виде левой свертки. Ранее они принимали ровно два аргумента. #104659 (Aruj Bansal).
  • Добавлен новый встроенный веб-интерфейс по адресу /processors-profile, который визуализирует конвейер любого ранее выполненного запроса SELECT в виде тепловой карты на основе данных из system.query_log и system.processors_profile_log. Каждый процессор окрашивается в зависимости от значения elapsed_us, а при наведении показывает статистику по нему (строки, байты, время ожидания). #104614 (Nikita Mikhaylov).
  • Настройка query_plan_use_logical_join_step (и её алиас query_plan_use_new_logical_join_step) теперь устарела и не оказывает никакого влияния; шаг логического JOIN теперь используется всегда. #104017 (Vladimir Cherkasov).
  • Поле ввода user в play.html и на других встроенных веб-страницах (dashboard.html, jemalloc.html, merges.html, binary.html, webterminal.html) больше не заполняется заранее буквальным текстом default. Теперь в нём отображается подсказка user, а по умолчанию поле остаётся пустым. Если оставить его пустым, страница не отправляет URL-параметр user= (а auth JSON в WebTerminal не содержит поле user), поэтому сервер по обычной схеме переключается на пользователя default — и HTTP credentials, переданные по другим каналам (X-ClickHouse-User, HTTP Basic, конфигурация <handler><user> для конкретного обработчика), больше не переопределяются. #105254 (Alexey Milovidov).
  • Ридер 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).
  • Исправлено срабатывание assert в DatabaseCatalog::updateDependencies при удалении и повторном создании materialized view с тем же именем; также исправлена проблема, из-за которой зависимости представления беззвучно терялись при RENAME TABLE или EXCHANGE TABLES, когда ссылочные зависимости были пустыми. #98779 (Alexey Milovidov).
  • Исправлено аварийное завершение сервера (ошибка assert в 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).
  • Исправлена ошибка "Не удаётся найти столбец" при использовании 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, которая могла приводить к сбоям сервера в сборках с санитайзерами или к некорректным результатам запроса. #100526 (Alexey Milovidov).
  • Исправлена утечка учетных данных в query_log для table functions paimonCluster, paimonS3Cluster, paimonAzureCluster и deltaLakeS3. #100529 (JIaQi Tang).
  • Исправлено зависание DROP TABLE для таблиц с движком Kafka, которое могло происходить бесконечно из-за дедлока в rd_kafka_consumer_close. #100604 (Alexey Milovidov).
  • Жёстко заданный список source_table_engines заменён на поиск во время выполнения через StorageFactory и DatabaseFactory. В DatabaseFactory::EngineFeatures добавлен source_access_type, чтобы для CREATE DATABASE с движками-источниками (PostgreSQL, MySQL, S3 и т. д.) требовались те же привилегии доступа к источникам, что и для 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).
  • Исправлен случай, когда планирование IO для рабочей нагрузки незаметно обходилось при записи в S3/объектное хранилище через путь DiskObjectStorageTransaction (используется дисками s3_with_keeper и явно при use_fake_transaction=false). Ранее при вставке INSERT в таблицы MergeTree на таких дисках игнорировалось throttling, заданное через CREATE RESOURCE / CREATE WORKLOAD, поскольку ссылка на ресурс никогда не добавлялась в WriteSettings для транзакционного пути записи. #100777 (JIaQi Tang).
  • Исправлена коллизия в общем кэше схем между Protobuf и ProtobufList: чтение сообщения сначала как FORMAT Protobuf, а затем как FORMAT ProtobufList могло завершиться ошибкой, поскольку ProtobufList принудительно преобразовывал кэшированную схему в форму своей обёртки. Теперь ProtobufList использует кэшированный тип сообщения, если схема обёртки недоступна. #100849 (Callum Cooper).
  • Исправлено переполнение буфера в куче в мосте 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).
  • Исправлена ошибка, из-за которой при разреженной сериализации терялся знак отрицательного нуля (-0.0) в столбцах BFloat16, Float32 и Float64. #100983 (Takumi Hara).
  • Исправлены две ошибки в парсере геометрии WKT, используемом при чтении файлов GeoParquet и Arrow с WKT-кодированием: геометрии MULTILINESTRING ошибочно разбирались как Polygon (что вызывало исключение для типизированных столбцов и незаметное повреждение данных для смешанных столбцов Geometry), а некорректная строка WKT без ключевого слова типа приводила к неопределённому поведению вместо корректной ошибки. #100997 (Vasily Chekalkin).
  • Исправлена ошибка в запросах grouping/GROUPING SETS к таблицам Distributed с одним сегментом, из-за которой возникала ошибка "Method executeImpl is not supported for 'grouping' function". #101030 (Alexey Milovidov).
  • Исправлена ошибка LOGICAL_ERROR "Идентификатор столбца уже зарегистрирован" в планировщике, которая могла возникать, если одно и то же табличное выражение обрабатывалось несколько раз. #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).
  • Исправлено обращение за пределами допустимых границ в оптимизации отложенной материализации, которое могло вызывать исключение в отладочных сборках. #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, когда не удаётся выделить поток. #101292 (Alexey Milovidov).
  • Исправлен случай, когда часовой пояс не учитывался при присваивании в операторе ALTER. Закрывает #101328. Связано с https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
  • Исправлено падение сервера (LOGICAL_ERROR) для запросов INSERT SELECT с ORDER BY ALL, если в конвейере SELECT формируется несколько потоков. #101443 (Groene AI).
  • Исправлены некорректные результаты запроса, вызванные переупорядочиванием JOIN, из-за которого фильтр INNER JOIN (ссылающийся только на сохраняемую сторону внешнего JOIN) переносился в условие ON внешнего JOIN. #101504 (Vladimir Cherkasov).
  • Не применять lazy materialization для планов с arrayJoin, так как это могло приводить к игнорированию limit. Закрывает #101608. #101644 (Vladimir Cherkasov).
  • Исправлены некорректные результаты JOIN-запроса, возникавшие, когда оптимизация mergeFilterIntoJoinCondition незаметно отбрасывала условие равенства в WHERE из-за несовпадения типов. #101652 (Xiaozhe Yu).
  • Исправлена проблема, из-за которой не работала подсказка теста error для ошибок синтаксиса/разбора: ранее -- { error SYNTAX_ERROR } для некорректного запроса завершалось сообщением "Ожидалась ошибка сервера" вместо сопоставления с клиентской ошибкой разбора. #101675 (Groene AI).
  • Исправлена ошибка, из-за которой INTO OUTFILE ... TRUNCATE фактически не использовал атомарное переименование: запись выполнялась напрямую в исходный файл, а не во временный, поэтому при сбое запроса исходное содержимое уничтожалось. Теперь данные записываются во временный файл и переименовываются только при успешном завершении. #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 ошибочно повторно использовал метаданные первого файла для всех последующих файлов в архиве. #101990 (Ahaan Limaye).
  • Исправлено падение сервера (LOGICAL_ERROR) при выполнении ALTER TABLE UPDATE/DELETE для таблиц Iceberg, если в течение текущего времени работы сервера с этой таблицей ранее не выполнялись ни SELECT, ни INSERT. #102113 (Alexey Milovidov).
  • Исправлено возможное аварийное завершение при выполнении запроса ALTER для таблиц из базы данных в памяти (например, временных таблиц). #102360 (Den Kalantaevskii).
  • Исправлен formatQuery: при форматировании обратносовместимых привилегий READ/WRITE для одного и того же источника он создавал дублирующиеся привилегии, например GRANT FILE ON *.*, FILE ON *.* TO x вместо GRANT FILE ON *.* TO x. #102411 (Groene AI).
  • Исправлена потеря параллелизма при агрегации после запросов с чтением по порядку, когда max_streams_to_max_threads_ratio больше 1. #102467 (Alexey Milovidov).
  • Исправлен сбой (LOGICAL_ERROR: Unknown virtual column) при выборе подстолбцов (например, .null для Nullable, .size0 для Array, элементов Tuple или ключей/значений Map) из таблицы с движком Buffer. #102470 (Groene AI).
  • Исправлено исключение "Не удаётся свернуть действия для проекции" при оптимизации переупорядочивания JOIN, когда LEFT/RIGHT JOIN с join_use_nulls используется вместе с другими JOIN'ами с участием более двух таблиц. #102516 (Alexey Milovidov).
  • Исправлено тихое переполнение в скалярных покомпонентных операциях над numericIndexedVector (например, numericIndexedVectorPointwiseAdd), когда значение скаляра выходит за допустимый диапазон. Теперь такие входные данные приводят к ошибке INCORRECT_DATA вместо возврата повреждённых значений. #102546 (FriendLey).
  • Исправлено непоследовательное форматирование AST для INSERT с SAMPLE и OFFSET на уровне запроса. Закрывает #102523. #102547 (zoomxi).
  • Исправлено исключение LOGICAL_ERROR в groupConcat при десериализации повреждённого состояния агрегатной функции. #102558 (Christoph Wurm).
  • Теперь при input_format_csv_use_default_on_bad_values=0 мы не принимаем лишние символы в конце значений Time64 в CSV. Закрывает #102490. #102596 (Yarik Briukhovetskyi).
  • Исправлено исключение UNKNOWN_ELEMENT_OF_ENUM при вставке значения по умолчанию в JSON-столбец с путями, типизированными как Enum. Закрывает #102359. #102687 (Pavel Kruglov).
  • Исправлено повреждение файла columns_substreams.txt, которое в некоторых случаях возникало при переименовании столбца. Закрывает #102259. #102689 (Pavel Kruglov).
  • Исправлена вставка в тип данных Time при парсинге JSON. Закрывает #102016. #102690 (Pavel Kruglov).
  • Исправлено шестнадцатеричное кодирование образца данных в именах файлов кэшированной схемы. Закрывает #101904. #102703 (Pavel Kruglov).
  • Исправлено нарушение порядка сортировки (сбой в отладочной сборке, тихое повреждение данных в релизной) при слиянии SummingMergeTree, когда ключ ORDER BY представляет собой хеш-выражение над столбцом Float32, содержащим значения signaling NaN. #102791 (Groene AI).
  • Сделать DETACH DATABASE ... SYNC и другие операции, вызывающие waitDetachedTableNotInUse, прерываемыми через KILL QUERY и корректно реагирующими на остановку сервера, чтобы избежать бесконечных зависаний, когда параллельный запрос удерживает ссылку на таблицу. #102804 (Antonio Andelic).
  • Исправлен возможный неверный результат ANY RIGHT JOIN. #102893 (Nikita Taranov).
  • Исправлена ошибка, из-за которой запросы к S3 завершались с ios_base::clear: unspecified iostream_category error вместо повторной попытки: Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне сокета. #102894 (Sema Checherinda).
  • Исправлена ошибка, из-за которой табличная функция input('auto') не работала через HTTP-интерфейс в запросах INSERT SELECT. #102902 (Miсhael Stetsyuk).
  • Отключена тривиальная оптимизация LIMIT при использовании политик доступа на уровне строк/additional_table_filters (чтобы обеспечить параллельный анализ индексов). #102921 (Azat Khuzhin).
  • Скрыт секретный ключ в SQL-функции HMAC. Исправлена ошибка #102927. #102997 (Mikhail f. Shiryaev).
  • Исправлено исключение MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшее в распределенных запросах, где один и тот же вызов quantile используется несколько раз (например, в SELECT, HAVING и ORDER BY) при включенном optimize_syntax_fuse_functions. #103014 (tanner-bruce).
  • Исправлен случай, обнаруженный в CI, когда передавался неготовый Set, если фильтр зависит от левого столбца. Закрывает #102966. #103029 (Yarik Briukhovetskyi).
  • Исправлена работа castOrNull с JSON в некоторых случаях. Закрывает #101818. #103036 (Pavel Kruglov).
  • Исправлено поведение, при котором SELECT DISTINCT молча возвращал неполные результаты, если запросу соответствовала агрегатная проекция, но у некоторых частей таблицы отсутствовали данные проекции (например, если проекцию добавили в таблицу, которая уже содержала данные, и MATERIALIZE PROJECTION не выполнялась). Закрывает #102951. #103052 (Nihal Z. Miaji).
  • Исправлено исключение TOO_FEW_ARGUMENTS_FOR_FUNCTION, возникавшее, когда предикат в WHERE, такой как AND(OR(A, A), A), сворачивался до одного аргумента верхнего уровня при извлечении общих выражений в анализаторе. #103072 (Peng).
  • Исправлена логическая ошибка Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшая при вычислении if/ifNull для Tuple, Map или Array, содержащих элемент QBit. ColumnQBit::structureEquals некорректно сравнивал внутренний Tuple одного столбца 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 элементов кортежа к типу в левой части выражения: это может привести к переполнению. Закрывает #103055. #103169 (Yarik Briukhovetskyi).
  • Исправлено использование неинициализированного значения в функции protocol. #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' в семействе агрегатных функций timeSeries*ToGrid (например, timeSeriesResampleToGridWithStaleness, timeSeriesChangesToGrid, timeSeriesResetsToGrid, timeSeriesRateToGrid), возникавшая при вызове с экстремальными значениями параметров временных меток, которые могли вызывать переполнение знаковой 64-битной арифметики при вычислении количества бакетов. Также общее число бакетов сетки ограничено 16 миллионами, чтобы предотвратить случайное выделение большого объёма памяти из-за вредоносных входных данных. #103223 (Groene AI).
  • Исправлено исключение Logical error: 'Port is already connected', возникавшее при расширении конвейера на ленивом пути FINAL для ReplacingMergeTree. Ошибка затрагивала запросы с query_plan_optimize_lazy_final = 1, когда ReadFromMergeTree::initializePipeline вставлял внутренние преобразования (например, Resize), которые соединяли процессоры подпайплайна между собой, из-за чего 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 читает из одной и той же строки invalidate_query_response, а isModified() const в неё записывает. #103277 (Miсhael Stetsyuk).
  • Исправлено некорректное определение монотонности для типа Date32. Закрыт #101265. #103283 (Yarik Briukhovetskyi).
  • Размер строк в pre-auth TCP Hello packet ограничен 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. #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. В цикле по агрегату / подмассиву индекс 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).
  • Исправлена ошибка heap-use-after-free при умножении состояния AggregateFunction на целое число (например, quantilesExactState(...) * N). В цикле возведения в степень методом двоичного разложения состояние сливалось с самим собой, что приводит к неопределённому поведению, если merge агрегатной функции перераспределяет своё внутреннее хранилище. Закрывает STID 0988-40af. #103536 (Groene AI).
  • Исправлена редкая ошибка LOGICAL_ERROR "Часть X пересекается с предыдущей частью 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).
  • Исправлено поведение, при котором JSONExtract в тип Variant молча усека́л дробную часть JSON-чисел. Ранее 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).
  • Исправлена логическая ошибка / неопределённое поведение в оконном представлении windowID и tumble при вызове со строкой часового пояса в качестве 3-го аргумента. #103641 (Alexey Milovidov).
  • Журналирование клиента S3 теперь обрабатывает HTTP-ответы 400 с непустым заголовком x-amz-bucket-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).
  • Исправлена логическая ошибка Arguments of 'plus' have incorrect data types, возникавшая в FunctionBinaryArithmetic::executeImpl2, когда у таблицы MergeTree в ключе сортировки был Array(LowCardinality(...)), а в условии WHERE использовались plus / minus между этим столбцом и константой Array с другим типом элемента. KeyCondition::getMonotonicityForRange теперь рекурсивно удаляет LowCardinality перед вызовом внутренней числовой диспетчеризации. #103701 (Groene AI).
  • Исправлена гонка при динамическом изменении размера кэша в 26.1+. #103702 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой для столбцов ALIAS, в выражении которых была лямбда-функция с захваченными константами (например, arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m)))), молча игнорировались skip-индексы text и bloom&#95;filter. #103708 (Anton Popov).
  • Исправлена проблема, из-за которой 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).
  • Исправлена передача токенизатора из текстового индекса в функции, которые это поддерживают. #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 с автоматическим сбросом на диск теперь остаётся ниже max_bytes_before_external_join. Ранее предварительное выделение памяти на основе статистики, удвоение хеш-таблицы на месте и неограниченное число бакетов GraceHashJoin в памяти — каждое из этих условий — могли приводить к тому, что запрос превышал заданный предел и вызывал MEMORY_LIMIT_EXCEEDED. #103838 (Alexey Milovidov).
  • Исправлено зависание при завершении работы clickhouse-local, когда настроены системные журналы (например, text_log или filesystem_cache_log). SystemLogs::flushImpl вызывал BaseDaemon::instance().flushTextLogs(), что вне clickhouse-server приводило к std::bad_cast, из-за чего потоки сохранения продолжали работать, пока pthread_cond_destroy не блокировал уничтожение очередей системных журналов. #103874 (Alexey Milovidov).
  • Отклонять запросы с MATERIALIZED CTE, у которых тело при разных обращениях приводит к разным выведенным типам столбцов, с понятной ошибкой TYPE_MISMATCH вместо аварийного завершения сервера с Bad cast LOGICAL_ERROR. Ранее это происходило, когда тело CTE ссылалось на идентификаторы из внешней области видимости (например, на alias из проекции вызывающего подзапроса), которые при каждом обращении подставлялись как разные константы. #103879 (Groene AI).
  • Исправлено использование неинициализированного значения в оптимизаторах плана запроса, преобразующих JOIN (tryConvertAnyOuterJoinToInnerJoin, tryConvertAnyJoinToSemiOrAntiJoin), когда фильтр над ANY OUTER JOIN содержит недетерминированную функцию, такую как rand, now или rowNumberInAllBlocks. Оптимизатор больше не пытается сворачивать такие фильтры в константу и оставляет JOIN без изменений, что также предотвращает некорректные преобразования в INNER/SEMI/ANTI JOIN, которые могли бы незаметно отбрасывать строки. #103880 (Groene AI).
  • Исправлена ошибка use-after-free в StorageKafka2, которая могла приводить к аварийному завершению сервера при замене сеанса Keeper, пока потребитель удерживает эфемерные блокировки топика-партиции. #103890 (Groene AI).
  • Исправлена ошибка LOGICAL_ERROR "Несоответствие типа первичного ключа", возникавшая при JOIN таблицы EmbeddedRocksDB через JOIN ... USING (key) с подзапросом, в котором столбец ключа имеет тип, отличный от типа первичного ключа хранилища (например, Nullable(UInt64), Int64, Decimal). Теперь планировщик отклоняет DirectKeyValueJoin при несовпадении типов и использует HashJoin, который выполняет преобразование типов. #103928 (Groene AI).
  • SET max_threads = DEFAULT (и то же самое для max_final_threads и max_parsing_threads) больше не приводит к потере состояния auto. Ранее после сброса одного из этих параметров system.settings показывал вычисленное число ядер (например, 32) вместо 'auto(32)', и сервер вёл бы себя так, будто значение было явно зафиксировано. #103991 (Groene AI).
  • Исправлена ошибка SIZES_OF_ARRAYS_DONT_MATCH при чтении столбцов AggregateFunction(topK(N), String), у которых сохранённый alpha_size был увеличен в результате цикла deserialize+serialize в версиях до 25.12. #104002 (Raúl Marín).
  • Исправлена уязвимость SQL-инъекции в источниках словарей PostgreSQL, Cassandra и XDBC: строковые ключи, содержащие одинарные кавычки, экранировались как \' (обратная косая черта), которую эти backend'ы трактуют как обычную обратную косую черту, а не как управляющую последовательность, что позволяло внедрять произвольный SQL в запросы поиска по словарю. ExternalQueryBuilder теперь использует для этих backend'ов стандартное для SQL экранирование ''; источники словарей ClickHouse и MySQL по-прежнему используют экранирование обратной косой чертой. #104009 (Shaohua Wang).
  • Исправлено возможное несоответствие типов при агрегации, когда тип столбца был изменён на LowCardinality или с LowCardinality, а min-max-проекция не была перестроена. #104013 (Nikita Taranov).
  • Исправлен бесконечный цикл оптимизаций запроса, вызванный тем, что при слиянии выражений не передавалась информация о запрете удаления неиспользуемых столбцов. #104083 (János Benjamin Antal).
  • Исправлен LOGICAL_ERROR в StreamingStorageRegistry::renameTable, возникавший при пакетном переименовании потоковых таблиц (S3Queue, Kafka, RabbitMQ): отслеживание теперь выполняется по UUID, а не по имени. #104101 (Nikita Taranov).
  • Исправлены некорректные результаты, возникавшие, когда CTE, построенный с UNION ALL, содержал ветку SELECT DISTINCT, а внешний запрос выбирал только часть столбцов CTE. Новый анализатор в RemoveUnusedProjectionColumnsPass ошибочно удалял столбец, на который не было ссылок, из внутренней проекции DISTINCT, из-за чего строки, которые должны были оставаться различными (с одинаковым значением в проецируемом столбце, но разными значениями в удалённом столбце), схлопывались в одну. #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()) (которые округляются вверх до значения, превышающего фактический максимум), обходили проверку границ и приводили к неопределённому поведению при последующем приведении типа. Это затрагивало разбор параметров агрегатных функций (topK, histogram, uniqUpTo, groupArrayInsertAt и т. д.) и настройки целочисленного типа, задаваемые через SET <setting> = <Float64>. Закрывает #103817. #104154 (Groene AI).
  • Исправлено исключение LOGICAL_ERROR "Unexpected return type from comparison. Expected UInt8. Got Const(Nullable(UInt8))", возникавшее при сравнении вложенного Tuple(Tuple(Nullable(...))) (или с ещё более глубокой вложенностью) со строковым литералом. Возвращаемый тип сравнения теперь корректно определяется как Nullable(UInt8), что соответствует поведению во время выполнения. #104171 (Groene AI).
  • Исправлено аварийное завершение сервера (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 пропадал из выходного заголовка, потому что prewhere использовал его как входной, но не возвращал его обратно в выходные данные. В результате последующий шаг addIsDeletedFilter разыменовывал нулевой указатель ActionsDAG::Node. #104177 (Groene AI).
  • При обращении к таблице system.failpoints задействовался failpoint, из-за чего он мог отключаться. #104237 (Pedro Ferreira).
  • Исправлено MemorySanitizer: use-of-uninitialized-value в функциях detectLanguage*, когда во входных данных содержится символ UTF-8, заканчивающийся ровно на границе буфера. #104257 (Raúl Marín).
  • Исправлена логическая ошибка (Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage), из-за которой прерывался разбор аргументов табличных функций и движков озера данных (icebergS3, deltaLakeS3 и т. д.) при вызове с SETTINGS disk = '...' для диска, у которого нижележащее объектное хранилище обёрнуто декоратором, например файловым кэшем. Закрывает #89300. #104258 (Groene AI).
  • Исправлен разбор индексных выражений в круглых скобках для столбцов с именем values, например (values['a']), чтобы они больше не интерпретировались как табличные выражения VALUES из стандарта SQL. #104312 (Desel72).
  • Исправлено аварийное завершение сервера/LOGICAL_ERROR в фоновом потоке вытеснения файлового кэша (SLRUFileCachePriority::collectEvictionInfo), которое могло возникнуть, когда keep_free_space_size_ratio или keep_free_space_elements_ratio были достаточно велики, чтобы инициировать вытеснение, при том что все записи кэша уже были переведены в защищённую очередь SLRU (очередь probationary пуста). #104313 (Groene AI).
  • Исправлены исключения (NOT_FOUND_COLUMN_IN_BLOCK, LOGICAL_ERROR, AMBIGUOUS_COLUMN_NAME) при использовании проекций с представлениями на UNION ALL, оконными функциями или при совпадении имён алиасов и столбцов. Регрессия после #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).
  • Исправлена фатальная логическая ошибка при запуске сервера на macOS (и в аналогичных сборках jemalloc), из-за которой Jemalloc::verifySetup ошибочно сообщал о несоответствии jemalloc_enable_background_threads, поскольку необязательные mallctl background_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 cast LOGICAL_ERROR в caseWithExpression (и в SQL CASE expr WHEN ... THEN ... ELSE ...), возникавший, когда супертип только для THEN и супертип для (THEN + ELSE) попадали в разные хранилища ColumnDecimal — например, для значений THEN (UInt16, Int8) и ELSE Decimal(9, 2). Закрывает #104335. #104378 (Groene AI).
  • Внутренние сбои, регистрируемые через logExceptionBeforeStart (сбросы асинхронных вставок, обновления материализованных представлений, ошибки разбора, возникающие при выполнении внутренних запросов), теперь корректно увеличивают ProfileEvents FailedInternalQuery, FailedInternalSelectQuery и FailedInternalInsertQuery наряду с видимыми пользователю счётчиками FailedQuery, FailedSelectQuery и FailedInsertQuery. Ранее эти внутренние счётчики оставались равны нулю для сбоев, происходивших до начала выполнения запроса, из-за чего значительный класс внутренних сбоев не учитывался. #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 профиля настроек или списка получателей прав в политике строк), и сохраняют результат очистки на диск. Ранее состояние в памяти выглядело корректным, поскольку SHOW CREATE отфильтровывает неизвестные UUID, однако .sql-файлы на диске сохраняли висячие записи ID('<dropped-uuid>'), и после следующего перезапуска сервера эти ссылки восстанавливались, что приводило к ошибкам ACCESS_ENTITY_NOT_FOUND при выполнении распределённых запросов. #104427 (Groene AI).
  • Исправлено аварийное завершение сервера, возникавшее при использовании azureBlobStorage, движка AzureBlobStorage и DeltaLake-on-Azure со строкой подключения, в которой URL BlobEndpoint содержит пустой, нечисловой или выходящий за допустимый диапазон порт (например, BlobEndpoint=http://host:abc/). Теперь вместо аварийного завершения в отладочных сборках и сборках с санитайзерами сервер возвращает понятную ошибку BAD_ARGUMENTS. #104460 (Groene AI).
  • Разрешено использовать идентификатор без кавычек в качестве имени пользователя в табличных функциях remote и remoteSecure, аналогично тому, как аргументы базы данных и таблицы принимают идентификаторы без кавычек. Ранее такой запрос завершался ошибкой аутентификации с вводящим в заблуждение упоминанием пользователя default. #104465 (Alexey Milovidov).
  • Исправлена ошибка Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N), возникавшая, когда тело пользовательской SQL-функции содержит внутренний 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, использующих REST-каталоги Iceberg (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 formatting LOGICAL_ERROR, возникавшая при разборе вызова функции, в котором после запятой следует лямбда, например SELECT substring(x, `x` -> `x`). Раньше parser незаметно объединял предыдущие аргументы с левой частью лямбды, из-за чего получался вызов с одним аргументом, который нельзя было повторно разобрать в тот же 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 в FutureSetFromTuple::buildOrderedSetInplace, из-за которой возникала логическая ошибка. #104673 (Miсhael Stetsyuk).
  • Исправлено несколько функций, которые возвращали разные результаты для одного и того же входного значения в зависимости от того, передавались ли arguments как столбцы или как константы: 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 для лениво присоединённой таблицы Iceberg / IcebergLocal / DeltaLake / Hudi, метаданные которой ещё не были загружены (обычно после перезапуска сервера или после предыдущей неудачной записи метаданных, оставившей на диске повреждённый файл метаданных). Теперь операция либо выполняется штатно, если метаданные успешно загружаются, либо возвращает исходную ошибку загрузки как обычное пользовательское исключение вместо аварийного завершения сервера в debug / 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, возникавшее после https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d. #104837 (Konstantin Bogdanov).
  • Исправлены ещё три функции, которые возвращали разные результаты для одного и того же входного значения в зависимости от того, были ли аргументы переданы как столбцы или как константы: 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, возникавшее при отсечении партиций для таблиц MergeTree, когда выражение партиции содержит цепочку функций, сворачивающуюся в одно константное значение (например, floor(NULL, toRelativeYearNum(...))). #104861 (Groene AI).
  • Исправлена гонка данных, обнаруженная ThreadSanitizer, в конструкторе копирования ContextData: table_function_results копировался из исходного объекта без захвата table_function_results_mutex, поэтому параллельная запись из Context::executeTableFunction могла вызвать гонку с несинхронизированным чтением в конструкторе копирования. #104879 (Groene AI).
  • Исправлены проверки согласованности частей данных для типов с динамической структурой, а также обнаружение повреждённого 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).
  • Обеспечено, чтобы табличная функция 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(), оборачивающего хранилище, способное откладывать агрегацию) с GROUP BY. Ранее внешний планировщик добавлял MergingAggregatedStep на основе сообщаемой внутренним хранилищем стадии обработки, однако LoopSource всегда материализует свой внутренний select с QueryProcessingStage::Complete и выдаёт обычные фрагменты столбцов, из-за чего MergingAggregatedTransform при enable_parallel_replicas = 1 приводил к LOGICAL_ERROR (Chunk info was not set for chunk in MergingAggregatedTransform), а в остальных случаях незаметно отбрасывал внешнюю агрегацию. #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 отсутствовали builtins из compiler-rt для преобразования float в беззнаковое 128-битное целое. Закрывает #105031. #105048 (Raúl Marín).
  • Исправлено: clickhouse-local не выводил сообщения лога при неудачном запросе, если был задан send_logs_level. #105067 (Alexey Milovidov).
  • Исправлены некорректные результаты, возникавшие, когда в одном и том же запросе на одно и то же параметризованное представление ссылались более одного раза с разными значениями аргументов. Ранее анализатор объединял эти вызовы в один, молча отбрасывая все фильтры, кроме первого. #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).
  • Исправлена гонка в 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, когда правая таблица содержит несколько строк для одного ключа, а выходной блок разбивается из-за ограничений по размеру. Закрывает #99431. #102064 (Vladimir Cherkasov).
  • Проверка на переполнение стека в средстве чтения Avro при десериализации вложенных типов. #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: вместо 0/1 возвращалось извлечённое значение (приведённое к UInt8). #103313 (zxuhan7).
  • Формат ввода CustomSeparated защищён от некорректных или злонамеренных данных, в которых отсутствует format_custom_row_after_delimiter. При обнаружении заголовка, выводе схемы и обработке строк с переменным числом столбцов ранее поля накапливались без ограничений, из-за чего до сбоя могло быть выделено много гигабайт памяти. Теперь чтение завершается ошибкой INCORRECT_DATA, как только одна строка содержит более 1 000 000 полей. #103404 (Groene AI).
  • Исправлена операция RESTORE для реплицируемых таблиц MergeTree: при присоединении восстановленных частей теперь используется параметр backup_restore_keeper_max_retries вместо обычного лимита повторных попыток Keeper для вставки. #104610 (Pablo Marcos).
  • Исправлены неверные результаты для WHERE p AND <LowCardinality(Nullable(int)) constant> в таблицах MergeTree. Ранее такие запросы не возвращали ни одной строки, поскольку при отсечении частей из типа LowCardinality(Nullable(...)) выводилось значение NULL по умолчанию и формировалось защитное условие 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).
  • Исправлена race condition при передаче снимка Keeper, из-за которой снимок мог быть удалён или перемещён во время отправки на восстанавливающуюся ведомую реплику. #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 за весь срок жизни потока, а не время ожидания 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).
  • Исправлена незаметная потеря данных в асинхронных вставках Distributed при восстановлении после аварийного завершения работы: если последний файл .bin в сохранённом батче был цел, а один из файлов в середине повреждён, DistributedAsyncInsertBatch::recoverBatch проверял только заголовок последнего файла, после чего sendBatch помечал весь батч — включая неповреждённые файлы — как повреждённый, из-за чего терялись их строки. Теперь заголовок каждого файла проверяется отдельно, поэтому в broken/ перемещается только действительно повреждённый файл, а уцелевшие строки доходят до удалённого сегмента. #105281 (Groene AI).
  • Исправлена регрессия в clickhouse extract-from-config --try: если в конфигурации использовались атрибуты from_env и отсутствовал элемент include_from (или он ссылался на отсутствующий файл), все подстановки from_env беззвучно отбрасывались и возвращали пустые строки. Из-за этого в 26.2.5 ломалось определение порта в entrypoint Docker-контейнера. Закрывает #101704. #105283 (Groene AI).
  • Исправлена ошибка, из-за которой INSERT INTO в таблицу SQLite завершался синтаксической ошибкой SQLite, если вставляемое значение имело тип Enum, JSON или AggregateFunction, а его текстовое представление содержало одинарную кавычку. Теперь настройка 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 и расходились с вариантом minMap/maxMap с аргументом Map, который был исправлен в #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 descriptor теперь собираются на macOS и FreeBSD благодаря использованию переносимых POSIX-функций posix_openpt / grantpt / unlockpt и удалению Linux-only-защит #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).

Новая возможность

  • Добавлена автоматическая выгрузка на диск для хеш- и параллельных хеш-соединений: при достижении лимита памяти они преобразуются в grace hash join. Это поведение управляется параметром 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 при укрупнении блоков в рамках настройки совместимости use_strict_insert_block_limits. #94207 (Kirill Kopnev).
  • Добавлена функция arrayAutocorrelation(arr [, max_lag]), вычисляющая нормализованную автокорреляцию числового массива для каждого значения лага. Поддерживаются массивы целочисленных, вещественных и десятичных типов. #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 (инвертированного), что позволяет пропускать гранулы на основе набора 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).
  • Теперь пользователи могут писать запросы с соединением, используя синтаксис 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).
  • Добавлена поддержка совместимых с PostgreSQL единиц в операторе EXTRACT: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE, MILLENNIUM. Также исправлен EXTRACT(WEEK FROM date), который ранее вызывал ошибку. #100274 (Alexey Milovidov).
  • Добавлена поддержка составных литералов интервалов в формате 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' для упорядоченного и неупорядоченного режимов. #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).
  • В clickhouse-keeper-client добавлена команда watch, а в командах 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, которая случайным образом изменяет статистику, используемую для переупорядочивания соединений; полезно для тестирования. #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).
  • Небольшие улучшения в хеш-соединении и параллельном хеш-соединении. #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).
  • Ускорено хеш-соединение по ключам Int32 и Int64 с небольшим диапазоном благодаря использованию хеш-таблицы с прямой индексацией. #99275 (Hechem Selmi).
  • Ускорено выполнение запросов с несмежными диапазонами для столбцов LowCardinality с одним словарём. #99285 (Ivan Babrou).
  • Ускорены функции var*Stable и stddev*Stable для столбцов Float64 за счёт девиртуализации внутреннего цикла. Внимание: это позволяет компилятору применять оптимизации (FMA/регистры), которые меняют результаты вычислений с плавающей точкой на уровне ULP. #99460 (Riyane El Qoqui).
  • Использовать оптимизированное кодирование base58 из Firedancer для входных данных размером 32/64 байта (автоматически для base58Encode). Разрешить использование оптимизированного декодирования base58, если размер декодированного результата составляет 32/64 байта (явно через base58Decode('...', 32) или аналогичный вызов). #99461 (Joanna Hulboj).
  • Включены оптимизации на основе секций компоновщика (-ffunction-sections, -fdata-sections, --icf=all) для сокращения размера бинарного файла и более эффективного использования кэша инструкций. #99474 (Alexey Milovidov).
  • Исправлено ухудшение производительности коротких запросов с агрегацией на многоядерных машинах. Когда запрос читает мало марок, конвейер после агрегации больше не расширяется до max_threads, что позволяет избежать накладных расходов из-за почти пустых потоков. #99493 (Alexey Milovidov).
  • Повысьте производительность запросов при использовании параллельных реплик за счёт правильного выбора размера задачи чтения. #99801 (Nikita Taranov).
  • Разрешено использовать предварительное чтение при чтении удалённого файла через кэш страниц в пользовательском пространстве. #99919 (Alexey Milovidov).
  • Исключено ненужное вычисление подстолбца .size у String при перечислении подстолбцов. #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, что повышает производительность сортировки на этапе слияния на 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 в строку для больших целочисленных значений за счёт расширения быстрого пути 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).
  • Исключено создание лишних потоков при параллельном слиянии в 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).
  • Оптимизированы операции выделения и освобождения памяти за счёт кэширования настроек сэмплирования вместо обхода всей иерархии memory tracker. #101267 (Azat Khuzhin).
  • Исправлена существенная регрессия производительности INSERT при deduplicate_insert = 'enable' (по умолчанию с версии 26.2): вычисление хеша данных перенесено из этапа укрупнения блоков в sink, а для столбцов используется пакетное хеширование через updateHashWithValueRange, что позволило сократить накладные расходы примерно с ~2.5s до ~0.5s для 5M строк и 22 столбцов. #101494 (Sema Checherinda).
  • Снижены накладные расходы на профилируемые блокировки благодаря использованию try_lock: это позволяет не замерять время захвата при отсутствии конкуренции и отказаться от измерения времени удержания. #101502 (Antonio Andelic).
  • Заменены написанные вручную AVX-512-интринсики в arrayDotProduct на платформонезависимые циклы с автоматической векторизацией; добавлена поддержка AVX2 и ARM NEON. #101571 (Peng).
  • Повышена производительность INSERT VALUES для столбцов Map, Array и Tuple, когда значения передаются в виде экранированных строк (например, '{\'key\':1}'), что позволяет избежать ненужного обращения к парсеру SQL-выражений. #102119 (Joanna Hulboj).
  • Исправлено чрезмерное потребление CPU движком таблицы RabbitMQ. #102711 (Jaap Elst).
  • Оптимизатор порядка соединений теперь выводит транзитивные предикаты эквисоединения на основе существующих условий соединения. Например, при A.x = B.x AND B.x = C.x распознаётся эквивалентность A.x = C.x, что позволяет оптимизатору рассматривать прямые соединения между таблицами, транзитивно связанными друг с другом. Это может улучшить качество плана выполнения для схем типа star и snowflake, где таблицы измерений соединяются через общую таблицу фактов. Эта возможность управляется новой настройкой enable_join_transitive_predicates (по умолчанию отключена). #98479 (Alexander Gololobov).
  • Оптимизирован TRUNCATE DATABASE TABLES LIKE благодаря предварительной параллельной отмене слияний. #98597 (Shaohua Wang).
  • Добавлена поддержка монотонности операции умножения, что позволяет выполнять отсечение по первичному ключу для выражений key * constant. #98983 (Amos Bird).
  • Кэш-словари больше не используют эксклюзивную блокировку в hasKeys; это снижает конкуренцию за блокировки за счёт использования разделяемой блокировки для операций чтения из кэша. #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: теперь выводятся столбцы результата запроса верхнего уровня, показываются метки/символы связей соединения с оценкой числа строк в результате и локальности, а также включаются столбцы результата для каждого шага соединения/источника. Изменения охватывают раздел 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).
  • В XML-конфигурацию keeper-client добавлена поддержка полей password и identity. #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 заменён на динамическое получение через StorageFactory::getAllStorages(). Это добавляет проверки доступа для некоторых движков таблиц, для которых они ранее отсутствовали, и закрывает #71544. #98984 (pufit).
  • Добавлена настройка, управляющая поведением при несоответствии типов для Variant и Dynamic (выбрасывать исключение или возвращать null). #99085 (Bharat Nallan).
  • Улучшена совместимость Iceberg и Spark: исправлена некорректная обработка путей, вызванная смешением путей хранилища и путей метаданных; обеспечено, что таблицы Iceberg записывают расположение таблицы либо в виде URL, либо в виде абсолютного пути; добавлен резервный механизм подсчета размеров файлов в Azure, поскольку некоторые средства чтения ClickHouse не поддерживают подсчет байтов после обхода; обработка version-hint.txt приведена в соответствие со Spark; введены абстракции на уровне типов, которые в будущем затруднят путаницу между типами путей; добавлены тесты для Azure и Local, проверяющие междвижковую совместимость без промежуточной выгрузки и загрузки; исправлено использование позиционных удалений, которое ранее опиралось на эвристику определения путей там, где такой подход неприменим. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik).
  • Исправлено возможное состояние гонки в IPartitionStrategy::cached_result, появившееся в https://github.com/ClickHouse/ClickHouse/pull/92844. #99400 (Arthur Passos).
  • Теперь пользователи могут записывать в формате Arrow типы данных Interval в ClickHouse. #99519 (Peter Nguyen).
  • Добавлена native-поддержка импорта и экспорта типов данных UUID в форматах Arrow и Parquet. Теперь пользователи могут напрямую выполнять запросы к данным UUID и передавать их между ClickHouse и другими инструментами работы с данными без ручного преобразования в строки или обходных решений. Добавлен автоматический логический вывод для UUID верхнего уровня, а также поддержка явной подсказки schema для вложенных UUID. #99521 (Ivan).
  • Добавлена поддержка архивов 7z в объектном хранилище. Закрывает #70968. #99600 (Alexey Milovidov).
  • Добавлены ObjectStorageListedObjects, ObjectStorageGlobFilteredObjects, ObjectStoragePredicateFilteredObjects и ObjectStorageReadObjects в ProfileEvents для интроспекции конвейера перечисления и чтения файлов объектного хранилища (S3, Azure и т. д.). #99778 (Sema Checherinda).
  • Исправлена ошибка UNKNOWN_IDENTIFIER в табличной функции merge при запросе столбцов, присутствующих не во всех базовых распределённых/удалённых таблицах. #99833 (Alexey Milovidov).
  • Теперь время фиксации включено в метрику общего времени выполнения mutation для 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).
  • Предотвращено сканирование всего каталога удалённого озера данных при поиске подсказок к таблицам «Maybe you meant …», когда show_data_lake_catalogs_in_system_tables отключён. #100452 (Alsu Giliazova).
  • Применять distributed_index_analysis_min_indexes_bytes_to_activate после отсечения партиций. #100477 (Azat Khuzhin).
  • Исправлен сбой при pushdown bloom-фильтра Parquet при использовании пустых условий IN/NOT IN. #100543 (zoomxi).
  • Статистика столбцов MinMax теперь хранит минимальные и максимальные значения в виде Field (типизированных), а не Float64. Сериализованный формат включает имя типа столбца вместе со значениями. Версия файла статистики обновлена до V2; файлы, записанные более старыми версиями, требуют повторной материализации (ALTER TABLE … MATERIALIZE STATISTICS ALL). исправлено #53140. #100605 (Han Fei).
  • Обновлён cppkafka: добавлено исправление взаимной блокировки при закрытии Consumer. #100612 (Azat Khuzhin).
  • Информация об объекте, используемая для разбора файлов данных в Iceberg, теперь содержит количество строк в файле и размер файла в байтах, извлечённые из manifest-файла. #100645 (Daniil Ivanik).
  • Добавлен параметр конфигурации use_separate_cache_arena, позволяющий управлять разделением арены памяти кэша. #100664 (Seva Potapov).
  • Добавляет нативную поддержку импорта типов данных Apache Arrow StringView и BinaryView в столбцы ClickHouse String, повышая совместимость с ингестией на основе Arrow. #100762 (Ivan).
  • Некоторые настройки сервера Keeper теперь перечитываются на лету при изменении файла конфигурации во время работы: 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 (UI perfetto, спарклайны в разделе итогов для CPU/Memory/слияний/запросов, system.warnings, поиск по регулярным выражениям в логах). #101092 (Azat Khuzhin). Обновлён chdig до v26.4.3 (улучшения perfetto, исправления для публикации через pastila.nl, различия flamegraph, изменение настроек в реальном времени). #103145 (Azat Khuzhin).
  • Теперь в секции WITH перед запросом SELECT можно ставить завершающую запятую. #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. Закрывает #90743. #101427 (Kseniia Sumarokova).
  • Добавлена асинхронная метрика CGroupMemoryUsedWithoutPageCache, которая показывает использование памяти cgroup без учёта как страничного кэша ядра OS, так и страничного кэша пользовательского пространства ClickHouse, аналогично MemoryResidentWithoutPageCache. Также уточнено описание метрики CGroupMemoryUsed. #101513 (Francesco Ciocchetti).
  • Добавлен синтаксический сахар на уровне parser для стандартного SQL-синтаксиса функции OVERLAY. Функция overlay уже существует; это изменение добавляет поддержку формы с ключевыми словами PLACING, FROM и FOR, используемыми в качестве разделителей. #101681 (Desel72).
  • Добавлен псевдоним столбца INDEX_LENGTH для системной таблицы information_schema.tables, по аналогии с уже существующими в этой таблице псевдонимами в верхнем регистре. #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).
  • Высота ячеек в Web UI (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).
  • Создана и заполнена таблица system.asynchronous_metric_log в режиме keeper-as-server. #102664 (Miсhael Stetsyuk).
  • Добавлена настройка конфигурации 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).
  • В system.stack_trace теперь доступен untracked_memory для каждого потока. #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).
  • Исправлены вызовы N+1 HeadObject для S3-глоб-шаблонов с раскрытием фигурных скобок. #99219 (Konstantin Bogdanov).
  • Проверка изменений настроек в запросах CREATE, если сам движок также поддерживает настройки. #99279 (János Benjamin Antal).
  • Исправлена ошибка, из-за которой ALTER TABLE UPDATE/DELETE завершался ошибкой Missing columns, если в таблице есть столбец MATERIALIZED, выражение которого зависит от столбца EPHEMERAL. #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 при отключенном анализаторе. #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 при Вертикальном слиянии, если во время слияния таблицы со столбцами Dynamic быстро переключать SYSTEM STOP/START MERGES. #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 при чтении числовых значений, выходящих за диапазон целевого типа столбца. Теперь при переполнении запросы завершаются с ошибкой, а не молча возвращают некорректные значения. #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).
  • Исправлена ошибка, из-за которой для запросов async insert в query_log и выводе клиента отображались нулевые значения written_rows, read_rows и result_rows. #99879 (Sema Checherinda).
  • Исправлено исключение "Bad cast from type X to 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 "Переместить оценку количества строк на этапе соединения перед проверкой наличия 1 дочернего узла" из-за подозрения на регрессию производительности. #99957 (Alexander Gololobov).
  • Исправлена ошибка, из-за которой ClickHouse мог пропускать файлы, если в ответе на HEAD-запрос к ним отсутствовал заголовок Content-Length (например, из-за декомпрессионного транскодирования в GCS). #99971 (Yarik Briukhovetskyi).
  • Исправлен сбой assertion (исключение в отладочных сборках, некорректные результаты в релизных сборках) при умножении состояний агрегатной функции NumericIndexedVector на чётную целочисленную константу, вызванный само-XOR над псевдонимами одной и той же битовой карты Roaring в pointwiseAddInplace. #99976 (Desel72).
  • Предотвращено исключение Unexpected return type при использовании устаревшего проталкивания фильтра через цепочку JOIN USING, если типы ключей меняются после преобразований соединений. #99999 (Alexey Milovidov).
  • Исправлено исключение LOGICAL_ERROR "Unexpected node type for table expression ... Actual 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 на таблицу мог видеть ожидающие записи async insert, принадлежащие другим пользователям. Теперь записи фильтруются по текущему пользователю, если только у него нет привилегии 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 завершался сбоем при использовании псевдонима функции-выражения в WITH (например, tuple(...)) в правой части IN. #100042 (Peng).
  • Исправлена ошибка, из-за которой агрегатные функции временных рядов (например, timeSeriesResampleToGridWithStaleness) завершались с ошибкой ILLEGAL_TYPE_OF_ARGUMENT при использовании с initializeAggregation или AggregatingMergeTree в режиме parallel replicas. #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, перекрёстными соединениями и фильтрами времени выполнения; проблема возникала из-за того, что ColumnVariant::filter использовал общие указатели на столбцы Variant вместо их клонирования в ветке оптимизации hasOnlyNulls. Закрывает https://github.com/ClickHouse/ClickHouse/pull/100147. #100234 (Pavel Kruglov).
  • Исправлена ошибка в массиве Variant, из-за которой при вызове функции arrayFirst/arrayLast тип данных мог интерпретироваться неверно. Например, ранее Array(Variant(Date, Bool)) преобразовывался в Bool, хотя фактический внутренний тип Variant был Date. #100255 (timothygk).
  • Несколько небольших изменений в функциях: функции h3 теперь лучше проверяют граничные значения; readWKB проверяет ограничения по размеру (Новая настройка — max_wkb_geometry_elements); функции генератора случайных чисел ограничивают максимальное число итераций при вычислениях. Дополнение к #93543. #100270 (Alexey Milovidov).
  • Исправлена проблема, из-за которой cutURLParameter мог некорректно пропускать параметры, если они являлись подстроками других параметров. #100280 (Nikita Semenov).
  • Исправлено исключение, возникавшее, если параметр пути к файлу метаданных Iceberg содержал нулевой байт. #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).
  • Исправлено исключение "Inconsistent AST formatting", возникавшее в отладочных сборках при использовании GROUP BY CUBE(...) WITH ROLLUP и похожих комбинаций. #100376 (Alexey Milovidov).
  • Исправлено исключение при создании представления с псевдонимами столбцов на основе запросов SELECT * или EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
  • Исправлено бесконечное зависание команды DROP TABLE для таблиц с движком Kafka, когда потребители застревают в ребалансировке после ошибки 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 на уровне таблицы, grant на уровне базы данных и revoke на уровне столбца. #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).
  • Исправлено переполнение буфера в куче в usearch sorted_buffer_gt::insert(), которое могло вызывать сбой или незаметное повреждение памяти при поиске векторного сходства. #100537 (Dustin Healy).
  • Исправлено поведение, при котором EXECUTE AS игнорировал FORMAT и INTO OUTFILE, указанные в запросе. #100538 (pufit).
  • Исправлено непоследовательное форматирование AST для SAMPLE при OFFSET на уровне запроса. Закрывает #100576. #100579 (Pavel Kruglov).
  • Исправлен каталог Polaris для 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).
  • Проверять размерности shape в формате Npy на соответствие размеру файла и ограничениям переполнения, чтобы предотвратить отказ в обслуживании из-за специально созданных файлов .npy с неоправданно большими размерностями. Также отклонять пустые shape и ограничивать объём памяти на строку до 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).
  • Исправлен редкий случай, когда соединение с переупорядочиванием может приводить к неверному результату. #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).
  • Исправлены комбинаторы агрегатных функций If, Distinct, DistinctIf, IfState с типом возвращаемого значения Tuple и одним или несколькими аргументами Nullable, которые не могли читать ранее сериализованные состояния после введения Nullable(Tuple). Закрывает #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-client get, 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).
  • Исправлены неверные результаты при соединении с оптимизацией shard-by-PK, когда используется кэш условий запроса и некоторые части отфильтровываются условиями из кэша. #100926 (Groene AI).
  • Исправлена ошибка, из-за которой divide и intDiv в некоторых случаях возвращали ILLEGAL_DIVISION при использовании в выражениях фильтра во время анализа индекса. #100928 (Nihal Z. Miaji).
  • Исправлены ошибки "Target table doesn't exist" для materialized views с внутренними таблицами при асинхронном запуске, вызванные неправильным порядком инициализации зависимостей. #100946 (Nikolay Degterinsky).
  • Исправлено неопределённое поведение (переполнение знакового целого числа) в parseDateTimeBestEffort при разборе строк даты и времени с более чем 18 цифрами в дробной части секунды. #100948 (Vasily Chekalkin).
  • Исправлен сбой при использовании текстового поискового индекса с условием IN, содержащим подзапрос с кортежем, например WHERE (id, str) IN (SELECT (id, str) FROM ...), а также в случаях, когда число столбцов в подзапросе не соответствует числу элементов кортежа в левой части IN. #100959 (Anton Popov).
  • Исправлен сбой при создании полигонного словаря из таблицы 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, попадающие в конвейеры сортировки слиянием при позднем поступлении входных данных. #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).
  • Исправлена ошибка "Illegal type Decimal64 of start parameter" в агрегатных функциях для временных рядов при использовании 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).
  • Исправлен сбой сервера с ошибкой "Trying to attach external table to a ready set without explicit elements", возникавший при распределённом анализе индексов, когда встречался предикат GLOBAL IN, для которого множество было построено без явных элементов. #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).
  • Исправлена очистка устаревших узлов в состоянии processing в 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).
  • Исправлен сбой сегментации в 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).
  • Исправлена ошибка, из-за которой повторные попытки INSERT в Iceberg зацикливались, если таблица была создана с iceberg_metadata_file_path, а целевая версия метаданных уже существовала. #101548 (Groene AI).
  • Убрано Nullable из столбца результата в arrayIntersect и связанных функциях, чтобы избежать несоответствия при сериализации/десериализации. #101569 (George Larionov).
  • Исправлен сбой сервера (LOGICAL_ERROR) при выполнении SELECT из materialized view, основанного на движке таблицы IcebergLocal. #101577 (Groene AI).
  • Исправлено неверное сообщение об ошибке при вызове intExp10 с аргументом NaN: вместо intExp10 указывалось intExp2. #101582 (Krishna Chaitanya).
  • Исправлена проблема, из-за которой allow_statistics=0 не блокировал ALTER TABLE ADD STATISTICS и ALTER TABLE DROP STATISTICS после рефакторинга в #100288. #101585 (Krishna Chaitanya).
  • Исправлена ошибка CREATE TABLE для KeeperMap с сообщением "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 can't contain null values") при сравнении столбца 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, а также использовалась неверная конфигурация типа, если атрибуты минимального и максимального диапазона имели разные типы. Причиной был copy-paste-баг в 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).
  • Исправлено игнорирование тел форм в POST-запросах в Prometheus Query API. #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, когда искомая строка впервые встречается внутри аргумента шаблона в деманглированном имени символа. #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 с алгоритмом соединения 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. close https://github.com/clickhouse/clickhouse/issues/101723. #102063 (Han Fei).
  • Исправлено падение (SIGSEGV) при запросе к представлению с условием WHERE, когда внутренний запрос возвращает столбцы с типами, отличающимися от метаданных представления (например, Nullable из LEFT JOIN с join_use_nulls). #102085 (Miсhael Stetsyuk).
  • Исправлена ошибка, из-за которой после удаления части записи VectorSimilarityIndexCache никогда не вытеснялись из кэша из-за несовпадения ключей. #102152 (Seva Potapov).
  • Отправка NACK для повреждённых сообщений при использовании хранилища RabbitMQ. #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-файлов с включённым pushdown bloom filter и условиями равенства/неравенства в WHERE. Сбой происходил из-за выхода за пределы памяти при извлечении данных bloom filter в механизме предварительного чтения Parquet, а также мог приводить к недетерминированно некорректным результатам запроса. #102385 (Groene AI).
  • Исправлено аварийное завершение с LOGICAL_ERROR при динамическом изменении размера файлового кэша SLRU, вызванное общей статистикой вытеснения для подочередей и некорректной логикой восстановления для кандидатов, обработка которых завершилась ошибкой. #102396 (Antonio Andelic).
  • Исправлен сбой инициализации на новой реплике таблиц Alias без целевой таблицы в базе данных Replicated. Закрывает #101320. #102397 (Nikolay Degterinsky).
  • Исправлено чтение за пределами допустимых границ в функциях поиска по строке (countSubstrings, position и т. д.) при поиске needle, состоящей целиком из нулевых байтов. #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 для needle, состоящих только из разделителей (например, '()', '!!!'), в столбцах с текстовым индексом: ранее индекс молча пропускал все гранулы вместо того, чтобы выдавать BAD_ARGUMENTS (для hasToken) или возвращать NULL (для hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
  • Исправлены OOM при очень больших multi-запросах в Keeper. Для трассировки OpenTelemetry мы всегда выделяли >1 KiB для спанов OpenTelemetry в объектах 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, где было указано "чтение" вместо "запись". #102639 (Miсhael Stetsyuk).
  • Ошибка в политике строк, из-за которой в некоторых особых случаях возникало исключение 'Not found column in block'. #102648 (Yarik Briukhovetskyi).
  • Исправлено серверное исключение в ClusterDiscovery, возникавшее, когда в статическом кластере (заданном в конфигурации) временно не было ни одного активного узла. #102661 (Kseniia Sumarokova).
  • Исправлен неверный вывод типа данных Date в случае переполнения после корректировки часового пояса. Закрывает #102601. #102674 (Pavel Kruglov).
  • Исправлено бесконечное зависание SYSTEM WAIT VIEW, если во время ожидания удаляется refreshable materialized view. #102681 (Nikolay Degterinsky).
  • Исправлен CASE с динамическим выражением, который возвращал 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-заголовков в динамических/предопределённых handler'ах запросов. Закрывает #101846. #102706 (Konstantin Bogdanov).
  • К свёрнутым профилям кучи jemalloc применена поправка на пуассоновскую выборку, чтобы привести их в соответствие с выводом jeprof. Ранее свёрнутый формат занижал фактические размеры выделений, поскольку не учитывал вероятность выборки. #102759 (Antonio Andelic).
  • Исправлен сбой в функции hasPhrase при аргументе NULL. #102802 (Nikita Taranov).
  • Исправлено аварийное завершение работы сервера (SIGSEGV) при чтении файлов Avro с рекурсивными schema, содержащими циклические символьные ссылки на типы. Теперь такие schema выявляются и отклоняются с понятным сообщением об ошибке, а не приводят к аварийному завершению работы. #102853 (Groene AI).
  • Исправлен сбой сервера (assertion LOGICAL&#95;ERROR), возникавший, когда функция для столбца Variant упиралась в лимит памяти или вызывала другое исключение, не связанное с преобразованием типов, при приведении результата в FunctionVariantAdaptor. Теперь исключение корректно пробрасывается, а не ошибочно классифицируется как внутренняя ошибка. #102855 (Groene AI).
  • Исправлен сбой сервера в отладочных сборках и сборках с санитайзерами при выбросе std::length_error во время schema inference (например, из-за экстремальных значений 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 вместо повторной попытки; это происходило из-за того, что Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне сокетов. #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 и неконтролируемый рост числа потоков в кластерах с высокой пропускной способностью вставки. #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).
  • Исправлена ошибка в статистике ColumnIndex для Parquet: min_value > max_value для столбцов 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).
  • Используйте wasmtime v42.0.1. #98603 (Konstantin Bogdanov).
  • Используйте llvm-project 22.1.1. #98882 (Konstantin Bogdanov).
  • В nightly-конвейере покрытия по отдельным тестам SANITIZE_COVERAGE (пользовательские обратные вызовы санитайзера, гранулярность на уровне символов) заменён на coverage на основе исходного кода LLVM (WITH_COVERAGE, -fprofile-instr-generate -fcoverage-mapping). Теперь сервер при запуске считывает собственную карту покрытия из секций ELF и собирает кортежи (file, line_start, line_end) для каждого теста с помощью новой команды SYSTEM SET COVERAGE TEST 'name'. Выбор тестов в целевых проверках CI использует запросы по диапазонам строк к новой таблице CIDB checks_coverage_lines и ранжирует тесты-кандидаты по числу изменённых строк в diff, которые они покрывают. #99513 (Nikita Fomichev).
  • Исправлена ошибка линковки llvm-libc при сборке с -O0. #100023 (Zheguang Zhao).
  • Исправлены две ошибки при запуске контейнера, если в конфигурации отсутствовали настройки logger.log и logger.errorlog (например, когда все сообщение лога должны выводиться в STDOUT/STDERR). #100239 (Simon).
  • Для сборок под macOS предпочитайте ld64.lld вместо ld от Apple (cctools-port ld64). Это должно существенно сократить время компоновки на Darwin, поскольку ld64 из cctools-port очень медленно работает с -ffunction-sections и -dead_strip. Если ld64.lld недоступен, используется ld. #100275 (Alexey Milovidov).
  • Тесты, проверяющие, что каталоги не регистрируют никаких 시크릿ов (REST + Glue). #100307 (Konstantin Vedernikov).
  • Повторный запуск недавно изменённых тестов с различными случайными настройками. #100385 (Alexey Milovidov).
  • Отслеживание зависимостей файлов #embed в CMake и включение режима зависимостей в ccache для корректной пересборки. #100411 (Alexey Milovidov).
  • Добавлены тесты на корректность для запросов TPC-H. #100580 (Raufs Dunamalijevs).
  • Используется aws-sdk-cpp 1.11.771. #100582 (Konstantin Bogdanov).
  • Разрешено ссылаться из XML-файлов тестов производительности на внешние файлы SQL-запросов и настройки через атрибут file. #100747 (Raufs Dunamalijevs).
  • Исправлена компиляция с -march=x86-64-v4: в LowerUpperImpl.h добавлен отсутствующий include TargetSpecific.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).
  • Добавлены stateless-тесты для легковесных удалений в MergeTree, охватывающие: жизненный цикл флага has_lightweight_delete, корректность COUNT(*) при optimize_trivial_count_query, целостность столбцов MATERIALIZED/DEFAULT, восстановление флага в ReplicatedMergeTree, read_in_order с удалёнными строками, несколько циклов удаления/слияния, скрытие столбца _row_exists, различные предикаты и применение RBAC для ALTER DELETE. #101792 (Nikita Fomichev).
  • Образы Docker Distroless теперь публикуются в вариантах 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).
  • Использован wasmtime v43.0.1. #102603 (Konstantin Bogdanov).
  • Используйте openssl 3.5.6. #102606 (Konstantin Bogdanov).
  • Используйте xz 5.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/и т. д. Это поведение регулируется настройкой таблицы MergeTree propagate_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, что приводило к ошибкам "File name too long" и сбоям при чтении индексов с длинными именами. Имена файлов индекса пропуска данных теперь хешируются, если они превышают max_file_name_length, аналогично файлам столбцов. Изменение обратно совместимо (новые серверы читают старые части), однако при откате версии (или при использовании старых серверов во время rolling upgrade) индексы с длинными именами могут игнорироваться. #97128 (Raúl Marín).
  • Асинхронная вставка теперь включена по умолчанию. Теперь ClickHouse по умолчанию будет группировать все небольшие вставки в пакеты. Этот параметр задаётся через compatibility. Если задать compatibility=<version less than 26.2>, значением по умолчанию останется прежнее — false. Вы можете отключать и включать асинхронные вставки на нескольких уровнях: в конфигурации, в профилях пользователей, для сессии, для запроса или для таблицы MergeTree. #97590 (Sema Checherinda).
  • Изменено значение mysql_datatypes_support_level по умолчанию: вместо пустого теперь используется decimal,datetime64,date2Date32, что по умолчанию обеспечивает корректное соответствие MySQL DATE типу Date32, DECIMAL/NUMERIC — типу Decimal, а DATETIME/TIMESTAMP с точностью — типу DateTime64. Ранее столбцы MySQL с типом DATE сопоставлялись с Date, который не может представлять даты до 1970-01-01, что приводило к повреждению данных. #97716 (Alexey Milovidov).
  • Принимается массив имён частей вместо regexp для mergeTreeAnalyzeIndexes{,UUID}, поскольку regexp работает медленно (экспериментальная функция). #98474 (Azat Khuzhin).
  • Изменено значение stderr_reaction по умолчанию с throw на log_last для исполняемых пользовательских функций. UDF, записывающие предупреждения в stderr, больше не завершаются с ошибкой, если код выхода равен 0. Исключения, связанные с кодом выхода, теперь включают содержимое stderr. #99232 (Xu Jia).

Новая возможность

  • Добавлена сериализация по бакетам для столбцов Map в MergeTree (map_serialization_version = 'with_buckets'). Ключи распределяются по бакетам на основе хеша, поэтому при чтении одного ключа (m['key']) считывается только один бакет, а не весь столбец, что ускоряет поиск по одному ключу в 2–49 раз в зависимости от размера 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).
  • Теперь вы можете использовать функцию естественной сортировки как naturalSortKey(s). #90322 (Nazarii Piontko).
  • Теперь вы можете использовать нативный ввод JSON/Object в функциях JSONExtract. Исправляет #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>, который ссылается на отдельный раздел конфигурации <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).
  • Добавлен токенизатор asciiCJK для полнотекстовых индексов и функции tokens. Он разбивает текст по правилам границ слов в Unicode: ASCII-слова формируются с использованием символов-соединителей (подчёркивание, двоеточие, точка, одинарная кавычка), а не-ASCII-символы Unicode становятся односимвольными токенами. #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 для удаления завершающих нулевых байтов из значений FixedString в текстовых форматах вывода. #97558 (NeedmeFordev).
  • Поддержка выражений соединения таблиц в скобках в предложении 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 (без резервного перехода на 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, параллельные реплики будут использоваться для всех поддерживаемых запросов независимо от статистики. Одно из заметных исключений — distributed 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).
  • Разрешено использовать оптимизацию чтения в порядке сортировки и отсечение по первичному ключу, когда целевой тип CASTNullable, а преобразование монотонно; например, при PRIMARY KEY x ClickHouse может использовать оптимизацию чтения в порядке сортировки для ORDER BY x::Nullable(UInt64) и применять отсечение по первичному ключу для предикатов, таких как WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • Разрешено отсечение по индексу и проталкивание фильтров, когда целочисленный столбец сравнивается с литералом с плавающей точкой; например, предикаты вида WHERE x < 10.5 теперь могут использовать первичный ключ для отсечения, а фильтры, такие как prime < 1e9 или number < 1e5, теперь проталкиваются в табличные функции primes() и numbers() вместо того, чтобы приводить к неограниченному выполнению. Закрывает #85167. #98516 (Nihal Z. Miaji).
  • Добавлен новый SLRU-кэш для метаданных Parquet, повышающий производительность чтения за счёт устранения необходимости повторно загружать файлы только ради чтения метаданных. #98140 (Grant Holly).
  • Добавлена поддержка возможности поменять местами стороны соединений ANTI, SEMI и FULL на основе статистики оптимизатора. #97498 (Hechem Selmi).
  • Оптимизирован пропуск гранул для pointInPolygon при работе с большими полигонами и исправлена ошибка, из-за которой при анализе индекса pointInPolygon во время отсечения по первичному ключу возникало исключение. #91633 (Nihal Z. Miaji).
  • Повышена производительность функции levenshteinDistance. #94543 (Joanna Hulboj).
  • Оптимизировано пакетное преобразование десятичных типов за счёт отказа от вызовов функций для каждого элемента. #95923 (Konstantin Bogdanov).
  • Таблицы Iceberg теперь поддерживают асинхронное предварительное чтение метаданных с помощью настройки таблицы iceberg_metadata_async_prefetch_period_ms, которая периодически предварительно заполняет кэш метаданных. Кроме того, настройка запроса iceberg_metadata_staleness_ms позволяет запросам SELECT использовать кэшированные метаданные, если они не старше указанного порога устаревания, исключая обращения к каталогу Iceberg при обработке запроса. #96191 (Arsen Muk).
  • В упорядоченном режиме S3Queue использует S3 ListObjectsV2 StartAfter, чтобы избежать повторного перечисления всей истории по префиксу и сократить количество вызовов ListObjects. #96370 (Venkata Vineel ).
  • Снижено потребление памяти при дедупликации вставок. В целом для дедупликации требуется исходный блок, но при синхронной вставке его можно не хранить и тем самым заметно сократить расход памяти. #96661 (Sema Checherinda).
  • Используется зависящее от архитектуры значение размера строки кэша вместо жёстко заданного значения 64. #97357 (Nikita Taranov).
  • Незначительно оптимизировано чтение из словаря текстового индекса, благодаря чему улучшена общая производительность анализа текстового индекса. #97519 (Anton Popov).
  • Ускорена распаковка 16-байтных блоков LZ4 на 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 и FULL JOIN, добавив проверку, установлен ли JoinUsedFlags, перед записью. #99274 (Hechem Selmi).
  • Оптимизирован PrefetchingHelper::calcPrefetchLookAhead: вычисления с плавающей запятой заменены на чисто целочисленную арифметику, что улучшает структуру кэша инструкций и снижает затраты по тактам в циклах агрегации. #99327 (Riyane El Qoqui).
  • Снижено потребление памяти Keeper за счёт замены absl::flat_hash_set на CompactChildrenSet для хранения дочерних узлов. Новый контейнер хранит 0–1 дочерний узел встроенно, без выделения памяти в куче, что характерно для большинства узлов Keeper. Это уменьшает размер KeeperMemNode со 144 до 128 байт. #99860 (Antonio Andelic).
  • Агрегатные проекции теперь корректно поддерживаются в представлениях. Исправлена ошибка #32753. #88798 (Amos Bird).
  • Добавлена оптимизация преобразования соединения OUTER в INNER с join_use_nulls. Закрывает #90978. #95968 (Vladimir Cherkasov).
  • Улучшено чтение подстолбцов за счёт корректного вычисления размеров перед чтением. Это снижает потребление памяти и ускоряет чтение подстолбцов. #96251 (Pavel Kruglov).
  • Кэши 마크, несжатых данных и страниц переведены на использование отдельной арены jemalloc, чтобы избежать фрагментации памяти, когда кратковременные выделения памяти, то есть для запросов и обращений, смешиваются с более долгоживущими выделениями для кэшей. #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 ошибочно интерпретировал первые байты как чрезмерно большую длину метаданных. #98893 (Konstantin Bogdanov).

Улучшение

  • Позволяет разбирать файлы GeoParquet, содержащие разные геотипы в одном и том же столбце. #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, позволяя анализировать stack traces всех потоков сервера. #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 локального сервера, а не IP-адреса какого-либо хоста. Исправляет #81215, #70156 и #65268. #93726 (Zhigao Hong).
  • Добавлена возможность для optimize_aggregators_of_group_by_keys корректно оптимизировать агрегатные функции в запросах GROUPING SETS. #93935 (Xiaozhe Yu).
  • Keeper-bench: сообщать об ошибках в метриках и генерировать JSON-файл метрик для режима --input-request-log. #95748 (Mohammad Lareb Zafar).
  • В CREATE USER добавлено новое предложение ROLE. #97074 (Vitaly Baranov).
  • Теперь для кластера, созданного базой данных Replicated, можно задавать настройки internal_replication. #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 для управления параметром jemalloc lg_prof_sample; она также доступна как асинхронная метрика jemalloc.prof.lg_sample. #97945 (Antonio Andelic).
  • Добавлена поддержка весов в реализации ограниченной очереди для параллельного доступа. #97962 (Daniil Ivanik).
  • Добавлен sslmode в список разрешённых ключей для источников словарей PostgreSQL. Ранее sslmode отсутствовал в списке разрешённых ключей dictionary&#95;allowed&#95;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).
  • Включена поддержка алгоритма соединения grace_hash для запросов с итогами. #98144 (János Benjamin Antal).
  • Ранняя отмена фоновых слияний при DROP DATABASE для ordinary shared merge tree. #98161 (Shaohua Wang).
  • Улучшена отмена запросов к MongoDB и MySQL с помощью KILL QUERY и прерывания запроса (Ctrl+C) в clickhouse-client. #98187 (Roman Vasin).
  • Удалён NetlinkMetricsProvider; для сбора метрик taskstats по отдельным потокам теперь используется только procfs. Сбор через Netlink создаёт проблемы в контейнеризированных средах и даёт более высокую хвостовую задержку при конкуренции. #98229 (Amos Bird).
  • Рефакторинг обработки файлов манифеста Iceberg для исправления проблем с кэшированием этих файлов. #98231 (Daniil Ivanik).
  • Теперь мы учитываем случаи, когда сортировочный ключ таблицы может быть выражением, например toDate(time), и можем принимать решение не откладывать такие выражения, если они входят в фильтры. #98237 (Yarik Briukhovetskyi).
  • Добавлена новая метрика MaxAllocatedEphemeralLockSequentialNumber для максимального порядкового номера, выделенного для эфемерных 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 (по умолчанию disabled/allowed), запрещающая использовать для пользователей, определённых через SQL, профили настроек, заданные в конфигурации (кроме профиля default). #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: добавлены конвейерная обработка запросов, период прогрева, статистика по операциям, воспроизводимые начальные значения и улучшенная обработка ошибок. #98906 (Antonio Andelic).
  • Добавлена поддержка клаузы SAMPLE в распределённом анализе индексов. #98931 (Azat Khuzhin).
  • Показывать заголовок графика на дашборде, даже если запрос возвращает пустой результат или приводит к ошибке. #98975 (Yash ).
  • Сообщения об ошибках анализатора больше не содержат дамп всех столбцов таблицы (из-за чего размер исключений мог превышать 150 КБ). Теперь списки столбцов ограничены 10 элементами. #99002 (Yash ).
  • Корректно возвращается статистика по столбцам из подзапросов с соединениями, чтобы родительский запрос мог использовать её для изменения порядка соединений. #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).
  • Снижено потребление памяти и устранена возможная проблема с дублированием вывода в свёрнутом формате system.jemalloc_profile_text. #99121 (Antonio Andelic).
  • Добавлен столбец is_subrequest в system.aggregated_zookeeper_log, чтобы отделять отдельные запросы от подзапросов внутри запросов Multi/MultiRead. Ранее подзапросы агрегировались в те же бакеты, что и отдельные запросы, и поскольку каждая подоперация записывалась в лог с общей длительностью multi-запроса, средняя задержка становилась некорректной. Теперь у подзапросов нулевая задержка. #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 за счёт вызова callback-функций и обработки запросов на чтение вне области мьютекса, а также добавлены профилируемые защитные блокировки для обсервабилити. #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).
  • Исправлена ошибка, из-за которой клиент сообщал NETWORK_ERROR вместо фактической ошибки разбора (с правильным номером строки), когда INSERT с параллельным разбором сталкивался с недопустимыми данными. #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).
  • Исправлена логическая ошибка из-за отсутствующего потока при INSERT SELECT с JSON и бакетами в shared data. Закрывает #97331. #97523 (Pavel Kruglov).
  • Исправлено некорректное сообщение об исключениях MEMORY_LIMIT_EXCEEDED как о CORRUPTED_DATA во время слияний SummingMergeTree и CoalescingMergeTree. #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 со значением до эпохи с функцией toDate(). #97746 (Yarik Briukhovetskyi).
  • После этого патча hasPartitionId будет возвращать false, если в наборе частей данных существует другая партиция с более высоким идентификатором. #97748 (Mikhail Artemenko).
  • Исправлены возможные сбои при чтении пустых гранул в режиме advanced shared data для JSON. Закрывает #97563. #97778 (Pavel Kruglov).
  • Исправлена ошибка LOGICAL_ERROR Cannot schedule a file при INSERT в Distributed, вызванная состоянием гонки между DROP и INSERT. #97822 (Azat Khuzhin).
  • Исправлены сбой и срабатывание assert на сервере ClickHouse при вызове mapContainsKey/mapContainsKeyLike с индексом пропуска данных tokenbf_v1. #97826 (Shankar Iyer).
  • Исправлены исключения LOGICAL_ERROR, вызванные использованием LowCardinality внутри составных типов (Variant, Dynamic, Tuple) в concatWithSeparator, format, подзапросах IN, GLOBAL IN и соединениях с фильтрами времени выполнения. #97831 (Raúl Marín).
  • Исправлено исключение LOGICAL_ERROR Chunk info was not set for chunk in MergingAggregatedTransform, возникавшее при использовании ARRAY JOIN с табличной функцией merge() для нескольких таблиц Distributed в сочетании с GROUP BY. #97838 (Raúl Marín).
  • Исправлен сбой сервера (std::terminate), вызванный необработанным исключением в деструкторе пула HTTP-соединений, когда при высокой конкурентной нагрузке достигается жёсткий лимит группы соединений. Исключение HTTP_CONNECTION_LIMIT_REACHED могло пробрасываться из ~PooledConnection при возврате соединения в пул, что приводило к SIGABRT. #97850 (Antonio Andelic).
  • Исправлен некорректный результат при использовании алгоритма grace_hash с неэквивалентными соединениями, когда левый блок не удаётся обработать полностью из-за ограничений на размер результата соединения. #97866 (János Benjamin Antal).
  • Устранена проблема с производительностью при сканировании метаданных DeltaLake, появившаяся в #96686. #97880 (Kseniia Sumarokova).
  • Исправлена состояние гонки в клиенте ZooKeeper между sendThread и receiveThread. #97887 (Pablo Marcos).
  • Исправлена ошибка, из-за которой нельзя было использовать CTE с distributed 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).
  • Исправлена mutation после легковесного обновления и при работе со вторичными индексами. #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).
  • Исправлен сбой сегментации при оптимизации плана запроса при преобразовании внешнего соединения во внутреннее с arrayJoin в выражении фильтра. #98147 (Alexey Milovidov).
  • Исправлена ошибка, из-за которой формат ProtobufList не работал с движком Kafka, поскольку состояние чтения не сбрасывалось между сообщениями. #98151 (Alexey Milovidov).
  • Исправлена логическая ошибка, связанная с analyzer_compatibility_join_using_top_level_identifier и ARRAY JOIN; закрыт #98164. #98179 (Vladimir Cherkasov).
  • Теперь для ответов watch в aggregated_zookeeper_log задаётся компонент Watch, а не остаётся пустым. #98202 (Antonio Andelic).
  • Если столбцы ключа партиционирования не входят в сортировочный ключ, то при отсечении партиций могли ошибочно пропускаться партиции, содержащие строки, которые должны "побеждать" при дедупликации с FINAL. #98242 (Yarik Briukhovetskyi).
  • Исправлена логическая ошибка "Некорректное приведение типа DB::ColumnConst к 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, возникавшее, когда оптимизация query_plan_join_swap_table меняла местами таблицы в RIGHT JOIN, обёрнутом в CROSS 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).
  • Исправлено незаметное повреждение данных при вставке столбца Date из Parquet/Arrow в столбец Enum — теперь несовместимое преобразование типов корректно отклоняется, а недопустимые значения enum больше не сохраняются. #98364 (Alexey Milovidov).
  • Исправлено исключение при чтении файла Arrow со столбцом Array в таблицу со столбцом Nested. #98365 (Alexey Milovidov).
  • Исправлено зависание mutation MATERIALIZE INDEX и MATERIALIZE PROJECTION, если индекс или проекция удаляются до завершения mutation. #98369 (Alexey Milovidov).
  • Исправлено исключение при чтении из Nullable(Tuple(...)), когда имя элемента Tuple конфликтует с подстолбцом null типа Nullable. #98372 (Alexey Milovidov).
  • Исправлено исключение "Column ... query tree node does not have valid source node", возникавшее при соединении таблицы Merge (оборачивающей таблицу Distributed) с другой таблицей. #98376 (Alexey Milovidov).
  • Исправлено некорректное преобразование Parquet Bool в FixedString в нативном ридере V3, из-за которого выдавались сырые байты вместо строкового представления. #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).
  • Исправлена ошибка "Идентификатор столбца уже зарегистрирован" при использовании 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" в соединениях full_sorting_merge, вызванное взаимной блокировкой в PingPongProcessor, когда оптимизация FilterBySetOnTheFly создавала циклическую зависимость с MergeJoinTransform. #98454 (Alexey Milovidov).
  • Исправлено исключение LOGICAL_ERROR "Projection cannot increase the number of rows in a block", возникавшее при слиянии частей с 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).
  • Исправлена проблема, из-за которой ClickHouse Keeper отключал Java-клиенты ZooKeeper после запроса addWatch. Java-клиент ожидает 4-байтовое тело ErrorResponse в ответе на addWatch, однако Keeper отправлял пустое тело, что приводило к EOFException и разрыву сеанса. Из-за этого переставали работать CuratorCache из Apache Curator и любые Java-приложения, использующие постоянные watches. Исправляет #98079. #98499 (Antonio Andelic).
  • Исправлено поведение метрик Keeper zk_followers и zk_synced_followers: они не уменьшались, когда follower-узел выходил из строя. В four-letter-word команду 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).
  • Исправлено десятичное переполнение при отсечении партиций для DateTime64. #98628 (Yarik Briukhovetskyi).
  • Исправлены две ошибки в JIT-компиляции выражений: ошибка copy-paste в проверке типов nativeCast, из-за которой ветви приведения integer-to-integer и float-to-float были недостижимы, а также неверный nullptr для TargetMachine, переданный в LLVM PassBuilder, из-за чего не регистрировались зависящие от целевой платформы оптимизационные проходы. #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 "Replica decided to read in Default mode, not in WithOrder", возникавшая при использовании read_in_order_through_join с параллельными репликами. #98685 (Alexey Milovidov).
  • Исправлено исключение "Bad cast from type DB::TableFunctionNode to 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).
  • Исправлено аварийное завершение, при котором могло происходить разыменование нулевого указателя в системных таблицах, созданных в период между созданием снимка таблиц при вызове IDatabaseTablesIterator::table() и их изменением в другом потоке во время последующей итерации. #98792 (Grant Holly).
  • Исправлена проблема, из-за которой SYSTEM START REPLICATED VIEW не пробуждал задачу обновления. #98797 (Pablo Marcos).
  • Исправлено исключение "Inconsistent table names" при использовании табличной функции view(), содержащей соединения внутри другого соединения (только со старым анализатором). #98809 (Alexey Milovidov).
  • Исправлена корректировка RLIMIT_SIGPENDING (через pending_signals). #98829 (Azat Khuzhin).
  • Исправлено исключение при комбинировании loop с кластерными табличными функциями. #98860 (Konstantin Bogdanov).
  • LEFT ANTI 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).
  • Запретить присоединять локальные таблицы озера данных вне пользовательских путей, а не только создавать их. #98936 (Daniil Ivanik).
  • Исправлено состояние гонки, из-за которого в запросах с urlCluster и аналогичными кластерными табличными функциями могло возникать исключение "ReadBuffer is canceled". #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&#39;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 теперь передаются клиенту GCS S3 (что устраняет ошибки 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 во вложенных запросах, что приводило к неверным результатам, если вложенный запрос не возвращал ни одной строки из-за смещения или нулевого LIMIT. Закрывает #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 для патч-части после изменения schema (например, ADD COLUMN). Сбой был вызван отсутствием системных столбцов (_part) в метаданных пустой coverage-части, что приводило к неперехваченному исключению внутри NOEXCEPT_SCOPE. #99036 (Peng).
  • Процесс сервера ClickHouse мог аварийно завершиться, если во время чтения с кэшируемого диска возникало исключение о превышении лимита памяти. Теперь это исправлено. #99042 (Shankar Iyer).
  • Исправлен LOGICAL_ERROR при выполнении запроса к таблице, в которой есть и ROW POLICY, и столбец ALIAS, при использовании dictGet. Проблема была вызвана преждевременным обращением к табличному выражению при разрешении столбца ALIAS в новом анализаторе. #99065 (Peng).
  • Исправлена ошибка выхода за границы, возникавшая, когда пользователь пытался выполнить запрос только к виртуальным столбцам таблицы Iceberg с данными в формате Avro. Это крайне редкий сценарий, поэтому он не помечен как критический. Исправляет #88238. #99080 (alesapin).
  • Исправлен сбой сегментации в рекурсивном CTE с remote() + view(). #99081 (Konstantin Bogdanov).
  • Пропускается лишний анализ индекса, когда применяется оптимизация чтения в порядке сортировки. #99084 (Vladimir Cherkasov).
  • Исправлено аварийное завершение, вызванное исключением о превышении лимита памяти при применении патч-части. #99086 (Anton Popov).
  • Исправлено срабатывание отладочной проверки в 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() и т. д.) без необходимых привилегий доступа к источнику. Для функций, которые выводят schema с удалённых серверов, это также позволяло без авторизации инициировать исходящие connection (SSRF). #99122 (pufit).
  • Исправлено аварийное завершение Keeper (segfault в NuRaft) при динамической реконфигурации и передаче лидерства. #99133 (JIaQi Tang).
  • Исправлено аварийное завершение при использовании таблицы Buffer с SAMPLE, если целевая таблица не поддерживает 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: право CREATE_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 worker для запросов распределённого 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).
  • Исправлено обращение к памяти после её освобождения в 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).
  • Исправлены heap-buffer-overflow в CompressionCodecT64 и аварийное завершение процесса в CompressionCodecMultiple при распаковке повреждённых сжатых данных. Обе проблемы были выявлены новыми таргетами libFuzzer. Теперь кодеки выбрасывают исключение вместо аварийного завершения. #99680 (Rahul).
  • Отложить обработку, пока сервер не завершит загрузку всех таблиц. #99700 (Seva Potapov).
  • Исправлен обход RemoteHostFilter источником словаря MySQL при использовании встроенных параметров DDL. #99720 (Shaohua Wang).
  • Исправлена логическая ошибка при переборе таблиц из озера данных в system.tables. #99739 (Konstantin Vedernikov).
  • Исправлен анализ предикатов для функции IN в текстовом индексе с препроцессором. Исправлена коллизия искомых токенов в текстовом индексе, которая могла приводить к некорректным результатам. #99755 (Anton Popov).
  • Исправлен бесконечный цикл при чтении файлов формата Npy с отрицательными значениями размерностей. #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).
  • Исправлен сбой assert в sipHash128Keyed (и аналогичных хеш-функциях с ключом), возникавший, когда аргумент данных имеет тип 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-driver 2.2.2. #98304 (Konstantin Bogdanov).
  • Используется postgres REL_18_3. #98306 (Konstantin Bogdanov).
  • Для сборок UBSan включён аллокатор jemalloc, чтобы избежать накопления RSS из-за неэффективного возврата памяти в glibc malloc. #98444 (Alexey Milovidov).
  • Используется искажение имён символов Rust v0, а внутренние символы библиотеки PRQL удалены, чтобы сократить разрастание имён символов из-за библиотек комбинаторов парсеров. #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 в случае несовместимости подтипа варианта с функцией без каких-либо сообщений возвращался 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_final ROW 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 теперь сериализуется как встроенный тип Arrow date32 в форматах 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).
  • Интеграция с каталогом BigLake от Google. Это закрывает #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 добавлена конечная точка /jemalloc.html для интерактивной визуализации этой статистики. #97077 (Antonio Andelic).
  • Добавлена таблица system.jemalloc_profile_text для чтения и анализа профилей кучи jemalloc. Формат вывода задаётся настройкой jemalloc_profile_text_output_format (raw, symbolized или collapsed; по умолчанию — collapsed). Разрешение встроенных фреймов управляется параметром jemalloc_profile_text_symbolize_with_inline (если параметр включён, встроенные фреймы включаются ценой более медленной символизации; если отключён, они пропускаются для ускорения вывода). Для формата collapsed параметр jemalloc_profile_text_collapsed_use_count определяет, взвешиваются ли стеки по количеству активных выделений памяти (true) или по объёму активных байтов (false, по умолчанию). Это упрощает профилирование памяти и визуализацию flame graph для профилей кучи 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).
  • Добавлены functions 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 для хранения квантованных векторов в bit-packed формате (используется для приближённого поиска ближайших соседей) теперь общедоступен и больше не требует включения экспериментального параметра. #95358 (Raufs Dunamalijevs).
  • Векторный поиск в ClickHouse теперь может использовать реплики в кластере, чтобы распределять нагрузку и поиск по частям векторного индекса. Это позволяет ClickHouse поддерживать большие векторные индексы, которые превышают объём памяти одной виртуальной машины. #95876 (Shankar Iyer).
  • Добавлен серверный AST fuzzer, управляемый параметрами 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 для фильтрации использовалось условие по первичному ключу, а затем skip-индексы для остальных условий, то на этапе обработки PrimaryKeyExpand пересечение теперь будет проверяться только для исходно отобранных диапазонов первичного ключа. #94903 (Shankar Iyer).
  • При использовании параллельных реплик с табличными функциями, такими как s3(...), запросы с одним подзапросом, в который обёрнута табличная функция, теперь автоматически распараллеливаются по репликам, тогда как раньше распараллеливались только прямые обращения к табличным функциям. Закрывает #92264. #96332 (phulv94).
  • Добавлено разбиение файлов данных и системных файлов в кэше на отдельные сегменты. #87834 (MikhailBurdukov).
  • Ускорены некоторые операции хеш-соединения за счёт реализации динамической диспетчеризации для ColumnVector::replicate. #79573 (Raúl Marín).
  • Улучшена производительность параллельного hash join в случаях со сложными предикатами. Ранее строки без соединения обрабатывались в одном потоке, что неоптимально; суть этой оптимизации — распараллелить обработку таких строк между несколькими потоками. Поведение можно переключать с помощью настройки parallel_non_joined_rows_processing. Включено по умолчанию. #92068 (Yarik Briukhovetskyi).
  • Немного оптимизирован разбор типа JSON. #93614 (Pavel Kruglov).
  • Уменьшено потребление памяти AST. Оптимизация оправданна, поскольку эти поля не используются, если подсветка отключена и разбор VALUES не выполняется. #93974 (Ilya Yatsishin).
  • Оптимизировано потребление памяти именованными объектами Tuple в AST. Имена столбцов теперь хранятся как строки в объекте tuple, а не в универсальных узлах литералов AST. #94704 (Ilya Yatsishin).
  • Девиртуализация улучшена благодаря дополнительным опциям компоновщика. #94737 (Nikita Taranov).
  • Улучшена производительность клонирования реплики для таблиц ReplicatedMergeTree с большим количеством частей за счёт пакетирования запросов ZooKeeper. #94847 (c-end).
  • Если на этапе чтения уже применялись фильтры PREWHERE, добавить новый фильтр было нельзя. Это изменение откладывает оптимизацию PREWHERE до завершения оптимизации JOIN runtime filter, чтобы runtime filters также можно было протолкнуть в PREWHERE. #95838 (Alexander Gololobov).
  • Ускорено сжатие кодеком T64 за счёт использования динамической диспетчеризации на x86. #95881 (Raúl Marín).
  • Ускорена работа uniq на числовых типах за счёт пакетирования вставок, где это возможно (not null, not -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 OUTER JOIN. #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).
  • Оптимизация lazy materialization теперь применяется ко всем ветвям запроса 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, чтобы задействовать отсечение по первичному ключу и skip-индексам для диапазонных предикатов, когда столбцы ключа обёрнуты в эти функции. Закрывает #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 для таблиц Iceberg. #95476 (Konstantin Vedernikov).
  • Уменьшено потребление памяти некоторыми классами AST. #95514 (Raúl Marín).
  • Ограничено количество потоков pipeline, создаваемых при включенном split_intersecting_parts_ranges_into_layers. Это помогает избежать чрезмерного потребления памяти. #96478 (Nikita Taranov).
  • Реализована оптимизация эквивалентных множеств для нескольких JOIN. Запросы с несколькими последовательными операциями INNER JOIN теперь выигрывают от улучшенной оптимизации проталкивания фильтров. Когда таблицы соединяются по эквивалентным столбцам (например, 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 database не обновлять кэш кластера для каждого фиктивного запроса. #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).
  • Отключать dirty page decay в jemalloc, если ClickHouse испытывает длительное давление по памяти в течение memory_worker_decay_adjustment_period_ms миллисекунд. Включать dirty page decay в jemalloc обратно, если ClickHouse работает в штатных условиях в течение того же времени. #95145 (Antonio Andelic).
  • Поддержка вспомогательного ZooKeeper для S3Queue с использованием настройки keeper_path из s3Queue. #95203 (Diego Nieto).
  • Параметр max_parts_to_merge_at_once теперь учитывается при слиянии частей с удалением по TTL. #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_improvements. #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 теперь включён по умолчанию, если значение настройки compatibility26.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).
  • Улучшено проталкивание фильтров для numbers и primes. ClickHouse теперь может определять консервативные границы значений по условиям WHERE, когда точные границы определить невозможно, и соответствующим образом ограничивать генерацию последовательности (например, для WHERE number % 5 < 2 AND number > 100 AND number < 300 ClickHouse будет генерировать только числа от 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- и real-time-профилировщиков при использовании таймаутов сокета. #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. Параметры запроса в методах аутентификации (например, пароль) не подставлялись, что вызывало ошибки UNKNOWN_QUERY_PARAMETER на удалённых узлах. #92777 (xiaohuanlin).
  • Исправлены несоответствия при анализе текстового индекса для функций has, mapContainsKey и mapContainsValue. Ранее запросы с этими функциями могли возвращать разные результаты в зависимости от того, вычислялось ли выражение с использованием текстового индекса или без него. #93578 (Anton Popov).
  • Исправлено падение при прикреплении таблицы к базе данных MaterializedPostgreSQL, если dropReplicationSlot выбрасывает исключение во время раскрутки стека. #96871 (Alexey Milovidov).
  • Резервное копирование могло привести к сбою сервера, если одновременно выполнялось много резервных копий, конфликтующих из-за одних и тех же файлов. #93659 (Alexey Milovidov).
  • Исправляет запросы с parallel replicas и JOIN с таблицей не-MT. Закрывает #92056. #93902 (Igor Nikonov).
  • Исправлена проблема, из-за которой столбцы Iceberg с точками в именах возвращали значения NULL. #94335 (Mikhail Koviazin).
  • Исправлена обработка строк UTF-8 в stringJaccardIndexUTF8 и улучшена производительность. #94613 (Joanna Hulboj).
  • Исправлены возможные переполнения в WITH FILL STALENESS (которые приводят к неопределённому поведению (UB) и/или бесконечным циклам). Исправлен возможный бесконечный цикл из-за больших скачков. Добавлена поддержка старого анализатора (в основном для стресс-тестов). #94663 (Azat Khuzhin).
  • Исправлено возможное зависание распределённых запросов, когда имена хостов разрешаются в несколько IP-адресов и удалённая реплика перестаёт отвечать. #94726 (c-end).
  • Исправлен некорректный результат при соединении нескольких табличных выражений, когда крайним левым табличным выражением является табличная функция -Cluster. Устраняет проблему #89996. #94748 (Konstantin Bogdanov).
  • Исправлены некорректное отсечение по первичному ключу и skip-индексу для предикатов с использованием toWeek, toYearWeek, toStartOfWeek, toLastDayOfWeek и toDayOfWeek, а также исключения в некоторых из этих функций для корректных запросов с LowCardinality(String). #94816 (Nihal Z. Miaji).
  • Убрана ненужная возможность пропускать проверку прав доступа в запросах ATTACH для представления с SQL Security. Это предотвращает потенциальное повышение привилегий, когда пользователь выполняет ATTACH представления с 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).
  • Исправлен вывод типов для квалифицированных столбцов из таблиц-источников при использовании нескольких соединений с предложением USING. Ранее последующие соединения некорректно приводили типы исходных столбцов к общему супертипу, даже если столбец не участвовал в данном соединении (например, в SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a) столбец t2.a используется только в первом соединении, поэтому его тип должен быть супертипом t1.a и t2.a, без учета t3.a). Это могло приводить к логическим ошибкам или сбоям, когда функции ожидали одни типы столбцов, а в плане выполнения фактически оказывались другие. #95157 (Vladimir Cherkasov).
  • Выполнять преобразование столбца только один раз при получении содержимого списка манифеста .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).
  • Исправлена возможная логическая ошибка при чтении подстолбца «размер» из динамических подстолбцов типов Dynamic/JSON. #95573 (Pavel Kruglov).
  • Исправлена регрессия в (экспериментальной) репликации с нулевым копированием, появившаяся после #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, возникавшая при одновременном ожидании distributed 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 filters. #95775 (Hechem Selmi).
  • Исправлена возможная логическая ошибка в запросе с сопоставителем (*, table.*) и analyzer_compatibility_join_using_top_level_identifier, когда столбец USING имеет разные типы в таблицах и в списке SELECT. Закрывает #90477. #95808 (Vladimir Cherkasov).
  • Исправлены ошибки безопасности памяти в операциях параллельного пула потоков (резервное копирование, агрегация, распределённые запросы), которые могли приводить к исключениям при возникновении ошибки во время планирования задач. #95818 (Raúl Marín).
  • Исправлен сбой при выполнении DROP WORKLOAD одновременно с запросами, использующими удаляемый объект WORKLOAD. #95856 (Alexey Milovidov).
  • Ускорено выполнение запросов к системным таблицам при использовании пользователя с ограниченными правами доступа во многих базах данных. Закрывает #89371. #95874 (pufit).
  • Исправлено выполнение tupleElement для JSON со вложенными путями; ранее это могло приводить к неверному результату запроса. #95907 (Pavel Kruglov).
  • Исправлена ошибка NOT_SUPPORTED, которая могла возникнуть при использовании алгоритма join direct с пустой таблицей MergeTree. #95935 (Vladimir Cherkasov).
  • Исправлено поведение, из-за которого клиент не предлагал и не автодополнял имена алиасов для настроек; закрывает #92190. #95945 (phulv94).
  • Исправлено поле event_date в system.asynchronous_metric_log. #95947 (Raúl Marín).
  • Исправлена обработка пропуска путей в типе данных JSON. Ранее при использовании JSON(SKIP path) пропускались все ключи JSON с префиксом path, даже такие, как "pathpath", что могло приводить к потере данных для этих путей при insert. Теперь это исправлено: пропускается только ключ "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).
  • Исправлено несоответствие типов в функции if между UInt64 и Int32 в редком случае распределённых запросов и 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).
  • Исправлена ошибка assertion в WindowTransform при большом смещении PRECEDING. Закрывает #75852. #96026 (Alexey Milovidov).
  • Исправлена ошибка, из-за которой было возможно повреждение данных, когда конкурентные асинхронные вставки используют одинаковые имена параметров, но содержат разные значения. #96035 (Seva Potapov).
  • Исправлен период работы глобальных профилировщиков (задаётся параметрами global_profiler_real_time_period_ns и global_profiler_cpu_time_period_ns). Вместо заданного значения использовалось усечённое, из-за чего профилировщик просыпался чаще, чем предполагалось. #96048 (Antonio Andelic).
  • Ранее, если reference data file в файле манифеста Iceberg для position delete присутствовал в entry, но имел значение 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).
  • Исправлена ошибка, из-за которой запросы с внешними JOIN (LEFT, RIGHT или FULL) в сочетании с несколькими INNER JOIN могли возвращать некорректные результаты из-за недопустимого изменения порядка JOIN. Когда условие ON внешнего JOIN ссылалось на столбцы из нескольких ранее присоединённых таблиц, оптимизатор не учитывал все зависимости между таблицами и мог неправильно изменить порядок JOIN, что приводило к пропуску строк. Закрывает #95972. #96193 (Vladimir Cherkasov).
  • Если для таблицы не определена статистика, ClickHouse не следует пытаться её загружать. Это позволяет избежать лишних накладных расходов (100+ мс) на проверку наличия файлов статистики. (issue #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, когда у таблицы первичный ключ допускает NULL, а запрос использует функцию coalesce, у которой первый аргумент является константой. #96340 (Alexey Milovidov).
  • Взаимодействие GROUPING SETS, group_by_use_nulls и типа данных Tuple, содержащего LowCardinality, могло приводить к неожиданной структуре block в pipeline запроса, что вызывало логическую ошибку. Это проявилось после введения Nullable Tuple. #96358 (Alexey Milovidov).
  • Можно было создать таблицу с пустым выражением () в качестве индекса, что приводило к некорректному доступу к памяти. #96363 (Alexey Milovidov).
  • Исправлен сбой в старом анализаторе при использовании JOIN и дублирующихся алиасов. #96405 (Ilya Golshtein).
  • Исправлена ошибка Nested columns sizes are inconsistent with local_discriminators, вызванная некорректной оптимизацией фильтрации in-place для столбцов Variant. #96410 (Alexey Milovidov).
  • Исправлена ошибка, из-за которой в CREATE TABLE ... CLONE AS ... игнорировался полный квалификатор исходной таблицы. #96415 (Hasyimi Bahrudin).
  • Исправлена отмена table function 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 с ограничениями. #96669 (Nikita Taranov).
  • Проверка версии witness в 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).
  • Исправлено исключение logical error в CoalescingMergeTree, возникавшее, когда выражение skip-индекса возвращало константный столбец (например, 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).
  • Исправлено аварийное завершение из-за ошибки проверки утверждения в 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).
  • Исправлено состояние гонки при операциях multipart-копирования в 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 (например, из-за лимита памяти), что приводило к несовпадению дайджеста метаданных в 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 висячего указателя на хранилище в ленивом batch резервного копирования. #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 подменяет преобразованный столбец массива столбцом несовместимого типа. Закрывает #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).
  • Исправлен assertion failure (исключение в debug/sanitizer-сборках) в Set и MergeTreeIndexSet при обработке столбцов с вложенными разреженными подстолбцами (например, столбцов Tuple из частей MergeTree с разными профилями разреженной сериализации). #97493 (Alexey Milovidov).
  • Исправлена возможная ошибка use-after-free в 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 catalog не работала для базового RestCatalog (она работала только для производных каталогов, таких как OneLakeCatalog). Из-за этого после появления BigLake catalog перестал работать REST catalog по умолчанию. #97561 (Konstantin Vedernikov).
  • Функции геометрии (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).
  • Исправлена ошибка, из-за которой IN (col) с единственной ссылкой на столбец завершался ошибкой UNSUPPORTED_METHOD. #97646 (Alexey Milovidov).
  • Устранено исключение logical error, возникавшее во время GROUP BY ... WITH ROLLUP/CUBE, когда ключи включают LowCardinality(Nullable(...)) внутри Nullable(Tuple(...)). #97647 (Alexey Milovidov).
  • Исправлена неконсистентность форматирования AST для NOT (1, 1, 1), которая могла приводить к LOGICAL_ERROR в debug-сборках. #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).
  • Добавлен stateless-функциональный тест для поддержки протокола SSH. #96996 (Alexey Milovidov).
  • В инфраструктуру stateless-функциональных тестов добавлен Kafka 3.9.0, что позволяет напрямую тестировать табличные движки Kafka и Kafka2, используя ClickHouse Keeper в качестве ZooKeeper. Шесть новых stateless-тестов охватывают базовые сценарии produce/consume, виртуальные столбцы, INSERT, несколько форматов, обработку повреждённых сообщений и хранение смещений в Keeper. #96997 (Alexey Milovidov).
  • Добавлен CI-процесс для сборки тулчейна clang, оптимизированного с помощью PGO+BOLT. #96991 (Alexey Milovidov).
  • Используйте в CI сборку LLVM/Clang, оптимизированную с помощью PGO, что должно ускорить сборку на 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).
  • Используйте libexpat 2.7.3. #95218 (Konstantin Bogdanov).
  • Использован OpenSSL 3.5.5. #95345 (Konstantin Bogdanov).
  • Использовать simdjson версии 4.2.4. #97129 (Konstantin Bogdanov).
  • Используется libarchive версии 3.8.5. #97131 (Konstantin Bogdanov).
  • Используется fast_float v8.2.3. #97133 (Konstantin Bogdanov).
  • Обновлены abseil-cpp до 20260107.1 и s2geometry до v0.13.1. #97134 (Konstantin Bogdanov).
  • Обновлён libxml2 до версии 2.15.1. #95574 (Robert Schulze).
  • Обновлены 7 Docker-образов интеграционных тестов Tier-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).
  • Реализован job 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, это приводило к 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, что требовало некорректной привилегии для такого типа проверки прав. #94556 (pufit).
  • Формат вывода Hash сделан независимым от размеров блоков. #94503 (Alexey Milovidov). Обратите внимание, что это изменит значения выходных хэшей по сравнению с предыдущими версиями.

Новая возможность

  • HTTP API и встроенный веб-интерфейс для ClickHouse Keeper. #78181 (pufit и speeedmaster).
  • Дедупликация асинхронных вставок теперь работает с зависимыми materialized view. Когда происходит коллизия по block_id, исходный блок фильтруется для удаления строк, связанных с этим block_id, а оставшиеся строки преобразуются всеми соответствующими запросами SELECT из materialized view, в результате исходный блок перестраивается без конфликтующих строк. #89140 (Sema Checherinda). Теперь допускается использовать дедупликацию с асинхронными вставками, когда задействованы materialized view. #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 для реплицируемой базы данных, если включена настройка 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 fair для управления параллелизмом. Обеспечивает более высокую справедливость при сильной переподписке (oversubscription), когда множество запросов конкурируют за ограниченное число CPU-слотов. Кратковременные запросы не страдают из‑за долгих запросов, которые со временем накопили больше слотов. Включается с помощью серверной настройки concurrent_threads_scheduler со значением max_min_fair. #94732 (Sergei Trifonov).
  • Добавлена возможность клиенту ClickHouse переопределять TLS SNI при подключении к серверу. #89761 (Matt Klein).
  • Добавлена поддержка временных таблиц в вызовах функции joinGet. #92973 (Eduard Karacharov).
  • Добавлена поддержка векторов удаления в движке таблиц DeltaLake. #93852 (Kseniia Sumarokova).
  • Добавлена поддержка векторов удаления в deltaLakeCluster. #94365 (Kseniia Sumarokova).
  • Поддержка Google Cloud Storage для озёр данных. #93866 (Konstantin Vedernikov).

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

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

  • Параметр 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, когда фильтр использует данные только с одной стороны. Добавлена поддержка соединений типов ANY, SEMI, ANTI. #92584 (Dmitry Novik).
  • Разрешить использование эквивалентных множеств для проталкивания фильтров в SEMI JOIN. Закрывает #85239. #92837 (Dmitry Novik).
  • Пропускаем чтение левой стороны хэш-соединения, когда правая сторона пуста. Ранее левая сторона читалась до первого непустого блока, что могло приводить к значительным затратам при сильной фильтрации или агрегации. #94062 (Alexander Gololobov).
  • Использование метода «fastrange» (Daniel Lemire) для партиционирования данных внутри конвейера запроса. Это может улучшить параллельную сортировку и операции JOIN. #93080 (Alexey Milovidov).
  • Улучшена производительность оконных функций, когда PARTITION BY совпадает с ключом сортировки или является его префиксом. #87299 (Nikita Taranov).
  • Внешний фильтр проталкивается в представления, что позволяет применять PREWHERE на локальных и удалённых узлах. Resolves #88189. #88316 (Igor Nikonov).
  • Implement JIT compilations for more functions. Closes #73509. #88770 (Alexey Milovidov with Taiyang Li).
  • Если пропускающий индекс, используемый в запросе с FINAL, построен по столбцу, который является частью первичного ключа, дополнительный шаг проверки пересечения по первичному ключу в других частях избыточен и теперь не выполняется. Resolves #85897. #93899 (Shankar Iyer).
  • Оптимизирована производительность и использование памяти для дробных значений LIMIT и OFFSET. #91167 (Ahmed Gouda).
  • Исправлено использование более быстрой логики произвольного чтения для префетчера Parquet Reader V3. Closes #90890. #91435 (Arsen Muk).
  • Улучшена производительность icebergCluster. Закрывает #91462. #91537 (Yang Jiang).
  • Don't filter by virtual columns on constant filters. #91588 (c-end).
  • Снизить потребление памяти при операциях INSERT и слияниях широких частей для очень широких таблиц за счёт включения адаптивных буферов записи. Добавить поддержку адаптивных буферов записи для зашифрованных дисков. #92250 (Azat Khuzhin).
  • Повышена производительность полнотекстового поиска с текстовым индексом и токенизатором sparseGrams за счёт уменьшения числа токенов, просматриваемых в индексе. #93078 (Anton Popov).
  • Функция isValidASCII была оптимизирована под положительный сценарий, то есть для входных значений, полностью состоящих из символов ASCII. #93347 (Robert Schulze).
  • Оптимизация чтения в порядке сортировки теперь распознаёт случаи, когда столбцы в ORDER BY являются константами вследствие условий WHERE, что позволяет эффективно выполнять чтение в обратном порядке. Это полезно для мультиарендных запросов вроде WHERE tenant='42' ORDER BY tenant, event_time DESC, которые теперь могут использовать InReverseOrder вместо полной сортировки.". #94103 (matanper).
  • Добавлен специализированный класс AST для Enum для хранения значений в виде пар (строка, целое число) вместо дочерних ASTLiteral, что оптимизирует потребление памяти. #94178 (Ilya Yatsishin).
  • Distributed index analysis on multiple replicas. Beneficial for shared storage and huge amount of data in cluster. This is applicable for SharedMergeTree (ClickHouse Cloud) and could be applicable for other types of MergeTree tables on a shared storage. #86786 (Azat Khuzhin).
  • Reduce overhead of join runtime filters by disabling them in the following cases: - too many bits are set in the bloom filter - too few rows are filtered out at runtime. #91578 (Alexander Gololobov).
  • Используйте буфер в памяти для входных данных коррелированных подзапросов, чтобы избежать их повторного вычисления. Часть #79890. #91205 (Dmitry Novik).
  • Разрешить всем репликам забирать «осиротевшие» диапазоны при параллельном чтении реплик. Это улучшает балансировку нагрузки и снижает задержки «длинного хвоста». #91374 (zoomxi).
  • Внешние агрегация/сортировка/JOIN теперь во всех случаях учитывают настройку запроса temporary_files_codec. Исправлено отсутствие событий профилирования для grace hash join. #92388 (Vladimir Cherkasov).
  • Make query memory usage detection for spilling to disk during aggregation/sorting more robust. #92500 (Azat Khuzhin).
  • Estimate total rows count and NDV (number of distinct values) statistics of aggregation key columns. #92812 (Alexander Gololobov).
  • Оптимизировано сжатие списков постингов с помощью simdcomp. #92871 (Peng Jian).
  • Рефакторинг обработки режима Ordered в S3Queue с использованием бакетов. Это также должно повысить производительность, сократив количество запросов к Keeper. #92889 (Kseniia Sumarokova).
  • Functions mapContainsKeyLike and mapContainsValueLike can now leverage a text index on mapKeys() or mapValues(), respectively. #93049 (Michael Jarrett).
  • Reduce memory usage on non-Linux systems (enable immediate purging of jemalloc dirty pages). #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).
  • Разбирать нижнюю и верхнюю границы имён файлов, соответствующих position deletes, из записей манифеста Iceberg для более точного выбора соответствующих файлов данных. #93980 (Daniil Ivanik).
  • Добавлены ещё две настройки для управления максимальным количеством динамических подстолбцов в столбце JSON. Первая — настройка MergeTree merge_max_dynamic_subcolumns_in_compact_part (аналогично уже добавленной merge_max_dynamic_subcolumns_in_wide_part), которая ограничивает количество динамических подстолбцов, создаваемых при слиянии в компактную часть. Вторая — настройка на уровне запроса max_dynamic_subcolumns_in_json_type_parsing, которая ограничивает количество динамических подстолбцов, создаваемых при разборе данных JSON; она позволяет задать этот лимит при вставке. #94184 (Pavel Kruglov).
  • Незначительно оптимизировано уплотнение JSON-столбцов для отдельных случаев. #94247 (Pavel Kruglov).
  • Уменьшите размер очередей пула потоков на основе опыта эксплуатации. Добавьте явную проверку потребления памяти перед чтением любых данных из MergeTree. #94692 (Nikita Mikhaylov).
  • Make sure the scheduler would prefer MemoryWorker thread under the CPU starvation, because it protects ClickHouse process from an existential threat. #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 использовал не имя диска. Добавлен столбец error_code в blob_storage_log. Тестовый конфигурационный файл разделён для упрощения локального тестирования. #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 на партиции для упорядоченного режима в 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).
  • Добавлена поддержка добавления вспомогательного 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).
  • Добавить столбец creation (неявный/явный) в system.data_skipping_indices. #92378 (Raúl Marín).
  • Добавлена возможность передавать описание столбцов для динамических таблиц 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).
  • Добавлена поддержка пустых кортежей в ридере Parquet. #92868 (Michael Kolupaev).
  • Переход на копирование в режиме чтения и записи для Azure Blob Storage при сбое встроенного копирования с ошибкой BadRequest (например, из‑за недопустимого списка блоков). Ранее это выполнялось только при ошибке Unauthorized, которая наблюдалась при копировании BLOB-объекта в другие учетные записи хранения. Однако иногда также возникает ошибка "The specified block list is invalid". Поэтому условие было обновлено, и теперь переход на чтение & запись выполняется при любых сбоях встроенного копирования. #92888 (Smita Kulkarni).
  • Исправлено ограничение частоты обращений (throttling) к конечной точке метаданных 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: используются строковые литералы для имён функций, изменены все подходящие функции и теперь можно использовать 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 для управления тем, используется ли статистика размера хеш-таблицы во время выполнения запроса при переупорядочивании соединений. Эта настройка включена по умолчанию, при этом сохраняется существующее поведение collect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov).
  • Пользователи теперь могут частично просматривать вложенные глобальные настройки сервера в таблице system.server_settings (например, logger.level). Это распространяется только на настройки с фиксированной структурой (без списков, перечислений, повторений и т. п.). #94001 (Hechem Selmi).
  • QBit теперь можно сравнивать на равенство. #94078 (Raufs Dunamalijevs).
  • Когда Keeper обнаруживает повреждённый snapshot или несогласованные журналы изменений, выбрасывать исключение вместо ручного прерывания или автоматической очистки файлов. Это должно обеспечить более безопасное поведение Keeper, предполагающее ручное вмешательство. #94168 (Antonio Andelic).
  • Исправлена проблема, из‑за которой после ошибки CREATE TABLE могли оставаться лишние объекты. #94174 (Azat Khuzhin).
  • Исправлен доступ к неинициализированной памяти (ошибка в OpenSSL), возникавший при использовании TLS-ключа, защищённого паролем. #94182 (Konстантин Bogdanov).
  • Обновлён chdig до версии v26.1.1. #94290 (Azat Khuzhin).
  • Добавлена поддержка более общего разбиения на партиции для упорядоченного режима 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 при преобразовании из Numbers в Enums, чтобы проверять, существует ли элемент. #94384 (Elmi Ahmadov).
  • В упорядоченном режиме S3(Azure)Queue добавлена очистка неуспешных узлов по лимитам отслеживания (ранее это выполнялось только в неупорядоченном режиме как для неуспешных, так и для обработанных узлов; теперь это также будет выполняться в упорядоченном режиме, но только для неуспешных узлов). #94412 (Kseniia Sumarokova).
  • Включено управление доступом для пользователя default в clickhouse-local. У пользователя по умолчанию в clickhouse-local отсутствовала привилегия access_management, из-за чего операции, такие как DROP ROW POLICY IF EXISTS, завершались ошибкой ACCESS_DENIED, хотя пользователь должен был иметь неограниченные права. #94501 (Alexey Milovidov).
  • Добавлена поддержка именованных коллекций для словарей и таблиц YTsaurus. #94582 (MikhailBurdukov).
  • Добавлена поддержка именованных коллекций, определённых в SQL, в BACKUP/RESTORE для S3 и Azure Blob Storage. Закрывает #94604. #94605 (Pablo Marcos).
  • Добавлена поддержка разбиения на бакеты по ключу партиции для S3Queue в упорядоченном режиме. #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 для преобразования из Numbers в Enums с проверкой того, существует ли элемент. Закрывает: #56144. #56240 (Nikolay Degтерinsky).
  • Разделять ресурсы парсера формата при чтении файлов данных и файлов позиционного удаления в таблицах Iceberg, чтобы сократить количество выделений памяти. #94701 (Yang Jiang).

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

  • Исправляет ошибку, из-за которой предопределённые обработчики запросов интерпретировали концевые пробелы как данные при выполнении вставок. #83604 (Fabian Ponce).
  • Исправлена ошибка INCOMPATIBLE_TYPE_OF_JOIN для хранилища 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 после преобразования обычной базы данных в атомарную базу. #90473 (sdk2).
  • Исправлено срабатывание assert-проверки при чтении из файла Parquet, когда часть выражения prewhere используется в другом месте запроса. #90635 (Max Kainov).
  • Исправлено падение в одноузловом кластере при чтении из Iceberg в режиме split-by-buckets. Это закрывает #90913. #91553 (Konstantin Vedernikov).
  • Исправлена возможная логическая ошибка в движке Log при чтении подстолбцов. Закрывает #91710. #91711 (Pavel Kruglov).
  • Исправлена логическая ошибка: 'Storage does not support transaction' при выполнении ATTACH AS REPLICATED. #91772 (Shaohua Wang).
  • Исправлена некорректная работа рантайм-фильтров при наличии дополнительного последующего условия в LEFT ANTI JOIN. #91824 (Alexander Gololobov).
  • Исправляет ошибку, из-за которой применялось null-безопасное сравнение с участием типа Nothing. Закрывает #91834. Закрывает #84870. Закрывает #91821. #91884 (Yarik Briukhovetskyi).
  • Исправлены ошибки декодирования DELTA_BYTE_ARRAY в нативном Parquet-ридере, затрагивающие строковые данные с высокой степенью повторяемости. #91929 (Daniel Muino).
  • Кэшировать схему только для того файла, по которому она была выведена, при обработке globs, вместо всех файлов во время вывода схемы. Закрывает #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).
  • Связанная задача: 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).
  • Исправлена ошибка "Cannot write to finalized buffer" при использовании некоторых агрегатных функций с оконными функциями. Закрывает #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, вызванная нежелательной модификацией плана запроса при преобразовании внешнего соединения во внутреннее. Также ослаблены требования к оптимизации, чтобы можно было применять её в случаях, когда инъективные функции применяются к ключам агрегации в операциях JOIN. #92503 (János Benjamin Antal).
  • Исправлена возможная ошибка SIZES_OF_COLUMNS_DOESNT_MATCH при сортировке пустого столбца кортежей. Закрывает #92422. #92520 (Pavel Kruglov).
  • Проверка наличия несовместимых типизированных путей в типе JSON. Закрывает #91577. #92539 (Pavel Kruglov).
  • Исправлена взаимная блокировка в SHOW CREATE DATABASE для базы данных Backup. #92541 (Azat Khuzhin).
  • Использовать правильный код ошибки при проверке индекса гипотезы. #92559 (Raúl Marín).
  • Исправлено разрешение динамических подстолбцов в псевдонимах столбцов в анализаторе. Ранее динамический подстолбец в псевдониме столбца оборачивался в вызов 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 с длиной ngram (1‑й параметр) > 8 вызывали исключение. #92672 (Robert Schulze).
  • Исправлено необработанное исключение при фоновой перезагрузке именованных коллекций при использовании хранилища ZooKeeper. Закрывает https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
  • Исправляет некорректную логику проверки прав доступа для подстановочных привилегий (wildcard grants). Предыдущая попытка https://github.com/ClickHouse/ClickHouse/pull/90928 устраняла критическую уязвимость, но оказалась слишком строгой, в результате чего некоторые команды GRANT с подстановками завершались ошибкой из‑за несвязанных с ними отзывов прав. #92725 (pufit).
  • Исправлена ошибка в логике пропуска данных при использовании not match(...) в WHERE, приводившая к некорректным результатам. Закрывает #92492. #92726 (Nihal Z. Miaji).
  • Не пытайтесь удалять временные каталоги при запуске, если таблица MergeTree создана на диске только для чтения. #92748 (Alexey Milovidov).
  • Исправлена ошибка "Cannot add action to empty 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).
  • Исправлено формирование подсказки типа для пути '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-ридера (по умолчанию не используется), приводившая к сбою при обработке пустых кортежей. #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).
  • Восстанавливать при необходимости обёртки LowCardinality вокруг результатов выражений Set во время агрегации TTL, чтобы предотвратить исключения при оптимизации таблицы. #92971 (Seva Potapov).
  • Исправлена логическая ошибка при анализе индекса, когда в функции has используется пустой массив. Закрывает #92906. #92995 (Nihал Z. Miaji).
  • Исправлено возможное зависание при завершении пула фоновых задач по расписанию (могло приводить к зависаниям сервера при его остановке). #93008 (Azat Khuzhin).
  • Исправлена возможная ошибка FILE_DOESNT_EXIST после мутации разреженного столбца, если настройка ratio_of_defaults_for_sparse_serialization была изменена на 1.0 через ALTER. #93016 (Pavel Kruglov).
  • Исправлена ошибка в логике пропуска данных, когда в WHERE используется not materialize(...) или not CAST(...), что приводило к некорректным результатам. Закрывает #88536. #93017 (Nihал Z. Miaji).
  • Исправлено возможное использование устаревших частей из-за гонки типа TOCTOU при работе с общими частями. #93022 (Azat Khuzhin).
  • Исправлен сбой при десериализации повреждённого агрегатного состояния groupConcat с смещениями, выходящими за допустимые границы. #93028 (Raufs Dunamalijevs).
  • Исправлена ошибка, из-за которой соединение оставалось в некорректном состоянии после предварительной отмены распределённых запросов. #93029 (Azat Khuzhin).
  • Исправлены результаты 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).
  • Исправлено применение PROJECTION, когда фильтр содержит подстолбцы. Закрывает #92882. #93141 (Pavel Kruglov).
  • Исправлена логическая ошибка, которая в некоторых случаях возникала при добавлении runtime-фильтров JOIN в план запроса. Она была вызвана некорректным возвратом дублированных константных столбцов с одной из сторон JOIN. #93144 (Alexander Gololobov).
  • Специальная функция __applyFilter, используемая в runtime-фильтрах join, в некоторых допустимых случаях возвращала ошибку ILLEGAL_TYPE_OF_ARGUMENT. #93187 (Alexander Gololobov).
  • Предотвращено схлопывание разных интерполированных столбцов в один столбец в блоке, когда интерполированные столбцы фактически являются псевдонимами одного и того же столбца. #93197 (Yakov Olkhovskiy).
  • Не добавляйте runtime-фильтр при выполнении JOIN с уже заполненной правой таблицей. #93211 (Alexander Gololobov).
  • Исправлена очистка постоянных наблюдений в Keeper после завершения сеанса. Это закрывает #92480. #93213 (Konstantин Vedernиков).
  • Исправлен ORDER BY tuple в 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).
  • Исправлена возможная проблема отсутствующего подстолбца в материализованном представлении при выполнении ALTER исходной таблицы. Закрывает #93231. #93276 (Pavel Kruglov).
  • Исправлено планирование запросов анализатором для табличного движка Merge, из‑за которого могла возникать ошибка ILLEGAL_COLUMN для hostName() при слиянии локальных и удалённых/Distributed таблиц. Закрывает #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-фильтров в запросе с итогами по правой таблице. #93330 (Alexander Gololobov).
  • Сервер больше не падает, если функция tokens вызывается с неконстантными параметрами токенизатора (со 2-м, 3-м и 4-м параметрами), например, SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze).
  • Исправлена уязвимость целочисленного переполнения в десериализации состояния groupConcat, которая могла приводить к проблемам с безопасностью памяти при обработке специально сконструированных агрегатных состояний. #93426 (Raufs Dunamalijevs).
  • Исправлен анализ текстового индекса для столбцов массивов, когда в индексе нет токенов (все массивы пусты или все токены пропускаются токенизатором). #93457 (Anton Popov).
  • Исключает использование аутентификации через OAuth в ClickHouse Client, если имя пользователя и пароль заданы в строке подключения. #93459 (Krishna Mannem).
  • Исправлена поддержка предоставляемых учетных данных Azure ADLS Gen2 в DataLakeCatalog — разбираются ключи adls.sas-token.* из REST-каталогов Iceberg и исправлен разбор URL-адресов ABFSS. #93477 (Karun Anantharaman).
  • Исправлена поддержка GLOBAL IN с анализатором (ранее Set повторно создавался на удалённом узле). #93507 (Azat Khuzhin).
  • Исправлена ошибка извлечения подстолбца при десериализации непосредственно в разреженные столбцы. #93512 (Pavel Kruglov).
  • Исправлено прямое чтение из текстового индекса при дублирующихся поисковых запросах. #93516 (Anton Popov).
  • Исправление ошибки NOT_FOUND_COLUMN_IN_BLOCK, возникающей при включённом runtime filter, если в объединённых таблицах один и тот же столбец возвращается несколько раз (например, 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).
  • Предотвращена возможность получения пользователями списка столбцов таблицы без проверки наличия разрешения SHOW COLUMNS при использовании движка таблиц merge. #93695 (János Benjamin Antal).
  • Исправлена материализация пропускающих индексов, созданных на основе подстолбцов. #93708 (Anton Popov).
  • Мы храним умные указатели shared_ptr на хранилища в QueryPipeline::resources::storage_holders, чтобы гарантировать, что объекты IStorage не будут уничтожены, пока существует PipelineExecutor. #93746 (Miсhael Stetsyuk).
  • Исправлена проблема с присоединением реплицируемых БД, когда межсерверный хост изменился после перезапуска. #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-фильтра JOIN поверх таблицы Merge. #94021 (Alexander Gololobov).
  • Запрос SELECT, содержащий предикат по нескольким столбцам с пропускающими индексами bloom filter и одновременно использующий условия OR и NOT, мог возвращать несогласованные результаты. Теперь это исправлено. #94026 (Shankar Iyer).
  • Исправлена операция CLEAR COLUMN для столбца с зависимыми индексами. #94057 (Raúl Marín).
  • Исправлено использование неинициализированного значения в ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov).
  • Исправлена некорректная проверка типизированных путей в JSON. Проверка была добавлена в https://github.com/ClickHouse/ClickHouse/pull/92842 и может вызывать ошибку при запуске существующих таблиц. #94070 (Pavel Kruglov).
  • Исправлено падение во время анализа фильтра при наличии 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 без включения статистики страниц (page statistics) или индекса страниц (page index). Затрагивает только столбцы типа данных Array. Вероятный симптом — усечение примерно одного массива на каждые ~1 МБ данных. До этого исправления используйте следующий SETTING как обходной путь: input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev).
  • Исправлена проблема с чрезмерным числом watches в ReplicatedMergeTree при ожидании записи в журнал. #94133 (Azat Khuzhin).
  • Функции arrayShuffle, arrayPartialShuffle и arrayRandomSample материализуют константные столбцы, чтобы разные строки получали разные результаты. #94134 (Joanna Hulboj).
  • Устранена гонка данных при вычислении табличных функций в materialized views. #94171 (Alexey Milovidov).
  • Исправлено разыменование nullptr в движках баз данных PostgreSQL (при некорректном запросе). Закрывает #92887. #94180 (Alexey Milovidov).
  • Исправлена утечка памяти в refreshable materialized views при выполнении запросов SELECT с несколькими подзапросами. #94200 (Antonio Andelic).
  • Устранена гонка данных между DataPartStorageOnDiskBase::remove и system.parts. Закрывает #49076. #94262 (Alexey Milovidov).
  • Удалён некорректный спецификатор noexcept у оператора копирующего присваивания HashTable, который мог приводить к аварийному завершению (std::terminate) при исключениях, связанных с памятью. #94275 (Nikita Taranov).
  • Ранее создание PROJECTION с дублирующимися столбцами в 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).
  • Исправлено проталкивание фильтра для SEMI JOIN с использованием наборов эквивалентности. Фильтр не проталкивается, если типы аргументов изменились. Исправляет #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, когда несколько вызовов receivePacketsExpectQuery читают Protocol::Client::IgnoredPartUUIDs. #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).
  • Исправлена некорректная обработка столбца ключа соединения типа 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).
  • Исправлена ошибка в мутациях со скалярными подзапросами и зависимостями таблицы. Если у таблицы были зависимости (индекс или PROJECTION) по столбцу, скалярные подзапросы могли вычисляться и кэшироваться без данных, что приводило к некорректным изменениям. #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).
  • Исправлено падение в некоторых случаях при включённых по умолчанию runtime-фильтрах JOIN. #95000 (Alexander Gololobov).
  • Улучшено маскирование паролей в URL-адресах, используемых в движке таблиц URL() и табличной функции url(). #95006 (Vitaly Baranov).
  • Функция toStartOfInterval теперь работает так же, как toStartOfX, где XDay, 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 = 0. Закрывает #93893. #95072 (Alexey Milovidov).
  • Преобразование из DateTime/целых чисел в Time64 извлекает компонент времени суток с помощью toTime, который не является монотонным. Шаблон ToDateTimeMonotonicity ошибочно указывал, что это преобразование монотонно, что приводило к исключению "Invalid binary search result in MergeTreeSetIndex" в debug-сборках. #95125 (Alexey Milovidov).
  • Список записей файла манифеста теперь пересоздаётся только при необходимости (ранее он пересоздавался на каждой итерации). #95162 (Daniil Ivanik).

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

  • Добавлен набор инструментов для профилирования выделений памяти в SQL-парсере ClickHouse с использованием возможностей профилирования кучи jemalloc. #94072 (Ilya Yatsishin).
  • Добавлен инструмент, упрощающий отладку выделений памяти в парсере. Он использует метрику jemalloc stats.allocated до и после разбора запроса в представление AST, чтобы показать, какие объекты были выделены. Также он поддерживает режим профилирования памяти, который сохраняет дамп профиля до и после разбора для построения отчетов о том, где происходили выделения. #93523 (Ilya Yatsishin).
  • Удалены транзитивные включения libc++. #92523 (Raúl Марín).
  • Некоторые последовательные тесты сделаны параллельными: https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df. #93030 (Nikita Fomichev).
  • Упорядочены некоторые флаги сборки. #93679 (Raúl Марín).
  • Обновление c-ares с v1.34.5 до v1.34.6. Это исправляет уязвимость CVE-2025-62408 в c-ares, которая не имеет отношения к ClickHouse. #94129 (Govind R Nair).
  • Переход на curl 8.18.0. #94742 (Konstantin Bogdanov).