обратно несовместимое изменение
- Значения по умолчанию для
date_time_input_format и cast_string_to_date_time_mode изменены с basic на best_effort. Запросы, в которых раньше не удавалось разобрать datetime-строки не в формате basic (например, 2024 April 4, Apr 15, 2020 10:30:00), теперь по умолчанию могут выполняться успешно. Чтобы сохранить прежнее строгое поведение разбора, установите для этих настроек значение basic (или используйте compatibility). #89334 (Alexey Milovidov).
- Имя элемента Tuple
null теперь запрещено, поскольку оно конфликтует с именем подстолбца, используемым для null map типа Nullable, что приводит к неоднозначному разрешению подстолбцов. #98377 (Alexey Milovidov).
- Добавлены настройки
dynamic_disk_allow_from_env, dynamic_disk_allow_from_zk, dynamic_disk_allow_include, запрещающие использование from_env, from_zk, include в динамических дисках. Это обратно несовместимое изменение, поскольку теперь по умолчанию запрещено поведение, которое раньше по умолчанию было разрешено. #99138 (Kseniia Sumarokova).
- Больше нельзя использовать устаревшие ридер и writer Parquet на основе Arrow. Вместо них будет использоваться native-реализация. #100949 (Alexey Milovidov).
SHOW CREATE TABLE t теперь отдает предпочтение временной таблице, если одновременно существуют постоянная и временная таблицы с именем t, а database не указана, что соответствует текущему поведению DESCRIBE TABLE. Кроме того, теперь поддерживается синтаксис DESCRIBE TEMPORARY TABLE. #100966 (Alexey Milovidov).
- Значение
http_max_fields по умолчанию уменьшено с 1,000,000 до 1,000, а http_max_field_name_size — со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до authentication. Добавлены настройки http_max_request_header_size и http_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda).
- В
system.metric_log добавлен вложенный столбец histograms, который сохраняет в каждой строке снимок каждой зарегистрированной метрики гистограммы, а новая настройка system_metric_log_show_zero_values_in_histograms управляет выводом нулевых значений. Таблица system.histogram_metric_log объявлена устаревшей. #103770 (Miсhael Stetsyuk).
CAST в DateTime или DateTime64 без явного часового пояса теперь сохраняет часовой пояс исходного аргумента (если источник — DateTime/DateTime64 с явным часовым поясом), что соответствует поведению функций toDateTime/toDateTime64. Закрывает #55072. #104433 (Alexey Milovidov).
- Удалена table function
kql. Используйте SET dialect = 'kusto', чтобы выполнять запросы в диалекте KQL. #105101 (Alexey Milovidov).
- Window functions
RANK и DENSE_RANK теперь отклоняют аргументы и генерируют NUMBER_OF_ARGUMENTS_DOESNT_MATCH в соответствии со стандартом SQL. Ранее запросы вида RANK(x) OVER (ORDER BY id) молча принимались, а аргумент игнорировался. Чтобы восстановить прежнее менее строгое поведение, установите allow_rank_dense_rank_arguments = 1. Закрывает #49526. #104324 (Groene AI).
- Добавлена новая настройка
max_bytes_ratio_before_external_join, аналогичная max_bytes_ratio_before_external_group_by и max_bytes_ratio_before_external_sort. Она задает порог spill-to-disk для hash JOIN как долю доступной памяти; вместе с абсолютным значением max_bytes_before_external_join применяется меньший из двух порогов. #103862 (Alexey Milovidov). Настройка max_bytes_ratio_before_external_join теперь включена по умолчанию со значением 0.5, аналогично max_bytes_ratio_before_external_group_by и max_bytes_ratio_before_external_sort. Hash JOIN автоматически переключаются на grace hash join со spill на диск, как только объем данных с правой стороны превышает половину доступной системной памяти (если настроены лимиты памяти). #104285 (Alexey Milovidov).
- Добавлена table function
filesystem. Она позволяет представлять структуру каталога в виде таблицы, а также выполнять SQL-запросы к метаданным и содержимому файлов. Изначально #42039 от @perst20. См. #42039. См. #50208. #53610 (Alexey Milovidov).
- Разрешена передача имен функций без обертки в функции высшего порядка, такие как
arrayMap, arrayFilter и т. д. Например, arrayMap(negate, [1, 2, 3]) теперь эквивалентен arrayMap(x -> negate(x), [1, 2, 3]). #101033 (Alexey Milovidov).
- Добавлены настройка
send_table_structure_on_insert_with_inline_data и опция клиента --inline-insert-data, чтобы server мог сам разбирать встроенные данные INSERT через собственный протокол, избегая дополнительного обмена данными для получения структуры таблицы и повышая производительность при множестве небольших вставок. #101034 (Alexey Milovidov).
- Добавлены функции
tokenizeQuery и highlightQuery для токенизации SQL-запросов и подсветки синтаксиса. tokenizeQuery возвращает токены лексера со смещениями в байтах и типами токенов; highlightQuery возвращает диапазоны подсветки синтаксиса на основе parser с категориями подсветки (keyword, identifier, function, number, string и т. д.). #101054 (Alexey Milovidov).
- Добавлена настройка
url_base для разрешения относительных URL в table function url и движке таблицы URL в соответствии с семантикой RFC 3986. #101113 (Alexey Milovidov).
- Добавлена поддержка отрицательных значений в clause
LIMIT BY, чтобы выбирать строки с конца каждой группы, а не с начала. Например, LIMIT -2 BY id возвращает последние две строки для каждого id. Также поддерживаются отрицательные смещения (LIMIT -1 OFFSET -1 BY id) и смешанные знаки (LIMIT -2 OFFSET 1 BY id). #103222 (Nihal Z. Miaji).
- Добавлена поддержка функции
json_value для вывода в tuple и array, что повышает производительность при выполнении нескольких JSON-запросов. #78362 (kevinyhzou). Добавлена поддержка многопутевого аргумента JSONPath Tuple/Array в JSON_VALUE, JSON_EXISTS и JSON_QUERY, от @KevinyhZou. #101102 (Alexey Milovidov).
- Введён новый параметр
kafka_autodetect_client_rack. Если он задан, зона доступности определяется средствами облачной платформы и передаётся в librdkafka как параметр client.rack, чтобы избежать межзонного обмена данными. #81323 (Ilya Golshtein).
- В
system.blob_storage_log добавлен тип события Read для отслеживания операций чтения из Объектного хранилища; он управляется новой настройкой enable_blob_storage_log_for_read_operations. #96867 (Alexey Milovidov).
- Теперь пользователи могут видеть наблюдения ZooKeeper, установленные
clickhouse-server, с помощью новой таблицы system.zookeeper_watches. #99277 (Den Kalantaevskii).
- Добавлено профильное событие
Shards, которое подсчитывает общее количество сегментов, участвующих в распределённых запросах, по всем таблицам. #99470 (Alexey Milovidov).
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-соединениях, что позволяет операторам переопределять autotuning ядра и ограничивать использование памяти на одно соединение. #100478 (Sema Checherinda).
- Добавлена поддержка
CREATE OR REPLACE MATERIALIZED VIEW с той же семантикой атомарной подмены, что и у CREATE OR REPLACE TABLE. Работает с внутренними таблицами, таблицами TO, POPULATE, REFRESH и ON CLUSTER. #100539 (DQ).
- Добавлены метрика гистограммы
s3_read_request_duration_microseconds и s3_read_request_bytes для наблюдения за временем жизни соединения и объёмом прочитанных данных у S3 GET-запросов; они доступны в system.histogram_metrics и на конечной точке Prometheus. #102058 (Sema Checherinda).
- Добавлены Движки таблиц
Paimon, PaimonS3, PaimonAzure, PaimonHDFS и PaimonLocal с поддержкой инкрементального чтения на основе отслеживания прогресса снимков Keeper. Инкрементальный режим возвращает только новые строки с момента последнего зафиксированного снимка. Доступно целевое чтение дельты снимка через paimon_target_snapshot_id, а ограничение числа снимков на запрос — через max_consume_snapshots. Фоновое обновление метаданных настраивается параметром paimon_metadata_refresh_interval_sec. Возможность включается через allow_experimental_paimon_storage_engine. #102343 (XiaoBinMu).
- Добавлена новая настройка таблицы Kafka
kafka_map_virtual_columns_on_write. Если она включена, столбцы _key, _timestamp, _headers.name и _headers.value из схемы таблицы Kafka при INSERT записываются как соответствующие ключ сообщения Kafka, временная метка и заголовки и исключаются из полезной нагрузки сообщения. #103243 (Alexey Milovidov).
- Добавлены запросы
SYSTEM PAUSE VIEW [db.]name и SYSTEM PAUSE VIEWS для refreshable materialized views. В отличие от SYSTEM STOP VIEW, SYSTEM PAUSE VIEW не прерывает выполняющееся в данный момент обновление — текущему обновлению даётся завершиться, а предотвращаются только последующие обновления. Отменяется командами SYSTEM START VIEW или SYSTEM START VIEWS, которые теперь единообразно снимают как состояние остановки, так и состояние паузы. #103252 (Nikita Mikhaylov).
- Добавлена функция
regexpPosition (с совместимыми с PostgreSQL псевдонимами regexpInstr и regexp_instr), которая возвращает байтовую позицию N-го совпадения regex в строке. Поддерживаются начальное смещение, режим возврата позиции после совпадения, флаги regex и выбор группы захвата. #104172 (Abhinav Agarwal).
- Добавлены новые функции
isPrime и isProbablePrime для проверки чисел на простоту. isPrime возвращает точный результат для беззнаковых целых чисел вплоть до UInt64. isProbablePrime также поддерживает UInt128 и UInt256; для этих более широких типов 0 означает точно составное число, а 1 — вероятно простое. Необязательный второй аргумент функции isProbablePrime, rounds, управляет степенью достоверности (с ограничением до 256); значение по умолчанию — 25 раундов — ограничивает вероятность ложноположительного результата для случайного составного числа уровнем ниже 10^-15, а isProbablePrime можно отменить. #104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji).
clear и /clear теперь очищают терминал в инструментах командной строки clickhouse вместо того, чтобы ошибочно выполняться как запрос. #104318 (Tyler Hannan).
- Табличной функции
file теперь разрешено принимать Array(String) путей в запросах SELECT. #104442 (Yue).
- В таблицу
system.functions добавлены столбцы deterministic и higher_order. #104479 (Pedro Ferreira).
- В
bech32Encode добавлен необязательный параметр варианта кодирования (bech32 / bech32m), а в bech32Decode — режим raw-декодирования для кодирования не-SegWit-адресов (например, Cosmos SDK, Injective, Osmosis). #98986 (Yash ).
- Теперь можно записывать данные в формат
AvroConfluent, который ранее поддерживался только для ввода. Это позволяет создавать Avro-сообщения с обрамлением Confluent Schema Registry напрямую из ClickHouse, например при записи в Kafka. Схема автоматически регистрируется в registry. Используйте новую настройку output_format_avro_confluent_subject, чтобы указать имя subject. #101935 (János Benjamin Antal).
- Добавлена функция
prettyPrintJSON для форматирования строки JSON в удобочитаемый вид. Полезно для панелей мониторинга или отчётов, где для красивого форматирования раньше требовался дополнительный шаг на стороне клиента. Закрывает #62523. #102594 (Dmitry Prokofyev).
- Добавлен
STRING_AGG как регистронезависимый алиас groupConcat для совместимости с PostgreSQL / стандартным SQL. #105125 (Alexey Milovidov).
- Результаты отдельных подзапросов теперь можно кэшировать независимо, используя
SETTINGS use_query_cache = true для конкретных подзапросов, без кэширования всего внешнего запроса. Новая настройка query_cache_for_subqueries = true включает массовое применение use_query_cache ко всем подзапросам. Note: use_query_cache во внешнем запросе больше не распространяется на подзапросы автоматически. #99804 (Vincent Voyer).
- В редактор запросов веб-интерфейса (
play.html) добавлена подсветка синтаксиса на основе лексера, выполненная по образцу цветовой схемы clickhouse-client. #105105 (Alexey Milovidov).
Экспериментальные возможности
- Добавлен экспериментальный интерфейс веб-терминала по адресу
/webterminal, предоставляющий интерактивный сеанс clickhouse-client в браузере через WebSocket. По умолчанию отключён; включается с помощью настройки сервера allow_experimental_webterminal. Посмотреть можно здесь. #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov).
- Движок
Kafka2 (экспериментальный, с хранением смещений на основе Keeper) теперь поддерживает прямые запросы SELECT и настройку kafka_commit_on_select. #100276 (Alexey Milovidov).
WASM UDFs теперь могут приводить больше числовых типов: меньшие целочисленные типы к более широким (например, Int8 к UInt64), а любые целые — к типам с плавающей точкой (например, Int32 к Float32). #100435 (Vasily Chekalkin).
- Добавлена поддержка функции
LIKE в запросе DELETE FROM system.webassembly_modules. #104397 (Vladimir Cherkasov).
- Добавлена поддержка гео-типов для
Iceberg. #103113 (Konstantin Vedernikov).
- Добавлена поддержка подготовленных операторов на сервере ArrowFlight SQL. #103047 (Yakov Olkhovskiy).
- Повышена устойчивость парсера KQL (для поддержки языка Kusto): глубина парсера и счётчики возвратов теперь сохраняются между этапами парсинга KQL, благодаря чему ограничения парсера для сложных запросов KQL отслеживаются согласованно. #103528 (Yakov Olkhovskiy).
- Повторно использовать кэш метаданных нижнего колонтитула Parquet при чтении локальных файлов Parquet через табличную функцию
file или движок таблицы File. Ранее кэш использовался только для backend-соединений объектного хранилища. #104260 (Alexey Milovidov).
- Проталкивать
ORDER BY ... LIMIT n через LEFT/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 для уменьшения числа page fault. #103958 (Nikita Taranov).
- Ограничить число одновременно активных streams в
UNION ALL, чтобы снизить пиковое потребление памяти. #100176 (Alexey Milovidov).
- Слегка оптимизировать кэш страниц в пространстве пользователя. #100300 (Alexey Milovidov). Теперь кэш страниц в пространстве пользователя всегда лучше, чем кэш страниц ОС.
- Холодные чтения из объектного хранилища через кэш страниц в пространстве пользователя (
use_page_cache_for_object_storage = 1) теперь выполняются значительно быстрее, поскольку последовательные промахи кэша объединяются в один HTTP request вместо одного запроса на каждый блок page_cache_block_size. #104230 (Alexey Milovidov).
- Ускорить анализ индексов, включающий приведение типов и применение функций. Закрывает #55653. #100366 (Alexey Milovidov).
- Ускорить выполнение больших запросов к таблицам
Merge поверх очень большого числа базовых таблиц. Закрывает #32465. #100369 (Alexey Milovidov).
- Удалить vtable из типов полей настроек, уменьшив размер копии
Settings примерно в 28 раз и улучшив локальность кэша за счет структуры typed-array для всех типов настроек. #102269 (Raúl Marín).
- Добавить настройки
max_threads_min_free_memory_per_thread и max_insert_threads_min_free_memory_per_thread, чтобы автоматически снижать параллелизм запросов, когда на сервере мало свободной памяти. #100383 (Alexey Milovidov).
- Снизить использование памяти в системах с небольшим объемом памяти (< 4 GiB). #100389 (Alexey Milovidov).
- Добавлен
OptimizeTrivialGroupByLimitPass. Для простых запросов SELECT ... FROM t GROUP BY k LIMIT n (без HAVING, ORDER BY и оконных функций) analyzer теперь устанавливает max_rows_to_group_by = n + offset и group_by_overflow_mode = 'any', поэтому aggregation останавливается, как только будет получено n различных ключей, вместо группировки всего входного набора данных. Управляется новой настройкой optimize_trivial_group_by_limit_query (включена по умолчанию). #104473 (Amos Bird) (Alexey Milovidov).
- Неявный min-max индекс на уровне гранул для виртуальных столбцов
_part_offset и _block_number, включая проекции. Обеспечивает быстрое pruning гранул на основе predicates виртуальных столбцов. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko).
- Для семейства методов aggregation
prealloc_serialized хеши для каждой строки теперь вычисляются заранее во время прохода батч-сериализации и затем используются, чтобы (a) избежать повторного хеширования в emplaceKey/findKey и (b) выполнять программную предварительную выборку бакета следующей строки. Это ускоряет aggregation по нескольким строковым/сериализованным ключам за счет скрытия latency промахов кэша hash table. #104475 (Amos Bird) (Alexey Milovidov).
- Кэш условий запроса для таблиц
Iceberg. #102115 (Konstantin Vedernikov).
- Оптимизированы
cramersV, cramersVBiasCorrected, theilsU и contingency при использовании с оконными функциями. Закрывает #83521. #93384 (Nihal Z. Miaji).
- Добавлена оптимизация запроса, которая переписывает
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N) в dictGet('dict', 'a', key), чтобы избежать получения ненужных атрибутов словаря. Управляется настройкой optimize_dictget_tuple_element (включена по умолчанию). #100186 (Alexey Milovidov).
- Включена buffering для шагов сортировки на initiator в distributed queries с сортировкой. #100661 (Nikita Taranov).
- Повышение производительности для
partial_merge JOIN. #100945 (Artem Zuikov).
- Незначительно уменьшено избыточное выделение памяти в
partial_merge JOIN. #100963 (Artem Zuikov).
- Оптимизированы выделение и освобождение памяти за счет кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Снижены накладные расходы на выделение памяти во время S3 multipart-загрузок за счет предварительного выделения внутренних контейнеров отслеживания. #101799 (Gagan Dhakrey).
- Добавлена программная предварительная выборка на этапе probe hash join для снижения latency доступа к памяти при работе с большими hash table; управляется настройкой
enable_software_prefetch_in_join. #102444 (Xiaozhe Yu).
- Оптимизирована структура
MemoryTracker, что повышает его производительность примерно на 25%. #103464 (Azat Khuzhin).
- Выполняется Rewrite предикатов
coalesce(a, b, ...) <op> const и ifNull(a, b) <op> const перед анализом индексов, чтобы первичный ключ по отдельным столбцам и индекс пропуска данных для каждого аргумента могли отсеивать гранулы. Управляется новой настройкой allow_key_condition_coalesce_rewrite (включена по умолчанию). #103468 (Manuel).
- Значительно улучшена производительность запросов при чтении каталогов Iceberg с большими JSON-файлами метаданных за счёт оптимизации обработки экранированных слешей. #103998 (Mohaidoss).
- Устранены накладные расходы кэша несжатых данных индекса, когда кэш отключён (настройка сервера
index_uncompressed_cache_size = 0, это значение по умолчанию). #104063 (Michael Kolupaev).
- Исправлены запросы
ORDER BY ... LIMIT с небольшим limit, которые в сочетании с неселективным фильтром WHERE считывали слишком много гранул. Раньше любой фильтр поверх упорядоченного чтения отключал разбиение задач по диапазонам меток, из-за чего конвейер не мог прерывать выполнение между гранулами и считывал всю part для каждого потока. #104112 (Vladimir Cherkasov).
- Исправлено отсутствие повторного использования кэша размеров hash table после перестановки сторон JOIN. #104131 (Nikita Taranov).
- Когда
fsync_after_insert включён, fsync файлов part теперь выполняется параллельно с использованием пула потоков IO, что ускоряет завершение вставки в wide tables. Полная загрузка 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. Ранее эти helpers имели SIMD-путь только на x86 (SSE2 / SSE4.2), а на ARM переходили к скалярному циклу. Это ускоряет parsing TSV примерно в 2 раза, URL-функции и splitByChar — примерно в 1,3 раза на наборе данных ClickBench hits; parsing очень плотного JSON (поля короче 16 байт с высокой частотой) немного замедляется, что соответствует существующему компромиссу SSE2. #104228 (Alexey Milovidov).
- Чтение данных через тривиальный столбец
ALIAS (например, some_alias['key'], где some_alias ALIAS m) теперь использует тот же путь чтения по подстолбцам, что и при прямом обращении к исходному столбцу, вновь обеспечивая значительную экономию I/O для столбцов Map, Array, Tuple и Nullable, определённых через alias. #104245 (Raúl Marín).
- Снижена конкуренция за блокировки на пути асинхронного чтения из удалённой FS за счёт перевода
AsyncReadCounters в lock-free режим на уровне отдельного запроса. #104374 (Nikita Mikhaylov).
- Немного улучшен план запроса для упорядоченного сканирования проекций. #103723 (Mikhail Artemenko).
optimizeUseNormalProjections расширен и теперь также обрабатывает частный случай, когда ничего не было отфильтровано, но ключ сортировки проекции позволяет убрать этап сортировки из плана запроса. #104680 (Mikhail Artemenko).
- Разрешена корректная работа синтаксического сахара
json.path[] и явных подсказок типа для типизированных путей JSON. #99179 (Pavel Kruglov).
- Оптимизировано выражение
json.path[N].nested.path (которое разворачивается в tupleElement(tupleElement(json.path[N], 'nested'), 'path')) в json.path[].nested.path[N], что позволяет читать значительно меньше данных. #99802 (Pavel Kruglov).
- Оптимизированы проверки доступа для
SHOW TABLES в system.parts: проверки grant на уровне database вынесены из цикла по отдельным table. #100860 (Shaohua Wang).
- Удалена избыточная проверка доступа
SHOW TABLES для каждой table в быстром пути SELECT name / SELECT database, name для system.tables. #100881 (Shaohua Wang).
- Включена JIT-компиляция на macOS. #100947 (Alexey Milovidov).
- Откладывание политики строк после
FINAL теперь пропускается, если она зависит только от столбцов ключа сортировки и является детерминированной; также в этом случае пропускается связанное откладывание PREWHERE, которое ранее вызывала политика строк. #102884 (Yarik Briukhovetskyi).
- Добавлена поддержка
hasAny и hasAll в качестве предикатов фильтра для текстовых индексов. #103266 (Anton Popov).
- Долгоживущее состояние кучи MergeTree (метаданные на уровне отдельных частей и таблиц) перенесено в выделенную arena jemalloc, доступную через асинхронные метрики
jemalloc.mergetree_arena.*. Это уменьшает фрагментацию arena по умолчанию в установившемся режиме и не позволяет долгоживущим объектам отдельных частей удерживать страницы, которые иначе могли бы быть освобождены. #104136 (Raúl Marín).
- Улучшена обработка тайм-аута клиента ZooKeeper под высокой нагрузкой, когда множество запросов передаются конвейером в одном сеансе. Теперь клиент ZooKeeper использует тайм-аут на основе прогресса: пока от server поступают какие-либо данные в пределах
session_timeout_ms, ожидание продлевается. При этом жесткое ограничение в 3 * session_timeout_ms на запрос по-прежнему ограничивает latency вызывающей стороны. Закрывает #100466. #104351 (Antonio Andelic).
- Флаги трассировки для отдельных событий перенесены в отдельный массив и теперь выделяются лениво, что снижает overhead трассировки
ProfileEvents. #105030 (Azat Khuzhin).
- Добавлен
compareTrackAt для ColumnDecimal, что повышает производительность сравнений для столбцов Decimal. #105110 (Artem Zuikov).
- Добавлена SIMD-реализация
MD5 (AVX2 / AVX512), которая хеширует несколько входных данных параллельно, повышая пропускную способность. #105161 (Joanna Hulboj).
- Улучшен вывод справки во всех приложениях ClickHouse:
--help теперь всегда возвращает код выхода 0, пишет в stdout, а clickhouse --help верхнего уровня выводит список всех подкоманд. Также добавлены опция --no-sudo для clickhouse start / restart (полезно в Docker) и подкоманда clickhouse help. Продолжение #58244 от @qoega. #98148 (Alexey Milovidov).
- Значение
input_format_column_name_matching_mode по умолчанию изменено с match_case на auto. Форматы ввода, сопоставляющие имена входных столбцов со схемой таблицы (JSONEachRow, CSVWithNames, JSONColumns, BSONEachRow, RowBinaryWithNames и т. д.), теперь сначала пытаются выполнить регистрозависимое сопоставление, а если совпадений нет — переходят к регистронезависимому. Прежнее строгое поведение сохраняется в режиме compatibility. #104320 (Alexey Milovidov).
- Добавлен
STDDEV как регистронезависимый псевдоним stddevSamp для совместимости с PostgreSQL/стандартом SQL. #105120 (Alexey Milovidov).
- Добавлен
array_to_string как регистронезависимый псевдоним arrayStringConcat для совместимости с PostgreSQL. #105121 (Alexey Milovidov).
- Добавлен
unnest как регистронезависимый псевдоним arrayJoin для совместимости с PostgreSQL (в форме вызова функции). #105124 (Alexey Milovidov).
- Индикатор выполнения в
clickhouse-client теперь рядом с оперативной памятью показывает объём временных данных на диске (например, при внешней сортировке, aggregation или JOIN), включая разбивку по хостам для распределённых запросов. #105190 (Alexey Milovidov).
- Добавлен
system.predicate_statistics_log — новый выборочный журнал селективности фильтров-предикатов и отсечения индексных гранул MergeTree для каждого запроса. По умолчанию отключён; включается через настройку сервера predicate_statistics_sample_rate. Нужен для автоматических рекомендаций по индексам и проекциям. #98727 (Yarik Briukhovetskyi).
- Разрешено пропускать локальный сегмент с отсутствующей таблицей, если включён
skip_unavailable_shards. #100141 (Alexey Milovidov).
- Добавлены предупреждения при запуске (видимые в
system.warnings), если массив Linux mdraid повторно синхронизируется или находится в деградированном состоянии, поскольку в обоих случаях это может влиять на производительность дискового IO или указывать на сбои дисков. #100941 (Alexey Milovidov).
- WASM UDF теперь отображаются в
system.functions с корректно заполненными столбцами origin (WasmUserDefined), syntax, arguments и returned_value на основе метаданных типов ClickHouse. Ранее они либо отсутствовали, либо отображались как дубликаты с неверным значением origin. #101053 (Vasily Chekalkin).
- Функция таблицы
generate_series теперь поддерживает отрицательные значения шага для генерации убывающих последовательностей, например SELECT * FROM generate_series(99, 0, -1). #101056 (Alexey Milovidov).
- Исправлены исключения
Context has expired, возникавшие в некоторых функциях (dotProduct, formatRow, structureToCapnProtoSchema/structureToProtobufSchema, пользовательские функции) при использовании в отложенных путях выполнения, таких как выражения DEFAULT/MATERIALIZED и настройки движка таблицы: теперь эти функции там, где это необходимо, удерживают сильную ссылку на контекст. #101109 (Alexey Milovidov).
- Исправлены ложные логические ошибки
Cache limits violated для приоритетов, созданных с нулевыми лимитами (например, для приоритета файлового кэша на уровне запроса, используемого при включённом enable_filesystem_query_cache_limit). #101428 (Alexey Milovidov).
- Добавлено автоматическое определение региона для конечных точек
s3express. #101520 (Pradeep Chhetri).
- Добавлена поддержка идентификаторов полей для файлов данных при записи в
Iceberg. Закрывает #102322. #102362 (Konstantin Vedernikov).
- Левая панель в веб-интерфейсе (
play.html) теперь прокручивается независимо, остаётся видимой при прокрутке страницы, а при нажатии на таблицу страница прокручивается к области запроса. #102498 (Alexey Milovidov).
- Теперь интерфейс Play можно открыть в новой вкладке через Ctrl/Cmd/Shift+click или средний клик по логотипу ClickHouse на левой панели. #102501 (Alexey Milovidov).
- Добавлены новые метрики для отслеживания памяти, используемой первичными ключами проекций и гранулярностью индекса проекций во всех таблицах. #102587 (Narasimha Pakeer).
max_network_bandwidth_for_user и max_network_bandwidth_for_all_users теперь применяются к операциям чтения/записи в удалённых файловых системах. #103080 (Azat Khuzhin).
- Повышена устойчивость резервных копий в случаях, когда Refreshable Materialized Views постоянно обновляются: решения теперь принимаются на основе состояния таблиц в снимке, а не глобального состояния. #103384 (Nikita Mikhaylov).
SELECT * FROM system.databases теперь всегда показывает базы данных каталога озера данных независимо от настройки show_data_lake_catalogs_in_system_tables. Раньше по умолчанию они были скрыты, что не соответствовало поведению SHOW DATABASES, которое всегда их показывало. #103444 (Alsu Giliazova).
- Значение по умолчанию для настройки сервера
concurrent_threads_soft_limit_ratio_to_cores в коде приведено в соответствие со значением из поставляемого config.xml (2), поэтому планировщик concurrent threads max_min_fair, используемый по умолчанию, ограничивает потоки обработки запросов уровнем 2x от числа ядер даже без использования поставляемого config.xml. #103446 (Alexey Milovidov).
- Повышена надёжность sanitizer в парсере и в пограничных случаях строковых функций: добавлена обработка пустого ввода в
getURLScheme, предотвращена арифметика с нулевым указателем в проверках max_query_size в Lexer::nextToken, а также добавлено раннее завершение вычисления UTF-8-подпоследовательности для пустой входной строки до декодирования. #103489 (Yakov Olkhovskiy).
- Повышена корректность определения монотонности для
divide(0, x) и intDiv(0, x): ранее эти функции безусловно считались монотонными, но 0 / x немонотонна на любом диапазоне, включающем 0, поскольку 0 / 0 не определено (NaN/Inf для divide, исключение деления на ноль для intDiv). Это ошибочное предположение приводило к тому, что KeyCondition::applyMonotonicFunctionsChainToRange формировал диапазоны с left > right, что вызывало LOGICAL_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 теперь откатываются, а неудачные шаблоны поиска переключаются на fallback-поисковики, что позволяет избежать несогласованного состояния. #103864 (Yakov Olkhovskiy).
- Реализован
sched_getcpu через rseq TLS в glibc-совместимом musl. #104016 (Azat Khuzhin).
- Replicated refreshable materialized view в режиме APPEND больше не будет обновляться дважды, если во время обновления соединение с ZooKeeper кратковременно прерывалось. #104051 (Michael Kolupaev).
- Для таблиц Distributed без явного списка столбцов теперь разрешена проверка ключей сегментирования по выведенной структуре удалённой таблицы. #104111 (Yue).
- Исправлена работа REST-каталога с путём
Azure abfss. #104120 (Konstantin Vedernikov).
- Настройки аутентификации
role_arn и role_session_name теперь учитываются в S3-клиенте снимков Keeper, что позволяет использовать при загрузке снимков аутентификацию на основе STS AssumeRole. #104140 (Alexey Milovidov).
- Исправлена утечка памяти при выполнении запросов с
MATERIALIZED CTE. #104153 (Alexey Milovidov).
- Исправлено Исключение
lowerUTF8 / upperUTF8 при обработке больших наборов данных с не-ASCII-символами (например, при сборке текстовых индексов), когда накопленный выходной буфер мог превысить 2 GiB; чрезмерно длинные отдельные строки теперь отклоняются с понятной ошибкой. #104229 (Shaohua Wang).
- Повышена устойчивость загрузки статистики столбцов MergeTree к временным сбоям I/O, чтобы предотвратить постоянное отключение оптимизаций на основе статистики для затронутых частей. #104372 (zoomxi).
- Для
INSERT INTO ... SELECT FROM input(...) больше не требуется grant 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).
- Добавлено заключение shell-аргументов, сформированных из CLI-опций и разобранного ввода, в кавычки в
clickhouse install и clickhouse git-import, чтобы пути, имена пользователей и групп, а также хеши коммитов, содержащие пробелы или shell-метасимволы, обрабатывались корректно. #105232 (Raúl Marín).
- Движок таблицы
Alias больше не является экспериментальным и доступен без настройки allow_experimental_alias_table_engine. #103488 (Alexey Milovidov).
- В
clickhouse-benchmark добавлена опция --queries-format, позволяющая выбирать между используемым по умолчанию форматом ввода tsv с экранированием табуляций и одним запросом на строку и разбором стандартного ввода как скрипта из нескольких запросов, разделённых ; (script). #99972 (Aleksandr Musorin).
- Поэлементные операторы Tuple
tuplePlus, tupleMinus, tupleMultiply, tupleDivide, tupleModulo, tupleIntDiv и tupleIntDivOrZero теперь являются вариадическими и принимают две или более Tuple одинакового размера, применяя операции поэлементно как левую свёртку. Ранее они принимали только ровно два аргумента. #104659 (Aruj Bansal).
- Добавлен новый встроенный web UI по адресу
/processors-profile, который визуализирует конвейер любого ранее выполненного SELECT-запроса в виде heatmap на основе данных из system.query_log и system.processors_profile_log. Каждый processor окрашивается в соответствии со значением elapsed_us, а при наведении показывает статистику по processor’у (строки, байты, время ожидания). #104614 (Nikita Mikhaylov).
- Настройка
query_plan_use_logical_join_step (и её alias query_plan_use_new_logical_join_step) теперь Obsolete и не имеет эффекта; логический шаг JOIN теперь используется всегда. #104017 (Vladimir Cherkasov).
- Поле ввода
user в play.html и на других встроенных веб-страницах (dashboard.html, jemalloc.html, merges.html, binary.html, webterminal.html) больше не заполняется заранее буквальным текстом default. Теперь оно показывает placeholder user и по умолчанию остаётся пустым. Если оставить его пустым, страница не отправляет URL-параметр user= (а auth JSON в WebTerminal не содержит поля user), поэтому сервер использует обычный fallback к пользователю default — и HTTP credentials, переданные по другим каналам (X-ClickHouse-User, HTTP Basic, конфигурация <handler><user> для конкретного handler), больше не overridden. #105254 (Alexey Milovidov).
- Reader
ORC: чтение по смещению (readBigAt) отделено от use_prefetch, чтобы данные с EC-кодированием в HDFS можно было корректно читать даже при use_prefetch = false (например, в Gluten). #103348 (zhanglistar).
- Файлы, загружаемые из
play.html в формате CSVWithNames, теперь используют расширение .csv. #103737 (JackFielding).
- Улучшена валидация входных данных для каталога BigLake. #105117 (Konstantin Vedernikov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено непоследовательное форматирование: теперь система запоминает, было ли выражение заключено в скобки. #92340 (Alexey Milovidov).
- Исправлено корректное сравнение типов Decimal и Float. #94293 (zoomxi).
- Разрешены позиционные аргументы в распределенных запросах. #94359 (simonmichal).
- Исправлен сбой проверки в
DatabaseCatalog::updateDependencies, возникавший при удалении и повторном создании materialized view с тем же именем; также исправлена проблема, из-за которой зависимости представлений могли незаметно теряться при RENAME TABLE или EXCHANGE TABLES, если ссылочные зависимости были пустыми. #98779 (Alexey Milovidov).
- Исправлено аварийное завершение сервера (сбой проверки в
DatabaseCatalog::getTableImpl), происходившее при создании таблицы через ON CLUSTER с UUID, совпадающим с UUID существующей базы данных. #98861 (xiaohuanlin).
- Исправлено использование индекса пропуска данных при чтении данных (при включенной настройке
use_skip_indexes_on_data_read) и существующих патч-частей, созданных легковесными обновлениями. #99543 (Alexey Milovidov).
- Исправлено исключение “Not-ready Set”, возникавшее, когда оптимизатор запросов переносил фильтр с
IN (subquery) в PREWHERE. #100375 (Alexey Milovidov).
- Исправлена ошибка “Cannot find column” при использовании
ADD COLUMN вместе с RENAME COLUMN в одном операторе ALTER TABLE. #100387 (Alexey Milovidov).
- Исправлены представления со смешанными операторами
UNION и INTERSECT/EXCEPT, которые возвращали неверные результаты после DETACH/ATTACH или перезапуска сервера. #100390 (Alexey Milovidov).
- Исправлено исключение “Trying to execute PLACEHOLDER action”, которое могло возникать при стресс-тестировании с AST-фаззером, когда в предложении IN появлялся коррелированный подзапрос. #100398 (Alexey Milovidov).
- Исправлено исключение logical error при вставке в таблицу Iceberg со столбцом
Date, разбитым на партиции с помощью преобразований year, month или day. #100404 (Alexey Milovidov).
- Исправлено использование индекса пропуска данных с несовместимыми данными после изменения типа столбца через
ALTER TABLE MODIFY COLUMN, что могло приводить к сбоям сервера в sanitizer-сборках или к неверным результатам запросов. #100526 (Alexey Milovidov).
- Исправлена утечка учетных данных в
query_log для табличных функций paimonCluster, paimonS3Cluster, paimonAzureCluster и deltaLakeS3. #100529 (JIaQi Tang).
- Исправлена ситуация, при которой
DROP TABLE для таблиц с Kafka engine мог зависать на неопределенное время из-за взаимной блокировки в rd_kafka_consumer_close. #100604 (Alexey Milovidov).
- Жестко заданный список
source_table_engines заменен на поиск во время выполнения через StorageFactory и DatabaseFactory. В DatabaseFactory::EngineFeatures добавлен source_access_type, чтобы CREATE DATABASE с исходными движками (PostgreSQL, MySQL, S3 и т. д.) требовал тех же привилегий на source, что и CREATE TABLE. Исправлена ошибка, из-за которой GRANT TABLE ENGINE ON * завершался неудачей при table_engines_require_grant=false. Закрывает #71544. #100746 (pufit).
- Исправлен сбой сервера при чтении из таблицы, где столбец
ALIAS содержал коррелированный подзапрос, вложенный в вызов функции (например, ALIAS toString(intDivOrZero(x, (SELECT ...)))). CREATE TABLE и ALTER TABLE теперь отклоняют любые подзапросы на любой глубине в выражениях столбцов DEFAULT / ALIAS / MATERIALIZED с ошибкой THERE_IS_NO_DEFAULT_VALUE. Ранее поверхностная проверка пропускала вложенные подзапросы, поэтому в коррелированном случае происходил сбой при чтении, а вложенный некоррелированный случай выглядел рабочим, но мог приводить к непредсказуемому поведению; теперь оба варианта отклоняются на этапе DDL. #100753 (Groene AI).
- Исправлен сбой сервера (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode), который мог возникать при использовании запросов с коррелированными подзапросами на таблицах с определениями CONSTRAINT ... ASSUME, если включены настройки optimize_substitute_columns и convert_query_to_cnf. #100756 (Groene AI).
- Исправлено исключение, которое могло возникать при вставке строки в JSON-столбец, если эта строка добавляла новое динамическое поле наряду с типизированным полем с несовместимым значением, а затем столбец использовался как ключ GROUP BY. #100758 (Jimmy Aguilar Mena).
- Исправлена ошибка, из-за которой планирование ввода-вывода для рабочей нагрузки незаметно обходилось при записи в S3/объектное хранилище через путь
DiskObjectStorageTransaction (используется дисками s3_with_keeper и явно при use_fake_transaction=false). Ранее INSERT-записи в таблицы семейства MergeTree на таких дисках игнорировали throttling CREATE RESOURCE / CREATE WORKLOAD, потому что ссылка на ресурс никогда не добавлялась в WriteSettings для транзакционного пути записи. #100777 (JIaQi Tang).
- Исправлена коллизия общего кэша схем между
Protobuf и ProtobufList: чтение сообщения сначала как FORMAT Protobuf, а затем как FORMAT ProtobufList могло завершаться ошибкой, потому что ProtobufList принудительно переводил кэшированную схему в формат оболочки. Теперь ProtobufList использует кэшированный тип сообщения, если схема оболочки недоступна. #100849 (Callum Cooper).
- Исправлено переполнение буфера кучи (heap-buffer-overflow) в мосте Rust CXX из-за несовпадения ABI
std::exception. #100931 (Azat Khuzhin).
FunctionVariantAdaptor теперь выбрасывает ILLEGAL_TYPE_OF_ARGUMENT, если все альтернативы Variant несовместимы с функцией, вместо того чтобы молча возвращать Nullable(Nothing). Ранее предикат WHERE function(variant_col), в котором ни один альтернативный тип не был совместим, возвращал 0 строк без ошибки, тогда как в эквивалентном контексте SELECT исключение уже выбрасывалось корректно. #100939 (Vasily Chekalkin).
TRUNCATE ALL TABLES больше не завершается ошибкой, если база данных содержит представления. #100943 (Alexey Milovidov).
- Исправлена оптимизация
optimize_rewrite_array_exists_to_has: теперь она корректно обрабатывает случаи с несовместимыми типами (например, Date и String) и снова включена по умолчанию. #100944 (Alexey Milovidov).
- Исправлен приоритет настроек S3: теперь настройки диска в
storage_configuration переопределяют глобальную секцию <s3>, а настройки на уровне пользователя/профиля/запроса переопределяют и те, и другие. #100975 (Alexey Milovidov).
- Исправлена разреженная сериализация, из-за которой для столбцов BFloat16, Float32 и Float64 терялся знак отрицательного нуля (-0.0). #100983 (Takumi Hara).
- Исправлены две ошибки в парсере геометрии WKT, используемом при чтении WKT-кодированных файлов GeoParquet и Arrow: геометрии
MULTILINESTRING ошибочно разбирались как Polygon (что вызывало исключение для типизированных столбцов и незаметное повреждение данных для смешанных столбцов Geometry), а некорректная строка WKT без ключевого слова типа приводила к неопределённому поведению вместо корректной ошибки. #100997 (Vasily Chekalkin).
- Исправлены запросы
grouping/GROUPING SETS к таблицам Distributed с одним сегментом, которые завершались ошибкой “Method executeImpl is not supported for ‘grouping’ function”. #101030 (Alexey Milovidov).
- Исправлена ошибка
LOGICAL_ERROR “Column identifier is already registered” в планировщике, которая могла возникать, когда одно и то же табличное выражение обрабатывалось несколько раз. #101048 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR “Column identifier is already registered” при использовании настройки
additional_result_filter с запросами UNION или EXCEPT. #101051 (Alexey Milovidov).
- Исправлен сбой сервера (Logical error: Bad cast from ColumnVector to ColumnNullable) при использовании
* APPLY с агрегатными функциями и group_by_use_nulls=1 вместе с GROUPING SETS, ROLLUP или CUBE. #101062 (Groene AI).
- Исправлен бесконечный цикл, возникавший, когда
input_format_csv_skip_first_lines или input_format_tsv_skip_first_lines превышали количество строк в файле. #101111 (Alexey Milovidov).
- Исправлен выход за границы в оптимизации lazy materialization, который мог вызывать исключение в debug-сборках. #101144 (Alexey Milovidov).
- Исправлен вывод типов в рекурсивных CTE: теперь типы столбцов итеративно расширяются через
getLeastSupertype между нерекурсивной и рекурсивной частями UNION ALL до сходимости, что предотвращает целочисленное переполнение в выражениях вида x + 1. #101155 (Alexey Milovidov).
- Настройки размера блоков сжатия в MergeTree (max_compress_block_size, min_compress_block_size, marks_compress_block_size, primary_key_compress_block_size) теперь ограничены значением 256 MiB, чтобы предотвратить сбой сервера при установке экстремальных значений через CREATE TABLE SETTINGS. #101159 (Groene AI).
- Исправлено аварийное завершение с LOGICAL_ERROR в
QueryAnalyzer::resolve(), когда ROW POLICY использует скалярный подзапрос в предложении USING (например, USING (SELECT 1)). Закрывает #100695. #101263 (Groene AI).
- Исправлено неопределённое поведение в
MergeTreeDataPartWriterCompact::cancel, если не удаётся выделить stream. #101292 (Alexey Milovidov).
- Исправлен случай, когда часовой пояс не учитывался при присваивании в операторе ALTER. Закрывает #101328. Связано с https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
- Исправлено аварийное завершение сервера (LOGICAL_ERROR) для запросов INSERT SELECT с ORDER BY ALL, когда конвейер SELECT создаёт несколько streams. #101443 (Groene AI).
- Исправлены некорректные результаты запроса, вызванные тем, что переупорядочивание JOIN проталкивало фильтр INNER JOIN (ссылающийся только на сохраняемую сторону OUTER JOIN) в предложение ON внешнего JOIN. #101504 (Vladimir Cherkasov).
- Отключено применение lazy materialization для планов с arrayJoin, так как это могло приводить к несоблюдению LIMIT. Закрывает #101608. #101644 (Vladimir Cherkasov).
- Исправлены некорректные результаты запросов JOIN, когда оптимизация
mergeFilterIntoJoinCondition молча отбрасывала условие равенства из WHERE при несовпадении типов. #101652 (Xiaozhe Yu).
- Исправлено, что тестовая подсказка
error не работала для ошибок синтаксиса/разбора — раньше -- { error SYNTAX_ERROR } на некорректном запросе завершалось с “Expected server error” вместо сопоставления с клиентской ошибкой разбора. #101675 (Groene AI).
- Исправлено, что
INTO OUTFILE ... TRUNCATE фактически не использовал atomic rename: запись шла напрямую в исходный файл, а не во временный, поэтому при сбое запроса исходное содержимое уничтожалось. Теперь данные записываются во временный файл и переименовываются только при успешном завершении. #101884 (Pablo Marcos).
- Исправлено исключение
Unsupported DeltaLake type: varchar(n) при чтении таблиц Delta Lake, чья схема содержит типы столбцов varchar(n) или char(n). Эти типы теперь сопоставляются с String, что соответствует тому, что протокол Delta Lake хранит их в Parquet как обычные массивы байтов. #101973 (Flavio Malavazi).
- Исправлена незаметная потеря данных при чтении tar-архивов из S3 с
schema_inference_mode=union и неоднородными схемами Parquet — parquet metadata cache ошибочно повторно использовал metadata первого файла для всех последующих файлов в архиве. #101990 (Ahaan Limaye).
- Исправлено аварийное завершение сервера (LOGICAL_ERROR) при выполнении ALTER TABLE UPDATE/DELETE на таблицах Iceberg, если ранее в течение текущего времени работы сервера для этой таблицы не выполнялся ни SELECT, ни INSERT. #102113 (Alexey Milovidov).
- Исправлен возможный сбой при выполнении запроса ALTER на таблицах из in-memory database (например, temporary tables). #102360 (Den Kalantaevskii).
- Исправлено поведение
formatQuery, из-за которого при форматировании обратно совместимых привилегий READ/WRITE для одного и того же source появлялись дублирующиеся grants вида GRANT FILE ON *.*, FILE ON *.* TO x вместо GRANT FILE ON *.* TO x. #102411 (Groene AI).
- Исправлена потеря parallelism для aggregation после запросов read-in-order, когда
max_streams_to_max_threads_ratio больше 1. #102467 (Alexey Milovidov).
- Исправлен сбой (
LOGICAL_ERROR: Unknown virtual column) при выборке subcolumns (например, .null для Nullable, .size0 для Array, элементов Tuple или ключей/значений Map) из таблицы с движком Buffer. #102470 (Groene AI).
- Исправлено Исключение “Cannot fold actions for projection” при оптимизации перестановки JOIN, когда LEFT/RIGHT JOIN с
join_use_nulls комбинируется с другими joins с участием более двух таблиц. #102516 (Alexey Milovidov).
- Исправлено тихое overflow в scalar покомпонентных операциях над numericIndexedVector (например,
numericIndexedVectorPointwiseAdd), когда scalar выходит за допустимый диапазон. Теперь такие входные данные приводят к INCORRECT_DATA вместо возврата поврежденных значений. #102546 (FriendLey).
- Исправлено неконсистентное форматирование AST для INSERT с SAMPLE и OFFSET на уровне запроса. Закрывает #102523. #102547 (zoomxi).
- Исправлено Исключение
LOGICAL_ERROR в groupConcat при десериализации некорректного состояния aggregate function. #102558 (Christoph Wurm).
- Значения Time64 в CSV больше не принимают мусор в конце при
input_format_csv_use_default_on_bad_values=0. Закрывает #102490. #102596 (Yarik Briukhovetskyi).
- Исправлено Исключение UNKNOWN_ELEMENT_OF_ENUM при вставке default value в JSON-столбец с paths типа Enum. Закрывает #102359. #102687 (Pavel Kruglov).
- Исправлено повреждение columns_substreams.txt в некоторых случаях при rename столбца. Закрывает #102259. #102689 (Pavel Kruglov).
- Исправлена вставка в тип данных Time при parsing JSON. Закрывает #102016. #102690 (Pavel Kruglov).
- Исправлено шестнадцатеричное кодирование content sample в именах файлов кэшированной схемы. Закрывает #101904. #102703 (Pavel Kruglov).
- Исправлено нарушение порядка сортировки (сбой в debug, тихая порча данных в релизной сборке) при merge в
SummingMergeTree, когда ключ ORDER BY представляет собой hash-выражение по столбцу Float32, содержащему signaling NaN-значения. #102791 (Groene AI).
- Операции
DETACH DATABASE ... SYNC и другие операции, вызывающие waitDetachedTableNotInUse, теперь можно отменить через KILL QUERY, и они корректно реагируют на остановку server, что предотвращает зависания на неопределённое время, когда параллельный запрос удерживает ссылку на table. #102804 (Antonio Andelic).
- Исправлен возможный некорректный результат
ANY RIGHT JOIN. #102893 (Nikita Taranov).
- Исправлена ошибка, из-за которой запросы к S3 завершались с
ios_base::clear: unspecified iostream_category error вместо повторной попытки; причиной было то, что Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda).
- Исправлена ошибка, из-за которой table function
input('auto') завершалась сбоем через HTTP interface в запросах INSERT SELECT. #102902 (Miсhael Stetsyuk).
- Отключена тривиальная оптимизация LIMIT с row policies/additional_table_filters (чтобы разрешить параллельный index analysis). #102921 (Azat Khuzhin).
- Скрыт secret key в SQL-функции
HMAC. Исправление #102927. #102997 (Mikhail f. Shiryaev).
- Исправлено исключение
MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшее в distributed queries, которые несколько раз ссылаются на один и тот же вызов quantile (например, в SELECT, HAVING и ORDER BY) при включённом optimize_syntax_fuse_functions. #103014 (tanner-bruce).
- Исправлен случай, обнаруженный CI, когда передавался неготовый set, если filter зависел от столбца в левой части. Закрывает #102966. #103029 (Yarik Briukhovetskyi).
- Исправлена
castOrNull для JSON в некоторых случаях. Закрывает #101818. #103036 (Pavel Kruglov).
- Исправлен случай, когда
SELECT DISTINCT молча возвращал неполные результаты, если aggregate projection соответствовала запросу, но у некоторых частей table отсутствовали данные projection (например, projection была добавлена в table, которая уже содержала данные, и MATERIALIZE PROJECTION не был выполнен). Закрывает #102951. #103052 (Nihal Z. Miaji).
- Исправлено исключение
TOO_FEW_ARGUMENTS_FOR_FUNCTION, возникавшее, когда predicate в WHERE, такой как AND(OR(A, A), A), сворачивался в единственный аргумент верхнего уровня при извлечении common expression в analyzer. #103072 (Peng).
- Исправлена logical error
Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшая при вычислении if/ifNull для кортежей, Map и массивов, содержащих элемент QBit. ColumnQBit::structureEquals некорректно сравнивал внутренний кортеж одного столбца QBit с внешней обёрткой другого, из-за чего структурно идентичные столбцы QBit считались разными. #103084 (Groene AI).
- Сделано так, чтобы
DETACH DATABASE с database_atomic_wait_for_drop_and_detach_synchronously учитывал KILL QUERY, а не зависал на неопределённое время, когда удерживается ссылка на таблицу. #103095 (Alexey Milovidov).
- Исправлен segfault при удалении модуля WASM с использованием предиката, не являющегося идентификатором (например,
WHERE 1=1). #103101 (Joe Redfern).
- Исправлено нарушение обратной совместимости, из-за которого старые клиенты завершались с
UNEXPECTED_PACKET_FROM_SERVER при вставке данных в более новый сервер через remote() или distributed таблицы; причиной был безусловный вызов sendProgress в конце processInsertQuery. #103148 (Sema Checherinda).
- Для
IN с неконстантным вторым аргументом-кортежем нельзя приводить элементы кортежа через CAST к типу левой части, так как это может вызвать overflow. Закрывает #103055. #103169 (Yarik Briukhovetskyi).
- Исправлено использование неинициализированного значения в функции протокола. #103187 (Pavel Kruglov).
- Исправлен
LOGICAL_ERROR (Bad cast … to ColumnLowCardinality) при анализе индекса MergeTree, когда предложение WHERE сравнивает ключевой столбец LowCardinality с константой, приведённой к типу, содержащему вложенный LowCardinality (например, Variant(LowCardinality(Date), String)). #103211 (Groene AI).
- Исправлена
Logical error: 'index < bucket_count' в семействе aggregate function timeSeries*ToGrid (например, timeSeriesResampleToGridWithStaleness, timeSeriesChangesToGrid, timeSeriesResetsToGrid, timeSeriesRateToGrid) при вызове с экстремальными параметрами временных меток, которые приводили к overflow в знаковой 64-битной арифметике при вычислении числа бакетов. Кроме того, общее число бакетов сетки теперь ограничено 16 миллионами, чтобы предотвратить случайное выделение большого объёма памяти из-за вредоносных входных данных. #103223 (Groene AI).
- Исправлено исключение
Logical error: 'Port is already connected', возникавшее при расширении конвейера в отложенном пути FINAL для ReplacingMergeTree. Ошибка затрагивала запросы с query_plan_optimize_lazy_final = 1, когда ReadFromMergeTree::initializePipeline вставлял внутренние преобразования (например, Resize), которые соединяли processors подконвейера между собой, из-за чего LazyUnorderedReadFromMergeTreeSource::expandPipeline пытался подключить выходные порты, уже подключённые ранее. #103230 (Groene AI).
- Исправлены неверные результаты
LIMIT BY и DISTINCT, когда входные данные представляют собой UNION ALL отсортированных подзапросов. Оптимизатор плана запроса ошибочно считал такое объединение глобально отсортированным, из-за чего возвращались лишние строки. #103231 (Nihal Z. Miaji).
- Исправлено возможное падение при вычислении статистики для типа Map с отложенной репликацией. Закрывает #102390. #103273 (Pavel Kruglov).
- Исправлена гонка данных для источников словарей ClickHouse, MySQL, PostgreSQL и XDBC, где
clone() const читает, а isModified() const записывает в одну и ту же строку invalidate_query_response. #103277 (Miсhael Stetsyuk).
- Исправлено некорректное определение монотонности для
Date32. Закрывает #101265. #103283 (Yarik Briukhovetskyi).
- Строки в предаутентификационном TCP-пакете Hello теперь ограничены 64 КБ; также добавлена настройка сервера
handshake_timeout_milliseconds, ограничивающая общее время рукопожатия и не позволяющая неаутентифицированным клиентам потреблять слишком много памяти или удерживать потоки неограниченно долго. #103284 (Sema Checherinda).
- Исправлена ошибка в статистике Parquet ColumnIndex, при которой
min_value > max_value для столбцов String. #103334 (Saurabh Kumar Ojha).
- Исправлена некорректная обработка строк с NULL для входных данных
Nullable(Tuple(...)) в flattenTuple и tupleToNameValuePairs. Теперь flattenTuple сохраняет внешнюю null-карту, поэтому строки с NULL остаются NULL. tupleToNameValuePairs теперь, когда это возможно, меняет тип значения результата на Nullable(T) для входных данных Nullable(Tuple(...)), поэтому строки с NULL дают [('a', NULL), ('b', NULL)] вместо [('a', 0), ('b', 0)]. Если тип элемента нельзя обернуть в Nullable (например, Array), вместо NULL используются значения по умолчанию. Закрывает #103312. #103383 (Nihal Z. Miaji).
- Добавлена проверка на некорректные уплощённые данные Dynamic в Native format. #103392 (Pavel Kruglov).
- Исправлен устаревший RPC, из-за которого репликация зависала после синхронизации снимка. #103406 (Seva Potapov).
- Исправлено аварийное завершение сервера из-за
LOGICAL_ERROR “Cannot pop N rows from X” (в debug- и sanitizer-сборках) при чтении некорректного BSON-документа, содержащего значение, тип BSON которого несовместим с типом целевого столбца внутри столбца Nullable(T) или Array(Nullable(T)). Теперь некорректная строка, как и ожидалось, приводит к корректному исключению ILLEGAL_COLUMN. #103418 (Groene AI).
- Исправлено аварийное завершение сервера в
arrayFill и arrayReverseFill при применении к столбцу Array(String), у которого первая строка пуста, вместе с лямбда-функцией, всегда возвращающей false. В цикле aggregate / sub-array индекс size_t уходил в SIZE_MAX из-за выхода за нижнюю границу диапазона, что затем вызывало чтение за пределами границ в ColumnString::doInsertManyFrom. Это то же семейство ошибок, что и #12263. #103424 (Groene AI).
- Исправлены ACCESS_DENIED / UNKNOWN_TABLE в нижестоящих APPEND RMV с SQL SECURITY DEFINER, когда EXCHANGE в вышестоящем REPLACE RMV переключает identity целевого хранилища в процессе разрешения. #103427 (Alexander Gololobov).
- Столбец
_time теперь заполняется из табличной функции url. #103437 (Nikita Taranov).
- Исправлено потенциальное чтение за пределами буфера в пути распаковки кодека
ALP при обработке некорректного входного потока с недопустимой битовой шириной. #103457 (Raufs Dunamalijevs).
- Исправлена ошибка, из-за которой
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ... мог терять имя кэша при форматировании запроса, из-за чего удалённые узлы синхронизировали все файловые кэши, а не только запрошенный. #103469 (Asish Kumar).
- Исправлена обработка URL-кодированного пути в
deltaLakeAzure. Закрывает #103509. #103525 (Smita Kulkarni).
- Исправлено обращение к уже освобождённой памяти в куче при умножении состояния
AggregateFunction на целое число (например, quantilesExactState(...) * N). В цикле возведения в степень методом двоичного разложения состояние сливалось само с собой, что не определено, если merge агрегатной функции перераспределяет своё внутреннее хранилище. Закрывает STID 0988-40af. #103536 (Groene AI).
- Исправлена редкая ошибка
LOGICAL_ERROR “Part X intersects previous part Y”, возникавшая при запуске таблицы ReplicatedMergeTree, когда две пустые неожиданные части на диске имели пересекающиеся, но не вложенные друг в друга диапазоны блоков. Исключение прерывало поток attach таблицы и не давало таблице запуститься. #103537 (Groene AI).
- Исправлена ошибка
Logical error: Incorrect mark rows for part ... (проверка только в отладочной сборке), которая срабатывала из-за мутаций в таблицах MergeTree с неадаптивной гранулярностью индекса (index_granularity_bytes = 0), у которых последняя метка данных была неполной (надёжнее всего воспроизводилось через DETACH/ATTACH с последующим легковесным DELETE). #103538 (Groene AI).
- Исправлена ситуация, когда
clickhouse-local молча возвращал 0 строк при чтении из псевдофайлов /proc и /sys через табличную функцию file() (например, SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')). #103548 (Ashrith Bandla).
- Исправлена обработка аргумента
max_string_length для движка таблицы GenerateRandom. #103550 (Alex Kuleshov).
- Исправлено маскирование вложенных учётных данных в журналах. #103552 (Vitaly Baranov).
- Исправлено определение SVE, использовавшее инструкции SVE, когда они недоступны. #103568 (Raúl Marín).
- Исправлен разбор аргументов хранилища
GenerateRandom. #103574 (Konstantin Bogdanov).
- Исправлен бесконечный цикл в
WITH FILL для данных, начинающихся с ±inf. #103580 (Konstantin Bogdanov).
- Исправлено молчаливое усечение дробных JSON-чисел при извлечении
JSONExtract в тип Variant. Ранее JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)') возвращал Int64=3, а JSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)') — Int64=3, отбрасывая дробную часть. Теперь дробное значение сохраняется без потерь: если присутствует член Float64/Decimal, значение попадает в него, в противном случае исходный JSON сохраняется в члене String. Типы Variant, содержащие только целочисленные члены (например, Variant(Int64, Int32)), а также прямое извлечение целых чисел (JSONExtract(json, 'Int64'), JSONExtractInt и т. д.) не изменились. #103620 (Groene AI).
- Исправлена ситуация, когда
SYSTEM INSTRUMENT REMOVE без аргументов выдавал std::bad_optional_access (код ошибки 1001) вместо SYNTAX_ERROR (код ошибки 62). #103622 (Pablo Marcos).
- Исправлены logical error и неопределенное поведение в
windowID и оконном представлении tumble при вызове со строкой часового пояса в качестве 3-го аргумента. #103641 (Alexey Milovidov).
- Логирование клиента S3 теперь рассматривает HTTP-ответы 400 с непустым заголовком
x-amz-bucket-region (неверный Region для подписи SigV4) как информативный случай неверного региона, с более понятной строкой в логе вместо общего пути обработки в стиле ошибки. Провайдер учетных данных STS web identity теперь добавляется в цепочку учетных данных S3 только при настроенной web identity, что уменьшает количество ложных предупреждений в развертываниях, где она не используется. Закрывает #99140. #103673 (MeltonSmith).
- Исправлено поведение
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS: теперь команда молча завершается успешно, если база данных не существует, в соответствии с уже существующим поведением для отсутствующей таблицы и прецедентом, заданным DROP TABLE IF EXISTS. Ранее запрос выдавал UNKNOWN_DATABASE, несмотря на IF EXISTS. Закрывает #103629. #103689 (Groene AI).
- Исправлена logical error
Arguments of 'plus' have incorrect data types, которую выбрасывал FunctionBinaryArithmetic::executeImpl2, когда у таблицы MergeTree в ключе сортировки был Array(LowCardinality(...)), а в предложении WHERE использовались plus / minus между этим столбцом и константой Array с другим типом элементов. KeyCondition::getMonotonicityForRange теперь рекурсивно удаляет LowCardinality перед вызовом внутреннего числового dispatch. #103701 (Groene AI).
- Исправлена race condition при динамическом изменении размера cache в 26.1+. #103702 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой skip-индексы
text и bloom_filter на столбцах ALIAS, чье выражение содержало lambda с захваченными константами (например, arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m))), молча игнорировались. #103708 (Anton Popov).
- Исправлено зависание или segmentation fault в
position и positionCaseInsensitive при start_pos, близком к UINT64_MAX, из-за переполнения арифметики указателей. #103766 (Raúl Marín).
- Исправлено неопределенное поведение при разборе
dateTime с двойной дробной частью. #103773 (Yarik Briukhovetskyi).
- Исправлена регрессия корректности данных в 26.x: JIT-скомпилированные
if и multiIf с типом результата Decimal и не-Decimal-литералом (целым числом или числом с плавающей точкой) в одной из ветвей могли молча возвращать значение в 10^scale раз меньше правильного. Медленный путь (без JIT) затронут не был. Обходное решение для затронутых версий: SET compile_expressions = 0. #103809 (Groene AI).
- Исправлена передача токенизатора из text index в поддерживаемые функции. #103826 (Elmi Ahmadov).
- Исправлены неверные результаты из
numbers, generate_series и аналогичных источников, учитывающих диапазон, когда в условии WHERE используется IN или NOT IN по кортежу, элементы которого дедуплицируются до одного ключевого столбца (например, WHERE tuple(number, number) NOT IN (tuple(1, 2))). Закрывает #103660. #103835 (Groene AI).
- Реальный пик потребления памяти у hash join с автоматическим spilling теперь удерживается ниже
max_bytes_before_external_join. Ранее предварительное выделение памяти на основе статистики, удвоение hash table на месте и неограниченные in-memory бакеты в GraceHashJoin по отдельности могли приводить к тому, что запрос превышал настроенный лимит и завершался с MEMORY_LIMIT_EXCEEDED. #103838 (Alexey Milovidov).
- Исправлено зависание при завершении работы
clickhouse-local, если настроены системные журналы (например, text_log или filesystem_cache_log). SystemLogs::flushImpl вызывал BaseDaemon::instance().flushTextLogs(), который генерирует std::bad_cast вне clickhouse-server, из-за чего потоки сохранения продолжали работать, пока pthread_cond_destroy не блокировал уничтожение очередей системных журналов. #103874 (Alexey Milovidov).
- Запросы
MATERIALIZED CTE, у которых body в разных ссылках разрешается в разные выведенные типы столбцов, теперь отклоняются с понятной ошибкой TYPE_MISMATCH вместо аварийного завершения сервера с Bad cast LOGICAL_ERROR. Ранее это происходило, когда body CTE ссылался на идентификаторы из внешней области видимости (например, на alias из проекции вызывающего подзапроса), которые подставлялись как разные константы для каждой ссылки. #103879 (Groene AI).
- Исправлено использование неинициализированного значения в оптимизаторах плана запроса, преобразующих JOIN (
tryConvertAnyOuterJoinToInnerJoin, tryConvertAnyJoinToSemiOrAntiJoin), когда filter над ANY OUTER JOIN содержит недетерминированную функцию, такую как rand, now или rowNumberInAllBlocks. Оптимизатор больше не пытается выполнять constant folding для таких filter и оставляет JOIN без изменений, что также предотвращает некорректные преобразования в INNER/SEMI/ANTI JOIN, которые могли незаметно отбрасывать строки. #103880 (Groene AI).
- Исправлена ошибка use-after-free в
StorageKafka2, которая могла приводить к сбою сервера, если сеанс Keeper заменялся, пока consumer удерживал эфемерные блокировки topic-partition. #103890 (Groene AI).
- Исправлена
LOGICAL_ERROR “Primary key type mismatch”, возникавшая при соединении таблицы EmbeddedRocksDB через JOIN ... USING (key) с подзапросом, у которого ключевой столбец имеет тип, отличный от primary key хранилища (например, Nullable(UInt64), Int64, Decimal). Теперь planner отклоняет DirectKeyValueJoin при несовпадении типов и переключается на HashJoin, который выполняет преобразование типов. #103928 (Groene AI).
SET max_threads = DEFAULT (и то же для max_final_threads и max_parsing_threads) больше не теряет состояние auto. Ранее после сброса одного из этих настроек system.settings показывал вычисленное число ядер (например, 32) вместо 'auto(32)', и server вёл себя так, как будто значение было явно зафиксировано. #103991 (Groene AI).
- Исправлена ошибка
SIZES_OF_ARRAYS_DONT_MATCH при чтении столбцов AggregateFunction(topK(N), String), у которых сохранённый alpha_size был увеличен циклом deserialize+serialize в версии до 25.12. #104002 (Raúl Marín).
- Исправлена уязвимость SQL injection в dictionary source PostgreSQL, Cassandra и XDBC: строковые ключи, содержащие одинарные кавычки, экранировались как
\' (обратный слеш), который эти backend-соединения трактуют как буквальный обратный слеш, а не как escape-последовательность, что позволяло внедрять произвольный SQL в запросы lookup словарей. ExternalQueryBuilder теперь использует для этих backend-соединений стандартное для SQL экранирование ''; dictionary source ClickHouse и MySQL по-прежнему используют экранирование обратным слешем. #104009 (Shaohua Wang).
- Исправлено возможное несоответствие типов при aggregation, когда тип столбца изменялся на LowCardinality или обратно, а min-max projection не была пересобрана. #104013 (Nikita Taranov).
- Исправлен бесконечный цикл query optimization, вызванный тем, что при слиянии выражений не распространялся запрет на удаление неиспользуемых столбцов. #104083 (János Benjamin Antal).
- Исправлена ошибка
LOGICAL_ERROR в StreamingStorageRegistry::renameTable при пакетном переименовании стриминговых table (S3Queue, Kafka, RabbitMQ) за счёт использования отслеживания identity на основе UUID вместо отслеживания по именам. #104101 (Nikita Taranov).
- Исправлены неверные результаты в случае, когда CTE, построенный с
UNION ALL, содержал ветку SELECT DISTINCT, а внешний запрос проецировал только подмножество столбцов CTE. RemoveUnusedProjectionColumnsPass в новом analyzer некорректно удалял неиспользуемый столбец из внутренней projection 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()) (которые округлялись вверх до значения, превышающего фактический максимум), обходили проверку границ и приводили к UB при последующем CAST. Это затрагивало parsing параметров агрегатных функций (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).
- Исправлено аварийное завершение server (
UndefinedBehaviorSanitizer: reference binding to null pointer, segfault в release-сборках) на SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr> при query_plan_optimize_lazy_final = 1. На этапе lazy-FINAL-чтения без пересечений столбец is_deleted исчезал из выходного header, поскольку prewhere использовал его как входной и не добавлял обратно в выходные данные. В результате следующий этап addIsDeletedFilter разыменовывал нулевой указатель ActionsDAG::Node. #104177 (Groene AI).
- При обращении к таблице system.failpoints использовался failpoint, из-за чего он мог отключаться. #104237 (Pedro Ferreira).
- Исправлено
MemorySanitizer: use-of-uninitialized-value в функциях detectLanguage*, когда входные данные содержат символ UTF-8, заканчивающийся ровно на границе buffer. #104257 (Raúl Marín).
- Исправлена logical error (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage), из-за которой прерывался разбор аргументов table function и движков для data lake (icebergS3, deltaLakeS3 и т. д.) при вызове с SETTINGS disk = '...' для disk, чьё базовое Объектное хранилище обёрнуто декоратором, например файловым кэшем. Закрывает #89300. #104258 (Groene AI).
- Исправлен разбор индексных выражений в скобках для столбцов с именем
values, например (values['a']), чтобы они больше не интерпретировались как табличные выражения SQL VALUES. #104312 (Desel72).
- Исправлено аварийное завершение server/
LOGICAL_ERROR в фоновом потоке eviction файлового кэша (SLRUFileCachePriority::collectEvictionInfo), которое могло происходить, когда keep_free_space_size_ratio или keep_free_space_elements_ratio были достаточно высокими, чтобы запустить eviction, при том что все записи кэша уже были перемещены в защищённую очередь SLRU (а probationary была пуста). #104313 (Groene AI).
- Исправлены исключения (
NOT_FOUND_COLUMN_IN_BLOCK, LOGICAL_ERROR, AMBIGUOUS_COLUMN_NAME) при использовании проекций с представлениями UNION ALL, window functions или конфликтами имён между alias и столбцами. Регрессия из #88798. #104317 (Amos Bird).
- Исправлен возможный выход за нижнюю границу диапазона при разборе массивов Postgres. #104322 (Grant Holly).
- Функции, которые возвращают тип, отличный от
Nullable (например, Array, Tuple или Map), теперь принимают аргументы типа Nullable. К затронутым функциям относятся extractAll, extractAllGroups, extractAllGroupsHorizontal, extractAllGroupsVertical, extractGroups, splitByChar, splitByString, splitByRegexp, splitByWhitespace, splitByNonAlpha и alphaTokens. Входные строки со значением NULL теперь дают значение по умолчанию для результирующего типа (например, пустой массив) вместо генерации ошибки “Nested type is not allowed inside Nullable type”. #104326 (Alexey Milovidov).
- Исправлена статистика Iceberg для партиционированной таблицы. Это закрывает #104321. #104329 (Konstantin Vedernikov).
- Исправлена фатальная logical error при запуске server на macOS (и в аналогичных build jemalloc), из-за которой
Jemalloc::verifySetup ошибочно сообщал о несоответствии jemalloc_enable_background_threads, поскольку необязательные 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 (flushes асинхронных вставок, refreshes materialized-view, ошибки разбора, возникающие во внутренних запросах), теперь корректно увеличивают ProfileEvents FailedInternalQuery, FailedInternalSelectQuery и FailedInternalInsertQuery наряду с видимыми пользователю counters FailedQuery, FailedSelectQuery и FailedInsertQuery. Ранее эти внутренние counters оставались равными нулю для сбоев, происходивших до начала выполнения запроса, из-за чего занижался учёт важного класса внутренних сбоев. #104399 (Groene AI).
- Исправлена ошибка
Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}, возникавшая при использовании параметра запроса в настройке base_backup оператора BACKUP или RESTORE (например, BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)). Регрессия появилась в 26.1.5 из-за PR #99205. Закрывает #103324. #104413 (Groene AI).
- Исправлено аварийное завершение сервера при записи в
IcebergLocal/IcebergS3, если после ALTER TABLE ... DROP COLUMN выполняется INSERT с iceberg_metadata_staleness_ms больше нуля. Теперь ALTER инвалидирует локальный кеш файлов метаданных Iceberg, поэтому последующие чтения и записи видят новую схему. #104419 (Groene AI).
- Исправлены
DROP ROLE, DROP USER, DROP SETTINGS PROFILE, DROP ROW POLICY, DROP QUOTA и DROP MASKING POLICY: теперь они удаляют ссылки на удалённую сущность из любых других объектов управления доступом, которые на неё ссылались (например, из списка DEFAULT ROLE пользователя, списка TO профиля настроек или списка grantee у политики строк), и сохраняют очистку на диск. Ранее состояние в памяти выглядело корректным, поскольку SHOW CREATE отфильтровывает неизвестные UUID, но .sql-файлы на диске сохраняли висячие записи ID('<dropped-uuid>'), и ссылки восстанавливались при следующем перезапуске сервера, что приводило к ошибкам ACCESS_ENTITY_NOT_FOUND во время выполнения распределённого запроса. #104427 (Groene AI).
- Исправлено аварийное завершение сервера, вызванное
azureBlobStorage, движком AzureBlobStorage и DeltaLake-on-Azure при использовании строки подключения, в которой URL BlobEndpoint содержит пустой, нечисловой или выходящий за допустимые пределы порт (например, BlobEndpoint=http://host:abc/). Теперь сервер возвращает корректную ошибку BAD_ARGUMENTS вместо аварийного завершения в debug/sanitizer-сборках. #104460 (Groene AI).
- Теперь в качестве имени пользователя в табличных функциях
remote и remoteSecure можно использовать идентификатор без кавычек — так же, как для аргументов базы данных и таблицы. Ранее такой запрос завершался вводящей в заблуждение ошибкой authentication со ссылкой на пользователя default. #104465 (Alexey Milovidov).
- Исправлена
Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N), возникавшая, когда тело SQL user-defined function содержит заключённый в скобки внутренний UNION ALL (например, CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))). #104477 (Groene AI).
- Исправлено поведение
uniqThetaIntersect, при котором функция возвращала мощность первого аргумента вместо 0, когда второй аргумент представляет собой пустое состояние uniqTheta — например, результат uniqThetaMergeStateIf(s, predicate), если предикат исключает все строки. #104529 (Groene AI).
- Исправлено поведение
SHOW TABLES и system.tables, которые молча обрезали список для баз данных DataLakeCatalog, использующих Iceberg REST-каталоги (iceberg-rest, onelake, biglake). Когда сервер каталога разбивал на страницы ответ list-tables или list-namespaces (например, в Microsoft Fabric / OneLake при более чем ~50 таблицах на пространство имен), таблицы на последующих страницах оставались незаметно невидимыми для SHOW TABLES и system.tables, хотя к ним можно было обращаться через прямой SELECT. RestCatalog теперь обрабатывает токен продолжения next-page-token, определённый спецификацией Iceberg REST OpenAPI, как это уже делают PaimonRestCatalog и UnityCatalog. #104531 (Groene AI).
- Табличная функция
input теперь выводит свою структуру из окружающего предложения FORMAT запроса INSERT, когда этот формат имеет фиксированную схему (LineAsString, RawBLOB, JSONAsString и т. д.), поэтому пользователям больше не нужно повторно задавать структуру как input('line String') для этих форматов. #104532. #104533 (Groene AI).
- Обновлён тип данных полей в истории Iceberg с
Int32 на Int64. Закрывает #94176. #104579 (Smita Kulkarni).
- Исправлен
Inconsistent AST formatting LOGICAL_ERROR при разборе вызова функции, где после запятой следует лямбда, например SELECT substring(x, `x` -> `x`). Ранее парсер молча объединял предыдущие аргументы с левой частью лямбды, из-за чего получался вызов с одним аргументом, который уже нельзя было повторно разобрать в то же AST. Теперь сохраняется исходная арность функции. #104626 (Groene AI).
CHECK TABLE t теперь отдаёт предпочтение TEMPORARY таблице перед постоянной таблицей с тем же именем, если не указан квалификатор базы данных, что соответствует приоритету, уже используемому в SHOW CREATE TABLE, DESCRIBE TABLE, OPTIMIZE TABLE и ALTER TABLE. Ранее CHECK TABLE t полностью игнорировал временные таблицы, поэтому завершался с UNKNOWN_TABLE для временной таблицы Log или File, хотя эти движки поддерживают CHECK. Продолжение #100966. #104637 (Groene AI).
- Исправлены завершение работы Keeper и цикл перезапуска, возникавшие, когда
get /keeper/availability_zone отправляется с quorum_reads=true в Keeper без настроенного <placement>. #104663 (myeongjun).
- Исправлена TOCTOU data race в
FutureSetFromTuple::buildOrderedSetInplace, приводившая к logical error. #104673 (Miсhael Stetsyuk).
- Исправлено несколько функций, которые возвращали разные результаты для одного и того же входного значения в зависимости от того, передавались ли аргументы как столбцы или как константы:
bitRotateLeft / bitRotateRight (граничные значения сдвига), length(FixedString) / concatWithSeparator с входами LowCardinality(Nullable), roundDown для NaN и rightUTF8 для некорректного UTF-8. #104710 (Raúl Marín).
- Исправлено поведение
anyHeavy, которая возвращала не-heavy значение, когда наиболее частым значением было значение столбца по умолчанию, а данные находились в нескольких частях MergeTree (путь чтения разреженных столбцов). #104712 (Raúl Marín).
- Исправлено несколько дефектов в обработке ограничений настроек: ограничения
MergeTreeSettings, объявленные для канонического имени настройки, можно было обойти, записав значение через псевдоним этой настройки; проверка ограничения disallowed_values выбрасывала исключение на путях clamp (вторичные запросы, воркеры предложения ON CLUSTER, представления SQL SECURITY DEFINER) вместо того, чтобы молча отбрасывать изменение. #104737 (Raúl Marín).
- Исправлено исключение
LOGICAL_ERROR (Metadata is not initialized), возникавшее при OPTIMIZE TABLE, ALTER TABLE ... DELETE, ALTER TABLE ... ADD COLUMN и других вариантах ALTER для лениво attached-таблиц Iceberg / IcebergLocal / DeltaLake / Hudi, чьи metadata еще не были загружены (обычно после перезапуска сервера или после предыдущей неудачной записи metadata, оставившей на диске поврежденный файл metadata). Теперь операция либо выполняется нормально, если metadata успешно загружаются, либо показывает исходную ошибку загрузки как обычное пользовательское исключение вместо аварийного завершения сервера в отладочных сборках или сборках с sanitizer. #104738 (Groene AI).
- Исправлен segfault из-за use-after-free в
AvroConfluentRowInputFormat. #104751 (Miсhael Stetsyuk).
- Скалярные варианты
numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, numericIndexedVectorPointwiseEqual и numericIndexedVectorPointwiseNotEqual теперь выдают INCORRECT_DATA, если вызываются со скаляром UInt64, превышающим Int64::max. #104784 (FriendLey).
- Исправлена ошибка, из-за которой ручное переопределение настройки через имя её псевдонима (например,
SET enable_analyzer = 1 вместо SET allow_experimental_analyzer = 1) после применения настройки compatibility могло быть отменено последующим изменением настройки compatibility. #104829 (Raúl Marín).
- Исправлена проблема, из-за которой AWS logger отключался после https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d. #104837 (Konstantin Bogdanov).
- Исправлены ещё три функции, возвращавшие разные результаты для одного и того же входного значения в зависимости от того, передавались ли argument как столбцы или как константы:
transform (и caseWithExpression через неё) с константным значением по умолчанию Date/Date32/Enum/FixedString, операторы сравнения между String и константным FixedString, а также if/ifNull/nullIf с веткой FixedString при константном условии. #104858 (Raúl Marín).
- Исправлено аварийное завершение сервера
Bad cast from type DB::ColumnConst to DB::ColumnNullable во время partition pruning для таблиц MergeTree, когда выражение партиционирования содержит chain функций, сворачивающуюся в одно константное значение (например, floor(NULL, toRelativeYearNum(...))). #104861 (Groene AI).
- Исправлена data race, обнаруженная
ThreadSanitizer, в конструкторе копирования ContextData: table_function_results копировался из исходного объекта без захвата table_function_results_mutex, поэтому конкурентная запись в Context::executeTableFunction могла пересечься с несинхронизированным чтением в конструкторе копирования. #104879 (Groene AI).
- Исправлены проверки согласованности data part для типов с динамической структурой и добавлено обнаружение повреждённых columns_substreams.txt. Повторная отправка https://github.com/ClickHouse/ClickHouse/pull/103858 с дополнительными изменениями. #104888 (Pavel Kruglov).
- Исправлена гонка между DROP и UNDROP в DatabaseCatalog. #104915 (Azat Khuzhin).
- Исправлено динамическое изменение размера файлового кэша при наличии частично загруженных сегментов, включая восстановление учёта после неудачного вытеснения. #104921 (Antonio Andelic).
DETACH TABLE для временной таблицы (без ключевого слова TEMPORARY) теперь корректно вызывает SYNTAX_ERROR, что соответствует поведению DETACH TEMPORARY TABLE. Ранее команда молча устанавливала внутренний флаг is_detached и завершалась без ошибки. Чтобы удалить временную таблицу, используйте DROP TEMPORARY TABLE или DROP TABLE (последняя команда разрешает временную таблицу через Context::ResolveExternal). Закрывает #103475. #104943 (Groene AI).
- Исправлено поведение table function
filesystem: теперь она учитывает max_memory_usage / max_server_memory_usage при загрузке содержимого файла. Ранее крупные или многочисленные параллельные чтения содержимого могли превышать лимит без MEMORY_LIMIT_EXCEEDED и в итоге завершаться из-за OOM. #104956 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR, возникавший при фильтрации system.detached_tables по uuid (например, SELECT count() FROM system.detached_tables WHERE uuid = '...'). Теперь запрос возвращает ожидаемый результат вместо аварийного завершения сервера. #104979 (Groene AI).
flattenTuple больше не вызывает LOGICAL_ERROR, если его применить к кортежу, чья вложенная структура содержит только пустые листья Tuple() (например, Tuple(c0 Array(Tuple())) или Tuple(c0 Tuple())). Теперь такие входные данные приводят к пользовательскому исключению ILLEGAL_TYPE_OF_ARGUMENT, поясняющему, что результат разворачивания был бы пустым кортежем. #104989 (Groene AI).
- Исправлены аварийное завершение сервера и ошибка, из-за которой запрос мог молча возвращать неверный результат, при выполнении
loop(remote(...)) (или любого loop(), оборачивающего хранилище, которое может откладывать aggregation) с GROUP BY. Ранее внешний planner добавлял MergingAggregatedStep на основе этапа processing, сообщаемого внутренним хранилищем, но LoopSource всегда materialize свой внутренний select с QueryProcessingStage::Complete и выдаёт обычные фрагменты столбцов, поэтому MergingAggregatedTransform приводил к LOGICAL_ERROR (Chunk info was not set for chunk in MergingAggregatedTransform) при enable_parallel_replicas = 1, а в остальных случаях молча отбрасывал внешнюю агрегацию. #105001 (Groene AI).
clickhouse-benchmark --reconnect (без значения) был непреднамеренно сломан в 25.4 изменением, которое превратило --reconnect в целочисленную опцию, требующую значения. Теперь форма без значения снова работает и эквивалентна --reconnect=1 (переподключение для каждого запроса). #105006 (Groene AI).
- Исправлен некорректный JSON-вывод для имён столбцов, оканчивающихся неполными последовательностями UTF-8. #105012 (Pablo Marcos).
- Исправлена незаметная потеря данных после
EXCHANGE TABLES или CREATE OR REPLACE TABLE для исходной таблицы materialized view. Ребро зависимости между исходной таблицей и представлением для MV теперь сохраняется за исходным именем, поэтому оно продолжает срабатывать при вставках. Регрессия была внесена в #98779; восстановлено поведение, существовавшее до неё. #105029 (Sema Checherinda).
- Исправлена ошибка
CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti при JIT-компиляции выражений, преобразующих Float в UInt128, например toUInt128(<Float64 expression>). В резолвере символов JIT отсутствовали builtin-функции compiler-rt для преобразования беззнаковых 128-битных чисел с плавающей точкой в целые. Закрывает #105031. #105048 (Raúl Marín).
- Исправлено поведение, при котором
clickhouse-local не выводил сообщение лога из завершившегося ошибкой запроса, если задан send_logs_level. #105067 (Alexey Milovidov).
- Исправлены некорректные результаты, когда один и тот же parameterized view использовался в одном запросе более одного раза с разными значениями аргументов. Ранее анализатор схлопывал такие вызовы в один, молча отбрасывая все фильтры, кроме первого. #105170 (Alexey Milovidov).
- Исправлено поведение, при котором строка
TOTALS дважды отображалась внизу таблицы результатов в веб-интерфейсе play.html. #103803 (Alexey Milovidov).
- Теперь при векторном поиске отклоняются неконечные векторы (
NaN, ±Inf) — как искомые, так и опорные; ранее они приводили к неопределённому поведению в usearch. #104079 (Groene AI).
- PromQL: исправлен оператор агрегации для пустых векторов. #104425 (Vitaly Baranov).
- PromQL: исправлена обработка ошибок в API запросов Prometheus. #104741 (Vitaly Baranov).
- Исправлена race condition в
MergeTreeTransaction::afterCommit: после потери соединения между записью CSN коммита в ZooKeeper и завершением транзакции ответ COMMIT мог дойти до клиента раньше, чем новые creation_csn / removal_csn становились видимыми в system.parts. #104708 (Tuan Pham Anh).
- Исправлен экспоненциальный рост потребления оперативной памяти в парсере KQL при преобразовании вложенной индексации массивов (
arr[arr[arr[...]]]). #105142 (Alexey Milovidov).
- Исправлены некорректные результаты для
RIGHT ANY JOIN, когда в правой таблице одному ключу соответствовало несколько строк, а выходной block разбивался из-за ограничений по размеру. Закрывает #99431. #102064 (Vladimir Cherkasov).
- Добавлена проверка на переполнение стека в
Avro reader при десериализации вложенных типов. #102417 (Pavel Kruglov).
- Исправлены дублирующиеся строки в
system.completions для настроек MergeTree: каждое имя настройки появлялось дважды, потому что выгружались и getMergeTreeSettings, и getReplicatedMergeTreeSettings, хотя имена настроек у них совпадают. Закрывает #102013. #102015 (Groene AI).
- Исправлено блокирование завершения работы
StorageObjectStorageQueue (S3Queue, AzureQueue) до тех пор, пока частично обработанные файлы не будут полностью прочитаны из Объектного хранилища. Теперь источник немедленно прерывает чтение при завершении работы; дедупликация гарантирует, что строки, уже переданные в целевую таблицу до завершения, не будут дублироваться при повторной обработке файла при следующем запуске. #103126 (Tuan Pham Anh).
- Исправлена вставка нескольких блоков в движок таблицы
Alias с insert_deduplication_token, чтобы сохранялись все блоки. #103246 (Enric Calabuig).
- Исправлено поведение
JSONHas и JSONExtractBool для нативных столбцов JSON, которые возвращали извлечённое значение (приведённое к UInt8) вместо 0/1. #103313 (zxuhan7).
- Входной формат
CustomSeparated защищён от некорректных или злонамеренных данных, в которых отсутствует format_custom_row_after_delimiter. Обнаружение заголовка, вывод схемы и строки с переменным числом столбцов ранее без ограничений накапливали поля и могли выделить много гигабайт памяти до сбоя. Теперь чтение завершается с INCORRECT_DATA, если одна строка содержит более 1,000,000 полей. #103404 (Groene AI).
- Исправлен
RESTORE реплицируемых таблиц MergeTree, чтобы при Attach восстановленных частей использовался backup_restore_keeper_max_retries вместо обычного бюджета повторных попыток Keeper для вставки. #104610 (Pablo Marcos).
- Исправлены неверные результаты для
WHERE p AND <LowCardinality(Nullable(int)) constant> в таблицах MergeTree. Ранее такие запросы возвращали ноль строк, потому что оптимизация part pruning выводила значение NULL по умолчанию из типа LowCardinality(Nullable(...)) и синтезировала защитное условие notEquals(x, NULL), отсекая каждую часть. #104767 (Groene AI).
- Исправлен некорректный результат агрегации при группировке по неинъективной функции столбца, который также является ключом партиционирования (например,
PARTITION BY a с GROUP BY intDiv(a, 2) или a % 2). Значения из разных партиций, попадавшие в одну и ту же группу, не сливались, что приводило к дублирующимся строкам групп при allow_aggregate_partitions_independently = 1. #104869 (Nihal Z. Miaji).
- Исправлена гонка при передаче снимка
Keeper, из-за которой снимок мог быть удалён или перемещён в момент его отправки восстанавливающемуся follower. #104941 (Antonio Andelic).
- Исправлена скрытая ошибка с неверным результатом в
hilbertEncode и mortonEncode, при которой неконстантный первый аргумент Tuple (маска диапазона) использовал значения из строки 0’ для вычисления сдвига битов во всех строках. Теперь функции вычисляют значения маски для каждой строки, поэтому результат больше не зависит ни от того, является ли входное значение константным, ни от размера блока. #104992 (Groene AI).
- Исправлено, что
clickhouse-local молча игнорировал пользовательскую конфигурацию (profiles, users, quotas, настройки управления доступом), когда конфигурационный файл автоматически обнаруживался по путям ./clickhouse-local.xml, ~/.clickhouse-local/config.xml или /etc/clickhouse-local/config.xml. Ранее эти настройки применялись только при передаче --config-file или если ./config.xml существовал в текущем каталоге; теперь все пути обнаружения ведут себя согласованно. #105008 (Groene AI).
- Исправлена проблема, из-за которой столбцы
BFloat16 при сравнении со строковым литералом молча возвращали ноль совпадений (например, WHERE bf16_col = '49.9'). #105042 (Raúl Marín).
- Исправлена обработка
CLEAR COLUMN и TTL во время слияний в SummingMergeTree, AggregatingMergeTree и CoalescingMergeTree, когда столбцы, необходимые для слияния, отсутствуют или срок их TTL истёк. Закрывает #101953. #105203 (Antonio Andelic).
- Исправлена гонка между
DNSCacheUpdater::run и Context::reloadClusterConfig: перед разыменованием shared->clusters_config добавлена явная проверка на null. #105220 (Mikhail f. Shiryaev).
- Исправлен
best_effort-парсинг даты и времени для toDateTime64 с точностью ms и ns. #105233 (Kaviraj Kanagaraj).
- Исправлено поведение
OSIOWaitMicroseconds, который сообщал о времени ожидания I/O за весь срок жизни потока, а не в рамках отдельного запроса. #105246 (Mikhail f. Shiryaev).
- Движок таблицы
Hudi теперь выдаёт INCORRECT_DATA (обычное исключение уровня запроса) вместо LOGICAL_ERROR, если файл Parquet в каталоге таблицы не соответствует соглашению об именовании Hudi [FileId]_[FileWriteToken]_[Timestamp].[extension]. Раньше такие имена файлов вызывали исключение в debug-сборках. #105266 (Groene AI).
- Исправлена взаимная блокировка в
ParallelFormattingOutputFormat при сбое планирования: когда scheduleFormatterThreadForUnitWithNumber генерирует исключение (например, CANNOT_SCHEDULE_TASK), элемент оставался в состоянии READY_TO_FORMAT без потока-форматтера для его обработки, что приводило к зависанию. Теперь вызов планирования обёрнут в try/catch, а любой сбой передаётся через onBackgroundException, чтобы коллектор завершался корректно. #105275 (Azat Khuzhin).
- Исправлена незаметная потеря данных в
Distributed async inserts при восстановлении после аварийного завершения: если последний файл .bin в сохранённом батче был целым, а один из файлов в середине — повреждённым, DistributedAsyncInsertBatch::recoverBatch проверял только заголовок последнего файла, после чего sendBatch помечал весь батч — включая неповреждённые файлы — как повреждённый, из-за чего терялись их строки. Теперь заголовок каждого файла проверяется отдельно, поэтому в broken/ перемещается только действительно повреждённый файл, а уцелевшие строки доходят до удалённого сегмента. #105281 (Groene AI).
- Исправлена регрессия в
clickhouse extract-from-config --try: когда конфигурация использовала атрибуты from_env и не содержала элемента include_from (или содержала его, но он указывал на отсутствующий файл), все подстановки from_env молча отбрасывались и возвращались как пустые строки. Это ломало определение порта в Docker entrypoint в 26.2.5. Закрывает #101704. #105283 (Groene AI).
- Исправлена ошибка
INSERT INTO в таблицу SQLite, из-за которой при вставке значения типа Enum, JSON или AggregateFunction, чьё текстовое представление содержало одинарную кавычку, возникала синтаксическая ошибка SQLite. Настройка output_format_values_escape_quote_with_quote теперь учитывается соответствующими сериализациями (раньше это работало только для String и FixedString). #105285 (Groene AI).
- Исправлена ошибка
Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists, возникавшая в распределённых запросах с allow_push_predicate_ast_for_distributed_subqueries = 1 (по умолчанию), когда кортеж GLOBAL IN сопоставлялся с подзапросом, в проекции которого есть дублирующиеся имена столбцов, например (x, y) GLOBAL IN (SELECT number, number FROM numbers(5)). #105290 (Groene AI).
- Исправлено поведение
reinterpret для Array(LowCardinality(...)): раньше во время выполнения возвращалась вводящая в заблуждение ошибка NOT_IMPLEMENTED, а теперь при проверке типов возвращается ILLEGAL_TYPE_OF_ARGUMENT. #105301 (Raúl Marín).
minMap/maxMap (форма с массивом) и minMappedArrays/maxMappedArrays теперь обрабатывают NaN согласованно с ORDER BY: NaN считается последним (возвращается только если все значения — NaN). Раньше результаты зависели от позиции NaN в данных из-за семантики неупорядоченного сравнения IEEE 754 и расходились с формой Map-аргумента у minMap/maxMap, которая была исправлена в #100448. #105331 (Raúl Marín).
- Исправлена утечка памяти в кэше
ColumnsDescription на уровне таблицы для таблиц семейства MergeTree со столбцами Nested. Записи никогда не вытеснялись при циклах ALTER ADD COLUMN/DROP COLUMN, когда share_nested_offsets = 1 (по умолчанию). #105376 (Groene AI).
- Исправлено исключение
BAD_ARGUMENTS “It’s a bug! Only integer types are supported by __bitWrapperFunc”, возникавшее, когда в SELECT с индексом пропуска данных TYPE set(N) атом в WHERE имел тип результата Float, BFloat16 или любой другой нецелочисленный тип (например, WHERE c0 + 0.1 или WHERE log(c0)). В этом случае индекс пропуска данных теперь переключается на обычный путь фильтрации. #105384 (Groene AI).
Улучшения сборки/тестирования/упаковки
- Прекращено использование системных библиотек и заголовочных файлов
compiler-rt. Закрывает #91475. #102857 (Konstantin Bogdanov).
- Обновлён базовый distroless-образ Docker для устранения CVE OpenSSL в
libssl3t64. #103583 (Rahul Nair).
- Во время выпусков GPG-ключ теперь надёжно получается через цепочку из нескольких серверов ключей Ubuntu вместо ожидания тайм-аута на
keyserver.ubuntu.com. #103834 (Mikhail f. Shiryaev).
- Удалены и запрещены проверки
CMake на этапе сборки (check_*, try_compile, try_run). Компилятор и набор инструментов фиксированы, поэтому определение возможностей на этапе конфигурации не требуется и теперь заблокировано на уровне всего проекта; любое поведение, зависящее от версии, должно явно ограничиваться через CMAKE_CXX_COMPILER_VERSION. #103980 (Alexey Milovidov).
libarchive обновлён с 3.8.6 до 3.8.7. #104047 (Robert Schulze).
mongo-c-driver обновлён до 2.3.0. #104300 (Raúl Marín).
- Обновлены зависимости LLVM для 22.x. #104381 (Joshua Carp).
- Обеспечена сборка классов embedded-client и дескриптора PTY на macOS и FreeBSD за счёт использования переносимых POSIX-функций
posix_openpt / grantpt / unlockpt и удаления специфичных для Linux защитных конструкций #if. #104436 (Alexey Milovidov).
librdkafka обновлён до версии 2.14.1. #105222 (János Benjamin Antal).
Обратно несовместимое изменение
- Оператор
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).
- Добавлен автоматический сброс на диск для
hash JOIN и параллельного hash JOIN: при достижении лимита памяти они преобразуются в 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 в процессе squashing в рамках настройки совместимости use_strict_insert_block_limits. #94207 (Kirill Kopnev).
- Добавлена функция
arrayAutocorrelation(arr [, max_lag]), вычисляющая нормализованную автокорреляцию числового массива для каждого лага. Поддерживаются массивы целочисленных типов, типов с плавающей точкой и Decimal. #94776 (Wenyu Chen).
- SQL-функция
obfuscateQuery. Закрывает #98010. #98305 (Xuewei Wang).
- Добавлена поддержка типов Map и JSON/Object в атрибутах словаря. Теперь словари могут хранить и возвращать сложные типы, включая Map(String, String), Map(String, Array(String)), JSON и Nullable(JSON), в структурах FLAT и HASHED. #98627 (yanglongwei).
- Добавлены две новые настройки MergeTree —
replicated_fetches_min_part_level и replicated_fetches_min_part_level_timeout_seconds, которые позволяют репликам пропускать загрузку недавно вставленных (не слитых) частей с других реплик, снижая накладные расходы на репликацию при интенсивной ингестии. #98625 (tanner-bruce).
- Добавлена поддержка индекса пропуска данных MergeTree для JSON-столбцов с использованием JSONAllPaths и типов индексов bloom_filter, tokenbf_v1, ngrambf_v1 и text (inverted), что позволяет пропускать гранулы на основе набора JSON-путей, присутствующих в каждой грануле. #98886 (Pavel Kruglov).
- Функция
printf теперь поддерживает неконстантные строки формата, что позволяет задавать разные шаблоны формата для каждой строки в зависимости от значений столбцов. #98991 (Yash ).
- Добавлен новый индекс-проекция
commit_order, переупорядочивающий данные в порядке вставки. #99004 (Mikhail Artemenko).
- Добавлена функция
highlight, которая оборачивает вхождения искомых терминов в текстовой строке в HTML-теги (по умолчанию <em>/</em>). Поддерживает ASCII-сопоставление без учёта регистра, автоматическое слияние перекрывающихся совпадений и пользовательские открывающие/закрывающие теги. #99131 (Peng).
- Реализованы квоты по хешу нормализованного запроса для защиты публичных сервисов ClickHouse от злоупотреблений. 1. Добавлена поддержка
NORMALIZED_QUERY_HASH в качестве типа ключа квоты — для каждого уникального нормализованного запроса создается отдельный бакет квоты, поэтому CREATE QUOTA q KEYED BY normalized_query_hash отслеживает каждый уникальный запрос независимо. 2. Добавлена поддержка QUERIES_PER_NORMALIZED_HASH в качестве типа ресурса квоты — ограничивает максимальное число выполнений любого отдельного нормализованного запроса в пределах интервала, поэтому MAX queries_per_normalized_hash = 100 не позволяет одному шаблону запроса выполняться более 100 раз. #99586 (Alexey Milovidov).
- Теперь пользователи могут писать JOIN-запросы с использованием синтаксиса
NATURAL JOIN, который автоматически выполняет сопоставление по всем столбцам с одинаковыми именами и устраняет дубликаты этих столбцов в результате. #99840 (Peter Nguyen).
- Добавлена поддержка
SET TIME ZONE 'tz' в качестве псевдонима для SET session_timezone. #99883 (phulv94).
- Добавлена поддержка параметризованных запросов в веб-интерфейсе (
play.html): параметры запроса вида {name:Type} распознаются, и для ввода их значений отображаются соответствующие поля. #100041 (Alexey Milovidov).
- Поддержка стандартного предложения SQL
VALUES как табличного выражения в FROM, например: SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72).
- В оператор
EXTRACT добавлены единицы, совместимые с PostgreSQL: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE, MILLENNIUM. Также исправлен EXTRACT(WEEK FROM date), который ранее выдавал ошибку. #100274 (Alexey Milovidov).
- Добавлена поддержка составных литералов Interval по стандарту SQL с квалификаторами диапазона
TO, например INTERVAL '1:30' HOUR TO MINUTE. Внутри они раскладываются в суммы интервалов. #100453 (Desel72).
- Добавлены асинхронные метрики памяти в буферах приёма и передачи TCP ядра (
sk_rmem_alloc, sk_wmem_alloc) для сокетов пула HTTP-соединений, представляемые в виде процентилей p50/p75/p90/p95 и суммарных значений по каждой группе соединений. #100575 (Sema Checherinda).
- Добавлен веб-интерфейс jemalloc для просмотра данных профилирования ClickHouse Keeper, доступный по адресу
/jemalloc на порту управления по HTTP. #100606 (murphy-4o).
- Добавлена команда
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x' для режимов ordered и unordered. #100709 (Bharat Nallan).
- Добавлена функция
JSONAllValues, которая возвращает все значения из столбца JSON как Array(String); значения сериализуются в текстовое представление и упорядочиваются по именам путей. Добавлена поддержка текстового индекса для выражения JSONAllValues в столбцах JSON. Когда текстовый индекс создаётся для JSONAllValues(json_column), он автоматически используется для фильтрации запросов по подстолбцам JSON (например, json_column.key1 = 'value'). #100730 (Anton Popov).
- Добавляет новую настройку
input_format_column_name_matching_mode, которая позволяет задавать разную чувствительность к регистру для форматов ввода. #99346 (manerone).
- Добавлена команда
watch в clickhouse-keeper-client, а в командах get, exists и ls — поддержка наблюдения. #100834 (Den Kalantaevskii).
- В ClickHouse Keeper добавлены запрос
getChildrenRecursive (ListRecursive) и команда lsr в clickhouse-keeper-client. Это закрывает #99916. #100998 (Konstantin Vedernikov).
- Добавлена новая функция
arrayTranspose, которая принимает двумерный массив (матрицу) и транспонирует его: SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]]). #101214 (Vitaly Baranov).
- У настройки
auto_statistics_types mergetree значение по умолчанию — 'minmax, uniq' — статистики minmax и uniq теперь автоматически создаются для всех подходящих столбцов в новых таблицах - у materialize_statistics_on_insert значение по умолчанию — false — статистика теперь строится во время слияний, а не при вставке, что снижает накладные расходы на вставку. Используйте SET materialize_statistics_on_insert = 1, чтобы восстановить прежнее поведение. #101275 (Han Fei).
- Добавлена настройка
prefer_dependency_replica для обновления цепочек зависимостей materialized view, чтобы сократить потери данных из-за задержки репликации между репликами. #101591 (Seva Potapov).
- Добавлена функция
hasPhrase (псевдоним matchPhrase) для поиска по фразам (непрерывным последовательностям токенов). Поиск выполняется методом полного перебора, то есть текстовый индекс его пока не поддерживает. #101997 (Elmi Ahmadov).
- Добавлены метрики-гистограммы
s3_read_request_duration_microseconds и s3_read_request_bytes, чтобы отслеживать время жизни соединений для запросов S3 GET и объём потребляемых байтов; они доступны в system.histogram_metrics и в конечной точке Prometheus. #102058 (Sema Checherinda).
- Значения
Date и Date32 теперь можно складывать со значениями Time и Time64 с помощью оператора +, получая результат типа DateTime или DateTime64. Например, SELECT toDate('2024-01-15') + toTime('14:30:25') возвращает 2024-01-15 14:30:25. Результат вычисляется с учетом часового пояса сеанса, а результаты, выходящие за допустимый диапазон, обрабатываются в соответствии с настройкой date_time_overflow_behavior. Закрывает #95914. #102421 (Nihal Z. Miaji).
- Текстовый индекс теперь имеет статус GA и остается включенным независимо от настройки
compatibility, что предотвращает его неожиданное отключение при восстановлении из резервных копий или работе в режиме совместимости. #101518 (Nikita Fomichev).
Экспериментальные возможности
- Добавлена команда
ALTER TABLE ... EXECUTE remove_orphan_files для таблиц Iceberg, позволяющая выявлять и удалять файлы без ссылок из Объектного хранилища. #99127 (murphy-4o).
- Добавлена настройка
query_plan_optimize_join_order_randomize, которая случайным образом изменяет статистику, используемую для переупорядочивания JOIN, что полезно для тестирования. #100643 (Vladimir Cherkasov).
- В ClickHouse добавлена поддержка функции ИИ, позволяющая пользователям вызывать конечные точки OpenAI и Anthropic с помощью SQL.
aiGenerate стала первой такой функцией. #100831 (George Larionov).
- Добавлены функции ИИ:
aiClassify, aiExtract и aiTranslate для использования API LLM в ClickHouse. #100832 (George Larionov).
- Добавлена
system.histogram_metric_log — новая системная таблица, которая периодически создает снимки всех гистограммных метрик (например, задержек S3/Azure и длительности этапов обработки запросов Keeper). Кроме того, столбец value таблицы system.histogram_metrics изменен на Float64, так как этот тип более гибок и лучше совместим с моделью данных Prometheus. #103046 (Miсhael Stetsyuk). Структура таблицы, вероятно, изменится в будущих релизах.
- ClickHouse теперь может исключать целые части данных в SELECT-запросах на основе статистики min/max. #94140 (zoomxi).
- Снижена конкуренция за блокировки при операциях только для чтения в таблицах ReplicatedMergeTree с завершёнными мутациями. #95771 (Eduard Karacharov).
- Параметр
optimize_read_in_order теперь учитывается при чтении проекций. Закрывает #89453. #95885 (Andrey Zvonov).
- Небольшие улучшения в Hash JOIN и параллельном хеш-соединении. #96663 (Yarik Briukhovetskyi).
- Оптимизировано преобразование
DISTINCT за счёт отключения оптимизации для столбцов LowCardinality, если входные данные почти полностью состоят из уникальных значений. #97113 (Nihal Z. Miaji).
- Оптимизация производительности запросов
LIKE из #97723. Теперь эти запросы могут использовать текстовые индексы. #98149 (Elmi Ahmadov).
- Векторизованные математические функции (
exp, log, sigmoid, tanh) теперь работают быстрее на AArch64 (с использованием NEON/SVE), а также на FreeBSD/Darwin, где раньше использовалась более медленная скалярная реализация. #98230 (Raúl Marín).
- В запросах, фильтрующих по столбцам первичного ключа
MergeTree с помощью regexp-альтернаций из строковых литералов, таких как ^(abc-1|abc-2), теперь можно использовать отсечение по первичному ключу, если альтернативы имеют общий префикс. #98988 (Yash ).
- Динамическая фильтрация top-k для
ORDER BY ... LIMIT обобщена и теперь поддерживает типы Nullable, String и COLLATE. #99033 (murphy-4o).
- Ускорен hash JOIN по ключам
Int32 и Int64 с небольшим диапазоном благодаря использованию хеш-таблицы с прямой индексацией. #99275 (Hechem Selmi).
- Более быстрые несмежные запросы к столбцам
LowCardinality с одним словарём. #99285 (Ivan Babrou).
- Ускорены функции
var*Stable и stddev*Stable для столбцов Float64 благодаря девиртуализации внутреннего цикла. Примечание: это позволяет задействовать оптимизации компилятора (FMA/регистры), которые изменяют результаты вычислений с плавающей запятой на уровне ULP. #99460 (Riyane El Qoqui).
- Используется оптимизированное кодирование Firedancer base58 для входных данных размером 32/64 байта (автоматически для
base58Encode). Также можно использовать оптимизированное декодирование base58, если результат декодирования имеет размер 32/64 байта (явно через base58Decode('...', 32) или аналогичным образом). #99461 (Joanna Hulboj).
- Включены оптимизации на основе секций компоновщика (
-ffunction-sections, -fdata-sections, --icf=all) для уменьшения размера бинарного файла и более эффективного использования кэша инструкций. #99474 (Alexey Milovidov).
- Исправлено ухудшение масштабируемости для коротких запросов с агрегацией на машинах с большим числом ядер. Когда запрос читает мало marks, конвейер после агрегации больше не разрастается до
max_threads, что позволяет избежать накладных расходов из-за почти пустых потоков. #99493 (Alexey Milovidov).
- Повышена производительность запросов с параллельными репликами за счёт правильного выбора размера задачи чтения. #99801 (Nikita Taranov).
- Разрешена предзагрузка при чтении удалённого файла через кэш страниц в пространстве пользователя. #99919 (Alexey Milovidov).
- Устранено лишнее вычисление подстолбца String
.size при перечислении подстолбцов. #99941 (Pavel Kruglov).
- Сделали индикатор прогресса в clickhouse-client более плавным при работе из отеля с кластерами с очень большим количеством реплик. #100145 (Alexey Milovidov).
- Запускается
MemoryWorker в clickhouse-local, когда включен кэш страниц, чтобы кэш страниц в пространстве пользователя действительно мог использоваться. #100306 (Alexey Milovidov).
- Оптимизировано выполнение запросов за счёт переноса условия
LIMIT внутрь UNION ALL. #100364 (Alexey Milovidov).
- Добавлена поддержка JIT-компиляции для сравнений столбцов
String и FixedString в ORDER BY, что повышает производительность сортировки на фазе merge на 6–17% для ключей сортировки, в которых преобладают строковые столбцы. В соавторстве с @lgbo-ustc. #100577 (Raúl Marín).
- Когда
read_in_order_use_virtual_row включен вместе с новой настройкой read_in_order_use_virtual_row_per_block, информация о границах виртуальных строк теперь выдается после чтения каждого блока из MergeTree, что позволяет механизму слияния на лету перераспределять приоритеты источников для частей, данные которых полностью отфильтровываются условиями WHERE/PREWHERE/JOIN. Закрывает #99945. #100603 (Vladimir Cherkasov).
- Ускорено преобразование Float в String для больших целочисленных значений за счёт расширения быстрого пути
itoa с помощью совместимого с dragonbox округления. #100649 (Raúl Marín).
- Заменили
dragonbox на zmij, что ускорило преобразование Float-to-String в 1,5–3 раза. #100650 (Raúl Marín).
- Ускорено преобразование
Int128/UInt128 в строку за счёт замены программного деления на редукцию Барретта и разворачивания цикла преобразования. #100671 (Raúl Marín).
- Предотвращено создание лишних потоков при параллельном
merge в uniqExact. #100686 (Jiebin Sun).
- Для
uniqExact добавлено параллельное слияние батчей. #100687 (Jiebin Sun).
- Улучшена распараллелизация запросов с простыми представлениями на базе таблицы
MergeTree, выполняемых в режиме параллельных реплик. #100815 (Igor Nikonov).
- Добавлена поддержка параллельных реплик для простых представлений (включая подходящие представления
UNION ALL над таблицами MergeTree) при parallel_replicas_allow_view_over_mergetree=1. Это позволяет распараллеливать внешний запрос представления вместо внутреннего, что повышает степень распараллеливания запросов между узлами. #100958 (Igor Nikonov).
- Оптимизировано чтение в порядке первичного ключа для
full_sorting_merge при наличии в плане запроса фильтров с IN. #101261 (Nikita Taranov).
- Оптимизация операций выделения/освобождения памяти за счёт кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Исправлена значительная регрессия производительности INSERT при
deduplicate_insert = 'enable' (по умолчанию с версии 26.2): вычисление хеша данных перенесено с этапа squashing в sink, а для хеширования столбцов батча используется updateHashWithValueRange, что сокращает накладные расходы примерно с 2,5 с до 0,5 с для 5 млн строк и 22 столбцов. #101494 (Sema Checherinda).
- Снизили накладные расходы на профилирование блокировок, используя
try_lock, чтобы не замерять время захватов без конкуренции, и убрали измерение времени удержания. #101502 (Antonio Andelic).
- Реализована замена написанных вручную AVX-512 intrinsic-функций в
arrayDotProduct на платформонезависимые автоматически векторизуемые циклы, с добавлением поддержки AVX2 и ARM NEON. #101571 (Peng).
- Повышена производительность
INSERT VALUES для столбцов Map, Array и Tuple, когда значения передаются как экранированные строки (например, '{\'key\':1}'), что позволяет избежать ненужного переключения на парсер SQL-выражений. #102119 (Joanna Hulboj).
- Исправлено чрезмерное использование CPU движком таблицы
RabbitMQ. #102711 (Jaap Elst).
- Оптимизатор порядка JOIN теперь выводит транзитивные предикаты экви-соединения из существующих условий JOIN. Например, для
A.x = B.x AND B.x = C.x распознаётся эквивалентность A.x = C.x, что позволяет оптимизатору рассматривать Direct JOIN между таблицами, связанными транзитивно. Это может улучшить качество плана выполнения для схем «звезда» и «снежинка», где таблицы измерений соединяются через общую таблицу фактов. Эта возможность управляется новой настройкой enable_join_transitive_predicates (по умолчанию отключена). #98479 (Alexander Gololobov).
- Оптимизирован
TRUNCATE DATABASE TABLES LIKE благодаря предварительной параллельной отмене слияний. #98597 (Shaohua Wang).
- Добавлена поддержка монотонности для функции multiply, что позволяет выполнять отсечение данных по первичному ключу для выражений
key * constant. #98983 (Amos Bird).
- Словари cache больше не используют эксклюзивную блокировку в
hasKeys; это уменьшает конкуренцию за блокировки, так как для чтения из cache теперь используется разделяемая блокировка. #100796 (liuguangliang).
- Подзапрос VIEW встроен в дерево запроса, что позволяет применять к VIEW больше оптимизаций. #100830 (Dmitry Novik).
- Ускорена загрузка кэша при запуске сервера. #101500 (Kseniia Sumarokova).
- Реализована отложенная материализация столбцов для ReplacingMergeTree с FINAL при достаточно селективном предикате. #101647 (Nikolai Kochetov).
- Снова включена оптимизация
optimize_rewrite_array_exists_to_has (по умолчанию отключена с версии 23.10). Она преобразует arrayExists(x -> x = elem, arr) в гораздо более быстрый has(arr, elem) и теперь корректно пропускает такое преобразование, если тип элемента массива и elem несовместимы для has (например, Date и String), поэтому запросы, которые раньше ломались, продолжают работать. Закрывает #71431. #100944 (Alexey Milovidov).
- Улучшен вывод EXPLAIN PLAN pretty=1: теперь выводятся выходные столбцы запроса верхнего уровня, показываются метки/обозначения отношений JOIN с оценкой числа результирующих строк и локальности, а также выходные столбцы для каждого шага JOIN/источника. Изменения охватывают часть Information Deficit из #98117. #99462 (Kirill Kopnev).
- Добавлена настройка таблицы семейства MergeTree
share_nested_offsets (по умолчанию true). Если задать false, столбцы типа Array с именами через точку (например, n.a, n.b) будут рассматриваться как независимые столбцы, а не совместно использовать файлы смещений и проверять равенство размеров массивов в рамках устаревшей семантики Nested. #98416 (Amos Bird).
- Теперь в конфигурации users.xml/yaml можно указывать несколько методов аутентификации (в SQL это всегда было возможно). #91998 (Flip-Liquid).
- Автоматическая перезагрузка межузловых соединений Raft, использующих TLS. #93455 (Evgeny).
- Расширена поддержка
cast_keep_nullable для типов Dynamic/JSON. Если параметр включён, приведение NULL из типов, которые могут быть Nullable, вернёт NULL; в противном случае будет сгенерирована ошибка CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).
- Снижен объем памяти, занимаемой внутренними структурами данных (объектами
ISerialization), за счет введения пула объектов. #96563 (Nikita Mikhaylov).
- Добавлена поддержка полей
password и identity в XML-конфигурации клиента Keeper. #96800 (Grigorii Sokolik).
- Улучшена запись в
Iceberg для Unity Catalog. #98162 (Konstantin Vedernikov).
- Добавлена настройка
finalize_projection_parts_synchronously, которая позволяет синхронно финализировать части проекций при INSERT, снижая пиковое потребление памяти у таблиц с большим числом проекций и сохраняя при этом существующее асинхронное поведение по умолчанию. #98228 (Amos Bird).
- Добавлен столбец
projections_duration_ms в system.part_log, который фиксирует длительность слияния/перестроения для каждой проекции в миллисекундах. #98292 (Amos Bird).
- Улучшена отмена запросов, использующих ExpressionTransform и NumbersRangedSource, с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #98908 (Roman Vasin).
- Жестко заданный список
source_table_engines заменен на lookup во время выполнения через StorageFactory::getAllStorages(). Это добавляет проверки доступа для некоторых ранее отсутствовавших движков таблиц и закрывает #71544. #98984 (pufit).
- Добавлена настройка для управления поведением при несовпадении типов для Variant и Dynamic (
throw или возврат NULL). #99085 (Bharat Nallan).
- Улучшена совместимость
Iceberg и Spark: исправлена непоследовательная обработка путей, вызванная смешением путей хранилища и путей метаданных; обеспечено, чтобы таблицы Iceberg записывали расположение таблицы либо как URL, либо как абсолютный путь; добавлен резервный механизм для подсчета размеров файлов в Azure, поскольку некоторые средства чтения ClickHouse не поддерживают подсчет байтов после обхода; обработка version-hint.txt приведена в соответствие со Spark; введены абстракции на уровне типов, чтобы в будущем было сложнее перепутать типы путей; добавлены тесты для Azure и Local, проверяющие междвижковую совместимость без промежуточной выгрузки и загрузки; исправлено использование position deletes, которое ранее опиралось на эвристики определения путей там, где такой подход неприменим. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik).
- Исправлена возможная ситуация гонки в
IPartitionStrategy::cached_result, появившаяся в https://github.com/ClickHouse/ClickHouse/pull/92844. #99400 (Arthur Passos).
- Теперь типы данных ClickHouse Interval можно записывать в формате Arrow. #99519 (Peter Nguyen).
- Добавлена встроенная поддержка импорта и экспорта типов данных
UUID в форматах Arrow и Parquet. Теперь пользователи могут напрямую выполнять запросы к UUID-данным и передавать их между ClickHouse и другими инструментами работы с данными без ручного преобразования в строки и других обходных решений. Автоматическое логическое определение для UUID верхнего уровня, а также поддержка явного указания схемы для вложенных UUID. #99521 (Ivan).
- Поддержка архивов
7z в объектном хранилище. Закрывает #70968. #99600 (Alexey Milovidov).
- Добавлены события ProfileEvents
ObjectStorageListedObjects, ObjectStorageGlobFilteredObjects, ObjectStoragePredicateFilteredObjects и ObjectStorageReadObjects для интроспекции конвейера перечисления и чтения файлов в объектном хранилище (S3, Azure и т. д.). #99778 (Sema Checherinda).
- Исправлен сбой табличной функции
merge с ошибкой UNKNOWN_IDENTIFIER при запросе столбцов, присутствующих не во всех базовых распределённых/удалённых таблицах. #99833 (Alexey Milovidov).
- Теперь время коммита включается в общую метрику времени выполнения мутации для ReplicatedMergeTree. Оно перестало учитываться после #96376. #99936 (alesapin).
- Добавлен журнал предзаписи для blob-объектов, ожидающих удаления в
MetadataStorageFromDisk, что повышает надёжность и согласованность метаданных с удалённым объектным хранилищем при удалении объектов. #100019 (Maksim Kita).
- Отключена функция генерации SQL с помощью ИИ (
??) во встроенном клиенте (протоколы SSH и WebSocket), чтобы предотвратить доступ к переменным окружения сервера. #100290 (Alexey Milovidov).
- Изменён интерфейс вставки в Iceberg через каталог. Настройки
storage_catalog_type, storage_aws_access_key_id и т. д. объявлены устаревшими. #100334 (Konstantin Vedernikov).
- При вставке в
clickhouse-client заменять табуляцию на 4 пробела. Закрывает #100405. #100416 (Raúl Marín).
- Сканирование всего удалённого каталога озера данных в поисках подсказок к таблицам «Возможно, вы имели в виду …» больше не выполняется, если
show_data_lake_catalogs_in_system_tables отключён. #100452 (Alsu Giliazova).
- Применение
distributed_index_analysis_min_indexes_bytes_to_activate после отсечения партиций. #100477 (Azat Khuzhin).
- Исправлена ошибка assert при проталкивании bloom filter для Parquet при использовании пустых секций IN/NOT IN. #100543 (zoomxi).
- Статистика MinMax для столбцов теперь хранит минимальные и максимальные значения как типизированные Field, а не как Float64. Сериализованный формат включает имя типа столбца наряду со значениями. Версия файла статистики повышена до V2; файлы, записанные старыми версиями, требуют повторной материализации (ALTER TABLE … MATERIALIZE STATISTICS ALL). исправлено #53140. #100605 (Han Fei).
- Обновлён
cppkafka: добавлено исправление взаимной блокировки при закрытии Consumer. #100612 (Azat Khuzhin).
- Информация об объекте, используемая для разбора data files в Iceberg, теперь включает количество строк в файле и размер файла в байтах, извлечённые из manifest file. #100645 (Daniil Ivanik).
- Добавлен параметр конфигурации
use_separate_cache_arena, позволяющий управлять использованием отдельной арены памяти для кэша. #100664 (Seva Potapov).
- Добавлена нативная поддержка импорта типов данных Apache Arrow
StringView и BinaryView в столбцы String в ClickHouse, что повышает совместимость при ингестии на базе Arrow. #100762 (Ivan).
- Некоторые настройки Keeper server теперь перезагружаются без перезапуска при изменении файла конфигурации во время выполнения: max_requests_batch_size, max_requests_batch_bytes_size, max_request_size, quorum_reads. #100773 (Michael Kolupaev).
- Увеличены счётчики profile events
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes в релизной сборке. #100899 (Pavel Kruglov).
- Отслеживание памяти в Cgroupv2 теперь исключает
slab_reclaimable из памяти ядра, обеспечивая более точную оценку использования памяти, не подлежащей освобождению. #100901 (Antonio Andelic).
use_partition_pruning = 0 теперь также отключает отсечение по индексу MinMax и оптимизацию для count на столбцах ключа партиционирования, помимо отключения отсечения по ключам партиционирования. #100904 (Nihal Z. Miaji).
pretty=1 в EXPLAIN [PLAN] теперь выводит выражения в человекочитаемом формате. #100927 (Kirill Kopnev).
accurateCastOrNull и accurateCastOrDefault теперь поддерживают целевые типы Tuple, включая вложенные Tuple с элементами Nullable. Ранее эти функции не принимали Tuple в качестве целевого типа, поскольку Tuple не мог находиться внутри Nullable. Закрывает #100820. #100942 (Nihal Z. Miaji).
- Исправлено дублирование диаграмм в интерфейсе Play при переключении между светлой и тёмной темами. #101058 (Alexey Milovidov).
- Обновлён chdig до v26.3.1 (интерфейс Perfetto, спарклайны в сводке по CPU/памяти/слияниям/запросам, system.warnings, поиск по регулярным выражениям в журналах). #101092 (Azat Khuzhin). Обновлён chdig до v26.4.3 (улучшения в Perfetto, исправления, связанные с общим доступом через pastila.nl, сравнение флеймграфов, изменение настроек в реальном времени). #103145 (Azat Khuzhin).
- Теперь перед запросом
SELECT в секции WITH допускается завершающая запятая. #101093 (Aruj Bansal).
- Добавлена настройка MergeTree
compress_per_column_in_compact_parts, управляющая тем, как сжатые блоки организованы внутри компактных частей. Когда true (по умолчанию, с сохранением текущего поведения), каждый столбец начинает новый сжатый блок, что позволяет выполнять выборочную распаковку. Когда false, все столбцы в пределах гранулы упаковываются в один сжатый блок, что улучшает коэффициент сжатия и производительность чтения для рабочих нагрузок, в которых всегда читаются все столбцы. #101114 (Amos Bird).
- Показывать всплывающую подсказку с информацией о таблице в интерфейсе Play только при наведении курсора на название таблицы, а не на всю строку. #101118 (Alexey Milovidov).
- Добавлены значки для конкретных движков и улучшено взаимодействие со списком таблиц на боковой панели интерфейса Play. #101134 (Alexey Milovidov).
- Добавлена поддержка
Nullable(Tuple) в форматах Arrow, ArrowStream, ORC и устаревшем формате Parquet. #101272 (Nihal Z. Miaji).
- Строка TOTALS теперь отображается в нижнем колонтитуле таблицы в веб-интерфейсе (play.html). #101286 (Alexey Milovidov).
- Поддержка режима работы с несколькими запросами в веб-интерфейсе (
play.html): одновременный запуск нескольких запросов с параллельным выполнением запросов типа SELECT и отдельным отображением результатов для каждого запроса. #101290 (Alexey Milovidov).
- Исправлено изменение ширины столбца в веб-интерфейсе play.html после того, как таблицу результатов переработали в веб-компонент. #101295 (Alexey Milovidov).
- Добавлена возможность ограничивать количество сбросов профиля jemalloc при MEMORY_LIMIT_EXCEEDED в течение заданного интервала времени. #101396 (Azat Khuzhin).
- Добавлены настройки Keeper:
nuraft_streaming_mode (по умолчанию false), nuraft_max_log_gap_in_stream, nuraft_max_bytes_in_flight_in_stream. Закрывает issue #90743. #101427 (Kseniia Sumarokova).
- Добавлена асинхронная метрика
CGroupMemoryUsedWithoutPageCache, которая показывает использование памяти cgroup без учёта как кэша страниц ОС в ядре, так и кэша страниц в пространстве пользователя ClickHouse, по аналогии с MemoryResidentWithoutPageCache. Также уточнено описание метрики CGroupMemoryUsed. #101513 (Francesco Ciocchetti).
- Добавлен синтаксический сахар на уровне parser для синтаксиса стандартной SQL-функции
OVERLAY. Функция overlay уже существует; добавлена поддержка формы с ключевыми словами PLACING, FROM и FOR в качестве разделителей. #101681 (Desel72).
- В системную таблицу
information_schema.tables добавлен псевдоним столбца INDEX_LENGTH, аналогичный существующим в этой таблице псевдонимам в верхнем регистре. #101705 (Robert Schulze).
- Системная таблица
information_schema.tables теперь не учитывает неактивные части таблицы. Благодаря этому отображаемые значения размера таблиц стали более реалистичными. #101706 (Robert Schulze).
- Функция
ngrams теперь отклоняет недопустимые значения длины n-грамм. Пример: SELECT ngrams('abc', 0) теперь возвращает ошибку. #101922 (Robert Schulze).
- В продолжение #91820 и #90837: исключать неподдерживаемые алгоритмы из сообщений об ошибках; запускать тесты для FIPS в FIPS-сборках. #102067 (Mikhail f. Shiryaev).
- Высота ячеек в веб-интерфейсе (
play.html) ограничена тремя строками, с возможностью раскрытия по щелчку. #102154 (Alexey Milovidov).
- Добавлена новая опция для принудительного использования стиля (virtual/path) для конечных точек S3. Решает #82019; #76007 Продолжение https://github.com/ClickHouse/ClickHouse/pull/83168. #102378 (Konstantin Vedernikov).
- Параметр
restore_replace_external_engines_to_null теперь также не восстанавливает базы данных с внешними движками (например, DataLakeCatalog, MySQL, PostgreSQL, S3) вместо того, чтобы завершаться ошибкой или устанавливать внешние подключения. #102400 (Nikita Fomichev).
- Добавлена поддержка анализа текстового индекса для функции
hasPhrase в режиме HINT. #102438 (Elmi Ahmadov).
- Считать STATISTICS доступными только для чтения в ColumnDependency, чтобы исправить LOGICAL_ERROR при MATERIALIZE STATISTICS ALL. #102627 (Konstantin Bogdanov).
- В режиме keeper-as-server теперь создаётся и заполняется
system.asynchronous_metric_log. #102664 (Miсhael Stetsyuk).
- Добавлена опция config
default_system_log_flush_policy.skip_alias_columns, позволяющая исключать столбцы ALIAS из системных таблиц логов; это исправляет системные логи, использующие S3 в качестве хранилища и не принимающие столбцы ALIAS. #102669 (Miсhael Stetsyuk).
- Не включайте автоматическую статистику для системных таблиц. Она им редко нужна. #102862 (Han Fei).
- Добавлена поддержка токенизатора
array для оптимизации LIKE. #102880 (Elmi Ahmadov).
- Отправлять MemoryAllocatedWithoutCheck даже в релизных сборках. #103064 (Azat Khuzhin).
- Появилась возможность просматривать untracked_memory для каждого потока в system.stack_trace. #103065 (Azat Khuzhin).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка
Block structure mismatch in stream, вызванная возвратом лишних столбцов при отложенной материализации. Исправляет #95191. #96682 (Nikolai Kochetov).
- Исправлена логическая ошибка в запросе политики маскирования данных с
ON CLUSTER. #97594 (Bharat Nallan).
- Исправлена ошибка при использовании Unity Catalog с GCS. #98456 (Melvyn Peignon).
DataLakeCatalog теперь учитывает настройку сервера http_forbid_headers при проверке параметра auth_header. #98827 (Michael Anastasakis).
- Исправлены вызовы
HeadObject по схеме N+1 для S3 глоб-шаблонов с раскрытием фигурных скобок. #99219 (Konstantin Bogdanov).
- Проверка изменений настроек в запросах CREATE, если сам движок тоже поддерживает настройки. #99279 (János Benjamin Antal).
- Исправлена ошибка, из-за которой
ALTER TABLE UPDATE/DELETE завершался с ошибкой Missing columns, когда в таблице есть материализованный столбец, выражение которого зависит от эфемерного столбца. #99281 (Yash ).
- Учетные данные в строках подключения JDBC, ODBC и NATS теперь маскируются в журнале запросов и выводе
SHOW CREATE, что предотвращает случайное раскрытие конфиденциальной информации. В строках подключения в формате URI (например, {scheme}://{user}:{password}@{host}) маскируется только пароль, а остальная часть остается видимой для удобства отладки. Настройка nats_token теперь тоже маскируется. #99344 (János Benjamin Antal).
- Исправлена ошибка в
parseDateTimeBestEffort: функция неверно разбирала слова, начинающиеся с префиксов месяцев, в формате DD-month-YYYY. Закрывает #99345. #99350 (Pavel Kruglov).
- Исправлено игнорирование TABLE_UUID_MISMATCH в режиме без analyzer. #99380 (Azat Khuzhin).
- Исправлена ошибка, из-за которой явные настройки, переданные вместе с
compatibility в одном запросе, могли незаметно игнорироваться, если их значение совпадало со значением сервера по умолчанию. #99402 (Raufs Dunamalijevs).
- Исправлена проблема, из-за которой числа с ведущими нулями в пути партиционирования Hive вызывали ошибки. Исправление #98801. #99458 (Yarik Briukhovetskyi).
- Исправлена ошибка heap-use-after-free, возникавшая при одновременном удалении таблицы и выполнении запроса на чтение (19 случаев в CI за последние 90 дней). #99483 (Alexey Milovidov).
- Исправлена ошибка в Keeper: запрос на чтение мог зависнуть (что приводило к тайм-ауту сеанса), если в тот же сервер в крайне неудачный момент закрывался другой, не связанный с ним сеанс. #99484 (Michael Kolupaev).
- Проверка структуры столбца перед применением патчей. #99531 (Seva Potapov).
- Исправлен сбой проверки
rows_sources при вертикальном слиянии во время быстрого переключения SYSTEM STOP/START MERGES для таблицы со столбцами Dynamic. #99532 (Alexey Milovidov).
- Исправлено некорректное отсечение партиций для
toWeek(), из-за которого запросы с WHERE toWeek(date, mode) = N возвращали пустой результат для недель 49–52 в таблицах, разбитых на партиции по toYYYYMM(date). #99542 (Takumi Hara).
- Исправлено исключение в функциях, работающих с ColumnReplicated при наличии строк без ссылок, созданных JOIN. #99564 (Hechem Selmi).
- Исправлена проблема, из-за которой
CLEAR COLUMN не перестраивал проекции и не выполнял повторный расчёт материализованных столбцов, зависящих от очищаемого столбца, что могло приводить к исключениям или повреждению данных при последующих слияниях. #99565 (Desel72).
- Исправлено Исключение (
Bad get: has Tuple, actual type String) в ConditionSelectivityEstimator, возникавшее, когда в запросе используется IN с одним скалярным параметром запроса (например, WHERE col IN ({p:String})) для таблицы, у которой есть статистика по столбцам и включен use_statistics. #99614 (Ilya Yatsishin).
- Часть с неизвестными проекциями не должна считаться безвозвратно потерянной. #99623 (Sema Checherinda).
- Исправлено редкое исключение из-за логической ошибки при Вертикальном слиянии, когда
SYSTEM STOP MERGES и SYSTEM START MERGES выполняются одновременно. #99628 (Desel72).
- Исправлена висячая ссылка в injectRequiredColumns, приводившая к сбою при слиянии. #99679 (Tuan Pham Anh).
- Исправлено неопределённое поведение в модуле чтения Avro format при чтении числовых значений, вызывающих переполнение целевого типа столбца. Теперь запросы завершаются ошибкой при переполнении вместо того, чтобы незаметно возвращать некорректные значения. #99697 (asyablue22).
- Исправлен разбор кавычек в стиле shell в аргументах табличной функции
executable. #99794 (Nikita Semenov).
- Исправлено ложное срабатывание аварийного завершения в
NativeReader при десериализации потока в формате Native с несовпадением количества строк: код ошибки изменён с LOGICAL_ERROR на INCORRECT_DATA, чтобы ситуация обрабатывалась как ошибка данных, а не вызывала abort() в сборках sanitizer/debug. #99822 (Rahul Nair).
- Исправлено аварийное завершение процесса при десериализации столбца
Tuple, когда тип сериализации в бинарном потоке — DETACHED. #99823 (Rahul Nair).
- Исправлено ложное исключение
LOGICAL_ERROR, возникавшее при динамическом изменении размера файлового кэша из-за состояния гонки при повышении приоритета подочереди SLRU. #99850 (Alexey Milovidov).
- Исправлено некорректное отображение нулевых значений
written_rows, read_rows и result_rows для запросов async insert в query_log и выводе клиента. #99879 (Sema Checherinda).
- Исправлено исключение “Неверное приведение типа X к Y” в
KILL QUERY, когда внутренний запрос к системным таблицам возвращает столбцы, обёрнутые в ColumnConst. #99881 (Alexey Milovidov).
- Исправлена логическая ошибка, связанная с коррелированным подзапросом в аргументе untuple. #99917 (Vladimir Cherkasov).
- Исправлено Исключение при вызове
right, rightUTF8 или других функций извлечения подстроки с длиной INT64_MIN (-9223372036854775808), которое ранее приводило к неопределённому поведению из-за целочисленного переполнения. Теперь эти функции корректно возвращают ошибку ARGUMENT_OUT_OF_BOUND. #99934 (Jimmy Aguilar Mena).
- Теперь ClickHouse должен корректно обрабатывать таблицы в стиле Spark (где для каждого файла указан полный абсолютный путь или относительный путь к общему пути таблицы). Исправляет #92348. #99935 (alesapin).
- Исправлено Исключение “Inconsistent AST formatting” для
ALTER TABLE ... MODIFY QUERY со вложенными подзапросами, содержащими SETTINGS, когда у самого ALTER тоже есть SETTINGS. #99938 (Nikita Mikhaylov).
- Отменён #97114 “Перенести оценку числа строк на этапе JOIN перед проверкой на наличие 1 дочернего элемента” из-за подозрения на регрессию производительности. #99957 (Alexander Gololobov).
- Исправлена ошибка, из-за которой ClickHouse мог пропускать файлы, если в ответе на HEAD-запрос к ним отсутствовал заголовок
Content-Length (например, из-за декомпрессионного транскодирования в GCS). #99971 (Yarik Briukhovetskyi).
- Исправлен сбой assert (исключение в debug-сборках, некорректные результаты в release-сборках) при умножении состояний агрегатной функции
NumericIndexedVector на чётную целочисленную константу, вызванный self-XOR для алиасов битмапов Roaring в pointwiseAddInplace. #99976 (Desel72).
- Предотвращено исключение
Unexpected return type в устаревшем pushdown фильтров через цепочку JOIN USING, когда типы ключей меняются после преобразований JOIN. #99999 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR “Неожиданный тип узла для табличного выражения … фактически IDENTIFIER”, возникавшее при использовании скалярного подзапроса внутри неразрешённого аргумента табличной функции, например: SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1))). #100014 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
INSERT с VALUES завершался сбоем, если после данных на следующей строке шёл завершающий SQL-комментарий (-- или /* */). Теперь комментарий пропускается, а не разбирается как ещё одна строка. #100016 (Pratima Patel).
- Исправлено исключение в
arrayRemove при сравнении кортежей с компонентами, равными NULL. #100017 (Alexey Milovidov).
- Исправлена межпользовательская утечка данных в
system.asynchronous_inserts: любой пользователь с SELECT к таблице мог видеть ожидающие записи асинхронной вставки, принадлежащие другим пользователям. Теперь записи фильтруются по текущему пользователю, если только у него нет привилегии SHOW_USERS. #100024 (Shaohua Wang).
- Исправлен случай, когда приведение Time64 к UInt64 могло обрезать значения до 24 часов. #100025 (Yarik Briukhovetskyi).
- Исправлен сбой локального сервера, когда CREATE DICTIONARY содержит определение со списочным значением, содержащим несуществующую функцию. #100036 (Yakov Olkhovskiy).
- Исправлена ошибка, из-за которой форматы
CSV и MsgPack не могли корректно разбирать Nullable(Tuple). Закрывает #99753. #100038 (Nihal Z. Miaji).
- Исправлена ошибка
UNKNOWN_IDENTIFIER, из-за которой CREATE VIEW завершался сбоем при использовании в качестве правой части IN алиаса функционального выражения в WITH (например, tuple(...)). #100042 (Peng).
- Исправлена ошибка, из-за которой агрегатные функции временных рядов (например,
timeSeriesResampleToGridWithStaleness) завершались с ILLEGAL_TYPE_OF_ARGUMENT при использовании initializeAggregation или AggregatingMergeTree с параллельными репликами. #100053 (Alexey Milovidov).
- Исправлена обработка отрицательных значений в NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
- Исправлено: функции
accurateCastOrDefault и to*OrDefault не сохраняли тип Const столбца для константных входных данных. #100132 (Alexey Milovidov).
- У пропущенных параметров запроса с типом
LowCardinality(Nullable(T)) теперь значение по умолчанию корректно устанавливается в NULL, как и для Nullable(T). #100144 (Denys Melnyk).
- Исправлена ошибка использования неинициализированного значения в StringSearcher.h. #100225 (Konstantin Bogdanov).
- Добавлена возможность отменять скалярные подзапросы и другие конвейеры, запускаемые на этапе анализа, с помощью Ctrl+C. Ранее нажатие Ctrl+C во время выполнения длительного скалярного подзапроса не давало никакого эффекта, пока подзапрос не завершался. Также исправлены индикатор прогресса и статистика в JSON, чтобы они корректно сообщали о числе прочитанных строк во время выполнения скалярного подзапроса — как в
clickhouse-client, так и в clickhouse-local. В соавторстве с @YjyJeff. #100230 (Raúl Marín).
- Исправлено исключение
LOGICAL_ERROR в запросах с Dynamic-столбцами, CROSS JOIN и runtime-фильтрами, вызванное тем, что ColumnVariant::filter использовал общие указатели на Variant-столбцы вместо их клонирования в ветке оптимизации hasOnlyNulls. Закрывает https://github.com/ClickHouse/ClickHouse/pull/100147. #100234 (Pavel Kruglov).
- Исправлена ошибка в массивах с
Variant, из-за которой при вызове функций arrayFirst/arrayLast мог переинтерпретироваться тип данных. Например, ранее Array(Variant(Date, Bool)) преобразовывался в Bool, хотя фактический тип варианта — Date. #100255 (timothygk).
- Несколько небольших изменений в функциях: функции
h3 теперь лучше проверяют границы; readWKB теперь проверяет ограничения на размер (новая настройка max_wkb_geometry_elements); функции генерации случайных чисел ограничивают максимальное число итераций при вычислениях. Дополнение к #93543. #100270 (Alexey Milovidov).
- Исправлена проблема, из-за которой cutURLParameter мог некорректно пропускать параметры, если они были подстроками других параметров. #100280 (Nikita Semenov).
- Исправлено исключение, возникавшее, если в настройке пути к файлу метаданных Iceberg присутствовал null-байт. #100283 (Alexey Milovidov).
- Исправлена проблема с квадратичным ростом числа выполняемых запросов при использовании
distributed_index_analysis с предикатами, содержащими IN-подзапросы. #100287 (Anton Popov).
- Исправлено исключение “Несоответствие структуры блока” при использовании
GROUP BY ... WITH TOTALS HAVING вместе с UNION DISTINCT и Nullable-выражениями. #100293 (Alexey Milovidov).
- Исправлено Исключение LOGICAL_ERROR в
estimateCompressionRatio, возникавшее, когда параметр block_size_bytes был чрезвычайно большим. #100298 (Alexey Milovidov).
- Исправлено Исключение “Несогласованное форматирование AST” в отладочных сборках при использовании
GROUP BY CUBE(...) WITH ROLLUP и похожих комбинаций. #100376 (Alexey Milovidov).
- Исправлено Исключение при создании представления с псевдонимами столбцов и запросами
SELECT * или EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
- Исправлено зависание
DROP TABLE на неопределённое время для таблиц с движком Kafka, когда consumer’ы застревают в состоянии перебалансировки после ошибки heartbeat. #100388 (Alexey Milovidov).
- Исправлено Исключение
ReadBuffer is canceled. Can't read from it. при операциях резервного копирования и восстановления с использованием zip-архивов. #100400 (Alexey Milovidov).
- Исправлено Исключение
TOO_MANY_ROWS для запросов SELECT count() с max_rows_to_read / force_primary_key, когда данные распределены по нескольким частям с несовпадающими границами гранул. #100408 (Alexey Milovidov).
- Исправлен
system.completions: теперь он корректно фильтрует базы данных, таблицы и столбцы по правам доступа во всех сочетаниях grant — на уровне таблицы, базы данных и при отзыве прав на уровне столбца. #100432 (Shaohua Wang).
- Исправлен SEGFAULT в NuRaft, вызванный состоянием гонки. #100444 (Pablo Marcos).
min/max/argMin/argMax теперь обрабатывают NaN так же, как ORDER BY: NaN всегда пропускается (возвращается только если все значения — NaN). Ранее результаты зависели от положения NaN в данных из-за семантики неупорядоченного сравнения в IEEE 754. #100448 (Raúl Marín).
- Исправлена ошибка, вызванная копированием и вставкой: если
delta_lake_snapshot_end_version задавался без delta_lake_snapshot_start_version, он молча игнорировался вместо того, чтобы приводить к ошибке BAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar).
StorageRabbitMQ::shutdown не является идемпотентным (он безусловно обращается к слабым указателям, а затем уничтожает соответствующие указатели с общим владением), но теперь вызывается дважды: сначала в StreamingStorageRegistry, а затем в DatabaseCatalog. Это исправление делает метод идемпотентным и добавляет защитные проверки на null. #100455 (Miсhael Stetsyuk).
- Исправлено Исключение
LOGICAL_ERROR, возникавшее при использовании accurateCastOrNull с целевым типом QBit. #100470 (Raufs Dunamalijevs).
- Исправлено исключение LOGICAL_ERROR “Stream … not found”, возникавшее при вставке в таблицу с вложенными столбцами
Array(JSON) в частях типа Wide при optimize_on_insert=0. #100475 (Pavel Kruglov).
- Проверка путей записей файлов в метаданных резервной копии для отклонения обхода путей, абсолютных путей и пустых имён при
RESTORE. #100483 (Pablo Marcos).
- Исправлена ошибка, из-за которой не работал синтаксис
LIMIT m OFFSET n WITH TIES. Этот синтаксис эквивалентен LIMIT n, m WITH TIES, который уже работал. #100491 (Nihal Z. Miaji).
- Исправлено исключение “No set is registered for key” при использовании
IN со столбцами Nullable(Tuple), содержащими именованные поля и элементы LowCardinality. #100523 (Alexey Milovidov).
- Исправлен heap-buffer-overflow в usearch
sorted_buffer_gt::insert(), который мог вызывать сбой или незаметно повреждать память при поиске по векторному сходству. #100537 (Dustin Healy).
- Исправлена ошибка, из-за которой
EXECUTE AS игнорировал секции FORMAT и INTO OUTFILE, указанные в запросе. #100538 (pufit).
- Исправлено неконсистентное форматирование AST для SAMPLE с OFFSET на уровне запроса. Закрывает #100576. #100579 (Pavel Kruglov).
- Исправлена работа Polaris catalog с Azure. Начиная с версии 25.12 этот каталог для Azure начал добавлять бакет в начало пути. Например,
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path> вместо abfss://polaris-polaris@<some_url>.windows.net/<other-path>. Этот PR убирает бакет из пути. #100583 (Konstantin Vedernikov).
- Исправлено исключение из-за несоответствия типов в transform, когда столбец по умолчанию является const в некоторых блоках. Закрывает #100574. #100616 (Pavel Kruglov).
- Исправляет случаи NOT_FOUND_COLUMN_IN_BLOCK, когда в части SELECT проекции есть столбцы, которых нет в исходной части SELECT запроса. Закрывает #100194. #100623 (Yarik Briukhovetskyi).
- Проверка размерностей массива в формате Npy на соответствие размеру файла и ограничениям переполнения, чтобы предотвратить отказ в обслуживании из-за специально созданных файлов
.npy с чрезмерно большими размерностями. Также отклоняются пустые формы массивов, а объём памяти на строку ограничивается 2 GiB. #100625 (Raúl Marín).
- Исправлена ошибка, из-за которой
session_timezone игнорировался при разборе значений DateTime во время асинхронных вставок (TCP) и всех вставок по HTTP. #100647 (Sema Checherinda).
- Разрешена передача ключа сегментирования в табличные функции
cluster() и clusterAllReplicas(), когда в качестве источника используется табличная функция (например, cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy).
- Исправлен сбой сервера (срабатывание assert) при использовании параметрических агрегатных функций с комбинатором Array и аргументами NULL, таких как
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot).
- Исправлено исключение, возникавшее при вычислении общего супертипа для пустых и непустых кортежей при включенном
use_variant_as_common_type. #100699 (Antonio Andelic).
- Сервер больше не запускается с ошибкой, если настроен диск Azure Blob Storage, а конечная точка временно недоступна (например, из-за сбоя DNS). #100701 (Raúl Marín).
- Исправлено неопределённое поведение в
positiveModulo, когда беззнаковый делитель не помещается в знаковый тип результата. #100705 (Raúl Marín).
- Исправлен сбой сервера (логическая ошибка “Неожиданный тип, возвращаемый __topKFilter”), когда включен
use_top_k_dynamic_filtering, а столбец в ORDER BY имеет тип Dynamic или Variant. #100742 (Groene AI).
- Исправлен сбой сервера при использовании функции
has() в PREWHERE/WHERE для ключа Tuple, содержащего элементы LowCardinality. #100760 (Groene AI).
- Исправлено срабатывание проверки
file_offset_of_buffer_end <= getFileSize() (исключение в отладочных сборках) при чтении из таблиц Log или StripeLog в объектном хранилище S3 при одновременной записи. #100763 (Alexey Milovidov).
- Исправлено исключение в оценщике селективности статистики, возникавшее, когда предложение WHERE содержит функциональное выражение (например, toDecimal64(col, 3)) в таблице со включенной статистикой. Теперь оценщик пропускает такие предикаты вместо того, чтобы пытаться выполнить недопустимое приведение типов. #100764 (Han Fei).
- Исправлен редкий случай, когда JOIN с изменением порядка мог давать неверный результат. #100790 (Yarik Briukhovetskyi).
- Исправлены некорректные типы аргументов
AggregateFunction в оптимизированном тривиальном count, из-за которых при выполнении запросов с выражениями вроде count(v0 + v1) на distributed таблицах возникало Исключение NUMBER_OF_ARGUMENTS_DOESNT_MATCH. #100794 (YjyJeff).
- Некоторые каталоги могли отображать секреты в разделе
SETTINGS результата запроса select * from system.databases. Этот PR предотвращает такое поведение. #100800 (Konstantin Vedernikov).
- Исправлено неопределённое поведение (переполнение знакового целого числа) в
toStartOfInterval при использовании интервалов Week, Quarter или Year с аргументом origin и предельными значениями интервала. #100817 (Raúl Marín).
- Исправлена невозможность чтения более старых сериализованных состояний после появления
Nullable(Tuple) для комбинаторов агрегатных функций If, Distinct, DistinctIf, IfState с возвращаемым типом Tuple и одним или несколькими аргументами Nullable. Закрывает #98917. #100826 (Nihal Z. Miaji).
- Исправлен segfault в s3Cluster и распределённых запросах, вызванный use-after-free при работе с пулом соединений. #100837 (Konstantin Bogdanov).
- Исправлен segfault из-за разыменования нулевого указателя при загрузке словарей во время остановки сервера.
Context::getUserDefinedSQLObjectsStorage (разыменовывает user_defined_sql_objects_storage) вызывается потоками словарей одновременно с вызовом Context::shutdown в основном потоке (он устанавливает user_defined_sql_objects_storage в null). Нужно убедиться, что до запуска Context::shutdown в загрузчике словарей отключены дальнейшие обновления, завершены выполняющиеся запросы к словарям и потоки загрузки словарей дожидаются завершения. Аналогично тому, как это делается для обычных запросов. #100839 (Miсhael Stetsyuk).
- Исправлено переполнение буфера в
ULIDStringToDateTime, возникавшее, когда входные данные содержат не-ASCII-байты. #100843 (Konstantin Bogdanov).
- Исправлен сбой (
LOGICAL_ERROR) при выполнении запроса к таблице Merge (или табличной функции merge()), объединяющей несколько таблиц, включая таблицу Distributed, при включенном distributed_group_by_no_merge=1. #100859 (Groene AI).
- При включенном Cast_keep_nullable при приведении dynamic null к variant исключение не будет генерироваться. #100864 (Seva Potapov).
- Исправлено поведение команд
clickhouse-keeper-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).
- Исправлены неверные результаты, когда JOIN с оптимизацией сегментирования по PK использует кэш условий запроса, а некоторые части отфильтровываются на основе кэшированных условий. #100926 (Groene AI).
- Исправлена ошибка, из-за которой
divide и intDiv в некоторых случаях возвращали ILLEGAL_DIVISION при использовании в выражениях фильтра во время анализа индексов. #100928 (Nihal Z. Miaji).
- Исправлены ошибки “Целевая таблица не существует” для materialized view с внутренними таблицами при асинхронном запуске, вызванные неверным порядком инициализации зависимостей. #100946 (Nikolay Degterinsky).
- Исправлено неопределённое поведение (переполнение знакового целого числа) в parseDateTimeBestEffort при разборе строк даты и времени, содержащих более 18 цифр в дробной части секунды. #100948 (Vasily Chekalkin).
- Исправлен сбой при использовании индекса для текстового поиска с условием
IN, содержащим кортежный подзапрос, например WHERE (id, str) IN (SELECT (id, str) FROM ...), а также в случае, когда число столбцов в подзапросе не совпадает с кортежем в левой части IN. #100959 (Anton Popov).
- Исправлен сбой, возникавший при создании словаря Polygon из таблицы
MergeTree, использующей сериализацию разреженных столбцов. #100964 (Anton Popov).
- Исправлена логическая ошибка “Invalid action query tree node” при использовании
INTERSECT ALL / UNION ALL с выражениями, свёрнутыми в константы. #100977 (Alexey Milovidov).
- Исправлена агрегатная функция
sumCountOrDefault: при одном или нескольких аргументах типа Nullable она не могла читать ранее сериализованные состояния после введения Nullable(Tuple). Закрывает #100882. #101021 (Nihal Z. Miaji).
- Исправлен сбой (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) в алгоритмах слияния, когда отложенная репликация столбцов (enable_lazy_columns_replication) создает столбцы ColumnReplicated, которые попадают в конвейеры merge-sort при позднем поступлении входных данных. #101036 (Groene AI).
- Исправлена некорректная ошибка
UNKNOWN_IDENTIFIER, возникавшая, когда один и тот же псевдоним использовался для нескольких выражений в SELECT; теперь вместо неё корректно сообщается ошибка MULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov).
- Исправлена проблема со столбцами ALIAS типов
DateTime/DateTime64: преобразование часового пояса не применялось, если указанный часовой пояс отличался от часового пояса выражения. #101043 (Alexey Milovidov).
- Исправлена проблема, из-за которой политики строкового доступа не записывались в
query_log для представлений, подзапросов и INSERT ... SELECT. Хотя политики строкового доступа применялись при планировании запросов, они не передавались от вложенных планировщиков в родительский планировщик для записи в журнал. Теперь политики строкового доступа (только для журналирования) хранятся в QueryAccessInfo, чтобы их могли заполнять и планировщики, и вложенные планировщики. #101044 (Narasimha Pakeer).
- Исправлено Исключение в
DirectJoinMergeTreeEntity, когда блоки конвейера содержат столбцы ColumnConst, которые объединяются с обычными столбцами. #101046 (Alexey Milovidov).
- Исправлен лишний пробел в оформлении псевдонима столбца в CTE (
WITH t (a, b) → WITH t(a, b)). #101049 (Alexey Milovidov).
- Исправлена ошибка, из-за которой табличные функции
remote/cluster не работали с вложенными табличными функциями, такими как merge, при включенном анализаторе. #101055 (Alexey Milovidov).
- Исправлено двойное применение
OFFSET в распределённых запросах при prefer_localhost_replica=1, из-за чего возвращалось меньше строк, чем ожидалось. #101071 (Nihal Z. Miaji).
- Исправлен сбой, возникавший при использовании формата
Regexp с некорректным регулярным выражением в настройке format_regexp. #101074 (Nihal Z. Miaji).
- Исправлена ошибка “Недопустимый тип Decimal64 для параметра start” в агрегатных функциях временных рядов при использовании
serialize_query_plan=1 с параллельными репликами. #101083 (Groene AI).
- Исправлено исключение в
optimizeLazyMaterialization, возникавшее при использовании проекции с PREWHERE вместе с ORDER BY ... LIMIT. #101115 (Anton Popov).
- Исправлен сбой сервера (SIGABRT) при использовании агрегатных функций с внутренним комбинатором
Null (например, sumNull, avgNull) и включенной настройкой aggregate_functions_null_for_empty = 1. #101147 (Groene AI).
- Исправлена ошибка use-after-free при записи в файловый кэш, которая могла приводить к чтению из уже освобождённой памяти при логировании завершённых сегментов файла (обнаружена с помощью MemorySanitizer в BuzzHouse). #101161 (Groene AI).
- Исправлен сбой сервера с сообщением “Попытка подключить внешнюю таблицу к готовому Set без явных элементов”, который возникал, когда распределённый анализ индексов сталкивался с предикатом GLOBAL IN, чей Set был построен без явных элементов. #101178 (Groene AI).
- Исправлены агрегатные функции
MAX/MIN для столбцов Decimal, возвращавшие некорректные результаты при включенной JIT-компиляции (после достижения порога компиляции). #101203 (Raúl Marín).
- Исправлена проблема, из-за которой оптимизации
minmax_count_projection и тривиального COUNT(*) оставались навсегда отключёнными после легковесного удаления, даже когда все части с маской легковесного удаления уже были слиты. #101212 (Anton Popov).
- Исправлен сценарий, который мог приводить к логической ошибке
Having zero bytes, ... в кэше: удалённый объект мог быть перезаписан в промежутке между list и read, из-за чего ранее возникали устаревшие метаданные объекта. #101219 (Kseniia Sumarokova).
- Исправлен сбой сервера (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) при запросе к таблице семейства MergeTree с
ORDER BY CAST(lc_column, 'Type'), где lc_column имеет тип LowCardinality. #101220 (Groene AI).
- Исправлена очистка устаревших узлов обработки в
S3Queue. #101230 (Kseniia Sumarokova).
- Исправлено UB в mergeTreeAnalyzeIndexes() при недопустимом значении аргумента optimizations. #101253 (Azat Khuzhin).
- Исправлено Исключение
Logical error: 'partitions_count > 0', возникавшее при последовательном выполнении ALTER TABLE UPDATE для секционированной таблицы Iceberg. #101278 (Desel72).
- Исправлены неверные результаты запроса, когда большая целочисленная константа (например, 256, 2147483648) используется как булевый предикат в предложении WHERE с оператором AND в таблицах семейства MergeTree. Например,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648 ошибочно возвращал 0 вместо того, чтобы учитывать все строки. #101287 (Groene AI).
- Исправлен INSERT SELECT из кластера Delta Lake с ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
- Исправлен сбой с сообщением “Логическая ошибка: чтение из материализованного CTE до материализации”, возникавший, когда скалярный подзапрос ссылался на цепочку зависимых материализованных CTE. #101305 (Groene AI).
- Исправлена гонка данных с
storage_id в IStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky).
- Исправлены форматирование и клонирование AST для BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
- Исправлен сбой LOGICAL_ERROR “Текущий компонент пуст”, возникавший при запросе к
system.part_moves_between_shards, когда включен enforce_keeper_component_tracking. #101462 (Groene AI).
- Исправлено падение из-за segmentation fault в DataTypeDynamic::create(), когда фаззер генерирует некорректный AST типа Dynamic. #101464 (Groene AI).
- Выдавать ошибку, если настройки
delta_lake_snapshot_version или версии CDF используются без включенного DeltaKernel, вместо того чтобы незаметно возвращать некорректные данные. #101489 (Desel72).
- Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее при использовании ARRAY JOIN с JOIN USING и включенной настройке analyzer_compatibility_join_using_top_level_identifier. Закрывает #101240. #101507 (Vladimir Cherkasov).
- Исправлена ошибка в цикле повторных попыток Iceberg INSERT, возникавшая, когда таблица была создана с
iceberg_metadata_file_path, а целевая версия метаданных уже существовала. #101548 (Groene AI).
- Убрали Nullable из результирующего столбца в arrayIntersect и связанных функциях, чтобы избежать несоответствия при сериализации/десериализации. #101569 (George Larionov).
- Исправлен сбой сервера (LOGICAL_ERROR) при выполнении SELECT-запроса к materialized view, использующему движок таблицы IcebergLocal. #101577 (Groene AI).
- Исправлено некорректное сообщение об ошибке при вызове
intExp10 с аргументом NaN — в нём было указано intExp2 вместо intExp10. #101582 (Krishna Chaitanya).
- Исправлено:
allow_statistics=0 не блокировал выполнение ALTER TABLE ADD STATISTICS и ALTER TABLE DROP STATISTICS после рефакторинга в #100288. #101585 (Krishna Chaitanya).
- Исправлена ошибка
KeeperMap при выполнении CREATE TABLE с сообщением “Cannot create metadata for table”, возникавшая, когда в оставшихся узлах ZooKeeper после неполного удаления в версиях до 25.1 отсутствовал узел drop_lock_version. #101623 (Antonio Andelic).
- Устранена возможная логическая ошибка при чтении подстолбцов типа Map. Закрывает #100769. Закрывает #101336. #101641 (Pavel Kruglov).
- Исправлен приоритет точного совпадения подстолбца над совпадением по префиксу в
getSubcolumnData, чтобы избежать возможного падения. Закрывает #101271. #101645 (Pavel Kruglov).
- Исправлен сбой (LOGICAL_ERROR: “ColumnUnique не может содержать значения NULL”) при сравнении столбца
LowCardinality с NULL-константой Variant, когда use_variant_default_implementation_for_comparisons отключён. #101690 (Groene AI).
- Что: В Bzip2ReadBuffer добавлена проверка на пустой поток, благодаря которой он возвращает EOF вместо UNEXPECTED_END_OF_FILE, если внутренний поток пуст. #101691 (ClickGap AI Bot).
- Что: Исправлено перепутанное описание столбца
alterable в system.s3_queue_settings и system.azure_queue_settings — значения 0 и 1 поменяны местами в соответствии с фактическим поведением кода. #101703 (ClickGap AI Bot).
- Исправлена ошибка, из-за которой для
positiveModulo(tuple, number) ошибочно вызывалось деление вместо операции взятия по модулю. #101709 (ClickGap AI Bot).
- Исправляет сбой, возникавший при настройке
thread_pool_size на диске с кэшем. Ранее FileCacheSettings::loadFromConfig() отклонял thread_pool_size как неизвестную настройку, из-за чего сервер не мог запуститься. Эта настройка является допустимым параметром IDisk, который определяет количество потоков, используемых для операций копирования с диска на диск при фоновом перемещении частей. #101712 (Francisco).
- Исправлено поведение, при котором при создании словаря
RANGE_HASHED молча принимался несуществующий атрибут диапазона MAX, а также использовалась неверная конфигурация типов, если атрибуты минимального и максимального диапазона имели разные типы. Причиной ошибки была опечатка из-за копирования и вставки в buildRangeConfiguration: для максимального атрибута искался min_attr_name вместо max_attr_name. #101732 (Yakov Olkhovskiy).
- Исправлено аварийное завершение, вызванное use-after-free в планировщике аренды CPU, когда таймер ожидания живёт дольше, чем воркер-поток, на
ProfileEvents::Counters которого он ссылается. #101761 (Antonio Andelic).
- Исправлена ошибка в функциях arrayLevenshteinDistanceWeighted и arraySimilarity. Закрывает #101725. #101767 (Mikhail f. Shiryaev).
- Исправлена ошибка, из-за которой Prometheus Query API игнорировал тела POST-форм. #101794 (James Cunningham).
- Исправлен выход исключения из деструктора S3
Client::~Client, приводивший к аварийному завершению сервера. #101798 (Gagan Dhakrey).
- Исправлена ошибка use-after-scope при параллельной десериализации динамических путей типа
Object, которая могла приводить к сбоям при чтении таблиц с большим количеством таких путей. #101823 (Antonio Andelic).
- Исправлен некорректный вывод в функции
formatDateTime для форматтера %W при определённых (не используемых по умолчанию) настройках форматирования. #101847 (Robert Schulze).
- Исправлено ложное срабатывание
shouldPatchFunction в SYSTEM INSTRUMENT ADD, когда искомая строка впервые встречается внутри аргумента Template в деманглированном имени символа. #101885 (Pablo Marcos).
- Исправлена потеря реестра UDF при истечении сеанса ZooKeeper во время периодического обновления — все пользовательские функции могли становиться недоступными, пока не завершится успешное полное обновление. #101891 (Nikita Fomichev).
- Исправлено описание
system.codecs для AES_256_GCM_SIV: теперь указывается AES-256, а не AES-128. #101917 (Jimmy Aguilar Mena).
- Исправлено использование некорректных экстремумов в min-max индексе, созданном для JSON-столбца, что приводило к неверному результату запроса. Закрывает #101700. #101918 (Pavel Kruglov).
- Токенизатор
splitByString теперь не принимает пустые строки в качестве разделителя. #101928 (Robert Schulze).
- Исправлено поведение, при котором
materialize_skip_indexes_on_merge=false не подавлял текстовые (полнотекстовые) индексы при слиянии. Ранее подавлялись только нетекстовые индексы пропуска данных (minmax, set, bloom_filter); текстовые индексы продолжали строиться, что приводило к напрасному расходу CPU и I/O. #101932 (Groene AI).
- Токенизатор
sparseGrams генерировал токены, длина которых превышала заданный максимум (это было связано с жёстко прописанным +2 в реализации). #101934 (Elmi Ahmadov).
- Исправлен SIGSEGV в
MergeTreeDataPartWriterWide::cancel, возникавший, когда конструктор потока выбрасывает исключение во время addStreams, из-за чего в column_streams оставался null-элемент. #101936 (Antonio Andelic).
- Исправляет исключение при запросе к таблицам Merge или Distributed с полнотекстовым индексом и комбинированными условиями фильтрации, в которых
has*Tokens сочетается с LIKE, когда включен query_plan_direct_read_from_text_index. #101939 (Jimmy Aguilar Mena).
- Исправлено неопределённое поведение при разборе пакетов запроса собственного протокола с некорректными значениями
QueryProcessingStage. #101972 (Raúl Marín).
- Закрывать TCP-соединение при возникновении исключения на этапе начального разбора запроса, чтобы предотвратить чтение мусорных данных из рассинхронизированного потока. #101989 (Raúl Marín).
- Исправлена ошибка гонки в SLRU в файловом кэше 26.1+, которая может приводить к логической ошибке при резервировании места. В отладочной сборке это также может приводить к срабатыванию assert:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.. #101991 (Kseniia Sumarokova).
- Исправлено исключение при приведении строки с лишними данными в конце к пустому типу
Tuple(). #102011 (Alexey Milovidov).
- Исправляет неправильный порядок строк в запросах, использующих ORDER BY с алгоритмом JOIN grace_hash. Затронутые запросы могли возвращать результаты в неверном порядке, что незаметно приводило к некорректному выводу. #102036 (János Benjamin Antal).
- Исправлена ошибка LOGICAL ERROR (Unexpected size of index type), которая могла возникать в запросах RIGHT JOIN и FULL JOIN, когда был настроен параметр
max_bytes_in_join. #102042 (Jimmy Aguilar Mena).
- Исправляет случаи, когда
Time с отрицательными значениями возвращал неверный результат при сравнении с типом DateTime. Закрывает #101670. #102056 (Yarik Briukhovetskyi).
- Исправлен сбой при обновлении UDF, вызванный тем, что
ZooKeeperRetriesControl выполнял повторную попытку с устаревшим (истекшим) сеансом ZooKeeper, не обновляя его. #102059 (Nikita Fomichev).
- Исправлено отсутствие пробелов при форматировании unlock snapshot. Закрывает https://github.com/clickhouse/clickhouse/issues/101723. #102063 (Han Fei).
- Исправлен crash (SIGSEGV) при выполнении запроса к представлению с предложением WHERE, когда внутренний запрос возвращает столбцы с типами, отличающимися от метаданных представления (например, Nullable из LEFT JOIN с
join_use_nulls). #102085 (Miсhael Stetsyuk).
- Исправлена ошибка, из-за которой записи в
VectorSimilarityIndexCache не вытеснялись после удаления части из-за несоответствия ключей кэша. #102152 (Seva Potapov).
- При использовании хранилища RabbitMQ для повреждённых сообщений теперь отправляется NACK. #102157 (Seva Potapov).
- Исправлена логическая ошибка при разборе некорректной строки с пустым кортежем. #102289 (Nihal Z. Miaji).
- Исправлены некорректные результаты агрегации (дублирующиеся строки) при использовании
optimize_aggregation_in_order=1, если столбцы в GROUP BY упорядочены иначе, чем ключ сортировки таблицы. #102299 (Groene AI).
- Исправлен сбой в
IcebergLocal при выполнении ALTER TABLE ... UPDATE с использованием формата Avro: типы-обёртки LowCardinality/Nullable не разворачивались перед сериализацией. #102337 (Desel72).
- Исправлена ошибка сегментации в мутациях для материализованных столбцов без выражения. Закрывает #102185. #102342 (zoomxi).
- Исправление в Coalescing merge tree для типа Array. Это закрывает #89509. #102384 (Konstantin Vedernikov).
- Исправлен segfault (или LOGICAL_ERROR в отладочных сборках) при чтении файлов Parquet с включённым проталкиванием bloom filter и условиями равенства/неравенства в предложении WHERE. Сбой происходил из-за обращения к памяти за пределами допустимых границ при получении данных bloom filter в механизме предвыборки Parquet, а также мог приводить к непредсказуемо неверным результатам запроса. #102385 (Groene AI).
- Исправлено прерывание с
LOGICAL_ERROR при динамическом изменении размера SLRU файлового кэша, вызванное общей статистикой вытеснения для подочередей и некорректным путём восстановления для кандидатов, завершившихся ошибкой. #102396 (Antonio Andelic).
- Исправлен сбой инициализации на новой реплике таблиц-алиасов без целевой таблицы в базе данных Replicated. Закрывает #101320. #102397 (Nikolay Degterinsky).
- Исправлено чтение за пределами буфера в функциях поиска по строкам (
countSubstrings, position и т. д.) при поиске подстроки, состоящей целиком из null-байтов. #102401 (Raúl Marín).
- Настройки полнотекстового индекса (
enable_full_text_index, allow_experimental_full_text_index, use_skip_indexes_on_data_read) больше не отключаются, если настройка compatibility указывает на версию старее 26.1. Ранее из-за этого SharedDatabaseCatalog мог не создавать таблицы с текстовыми индексами. #102422 (Nikita Fomichev).
- Исправлено чтение за пределами буфера в
printf при завершающем %. #102472 (Raúl Marín).
- Исправлено исключение chassert
ReadBuffer is canceled в отладочных сборках AsynchronousMetrics, вызванное тем, что rewind не сбрасывал флаг отмены буфера. #102524 (Yuri Fedoseev).
- Исправлены
hasToken / hasTokenOrNull для искомых подстрок, состоящих только из разделителей (например, '()', '!!!'), в столбцах с текстовым индексом: ранее индекс молча пропускал все гранулы вместо того, чтобы сгенерировать BAD_ARGUMENTS (для hasToken) или вернуть NULL (для hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
- Исправлены OOM-ситуации на огромных
multi-запросах в Keeper. Для трассировки OpenTelemetry мы безусловно выделяли >1 KiB для OpenTelemetry spans в объектах ZooKeeperRequest — то есть для действительно огромных multi-запросов пытались дополнительно выделить >10 GiB памяти. Чтобы это исправить, теперь мы храним общие данные в статической памяти и используем std::unique_ptr вместо std::optional в ZooKeeperOpentelemetrySpans. #102586 (Miсhael Stetsyuk).
- Исправлено завышение CurrentMetric для
NamedCollection из-за CREATE NAMED COLLECTION IF NOT EXISTS на уже существующих коллекциях, а также отсутствие инициализации для коллекций, загружаемых из конфигурации или SQL-хранилища при запуске. Закрывает #102507. #102598 (Pablo Marcos).
- Исправлено Исключение в
getStructureOfRemoteTable, когда локальный сегмент возвращает пустой список столбцов из-за параллельного DDL. #102604 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда несколько параллельных запросов CREATE TABLE IF NOT EXISTS были направлены к одной и той же таблице S3Queue в базе данных Shared. #102610 (Nikita Taranov).
- Исправлен сбой LOGICAL_ERROR “Неожиданное количество строк в подфрагменте столбца” в нативном считывателе Parquet V3 при чтении столбцов с типом Nullable с фильтром WHERE. #102628 (Groene AI).
- Исправлено описание события профиля
AzureWriteMicroseconds: вместо “write” было указано “read”. #102639 (Miсhael Stetsyuk).
- Ошибка в политике строк, из-за которой в ряде особых случаев возникает исключение ‘Not found column in block’. #102648 (Yarik Briukhovetskyi).
- Исправлено серверное исключение в ClusterDiscovery, возникавшее, когда в статическом кластере (заданном в config) временно не оставалось доступных узлов. #102661 (Kseniia Sumarokova).
- Исправлен неверный вывод типа данных Date при переполнении после поправки на часовой пояс. Закрывает #102601. #102674 (Pavel Kruglov).
- Исправлено бесконечное зависание
SYSTEM WAIT VIEW, если refreshable materialized view удаляется в процессе ожидания. #102681 (Nikolay Degterinsky).
- Исправлена ошибка в
CASE с выражением Dynamic, из-за которой для всех строк возвращался ELSE. Закрывает #102511. #102684 (Pavel Kruglov).
- Исправлена сериализация уплощенного типа Dynamic для бинарно закодированных типов данных. Закрывает #101911. #102692 (Pavel Kruglov).
- Исправлена проблема, из-за которой format_schema_source=‘query’ молча игнорировал результаты, содержащие несколько строк. Закрывает #101905. #102698 (Pavel Kruglov).
- Передаётся фактический код выхода через SSH-клиент вместо того, чтобы сопоставлять все ошибки с
1. Закрывает #101741. #102700 (Konstantin Bogdanov).
- Исправлена потеря HTTP-заголовков в обработчиках динамических/предопределённых запросов. Закрывает #101846. #102706 (Konstantin Bogdanov).
- Добавлена поправка на пуассоновское сэмплирование для свёрнутых профилей кучи jemalloc, чтобы привести их в соответствие с выводом jeprof. Ранее свёрнутый формат занижал фактические объёмы выделения памяти, поскольку не учитывал вероятность сэмплирования. #102759 (Antonio Andelic).
- Исправлен сбой в функции
hasPhrase при аргументе NULL. #102802 (Nikita Taranov).
- Исправлен сбой сервера (SIGSEGV) при чтении файлов Avro с рекурсивными схемами, содержащими циклические символьные ссылки на типы. Теперь такие схемы выявляются и отклоняются с понятным сообщением об ошибке, а не приводят к аварийному завершению. #102853 (Groene AI).
- Исправлен сбой сервера (assertion
LOGICAL_ERROR), возникавший, когда функция, применяемая к столбцу Variant, достигала лимита памяти или вызывала другое исключение, не связанное с преобразованием типов, при приведении результата в FunctionVariantAdaptor. Теперь исключение корректно пробрасывается, а не ошибочно классифицируется как внутренняя ошибка. #102855 (Groene AI).
- Исправлен сбой сервера в отладочных сборках и сборках с sanitizer при возникновении
std::length_error во время автоматического определения схемы (например, из-за экстремальных значений input_format_msgpack_number_of_columns или некорректных входных данных). #102859 (Groene AI).
- Исправлено представление null при сериализации реплицируемых и разреженных столбцов: теперь оно учитывает настройки (например, format_tsv_null_representation). #102888 (Hechem Selmi).
- Бэкпортировано в #103499: исправлена проблема, из-за которой запросы к S3 завершались ошибкой
ios_base::clear: unspecified iostream_category error вместо повторной попытки; причина была в том, что Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda).
- Исправлена ошибка, из-за которой оптимизации
minmax_count_projection и тривиального COUNT(*) навсегда отключались после легковесного удаления, даже если все части с маской легковесного удаления уже были слиты. #102900 (Anton Popov).
- Исправлены случайные падения jemalloc из-за LTO. #102913 (Azat Khuzhin).
- Оптимизировано преобразование OR-цепочек в IN в политиках доступа к строкам в новом анализаторе. #102915 (Azat Khuzhin).
- Исправлено повреждение метаданных jemalloc, вызванное освобождением кэша страниц с неправильным выравниванием, что могло приводить к аварийным завершениям. #102918 (Azat Khuzhin).
- Обычные INSERT без materialized view больше не запрашивают чрезмерное количество слотов ConcurrencyControl и потоков (
max_threads вместо max_insert_threads), что предотвращает дефицит слотов CC и лавинообразный рост числа потоков в кластерах с высокой пропускной способностью INSERT. #102961 (Sema Checherinda).
- Повторно введён ArrowMemoryPool, чтобы можно было сгенерировать MEMORY_LIMIT_EXCEEDED и избежать OOM ядра. #102999 (Azat Khuzhin).
- Исправлено игнорирование
cast_string_to_date_time_mode при CAST в Nullable(DateTime). Закрывает #101840. #103035 (Pavel Kruglov).
- Добавлена поддержка столбцов
ALIAS в оптимизации прямого чтения текстового индекса. #103037 (Anton Popov).
- Бэкпортировано в #103454: исправлена ошибка, из-за которой
SELECT DISTINCT незаметно возвращал неполные результаты, когда агрегатная проекция соответствовала запросу, а у некоторых частей таблицы отсутствовали данные проекции (например, если проекцию добавили в таблицу, в которой уже были данные, и MATERIALIZE PROJECTION не запускали). Закрывает #102951. #103052 (Nihal Z. Miaji).
- Исправлены неверные результаты, возвращаемые
WHERE x AND toNullable(N) в таблицах MergeTree, когда N — целое число шире UInt8 (например, 256, 65535, 2147483648 или любое отрицательное целое число). Фильтр ошибочно отбрасывал все строки, потому что splitFilterNodeForAllowedInputs использовал нулевой NULL при преобразовании Nullable-остатка сокращённого AND в булевый тип, из-за чего сравнение превращалось в NULL в рамках трёхзначной логики. #103077 (Groene AI).
- Исправлено некорректное указание типа аргумента в сообщениях об ошибках функций поиска в строках (например,
locate, position), когда аргументы передаются в обратном порядке (locate(needle, haystack) при function_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov).
- Исправлено зависание waitForPause на неопределённое время, когда disableFailPoint вызывается, а ни один поток не приостановлен в failpoint. #103119 (Shaohua Wang).
- Ограничен размер строк в TCP-пакете Hello до аутентификации до 64 КБ и добавлена настройка сервера
handshake_timeout_milliseconds, чтобы ограничить общее время рукопожатия и не позволить неаутентифицированным клиентам потреблять чрезмерный объём памяти или удерживать потоки сколь угодно долго. #103284 (Sema Checherinda).
- Исправлена ошибка в статистике min_value > max_value в Parquet ColumnIndex для столбцов String. #103334 (Saurabh Kumar Ojha).
- Проверка некорректно сформированных уплощённых данных Dynamic в формате Native. #103392 (Pavel Kruglov).
- Заполнение столбца
_time данными из табличной функции url. #103437 (Nikita Taranov).
- Исправлено определение SVE: инструкции SVE больше не используются, если они недоступны. #103568 (Raúl Marín).
Улучшение сборки/тестирования/пакетирования
- Зависимость Libstemmer (Snowball) теперь использует более новую версию — v3.0.1. #99256 (Jimmy Aguilar Mena).
- Рандомизированы настройки в clickhouse-test:
use_skip_indexes_for_top_k, use_top_k_dynamic_filtering, query_plan_max_limit_for_top_k_optimization. #91782 (Nikita Fomichev).
- Реализован стресс-тест для функций, проверяющий корректность различных свойств функций. #93543 (Michael Kolupaev).
- Добавлена собственная конфигурация CMake для
llvm-project вместо импорта конфигурации из upstream. #97453 (Konstantin Bogdanov).
- В тестовой инфраструктуре сделали более случайными настройки
optimize_*, чтобы улучшить покрытие этапов оптимизации запросов. #97547 (Alexey Milovidov).
- Используйте тулчейн Rust nightly-2026-03-22. #98602 (Konstantin Bogdanov).
- Используется
wasmtime v42.0.1. #98603 (Konstantin Bogdanov).
- Использование
llvm-project 22.1.1. #98882 (Konstantin Bogdanov).
- Заменили
SANITIZE_COVERAGE (пользовательские обратные вызовы sanitizer, гранулярность на уровне символов) на покрытие на основе исходного кода LLVM (WITH_COVERAGE, -fprofile-instr-generate -fcoverage-mapping) для ночного конвейера покрытия по отдельным тестам. Теперь сервер при запуске считывает собственную карту покрытия из секций ELF и собирает кортежи (file, line_start, line_end) для каждого теста через новую команду SYSTEM SET COVERAGE TEST 'name'. Выбор тестов в таргетированных CI-проверках использует запросы по диапазонам строк к новой таблице CIDB checks_coverage_lines и ранжирует тесты-кандидаты по числу покрываемых ими изменённых строк в diff. #99513 (Nikita Fomichev).
- Исправлена ошибка линковки llvm-libc в сборке с -O0. #100023 (Zheguang Zhao).
- Исправлены два сообщения об ошибках при запуске контейнера, если в конфигурации отсутствовали параметры
logger.log и logger.errorlog (например, когда все сообщения лога должны выводиться в STDOUT/STDERR). #100239 (Simon).
- Предпочтительнее использовать
ld64.lld вместо ld от Apple (cctools-port ld64) для сборок macOS. Это должно значительно сократить время компоновки на Darwin, поскольку ld64 из cctools-port работает очень медленно с -ffunction-sections и -dead_strip. Если ld64.lld недоступен, используется ld. #100275 (Alexey Milovidov).
- Тесты, гарантирующие, что в каталогах не обнаруживаются никакие секретные данные (REST + Glue). #100307 (Konstantin Vedernikov).
- Повторное выполнение недавно изменённых тестов с разными случайными настройками. #100385 (Alexey Milovidov).
- Отслеживание зависимостей файлов
#embed в CMake и включение режима depend в ccache для корректной пересборки. #100411 (Alexey Milovidov).
- Добавлены тесты на корректность для запросов TPC-H. #100580 (Raufs Dunamalijevs).
- Используется
aws-sdk-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).
- Добавлены тесты без сохранения состояния для легковесных удалений в MergeTree, охватывающие: жизненный цикл флага
has_lightweight_delete, корректность COUNT(*) с optimize_trivial_count_query, целостность столбцов MATERIALIZED/DEFAULT, восстановление флага в ReplicatedMergeTree, read_in_order с удалёнными строками, несколько циклов удаления и слияния, скрытие столбца _row_exists, различные предикаты и применение RBAC к ALTER DELETE. #101792 (Nikita Fomichev).
- Теперь для тегированных релизов публикуются distroless Docker-образы в вариантах ubuntu и alpine. #101941 (Rahul Nair).
- Трассировки стека теперь показывают чистые относительные пути (например,
src/Common/Exception.cpp) вместо путей, засорённых каталогом сборки (например, ./ci/tmp/fast_build/./src/Common/Exception.cpp). #102000 (Raúl Marín).
- Добавлена проверка стиля CI, отклоняющая файлы размером более 5 МБ, закоммиченные в репозиторий, со списком разрешённых исключений для существующих корректных тестовых данных. Удалён неиспользуемый файл
zookeeper_log.parquet размером 14 МБ. #102080 (Raúl Marín).
- Удалено ~400 неиспользуемых директив
#include из заголовочных файлов, что сокращает время компиляции. #102585 (Raúl Marín).
- Используется
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).
Обратно несовместимое изменение
- Понижение версии после обновления может привести к потере данных. Версии сериализации типов данных теперь распространяются на вложенные типы данных. Например, раньше версия сериализации 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, из-за чего возникали ошибки “Имя файла слишком длинное” и нарушалось чтение индексов с длинными именами. Теперь имена файлов индекса пропуска данных хешируются, если они превышают max_file_name_length, аналогично файлам столбцов. Изменение обратно совместимо (новые серверы читают старые части), но при откате версии (или если во время rolling-обновления используются старые серверы) индексы с длинными именами могут игнорироваться. #97128 (Raúl Marín).
- async insert теперь включён по умолчанию. Теперь ClickHouse по умолчанию будет объединять все небольшие вставки в батчи. Этот параметр задаётся через compatibility. Если установить
compatibility=<version less than 26.2>, то значением по умолчанию останется прежнее — false. Вы можете включать и отключать async inserts на нескольких уровнях: в конфигурации профилей пользователей, для сеанса, для запроса или для таблицы семейства MergeTree. #97590 (Sema Checherinda).
- Изменено значение
mysql_datatypes_support_level по умолчанию: вместо пустого теперь используется decimal,datetime64,date2Date32, что по умолчанию обеспечивает корректное сопоставление 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. UDF, записывающие предупреждения в stderr, больше не завершаются с ошибкой, если код выхода равен 0. Исключения, связанные с кодом выхода, теперь включают содержимое stderr. #99232 (Xu Jia).
- Добавлена сериализация Map по бакетам для столбцов Map в MergeTree (
map_serialization_version = 'with_buckets'). Ключи распределяются по бакетам на основе хеша, так что при чтении одного ключа (m['key']) считывается только один бакет, а не весь столбец, что дает ускорение в 2–49 раз для lookup по одному ключу в зависимости от размера Map. Количество бакетов и стратегию бакетирования можно настраивать с помощью новых настроек MergeTree: map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient и map_buckets_min_avg_size. #99200 (Pavel Kruglov).
- Добавлена поддержка материализованных CTE. Это позволяет вычислять CTE только один раз во время выполнения запроса и сохранять их результаты во временных таблицах. Закрывает #53449. #94849 (Dmitry Novik).
- Разрешена поддержка некоторых стандартных SQL-функций без скобок для совместимости, например
NOW. Закрывает #52102. #95949 (Aly Kafoury).
- Теперь функцию natural sort key можно использовать как
naturalSortKey(s). #90322 (Nazarii Piontko).
- Теперь для функций JSONExtract можно использовать нативный ввод JSON/Object. Закрывает #88370. #96711 (Fisnik Kastrati).
- Если параметр запроса имеет тип
Nullable и не задан, мы будем считать, что его значение — NULL. #93869 (Vikash Kumar).
- Добавлена поддержка дополнительного ZooKeeper для базы данных
Replicated. #95590 (RinChanNOW).
- Поддержка функции
has для типа JSON, чтобы проверять существование пути, аналогично Map. #96927 (DQ).
- Добавлена табличная функция
mergeTreeTextIndex(database, table, index), которая позволяет читать данные напрямую из текстового индекса. Эту функцию можно использовать для интроспекции или выполнения агрегаций на основе данных текстового индекса. #97003 (Anton Popov).
- Добавлена настройка MergeTree
table_readonly, позволяющая помечать таблицы как только для чтения, чтобы предотвратить вставку и другие изменения. #97652 (Alexey Milovidov).
- Добавлена новая настройка
use_partition_pruning и алиас use_partition_key. Установите значение false, чтобы отключить отсечение партиций по ключу партиционирования. #97888 (Nihal Z. Miaji).
- Реализована поддержка
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') для таблиц Iceberg. #97904 (murphy-4o). #99130
- Для каждой записи
type=http в <protocols> теперь можно указать пользовательский ключ <handlers>, указывающий на отдельный раздел config <http_handlers_*>, что позволяет задавать разные правила HTTP-маршрутизации для разных портов. #98414 (Amos Bird).
- Добавлена опция
pretty=1 в EXPLAIN для вывода в виде дерева с отступами, а также compact=1 для сворачивания шагов Expression, что делает планы запросов более читаемыми. #98500 (Kirill Kopnev).
- Добавлена настройка сервера
restore_access_entities_with_current_grants. Когда она включена, у пользователей/ролей, восстанавливаемых из резервных копий, привилегии ограничиваются тем, какие привилегии пользователь, выполняющий восстановление, имеет право выдавать (та же семантика, что и у GRANT CURRENT GRANTS), вместо завершения с ошибкой ACCESS_DENIED. #98795 (pufit).
- Добавлены функции
caseFoldUTF8 и removeDiacriticsUTF8 для свёртки регистра Unicode и удаления диакритических знаков. #98973 (George Larionov).
- Добавлена строковая функция
normalizeUTF8NFKCCasefold для Unicode-нормализации NFKC_Casefold, которая сочетает нормализацию NFKC со свёрткой регистра. #99276 (George Larionov).
- Добавлен токенизатор
asciiCJK для полнотекстовых индексов и функции tokens. Он разбивает текст по правилам границ слов Unicode: ASCII-слова могут включать символы-соединители (подчёркивание, двоеточие, точка, одинарная кавычка), а символы Unicode вне ASCII становятся односимвольными токенами. #99357 (Amos Bird).
- Добавлены настройки
max_skip_unavailable_shards_num и max_skip_unavailable_shards_ratio, чтобы ограничить число сегментов, которые можно незаметно пропустить, когда включен skip_unavailable_shards. Если число или доля недоступных сегментов превышает заданный порог, генерируется исключение вместо молчаливого возврата неполных результатов. #99369 (Alexey Milovidov).
- Теперь можно использовать ключевое слово
SOME в выражениях с подзапросами. Оно работает так же, как ANY. #99842 (Artem Kytkin).
- Добавлена настройка
output_format_trim_fixed_string, которая удаляет завершающие null-байты из значений FixedString в текстовых форматах вывода. #97558 (NeedmeFordev).
- Добавлена поддержка заключённых в скобки выражений JOIN таблиц в предложении FROM, например
SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
- Реализована функция
toDaysInMonth: она возвращает количество дней в месяце для указанной даты. #99227 (Vitaly Baranov).
Экспериментальные возможности
- Добавлена экспериментальная поддержка пользовательских функций (UDF) на базе WebAssembly, позволяющая реализовывать пользовательскую логику функций в WebAssembly и выполнять её внутри ClickHouse. Отдельная благодарность Alexey Smirnov за вклад в поддержку бэкенда Wasmtime. #88747 (Vladimir Cherkasov). Инкрементальные улучшения поддержки WASM UDF. #99373 (Vasily Chekalkin).
- Добавлена поддержка внешних SQL-диалектов с использованием библиотеки
polyglot. #99496 (Alexey Milovidov).
- Добавлен кодек сжатия чисел с плавающей точкой
ALP (без fallback-механизма ALP_rd для несжимаемых значений double). #91362 (Nazarii Piontko).
- Добавлены экспериментальные ленивые подсказки типов для столбцов
JSON. При включении через allow_experimental_json_lazy_type_hints команда ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName), которая только добавляет или изменяет подсказки типов, выполняется мгновенно как операция, затрагивающая только метаданные, без перезаписи исторических данных. Подсказки типов применяются во время выполнения запроса для старых частей и материализуются во время INSERT и фоновых слияний. #97412 (tanner-bruce).
- Включено параллельное чтение из движка таблицы YTsaurus. #97343 (MikhailBurdukov).
- Повышена производительность озер данных. В предыдущих версиях при чтении из объектного хранилища конвейер не масштабировался по числу потоков обработки. Это дает прирост производительности на порядки (~40x) на многоядерных машинах. #99548 (Alexey Milovidov).
- Теперь связь между
enable_parallel_replicas и automatic_parallel_replicas_mode такова. Запрос может использовать параллельные реплики, только если enable_parallel_replicas > 0. Кроме того, если automatic_parallel_replicas_mode=1, решение о том, использовать ли параллельные реплики, принимается на этапе планирования на основе ранее собранной статистики. Если automatic_parallel_replicas_mode=0, параллельные реплики будут использоваться для всех поддерживаемых запросов независимо от наличия статистики. Одно из заметных исключений — распределённый insert-select с параллельными репликами: в этом случае запросы всегда будут выполняться так, как если бы automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
- Разрешено отсечение партиций, если предикат содержит любой оператор сравнения (
=, <, >, !=), а ключ партиционирования обёрнут в детерминированную цепочку функций (например, при PARTITION BY x предикаты вида cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026 или toYYYYMM(x) != 2026 будут использовать ключ партиционирования для отсечения). Закрывает #28800. #98432 (Nihal Z. Miaji).
- Разрешена оптимизация чтения в порядке сортировки и отсечение по первичному ключу, если целевой тип
CAST — Nullable, а преобразование монотонно; например, при PRIMARY KEY x ClickHouse может использовать оптимизацию чтения в порядке сортировки для ORDER BY x::Nullable(UInt64) и отсечение по первичному ключу для таких предикатов, как WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
- Теперь поддерживаются отсечение по индексу и pushdown фильтров, когда целочисленный столбец сравнивается с литералом с плавающей запятой; например, предикаты вида
WHERE x < 10.5 теперь могут использовать первичный ключ для отсечения, а фильтры вроде prime < 1e9 или number < 1e5 теперь проталкиваются в табличные функции primes() и numbers() вместо того, чтобы приводить к неограниченному выполнению. Закрывает #85167. #98516 (Nihal Z. Miaji).
- Добавлен новый SLRU-кэш для метаданных Parquet, который повышает производительность чтения, устраняя необходимость повторно загружать файлы только для чтения метаданных. #98140 (Grant Holly).
- Добавлена возможность менять местами стороны ANTI-, SEMI- и FULL JOIN на основе статистики оптимизатора. #97498 (Hechem Selmi).
- Оптимизирован пропуск гранул для
pointInPolygon при работе с большими полигонами, а также исправлена ошибка, из-за которой анализ индекса pointInPolygon генерировал исключение при отсечении по первичному ключу. #91633 (Nihal Z. Miaji).
- Повышена производительность функции
levenshteinDistance. #94543 (Joanna Hulboj).
- Оптимизировано преобразование батчей типа Decimal за счёт отказа от вызовов функций для каждого элемента. #95923 (Konstantin Bogdanov).
- Таблицы Iceberg теперь поддерживают асинхронную предзагрузку metadata через настройку таблицы
iceberg_metadata_async_prefetch_period_ms, которая периодически заранее заполняет кэш metadata. Кроме того, настройка запроса iceberg_metadata_staleness_ms позволяет запросам SELECT использовать кэшированные metadata, если они не старше указанного порога устаревания, что исключает обращения к каталогу Iceberg при обработке запроса. #96191 (Arsen Muk).
S3Queue в режиме ordered использует S3 ListObjectsV2 StartAfter, чтобы не выполнять повторный вывод всей истории префикса, уменьшая число вызовов ListObjects. #96370 (Venkata Vineel ).
- Снижено использование памяти при дедупликации вставок. В общем случае для дедупликации нужен исходный блок, но для sync insert можно обойтись без него и тем самым заметно сократить расход памяти. #96661 (Sema Checherinda).
- Использовать зависящее от архитектуры значение размера строки кэша вместо жёстко заданного значения 64. #97357 (Nikita Taranov).
- Незначительно оптимизировано чтение из словаря текстового индекса, что повысило общую производительность анализа текстового индекса. #97519 (Anton Popov).
- Ускорена декомпрессия
LZ4 для 16-байтных блоков на ARM. #97774 (Raúl Marín).
- Переработана токенизация: добавлен новый высокопроизводительный интерфейс, заменяющий старый API в стиле итератора, с поддержкой SIMD и токенизаторов с сохранением состояния. Часть #90268. #97871 (Amos Bird).
- Повышена производительность анализа текстового индекса для запросов с составными условиями, включающими как индексированные, так и неиндексированные столбцы. Ранее в таких случаях оптимизация раннего выхода при анализе индекса была ошибочно отключена. #98096 (Anton Popov).
- Повышена производительность запросов с константными выражениями, генерирующими очень длинные массивы или значения типа Map. #98287 (Alexey Milovidov).
- Исправлен анализ условий ключа для
DateTime64 в первичных ключах при сравнении с целочисленными константами, из-за чего ранее не выполнялось отсечение гранул. #98410 (Amos Bird).
- Параметр
optimize_syntax_fuse_functions по умолчанию включён. #98424 (Alexey Milovidov).
- Оптимизирована агрегатная функция
avgWeighted: использование локальных аккумуляторов вместо построчной передачи через агрегатное состояние повышает производительность до 27% для входных данных типа Nullable. #98793 (Antonio Andelic).
- Повышает производительность и снижает использование памяти для параллельных оконных функций в некоторых сценариях, а также для рабочих нагрузок
arrayFold с большими массивами. Это также может уменьшить давление page fault и повысить стабильность затронутых запросов при жёстких ограничениях по памяти. #98892 (filimonov).
- Повышена производительность слияний с сортировкой. #99013 (Artem Zuikov).
- Оптимизация
INTERSECT ALL и EXCEPT ALL. #99097 (Raufs Dunamalijevs).
- Добавлена поддержка оптимизации
read_in_order_use_virtual_row для чтения в обратном порядке. #99198 (Vladimir Cherkasov).
- Снижена конкуренция за кэш в
RIGHT и FULL JOIN-ах за счёт проверки того, установлен ли JoinUsedFlags, перед записью. #99274 (Hechem Selmi).
- Оптимизирован
PrefetchingHelper::calcPrefetchLookAhead за счёт замены вычислений с плавающей запятой на чисто целочисленную арифметику, что улучшает размещение в кэше инструкций и снижает накладные расходы в циклах агрегации. #99327 (Riyane El Qoqui).
- Снижено потребление памяти в Keeper за счёт замены
absl::flat_hash_set на CompactChildrenSet для хранения дочерних узлов. Новый контейнер хранит 0–1 дочерний узел inline, без выделения памяти в куче, что характерно для большинства узлов Keeper. Это уменьшает размер KeeperMemNode со 144 до 128 байт. #99860 (Antonio Andelic).
- Агрегатные проекции теперь корректно поддерживаются в представлениях. Исправлено #32753. #88798 (Amos Bird).
- Реализована оптимизация преобразования OUTER JOIN в INNER JOIN при использовании
join_use_nulls. Закрывает #90978. #95968 (Vladimir Cherkasov).
- Улучшено чтение подстолбцов благодаря корректному вычислению размеров перед чтением. Это снижает использование памяти и ускоряет чтение подстолбцов. #96251 (Pavel Kruglov).
- Кэши меток, несжатых данных и страниц переведены на использование отдельной arena jemalloc, чтобы избежать фрагментации памяти, когда кратковременные выделения памяти, например для queries и HTTP-запросов, смешиваются с более долгоживущими выделениями для кэшей. #96812 (Seva Potapov). #98812. #99021
- Таблицы с правилами
DELETE TTL теперь могут использовать алгоритм Вертикального слияния. #97332 (murphy-4o).
- Индексы пропуска данных теперь применяются при распределённом анализе индексов. #97767 (Azat Khuzhin).
- Метки вторичных индексов теперь заранее прогреваются, если включена настройка
prewarm_mark_cache (они загружаются в кэш меток индекса во время получения частей данных и при запуске таблицы). #97772 (Anton Popov).
- Снижено число блокировок при управлении доступом. #97894 (Nikita Taranov).
- Если включен apply_row_policy_after_final или apply_prewhere_after_final, составные условия с AND в политиках строкового доступа и PREWHERE теперь раскладываются так, чтобы извлекать атомарные условия по ключу сортировки для анализа индекса первичного ключа. Ранее, если отложенный фильтр содержал смесь предикатов по ключу сортировки и не по ключу сортировки (например, x > 1 AND y != ‘foo’), всё выражение исключалось из анализа индекса. Теперь атомарные условия по ключу сортировки (например, x > 1) извлекаются и используются для отсечения гранул, в том числе из вложенных выражений с AND. #98513 (Yarik Briukhovetskyi).
- Уменьшена конкуренция за блокировку в MergeTreeBackgroundExecutor за счёт освобождения ресурсов задачи без захвата блокировки. Закрывает #93620. #98604 (Dmitry Novik).
- Исправлено чрезмерное использование памяти (~514 MiB) при автоопределении формата во время чтения данных не в формате Arrow (например, JSON из
url или file без явно указанного формата), вызванное тем, что средство чтения ArrowStream ошибочно интерпретировало первые байты как чрезмерно большую длину metadata. #98893 (Konstantin Bogdanov).
- Добавлена возможность разбирать файлы GeoParquet, содержащие разные типы Geo в одном и том же столбце. #97851 (Mark Needham).
- Добавлена SQL-функция
tokensForLikePattern, которая разбивает шаблоны LIKE на токены с учетом семантики подстановочных символов: % и _ трактуются как подстановочные символы, экранированные подстановочные символы (\%, \_) трактуются как литералы, а токены, примыкающие к неэкранированным подстановочным символам, отбрасываются. #97872 (Amos Bird).
- Добавлен заполнитель
{_schema_hash} для движка таблицы S3, добавляющий в путь S3 хеш определений столбцов таблицы. #98265 (Miсhael Stetsyuk).
SymbolIndex, addressToSymbol, system.symbols и buildId теперь работают в macOS благодаря разбору таблиц символов Mach-O. #99014 (Alexey Milovidov).
- Таблица
system.stack_trace теперь работает в macOS, позволяя просматривать трассировки стека всех потоков сервера. #98982 (Alexey Milovidov).
- Добавлена опция LDAP-конфигурации для каждого сервера
<follow_referrals> (по умолчанию false), позволяющая управлять тем, переходит ли LDAP-клиент по рефералам. Отключение перехода по рефералам позволяет избежать тайм-аутов и зависаний при поиске от base DN корня домена Active Directory. Сообщения лога, связанные с рефералами, перенесены из warn в trace. #96765 (paf91).
- Теперь в таблице query_log в новом столбце
skip_indices мы отслеживаем все индексы пропуска данных, которые использовались при выполнении запроса. Исправляет #78676. Исходный автор — @pheepa. #87862 (Grant Holly).
- Подсказки ACCESS_DENIED больше не раскрывают имена столбцов, если пользователь не может видеть все необходимые столбцы; имена базы данных/таблицы по-прежнему видны в подсказке. #91067 (filimonov).
- Добавлен отдельный поток очистки для MergeTree, чтобы избежать задержек очистки при высокой нагрузке на слияние. Это устраняет #86181. #91574 (Amos Bird).
- Перезагружать конфигурацию кластера, если изменились IP-адреса hostname локального сервера, а не какого-либо хоста. Исправляет #81215, #70156 и #65268. #93726 (Zhigao Hong).
- Обеспечена корректная оптимизация агрегатных функций в запросах GROUPING SETS с помощью optimize_aggregators_of_group_by_keys. #93935 (Xiaozhe Yu).
- Keeper-bench: отображать ошибки в метриках и генерировать JSON-файл с метриками для режима —input-request-log. #95748 (Mohammad Lareb Zafar).
- В CREATE USER добавлена новая клауза ROLE. #97074 (Vitaly Baranov).
- Теперь можно задавать настройки internal_replication для кластера, созданного с помощью базы данных Replicated. #97228 (Pervakov Grigorii).
- новая настройка
allow_nullable_tuple_in_extracted_subcolumns определяет, будут ли извлечённые подстолбцы Tuple(...) из Tuple, Variant, Dynamic и JSON возвращаться как Nullable(Tuple(...)) (NULL для отсутствующих строк) или как Tuple(...) (значения кортежа по умолчанию для отсутствующих строк). По умолчанию эта настройка отключена; изменить её можно только перезапуском сервера. #97299 (Nihal Z. Miaji).
- Добавлена информация об отложенных фильтрах в виде отдельного элемента в выводе запроса EXPLAIN (при использовании Row Policies/PREWHERE с FINAL). Связано: #91065. #97374 (Yarik Briukhovetskyi).
- Параметр
type_json_allow_duplicated_key_with_literal_and_nested_object теперь включён по умолчанию. Это позволяет избежать ошибок о дублирующихся ключах при разборе JSON, таких как {"a" : 42, "a" : {"b" : 42}}, которые ClickHouse может формировать из исходных JSON-данных {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
- Улучшения Keeper:
find_super_nodes — очень полезная команда для отладки неожиданного роста количества узлов в Keeper. К сожалению, если суперузлов несколько, найти больше одного почти невозможно, потому что команда навсегда зависает при обходе дочерних узлов первого найденного суперузла. Этот PR запрещает обход дочерних узлов суперузлов. #97819 (pufit).
- Базовая поддержка автодополнения для
clickhouse-keeper-client. #97828 (Konstantin Bogdanov).
- Сбрасывать буферы асинхронного логирования при аварийном завершении. #97836 (Azat Khuzhin).
- Возможность impersonate теперь включена по умолчанию (см. EXECUTE AS target_user). #97870 (Vitaly Baranov).
- Улучшено прерывание запросов для движка таблицы SQLite с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #97944 (Roman Vasin).
- Добавлена настройка сервера
jemalloc_profiler_sampling_rate для управления lg_prof_sample в jemalloc; она также доступна как асинхронная метрика jemalloc.prof.lg_sample. #97945 (Antonio Andelic).
- Добавлена поддержка весов в реализации ограниченной очереди с конкурентным доступом. #97962 (Daniil Ivanik).
- Добавлен
sslmode в список допустимых ключей для источников словарей PostgreSQL. Ранее sslmode отсутствовал в списке допустимых значений dictionary_allowed_keys в PostgreSQLDictionarySource.cpp, из-за чего было невозможно настроить режим SSL для подключений словарей к PostgreSQL. В результате словари не могли подключаться к серверам PostgreSQL, где требуется SSL (например, к AWS RDS, где SSL обязателен по умолчанию), поскольку подключение не проходило согласование TLS, а сервер отклонял незашифрованный резервный вариант. #98014 (mcalfin).
- Показывать понятную ошибку “no such file” при передаче несуществующего пути к файлу в
clickhouse или clickhouse-local вместо сбивающего с толку общего сообщения. #98048 (Raúl Marín).
- Текстовые индексы теперь можно создавать для столбцов
Nullable([Fixed]String) и Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
- Не удаляйте именованные коллекции, от которых зависят источники словарей. #98127 (Pablo Marcos).
- Включена поддержка алгоритма JOIN
grace_hash для запросов с итогами. #98144 (János Benjamin Antal).
- Раннее прекращение фоновых слияний при DROP DATABASE для обычного shared merge tree. #98161 (Shaohua Wang).
- Улучшена отмена запросов к MongoDB и MySQL с помощью KILL QUERY и сочетания Ctrl+C в clickhouse-client. #98187 (Roman Vasin).
- Удалён NetlinkMetricsProvider, и для сбора метрик taskstats по отдельным потокам теперь используется только procfs. Сбор через Netlink создаёт проблемы в контейнеризированных средах и сильнее ухудшает tail latency при конкуренции за ресурсы. #98229 (Amos Bird).
- Переработана обработка файлов манифеста в Iceberg, чтобы устранить проблемы с кэшированием файлов манифеста. #98231 (Daniil Ivanik).
- Теперь мы учитываем случаи, когда ключ сортировки таблицы может быть выражением вроде
toDate(time), и можем решать, не откладывать ли вычисление таких выражений, если они входят в фильтры. #98237 (Yarik Briukhovetskyi).
- Добавлена новая метрика
MaxAllocatedEphemeralLockSequentialNumber — максимальный последовательный номер, выделенный для эфемерных lock znode в ZooKeeper. #98243 (Miсhael Stetsyuk).
- ClickStack обновлён до версии 2.20.0. #98252 (Aaron Knudtson).
- Добавлено новое событие профиля
KeeperRequestTotalWithSubrequests, которое учитывает каждый подзапрос в составе мультизапроса отдельно, обеспечивая лучшую видимость фактической рабочей нагрузки Keeper. Существующее событие KeeperRequestTotal по-прежнему учитывает каждый мультизапрос как один запрос. #98348 (Antonio Andelic).
SYSTEM RELOAD DICTIONARIES теперь перезагружает словари в порядке топологической сортировки, поэтому словари, использующие другие словари в качестве источника, после перезагрузки получают актуальные данные. #98356 (Alexey Milovidov).
- Перезапускайте кеш статистики после изменения настройки MergeTree. #98520 (Han Fei).
- Только “живые” реплики (доступные для подключения) участвуют в распределённом анализе индексов. #98521 (Azat Khuzhin).
- Добавлена настройка
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (по умолчанию отключена/разрешена), которая запрещает использовать профили настроек, заданные в конфигурации (кроме профиля default), для пользователей, определённых через SQL. #98662 (Alexander Tokmakov).
- Число узлов, используемых в автоматической эвристике параллельных реплик, теперь ограничивается фактическим числом узлов в кластере (а не только настройкой
max_parallel_replicas). #98668 (Nikita Taranov).
- Реализованы хеджированные запросы и асинхронное чтение для распределённого анализа индексов. #98724 (Azat Khuzhin).
- Для десериализации бинарных состояний
AggregateFunction теперь необходимо полностью прочитать входные данные. Если в конце присутствуют лишние байты, ClickHouse генерирует исключение вместо того, чтобы принимать некорректные данные состояния. #98786 (Nihal Z. Miaji).
- Сделать так, чтобы TRUNCATE DATABASE поддерживал отмену запроса. #98828 (Shaohua Wang).
- Улучшен
keeper-bench: добавлены конвейерная обработка запросов, период прогрева, статистика по каждой операции, воспроизводимые seed и улучшенная обработка ошибок. #98906 (Antonio Andelic).
- Поддержка предложения SAMPLE при распределённом анализе индексов. #98931 (Azat Khuzhin).
- Показывать заголовок диаграммы на панели мониторинга, даже если запрос возвращает пустой результат или завершается ошибкой. #98975 (Yash ).
- Сообщения об ошибках анализатора больше не перечисляют все столбцы таблицы (что могло приводить к исключениям размером более 150 КБ). Теперь списки столбцов ограничиваются 10 элементами. #99002 (Yash ).
- Корректно возвращается статистика столбцов из подзапросов с JOIN, чтобы родительский запрос мог использовать её для изменения порядка JOIN. #99096 (Alexander Gololobov).
- Помечать сеанс ZooKeeper как истёкший сразу после начала финализации, а не ждать завершения потока отправки. Это позволяет другим потокам без задержки устанавливать новый сеанс. #99102 (Raúl Marín).
- Теперь используется больше математических функций из LLVM-libc:
exp, exp2, expm1, fabs, fabsl, floor, fmodl, log, log2, logf, pow, scalbn, scalbnl, copysignl, nan, nanf, nanl и общие константы explogxf. #99118 (Konstantin Bogdanov).
- Снизили использование памяти и устранили возможное дублирование вывода в collapsed-формате
system.jemalloc_profile_text. #99121 (Antonio Andelic).
- Добавлен столбец
is_subrequest в system.aggregated_zookeeper_log, чтобы отделить отдельные запросы от подзапросов внутри запросов Multi/MultiRead. Ранее подзапросы агрегировались в те же бакеты, что и отдельные запросы, и поскольку каждая подоперация записывалась с общей длительностью мультизапроса, средняя задержка получалась некорректной. Теперь у подзапросов нулевая задержка. #99169 (Miсhael Stetsyuk).
- Разрешена команда
ALTER TABLE MODIFY COLUMN x TTL ... без указания типа столбца. #99208 (Nikolay Degterinsky).
- Пропускаются устаревшие запросы Keeper для сеансов, которые уже отключились, что позволяет избежать лишних обменов с Raft. Число отслеживаемых завершённых сеансов ограничивается настройкой coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic).
- Добавлена поддержка текстового индекса, построенного на
mapValues(map), для оператора IN. #99286 (Anton Popov).
- Поддержка shell-подобного автодополнения в clickhouse keeper-client (автодополнение аргументов в кавычках, то есть
'foo ba', обработка экранированных аргументов, то есть foo\ ba, ls теперь выводит узлы в кавычках, если они содержат пробелы). #99312 (Azat Khuzhin).
- Предотвращено зависание команды Keeper
mntr из-за конфликтов блокировок. #99472 (Antonio Andelic).
- Снизить конкуренцию за блокировки в диспетчере Keeper, вызывая обратные вызовы и обрабатывая запросы на чтение вне области действия мьютекса, а также добавить профилированные lock guard’ы для обсервабилити. #99751 (Antonio Andelic).
- Допускается отсутствие заполнения в конце последнего блока файлов Parquet. #99857 (Seva Potapov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено сохранение целевого объекта таблицы Alias как зависимости DDL, если он указан не полностью: теперь используется база данных таблицы Alias, а не база данных сеанса. #95175 (Enric Calabuig).
- Исправлены неверный результат или исключение при чтении подстолбцов у столбцов ALIAS. #95408 (Pavel Kruglov).
- Исправлено отсутствие столбца при использовании нестандартного алиаса идентификатора в JOIN со старым анализатором. Исправляет #25594, #47288 и #53263. #95679 (Zhigao Hong).
- Исправлен сбой в функциях диалекта Kusto
bin(), bin_at(), extract() и indexof(), возникавший при передаче пустых аргументов. #95736 (NeedmeFordev).
- Запрещает монтировать local_object_storage (которое используется для озёр данных поверх локальной файловой системы и, возможно, для LocalDisk) где-либо, кроме user_files_path, в clickhouse-client. #96201 (Daniil Ivanik).
- В движке таблицы
DeltaLake исправлена логическая гонка при смене версии снимка и устранены избыточные ресурсоёмкие перезагрузки снимка. #96226 (Kseniia Sumarokova).
- Исправлена логическая ошибка при присоединении части в MergeTree, если между её отсоединением и присоединением происходило несколько последовательных переименований. #96351 (Alexey Milovidov).
- Исправлена ошибка, из-за которой явные настройки, отправленные вместе с
compatibility в том же запросе, могли незаметно игнорироваться, если их значение совпадало со значением по умолчанию на сервере. #97078 (Raufs Dunamalijevs).
- Исправлено поведение клиента: при столкновении
INSERT с параллельным разбором с недопустимыми данными он сообщал об ошибке NETWORK_ERROR вместо фактической ошибки разбора (с правильным номером строки). #97339 (Alexey Milovidov).
- Исправлена ошибка, из-за которой агрегатная функция
sumCount не могла читать сериализованные состояния старого формата после введения Nullable(Tuple). Закрывает #97370. #97502 (Nihal Z. Miaji).
- Исправлено исключение при сравнении кортежей, содержащих элементы типа
Nothing (например, при сравнении с элементами кортежа NULL), при использовании GROUPING SETS и ORDER BY. #97509 (Alexey Milovidov).
- Исправлено недетерминированное вычисление
uncompressed_hash для частей Compact MergeTree при использовании нескольких кодеков сжатия, что могло приводить к некорректной дедупликации. #97522 (Alexey Milovidov).
- Исправлена логическая ошибка, связанная с отсутствием stream при INSERT SELECT с JSON и бакетами в общих данных. Закрывает #97331. #97523 (Pavel Kruglov).
- Исправлены случаи, когда исключения
MEMORY_LIMIT_EXCEEDED во время слияний SummingMergeTree и CoalescingMergeTree ошибочно регистрировались как CORRUPTED_DATA. #97537 (János Benjamin Antal).
- Исправлено исключение “Context has expired” для коррелированных подзапросов, содержащих табличные функции, например
url(). #97544 (Alexey Milovidov).
- Исправлены исключения и некорректное поведение в
optimize_syntax_fuse_functions при работе с агрегатными проекциями, типами Date и сохранением имён столбцов. #97545 (Alexey Milovidov).
- Убрано некорректное переписывание запроса с
replaceRegexpOne на extract, которое приводило к неверным результатам, если регулярное выражение не находило совпадений; также исправлено Исключение при использовании replaceRegexpOne с GROUP BY ... WITH CUBE и group_by_use_nulls=1. #97546 (Alexey Milovidov).
- Исправлено бесконечное зависание
DROP DATABASE при использовании database_atomic_wait_for_drop_and_detach_synchronously, если запрос был принудительно завершён. #97586 (Alexey Milovidov).
- Исправлено:
KILL QUERY не мог завершать запросы, зависшие при генерации WITH FILL, загрузке словаря через dictGet или выполнении ALTER DELETE с mutations_sync=1 на ReplicatedMergeTree. #97589 (Alexey Milovidov).
- Табличная функция
loop вызывала inner_storage->read() напрямую, в обход слоя интерпретатора, где применяются политики уровня строк, привилегии на уровне столбцов и другие проверки безопасности. Это позволяло пользователю, ограниченному политиками уровня строк, читать все строки через loop(table), даже если прямой SELECT не возвращал ни одной строки. #97682 (pufit).
- Исправлено некорректное отсечение партиций при использовании DateTime64 со значениями до эпохи Unix в функции
toDate(). #97746 (Yarik Briukhovetskyi).
- После этого патча
hasPartitionId будет возвращать false, если в наборе data part есть другая партиция с более высоким идентификатором партиции. #97748 (Mikhail Artemenko).
- Исправлены возможные сбои при чтении пустых гранул в расширенных общих данных в JSON. Закрывает #97563. #97778 (Pavel Kruglov).
- Исправлена ошибка
Cannot schedule a file LOGICAL_ERROR при INSERT в Distributed, возникавшая из-за состояния гонки между DROP и INSERT. #97822 (Azat Khuzhin).
- Исправлены аварийное завершение работы сервера ClickHouse и срабатывание assert при вызове
mapContainsKey/mapContainsKeyLike с индексом пропуска данных tokenbf_v1. #97826 (Shankar Iyer).
- Исправлены исключения LOGICAL_ERROR, возникавшие из-за
LowCardinality внутри составных типов (Variant, Dynamic, Tuple) в concatWithSeparator, format, IN-подзапросах, GLOBAL IN и JOIN с runtime-фильтрами. #97831 (Raúl Marín).
- Исправлено Исключение
LOGICAL_ERROR Chunk info was not set for chunk in MergingAggregatedTransform, возникавшее при использовании ARRAY JOIN с table function merge() для нескольких distributed таблиц в сочетании с GROUP BY. #97838 (Raúl Marín).
- Исправлен сбой сервера (
std::terminate), вызванный неперехваченным исключением в деструкторе пула HTTP-соединений, когда при высоком параллелизме достигался жёсткий лимит группы соединений. Исключение HTTP_CONNECTION_LIMIT_REACHED могло пробрасываться из ~PooledConnection при возврате соединения в пул, что приводило к SIGABRT. #97850 (Antonio Andelic).
- Исправлен некорректный результат при использовании алгоритма
grace_hash с неэквивалентными JOIN, когда левый блок не удаётся обработать полностью из-за ограничений на размер результата JOIN. #97866 (János Benjamin Antal).
- Исправлена проблема низкой производительности при сканировании metadata DeltaLake, возникшая после #96686. #97880 (Kseniia Sumarokova).
- Исправлена гонка данных в клиенте ZooKeeper между
sendThread и receiveThread. #97887 (Pablo Marcos).
- Исправлена ошибка, из-за которой было невозможно использовать CTE в распределённых INSERT SELECT. Продолжение https://github.com/ClickHouse/ClickHouse/pull/87789. Закрывает #95837. #97889 (Yarik Briukhovetskyi).
- Исправлено исключение в
CachedOnDiskReadBufferFromFile::readBigAt. Закрывает #97325. #97890 (Kseniia Sumarokova).
- Исправлено исключение
LOGICAL_ERROR в движке Alias при работе с материализованными столбцами, вызванное несоответствием столбцов. Закрывает #97907. #97921 (Kai Zhu).
- Исправлена потеря данных Keeper после перезапуска при использовании Azure Blob Storage с метаданными
s3_plain в качестве хранилища журнала. #97987 (Antonio Andelic).
- Исправлена ошибка JIT-компиляции функции
sign для целочисленных типов с разрядностью выше, чем у Int8 — для значений вне диапазона -128..127 знак мог определяться неверно. #98012 (Alexey Milovidov).
- Исправлены исключение
DUPLICATE_COLUMN и неявное появление NULL при чтении таблиц Delta Lake, использующих режим сопоставления столбцов “name”, с полями struct, имена которых содержат точки (например, STRUCT<`a.foo`: STRING, `b.foo`: STRING>). #98013 (Caio Ishizaka Costa).
- Исправлена мутация после легковесного обновления и при использовании вторичных индексов. #98044 (Raúl Marín).
- Исправлен некорректный результат FINAL-запросов при сочетании индексов пропуска данных по первичному и не по первичному ключу. #98097 (Raúl Marín).
- Обеспечено выполнение проверок прав READ ON FILE для скалярной функции file() и DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
- Исправлен сбой, из-за которого запрос к файлам с glob-шаблоном (например,
file('dir/**', 'LineAsString')) приводил к необрабатываемому исключению файловой системы (STD_EXCEPTION), если каталог содержал битую символическую ссылку. Теперь такие символические ссылки молча пропускаются, и запрос возвращает результаты по всем корректным файлам. #98143 (Mark Andreev).
- Исправлен сбой сегментации при оптимизации плана запроса во время преобразования OUTER JOIN в INNER JOIN с
arrayJoin в выражении фильтра. #98147 (Alexey Milovidov).
- Исправлена ошибка, из-за которой формат
ProtobufList не работал с движком Kafka, поскольку состояние чтения не сбрасывалось между сообщениями. #98151 (Alexey Milovidov).
- Исправлена логическая ошибка в analyzer_compatibility_join_using_top_level_identifier и ARRAY JOIN, закрыт #98164. #98179 (Vladimir Cherkasov).
- Для ответов наблюдения в
aggregated_zookeeper_log теперь задаётся компонент Watch вместо пустого значения. #98202 (Antonio Andelic).
- Если столбцы ключа партиционирования не входят в ключ сортировки, то отсечение партиций может ошибочно пропустить партиции, содержащие строки, которые должны были бы остаться после дедупликации FINAL. #98242 (Yarik Briukhovetskyi).
- Исправлена логическая ошибка “Bad cast from type DB::ColumnConst to DB::ColumnArray” в
kql_array_sort_asc/kql_array_sort_desc при вызове с аргументами в виде константных массивов. #98251 (Alexey Milovidov).
- Исправлен выход за границы при обращении к
ColumnConst::getExtremes, который мог вызывать сбой при включенном extremes = 1. #98263 (Alexey Milovidov).
- Исправлена потенциальная взаимная блокировка, возникавшая, когда две параллельные операции
MOVE PARTITION работают с одной и той же парой таблиц в противоположных направлениях. #98264 (Alexey Milovidov).
- HTTP-сервер теперь возвращает сообщение об ошибке в теле ответа на запросы с ответом 400 Bad Request, вызванные некорректными заголовками, вместо пустого тела. #98268 (Alexey Milovidov).
- Исправлены ошибки, приводившие к некорректным результатам при использовании распределённого анализа индексов (экспериментальная возможность) и кэша условий запроса. #98269 (Azat Khuzhin).
- Исправлено исключение LOGICAL_ERROR “Недопустимый результат двоичного поиска в
MergeTreeSetIndex”, вызванное преобразованием toDate для столбцов ключа, когда данные переходили через границу 65535. #98276 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда RIGHT JOIN, обёрнутый в CROSS JOIN, переставлялся оптимизацией query_plan_join_swap_table в устаревшем коде шага JOIN. #98279 (Alexey Milovidov).
- Добавлена проверка повреждённых данных при десериализации
DDSketch, чтобы предотвратить segfault’ы, исключения, бесконечные циклы и OOM при чтении повреждённых состояний агрегатной функции quantilesDD. #98284 (Alexey Milovidov).
- Исправлен LOGICAL_ERROR “Trying to execute PLACEHOLDER action”, возникавший при обращении к коррелированным столбцам из внешних запросов внутри лямбда-функций, таких как
arrayMap. #98285 (Alexey Milovidov).
- Исправлено исключение «Logical error» в
caseWithExpression, когда выражение CASE включает materialize(NULL) или другие аргументы Nullable(Nothing). #98290 (Alexey Milovidov).
- Исправлено ошибочное исключение преобразования типов при фильтрации по виртуальному столбцу
_table в табличной функции merge. #98291 (Alexey Milovidov).
- Исправлен редкий сбой дедупликации, из-за которого повторные вставки ошибочно дедуплицировались из-за несогласованного порядка очистки каталогов ZooKeeper
blocks/ и deduplication_hashes/. #98293 (Alexey Milovidov).
- Исправлено Исключение, возникавшее при одновременном использовании
ORDER BY ... WITH FILL и LIMIT BY. #98361 (Alexey Milovidov).
- Исправлено скрытое повреждение данных при вставке столбца Parquet/Arrow
Date в столбец Enum — теперь несовместимое преобразование типов корректно отклоняется, вместо того чтобы сохранять недопустимые значения enum. #98364 (Alexey Milovidov).
- Исправлено исключение при чтении файла Arrow со столбцом
Array в таблицу со столбцом Nested. #98365 (Alexey Milovidov).
- Исправлены мутации
MATERIALIZE INDEX и MATERIALIZE PROJECTION, которые застревали, если индекс или проекция удалялись до завершения мутации. #98369 (Alexey Milovidov).
- Исправлено исключение при чтении из
Nullable(Tuple(...)), когда имя элемента Tuple совпадает с подстолбцом null у Nullable. #98372 (Alexey Milovidov).
- Исправлено исключение “Столбец …: у узла дерева запроса нет корректного узла-источника” при выполнении JOIN между таблицей
Merge (оборачивающей таблицу Distributed) и другой таблицей. #98376 (Alexey Milovidov).
- Исправлено некорректное преобразование
Bool из Parquet в FixedString в нативном ридере V3, из-за которого возвращались raw bytes вместо строкового представления. #98378 (Alexey Milovidov).
- Исправлено:
tryGetColumnDescription теперь фильтрует подстолбцы по виду родительского столбца, аналогично другим методам поиска столбцов. #98391 (Alexey Milovidov).
- Принимать учетные данные Base64 без паддинга в HTTP Basic Auth. Некоторые HTTP-клиенты опускают завершающие символы паддинга
= в заголовке Authorization: Basic, что ранее приводило к ошибкам аутентификации. #98392 (Amos Bird).
- Исправлены некорректные результаты отсечения партиций после слияния частей со столбцами ключа партиционирования типа
Nullable, вызванные неверными границами индекса min-max. #98405 (Amos Bird).
- Исправлено редкое Исключение в исполнителе конвейера, которое могло проявляться сообщением
Received signal 6 (только в отладочных сборках), когда расширение конвейера происходило одновременно с отменой запроса. #98428 (Alexey Milovidov).
- Исправлено исключение “Column identifier is already registered” при использовании
count_distinct_optimization с предложением QUALIFY. #98433 (Alexey Milovidov).
- Исправлено исключение “cannot be inside Nullable type”, возникавшее при использовании
IN/NOT IN с аргументами-столбцами типа LowCardinality (например, a NOT IN (b), где a имеет тип LowCardinality(String)). #98443 (Alexey Milovidov).
- Исправлено исключение “Pipeline stuck” в JOIN-операциях
full_sorting_merge, вызванное взаимной блокировкой в PingPongProcessor, возникавшей, когда оптимизация FilterBySetOnTheFly создавала циклическую зависимость с MergeJoinTransform. #98454 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR “Проекция не может увеличить количество строк в блоке”, возникавшее при слиянии частей с TTL, удаляющим все строки, и агрегирующей проекцией с константным ключом GROUP BY. #98458 (Alexey Milovidov).
- Исправлено исключение с логической ошибкой при совместном использовании
CROSS JOIN и INNER JOIN USING. #98459 (Alexey Milovidov).
- Исправлено обращение к нулевому указателю в
dictGetOrDefault, когда аргумент ключа имеет тип Nullable. #98460 (Alexey Milovidov).
- Исправлено исключение в запросах
DISTINCT, возникавшее при использовании агрегатных проекций, если materialize приводил к различиям в типах LowCardinality между запросом и проекцией. #98462 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR, возникавшее при использовании
arrayJoin в выражении фильтра с OUTER JOIN и включенном join_use_nulls. #98464 (Alexey Milovidov).
- Исправлено Исключение из-за логической ошибки “Реплика решила читать в режиме WithOrder, а не в ReverseOrder” при использовании параллельных реплик с
optimize_aggregation_in_order. #98467 (Alexey Milovidov).
- Исправлено отключение Java-клиентов ZooKeeper от ClickHouse Keeper после запроса
addWatch. Java-клиент ожидает 4-байтовое тело ErrorResponse в ответе на addWatch, но Keeper отправлял пустое тело, из-за чего возникало EOFException и разрывался сеанс. Из-за этого переставали работать CuratorCache в Apache Curator и любые Java-приложения, использующие постоянные наблюдения. Исправляет #98079. #98499 (Antonio Andelic).
- Исправлено поведение, при котором метрики Keeper
zk_followers и zk_synced_followers не уменьшались при отказе follower. В четырёхбуквенную команду mntr добавлены новые метрики zk_learners и zk_synced_non_voting_followers. Исправляет #54173. #98504 (Antonio Andelic).
- Исправлено исключение
LOGICAL_ERROR в renameAndCommitEmptyParts, которое могло возникнуть при одновременном выполнении TRUNCATE TABLE и OPTIMIZE TABLE с использованием транзакций MergeTree. #98508 (Alexey Milovidov).
- Исправлено поведение, при котором защищённый raft-порт Keeper игнорировал параметры
cipherList и dhParamsFile из конфигурации openSSL и всегда использовал значения по умолчанию вместо заданных пользователем. Закрывает #51188. #98509 (Antonio Andelic).
- Исправлены вводящие в заблуждение сообщения лога Keeper, такие как “Receiving request for session X took 9963 ms”, где указанное время на самом деле уходило на ожидание в состоянии бездействия в
poll() между heartbeat-сообщениями, а не на выполнение самой операции. Исправление #79026. #98510 (Antonio Andelic).
- Исправлен неожиданный результат при использовании read_in_order_use_virtual_row и монотонных функций; закрыт #97837. #98514 (Vladimir Cherkasov).
- Исправлена ошибка
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' при использовании PREWHERE с подзапросом в IN в таблицах семейства MergeTree. #98522 (Alexey Milovidov).
- Исправлены TCP-соединения Keeper, из-за которых сервер не мог корректно завершить работу, поскольку они не реагировали на сигнал завершения. #98525 (Alexey Milovidov).
- Исправлено исключение “Столбец сортировки не найден среди выходов ActionsDAG” при включенном
query_plan_convert_join_to_in и query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
- Исправлена проблема, из-за которой источник словаря MongoDB не работал с именованными коллекциями. Закрывает #97840. #98528 (Pablo Marcos).
- Исправлен LOGICAL_ERROR, возникавший, если после подстановки параметров Identifier оказывался пустым. #98530 (Pervakov Grigorii).
- Исправлена взаимная блокировка конвейера при одновременном использовании
sort_overflow_mode = 'break' и оконных функций. #98543 (Alexey Milovidov).
- Исправлен откат столбца в движке Buffer при обработке исключения, возникающего при добавлении нового блока. Прежняя логика могла приводить к повреждению состояния столбцов в памяти. #98551 (Pavel Kruglov).
- Исправлено исключение
Bad cast from type ColumnConst to ColumnDynamic при null-safe сравнении (<=> / IS NOT DISTINCT FROM) с константными столбцами Dynamic или Variant и NULL. Также исправлена ошибка, из-за которой IS DISTINCT FROM для Dynamic/Variant при сравнении с NULL всегда ошибочно возвращал 0. #98553 (Alexey Milovidov).
- Исправлено использование текстового индекса вместе с другими индексами пропуска данных. Ранее при одновременном использовании фильтром запроса текстового индекса и других обычных индексов пропуска данных могли возникать логические ошибки, такие как “Trying to get non-existing mark”. #98555 (Anton Popov).
- Исправлена логическая ошибка “TABLE_FUNCTION is not allowed in expression context”, которая возникала, когда табличная функция с псевдонимом использовалась несколько раз в пределах одной и той же области видимости запроса (например, в секциях
PREWHERE и QUALIFY). #98557 (Alexey Milovidov).
- Исправлен распределённый анализ индексов для выражений (а не только для столбцов) в PK (из-за ошибки на удалённых репликах не отфильтровывались избыточные гранулы). #98561 (Azat Khuzhin).
- Запретить удаление столбца, если его подстолбцы используются в выражениях default/alias других столбцов, и использовать анализатор для выражений default при выполнении alter drop column. #98569 (Nikita Mikhaylov).
- Исправлены некорректные повторные попытки выполнения запросов S3 при ошибках, не допускающих повторной попытки (включая
HTTP_CONNECTION_LIMIT_REACHED), в HTTP-клиенте. #98598 (Sema Checherinda).
- Исправлено переполнение Decimal при отсечении партиций с DateTime64. #98628 (Yarik Briukhovetskyi).
- Исправлены две ошибки в JIT-компиляции выражений: ошибка copy-paste в проверке типов
nativeCast, из-за которой ветви приведения integer-to-integer и float-to-float были недостижимы, а также передача некорректного nullptr для TargetMachine в 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 “Реплика решила читать в режиме Default, а не WithOrder” при использовании
read_in_order_through_join с параллельными репликами. #98685 (Alexey Milovidov).
- Исправлено Исключение “Неверное приведение типа
DB::TableFunctionNode к DB::QueryNode” при использовании табличной функции input в качестве аргумента функции remote. #98694 (Alexey Milovidov).
- Исправлено повторное появление устаревших частей данных, вызванное некорректной очисткой пустых перекрывающих частей. #98698 (Shaohua Wang).
- Исправлено исключение в
LogicalExpressionOptimizerPass, возникавшее, если булева функция в сравнении equals возвращала тип Variant. #98712 (Alexey Milovidov).
- Исправлен некорректный разбор функцией
parseDateTimeBestEffort слов, начинающихся с префиксов названий месяцев/дней недели. Закрывает #97965. #98742 (Pavel Kruglov).
- Исправлено исключение
UNKNOWN_IDENTIFIER, возникавшее при выполнении запросов к табличной функции merge() или движку Merge для таблиц с JSON-столбцами с разными параметрами (например, разными полями SKIP) и столбцами ALIAS, ссылающимися на подпути JSON, при включенном новом анализаторе. Закрывает #97812. #98753 (Pavel Kruglov).
- Исправлена работа оптимизации
optimize_skip_unused_shards с анализатором при использовании хранилища Distributed в View. #98754 (Nikolai Kochetov).
- Исправлен доступ по имени к подстолбцам кортежа (например,
SELECT x.a для Tuple(a UUID, b Int32)) во внешних таблицах, передаваемых через --external в clickhouse-client. Закрывает #96925. #98755 (Pavel Kruglov).
- Исправлено Исключение
reverseUTF8 при некорректном (усечённом) вводе UTF-8. #98770 (Alexey Milovidov).
- Исправлено определение применимости индекса пропуска данных типа set для предиката с OR и false (то есть
or(x, 0)). #98776 (Azat Khuzhin).
- Исправлено исключение
LOGICAL_ERROR (несоответствие структуры блока в removeUnusedColumns), которое могло возникать при FINAL + PREWHERE + константном выражении WHERE + не зависящих от столбцов агрегатах, таких как count(). #98778 (Alexey Milovidov).
- Записи
system.trace_log для автоперезагрузки словарей ClickHouse теперь имеют непустые идентификаторы запросов. #98784 (Miсhael Stetsyuk).
- Исправлен crash, при котором мог происходить доступ по нулевому указателю в system tables, созданных в промежутке между созданием снимка таблиц при вызове
IDatabaseTablesIterator::table() и изменением таблиц в другом потоке во время последующей итерации. #98792 (Grant Holly).
- Исправлена ошибка, из-за которой
SYSTEM START REPLICATED VIEW не активировала задачу обновления. #98797 (Pablo Marcos).
- Исправлено исключение “Inconsistent table names” при использовании табличной функции
view(), содержащей JOIN-операции внутри другого JOIN (только со старым анализатором). #98809 (Alexey Milovidov).
- Исправлена корректировка RLIMIT_SIGPENDING (через pending_signals). #98829 (Azat Khuzhin).
- Исправлено исключение при комбинировании
loop с табличными функциями кластера. #98860 (Konstantin Bogdanov).
- LEFT ANTI JOIN по нескольким столбцам ключа JOIN возвращал некорректные результаты, когда
enable_join_runtime_filters=1 (значение по умолчанию). #98871 (Alexander Gololobov).
- Исправлено поведение, из-за которого
WITH FILL STALENESS создавал лишние заполненные строки при чтении данных несколькими фрагментами (например, при небольшом index_granularity). #98895 (Alexey Milovidov).
- Исправлена ошибка LOGICAL_ERROR «RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B». #98900 (Azat Khuzhin).
- Исправлена рассинхронизация учёта памяти, вызванная тем, что при неудачных выделениях памяти не выполнялся откат, неопределённым поведением
nallocx(0) и ошибкой на единицу при отслеживании глобального пика. Отслеживание расширено и теперь охватывает кольцевые буферы io_uring. #98915 (Antonio Andelic).
- Запретить выполнение Attach для таблиц локального озера данных вне пользовательских путей, а не только их создание. #98936 (Daniil Ivanik).
- Исправлено состояние гонки, которое могло вызывать исключение “ReadBuffer is canceled” в запросах, использующих
urlCluster или аналогичные кластерные табличные функции. #98955 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR в финансовых функциях (financialNetPresentValue, financialInternalRateOfReturn и т. д.), возникавшее при передаче аргументов типа BFloat16. #98958 (Alexey Milovidov).
- Исправлена ошибка, из-за которой индексы пропуска данных (и условия по первичному ключу) не применялись к столбцам ALIAS, когда слияние выражений в плане запроса отключено (query_plan_merge_expressions = 0 или query_plan_enable_optimizations = 0). #98960 (Peng).
- Для асинхронных вставок теперь увеличивается ProfileEvent
InsertQuery. Закрывает #98626. #98962 (Narasimha Pakeer).
- Исправлено исключение “Inconsistent KeyCondition behavior” в отладочных сборках, когда первичный ключ содержит значения NaN с плавающей запятой:
accurateLess и accurateEquals теперь обрабатывают NaN согласованно с порядком сортировки ClickHouse. Закрывает #98075. #98964 (Alexey Milovidov).
- SummingMergeTree больше не суммирует столбцы типа Bool (и других доменных типов). Значения Bool теперь сохраняются как есть, а не суммируются арифметически. #98976 (Yash ).
- Исправлено исключение Scalar doesn’t exist, возникавшее при выполнении запроса к удалённому сегменту с включённым
optimize_const_name_size и enable_scalar_subquery_optimization = 0. Крупные константы, заменённые в удалённом запросе ссылками __getScalar, не отправлялись в сегмент, из-за чего запрос завершался ошибкой. #98979 (andriibeee).
- Исправлено
NOT_FOUND_COLUMN_IN_BLOCK для некоторых запросов с GROUP BY и выражениями, включающими обратный поиск в словаре, сравнения при преобразовании Date/DateTime и сравнения кортежей. Закрывает #98888. #98980 (Nihal Z. Miaji).
- Исправлено неопределённое поведение (разыменование нулевого указателя) при изменении столбца version/sign/is_deleted в
EPHEMERAL или ALIAS в движках MergeTree. Такие изменения теперь корректно отклоняются. #98985 (Alexey Milovidov).
- Исправлена проблема, из-за которой в
system.grants отсутствовали параметры регулярного выражения для привилегий URL и S3 в столбце access_object. #98987 (DQ).
- Исправлено чтение из Iceberg BigLake: учетные данные ADC теперь передаются S3-клиенту GCS (что устраняет ошибки 403), учетные данные OAuth2 перед отправкой теперь URL-кодируются (что устраняет сбои аутентификации для токенов со специальными символами), а обход пространства имен больше не прерывается при получении от BigLake ответов HTTP 400. #98998 (Nikita Fomichev).
- Исправлена ошибка, из-за которой
clickhouse-client не переключал часовой пояс, если переменная окружения TZ задавалась в виде пути к файлу POSIX (например, TZ=:/etc/localtime). #99000 (Yash ).
- Исправлено некорректное или недостаточное отсечение, когда
startsWith, LIKE, NOT LIKE используются со столбцом FixedString. Кроме того, функция приведения FixedString к String теперь может отсекать гранулы, если применяется к ключевому столбцу. Закрывает #98940. #99001 (Nihal Z. Miaji).
- Исправлена ошибка, из-за которой
windowFunnel с strict_deduplication возвращал неверный уровень при обнаружении дубликата события. #99003 (Yash ).
- Исправлена ошибка, из-за которой EXISTS игнорировал секции LIMIT и OFFSET в подзапросах, что приводило к некорректным результатам, если подзапрос не возвращал ни одной строки из-за OFFSET или LIMIT со значением 0. Закрывает #88722. #99005 (andriibeee).
- Исправлено исключение “Block structure mismatch”, возникавшее, когда при оптимизации проталкивания фильтра выражение AND сводилось к константе из-за короткого замыкания при использовании
GROUPING SETS. #99010 (Alexey Milovidov).
- Исправлено Исключение при чтении патч-частей (легковесные обновления), если в плане запроса отсутствует столбец
_part_offset. #99023 (Alexey Milovidov).
- Запрос вида
SELECT * FROM table WHERE pk_id = '', где pk_id — первичный ключ типа String, теперь будет корректно использовать индекс первичного ключа для фильтрации гранул. #99027 (Shankar Iyer).
- Исправлено исключение
DEPENDENCIES_NOT_FOUND в движке Kafka, возникавшее, когда materialized view было отсоединено, пока фоновый поток передавал данные. #99028 (Alexey Milovidov).
- Исправлено Исключение при создании таблицы со столбцом
EPHEMERAL, у которого то же имя, что и у виртуального столбца (например, _part_offset). #99031 (Alexey Milovidov).
- Исправлено вводящее в заблуждение сообщение “inflate failed: buffer error” при чтении несуществующих сжатых файлов через табличную функцию
url() с глоб-шаблонами. Теперь при включенном http_skip_not_found_url_for_globs, как и ожидается, возвращается пустой результат. #99034 (Alexey Milovidov).
- Исправлен сбой сервера (std::terminate) при выполнении
ALTER TABLE ... DROP PART для patch part после изменения схемы (например, ADD COLUMN). Сбой был вызван отсутствием системных столбцов (_part) в метаданных пустой coverage part, что приводило к неперехваченному исключению внутри NOEXCEPT_SCOPE. #99036 (Peng).
- Процесс сервера ClickHouse мог аварийно завершиться, если во время чтения с кэш-диска возникало исключение о превышении лимита памяти. Теперь это исправлено. #99042 (Shankar Iyer).
- Исправлен
LOGICAL_ERROR при запросе к таблице, в которой есть и ROW POLICY, и столбец ALIAS, с использованием dictGet. Проблема была вызвана преждевременным обращением к табличному выражению при разрешении столбца ALIAS в новом анализаторе. #99065 (Peng).
- Исправлена ошибка выхода за границы, возникавшая, когда пользователь пытался выполнить запрос только к виртуальным столбцам таблицы Iceberg с форматом данных Avro. Это крайне редкий сценарий, поэтому он не помечен как критический. Закрывает #88238. #99080 (alesapin).
- Исправлен segfault в рекурсивном CTE с
remote() + view(). #99081 (Konstantin Bogdanov).
- Пропускается лишний анализ индексов, если применяется оптимизация чтения в порядке сортировки. #99084 (Vladimir Cherkasov).
- Исправлен сбой, вызванный исключением по ограничению памяти при применении patch part. #99086 (Anton Popov).
- Исправлено срабатывание отладочного assert в
DDLWorker, вызванное неактуальным first_failed_task_name после удаления записи ZooKeeper в ходе восстановления после повторной инициализации. #99099 (Antonio Andelic).
- Исправлена проблема с перестроением текстовых индексов при слияниях с TTL. #99107 (Anton Popov).
- Исправлен сбой при выполнении запроса
ALTER TABLE ... REMOVE SETTINGS для движка таблицы Iceberg. Исправляет #86330. #99108 (alesapin).
- Исправлена ошибка в оптимизации
query_plan_convert_any_join_to_semi_or_anti_join, из-за которой для строк без совпадений возвращался некорректный результат. Связано: https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi).
- Исправлено Исключение LOGICAL_ERROR в
ASTColumnsExceptTransformer::transform. #99119 (Pablo Marcos).
- Исправлен обход RBAC, который позволял пользователям получать структуру таблицы через
DESCRIBE TABLE или CREATE TABLE AS для табличных функций (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc() и т. д.) без необходимых привилегий доступа к источнику. Для функций, которые автоматически определяют схему по удалённым серверам, это также позволяло без авторизации инициировать исходящие соединения (SSRF). #99122 (pufit).
- Исправлен сбой Keeper (segfault в NuRaft) во время динамической реконфигурации и передачи лидерства. #99133 (JIaQi Tang).
- Исправлен сбой при использовании таблицы Buffer с SAMPLE, если пункт назначения его не поддерживает. #99141 (Kseniia Sumarokova).
- Исправлена ошибка LOGICAL_ERROR, вызванная несоответствием порядка столбцов в патч-частях. #99164 (Pablo Marcos).
- Исправлено очень редкое аварийное завершение, возникавшее, когда таблица Iceberg содержит файлы смешанных форматов (ORC и Parquet). Исправление #88126. #99168 (alesapin).
- Исправлено неприменение max_execution_time при резервном копировании и восстановлении. #99205 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой
insert_deduplication_token молча игнорировался в запросах INSERT SELECT без ORDER BY ALL. Ранее для несортированных INSERT SELECT дедупликация была полностью отключена, даже если был явно указан пользовательский токен. Теперь для включения дедупликации достаточно указать insert_deduplication_token независимо от ORDER BY ALL. #99206 (Desel72).
- Исправлены избыточные проверки доступа при оптимизации
InverseDictionaryLookupPass: теперь grant 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-воркере для распределённых DDL-запросов. #99317 (Pablo Marcos).
- Исправлены незначительные проблемы с аутентификацией TOTP: обработка пустого пароля в опции CLI
--one-time-password, проверка значений конфигурации <digits> и <period>. #99322 (Vladimir Cherkasov).
- Исправлена логическая ошибка
unordered_map::at: key not found в формате вывода Avro при сериализации столбцов Enum8/Enum16 со значениями, отсутствующими в определении enum. #99332 (Desel72).
- Исправлен
CHECK TABLE для разреженной сериализации в Tuple с Dynamic. Закрывает #96588. #99351 (Pavel Kruglov).
- Исправлена излишне строгая проверка предобработчика текстового индекса. #99359 (Anton Popov).
- Исправлена проблема совместимости при обновлении реплицированных таблиц с неявными индексами minmax с версии 25.10 на более новые версии. #99392 (Raúl Marín).
- Удалена поддержка функций с отрицанием (
notEquals, notLike, notIn) при анализе текстового индекса. Эти функции никогда не позволяли пропускать ни одной гранулы, поэтому их анализ в индексе лишь создавал дополнительную нагрузку, не принося никакой пользы. #99393 (Anton Popov).
- Исправлена работа
optimize_skip_unused_shards в новом анализаторе в случае, когда таблица Distributed использовалась внутри подзапроса с IN. #99436 (Nikolai Kochetov).
- Исправлена ошибка heap-use-after-free в
INTERSECT/EXCEPT, когда запрос возвращает повторяющиеся имена столбцов. #99471 (Alexey Milovidov).
- Исправлена логическая ошибка в
ALTER TABLE ... DROP PART, когда в качестве имени части используется типизированный параметр запроса. #99489 (Alexey Milovidov).
- Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда предикат текстового индекса (например, hasAllTokens) использовался в секциях SELECT и WHERE через псевдоним. #99504 (Anton Popov).
- Исправлены некорректные результаты при использовании
hasAllTokens с оператором OR между столбцами, для которых созданы отдельные текстовые индексы. #99505 (Anton Popov).
- В
clickhouse-local инициализирован кэш страниц, чтобы начала действовать настройка page_cache_max_size. #99510 (Alexey Milovidov).
- Исправлена редкая ошибка, из-за которой часть данных некорректно помечалась как повреждённая и отсоединялась после запроса
DETACH/ATTACH TABLE. #99529 (Anton Popov).
- Исправлено исключение
std::length_error, возникавшее при запросе пустых системных таблиц в формате Pretty через HTTP-интерфейс. #99541 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR при использовании ALTER TABLE ADD COLUMN для создания EPHEMERAL-столбца с тем же именем, что у виртуального столбца (например, _part_offset). #99549 (Alexey Milovidov).
- Исправлена ошибка, из-за которой записи
VectorSimilarityIndexCache никогда не вытеснялись после удаления части данных из-за несовпадения ключей кэша. #99575 (Seva Potapov).
- Запретить чтение учетных данных Google из локального файла. Эта настройка небезопасна, поскольку позволяет читать и другие учетные данные, если известен путь к файлу. #99584 (Konstantin Vedernikov).
- Устранена деградация производительности в анализаторе. Из ARRAY JOIN исключены неиспользуемые столбцы. #99587 (Dmitry Novik).
- Исправлено чтение текстового индекса в таблице при наличии легковесных удалений и политик доступа на уровне строк. #99661 (Anton Popov).
- Исправлено разыменование nullptr в ридере Parquet, когда в ветке filter-in-decoder встречаются отфильтрованные страницы. Закрывает #99676. #99677 (Alexey Milovidov).
- Исправлен некорректный переход seek в AsynchronousReadBufferFromFileDescriptor с O_DIRECT. Закрывает #99358. #99678 (Pavel Kruglov).
- Исправлены переполнение буфера в куче в
CompressionCodecT64 и аварийное завершение процесса в CompressionCodecMultiple при распаковке повреждённых сжатых данных. Обе проблемы были обнаружены новыми таргетами libFuzzer. Теперь кодеки генерируют исключение вместо сбоя. #99680 (Rahul).
- Откладывать обработку, пока сервер не завершит загрузку всех таблиц. #99700 (Seva Potapov).
- Исправлен обход
RemoteHostFilter источником словаря MySQL при использовании встроенных параметров DDL. #99720 (Shaohua Wang).
- Исправлена логическая ошибка при обходе таблиц озёр данных в
system.tables. #99739 (Konstantin Vedernikov).
- Исправлен анализ предикатов с функцией
IN для текстового индекса с предобработчиком. Исправлена коллизия искомых токенов в текстовом индексе, которая могла приводить к некорректным результатам. #99755 (Anton Popov).
- Исправлен бесконечный цикл при чтении файлов формата
Npy с отрицательными значениями размерностей в shape. #99812 (Desel72).
- Исправлен global-buffer-overflow в функции
CRC32 на аргументах FixedString, возникавший при вычислении с нулевым числом строк во время расчёта заголовка плана запроса. #99835 (Alexey Milovidov).
- Исправлен сбой (обращение по нулевому указателю) при выполнении
ALTER TABLE ... MODIFY COLUMN ... COMMENT для таблиц Iceberg. #99838 (Desel72).
- Исправлена настройка
aggregate_functions_null_for_empty: теперь она работает с агрегатными функциями, возвращающими типы, отличные от Nullable, такие как Array или Map (например, groupArray, sumMap). #99839 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR в функции
midpoint, которое возникало при вызове со смешанными знаковыми и беззнаковыми целочисленными типами. #99867 (Alexey Milovidov).
- Исправлено Исключение “Block structure mismatch” в запросах с предложением HAVING, где выражение фильтра содержит и агрегатную функцию, обёрнутую в функцию, возвращающую NULL, и
materialize(0). #99915 (Alexey Milovidov).
- Исправлена ошибка assertion failure в
sipHash128Keyed (и аналогичных хеш-функциях с ключом), когда аргумент data имеет тип Map с ключами-массивами или другими вложенными типами массивов. #99921 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR “Not-ready Set” в функции IN при оптимизации плана выполнения запроса с convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
Улучшение сборки/тестирования/пакетирования
- Сокращено время компиляции за счёт удаления тяжёлых включений заголовочных файлов и переноса затратных инстанцирований шаблонов из заголовков. #97893 (Raúl Marín).
- Сокращено время компиляции арифметических функций и связанных с ними заголовочных файлов за счёт уменьшения матриц диспетчеризации шаблонов и удаления тяжёлых включений. #98204 (Raúl Marín).
- Используется
mongo-c-driver 2.2.2. #98304 (Konstantin Bogdanov).
- Используется
postgres REL_18_3. #98306 (Konstantin Bogdanov).
- Для сборок UBSan включён jemalloc allocator, чтобы избежать накопления RSS из-за неэффективного возврата памяти в glibc malloc. #98444 (Alexey Milovidov).
- Используется манглинг символов Rust v0, а из библиотеки PRQL удалены внутренние символы, чтобы сократить разрастание имён символов из библиотек combinator для parser. #98446 (Alexey Milovidov).
- В
tests/benchmarks добавлены набор бенчмарков TPC-H и README для TPC-DS. #98495 (Raufs Dunamalijevs).
- Добавлены тесты корректности для всех 99 запросов TPC-DS. #99204 (Raufs Dunamalijevs).
- Добавлен интеграционный тест, воспроизводящий баг с DDL CREATE TABLE + ALTER при офлайн-реплике (#44070); он помечен как ожидаемо завершающийся с ошибкой. #99259 (Raufs Dunamalijevs).
- Интегрирован jemalloc с префиксом
je_, удалено использование --wrap компоновщика. #99342 (Azat Khuzhin).
Обратно несовместимое изменение
- Дедупликация по умолчанию включена для всех вставок. Раньше она была отключена для асинхронных вставок и MV, но включена для синхронных вставок. Цель — сделать одинаковые значения по умолчанию для обоих способов вставки. Если в вашем кластере дедупликация явно отключена, чтобы сохранить прежнее поведение, нужно явно установить
deduplicate_insert='backward_compatible_choice'. То же самое касается deduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda).
- Улучшен формат хранения статистики: теперь вся статистика хранится в одном файле. #93414 (Anton Popov). Если вы не включали статистику таблиц явно, этот пункт можно проигнорировать.
- Ограничен объём метаданных S3(Azure)Queue, хранимых в памяти. Системные таблицы переименованы:
azure_queue в azure_queue_metadata_cache, а system.s3queue — в s3queue_metadata_cache. #95809 (Kseniia Sumarokova).
- Ранее при применении функции к столбцу
Variant при несовместимости подтипа variant с функцией молча возвращались значения NULL; теперь генерируется исключение, что может нарушить работу запросов, которые опирались на такое поведение с молчаливым возвратом NULL. #95811 (Bharat Nallan).
- Столбцы
DATE из PostgreSQL теперь в ClickHouse автоматически определяются как Date32 (в предыдущих версиях они определялись как Date, что приводило к переполнению значений за пределами узкого диапазона). Разрешена вставка значений Date32 обратно в PostgreSQL. Закрывает #73084. #95999 (Alexey Milovidov).
- Семантика настройки
do_not_merge_across_partitions_select_final стала понятнее. Ранее эта возможность могла включаться автоматически, даже если настройка не была явно задана в конфигурации. Это неоднократно вызывало путаницу и, к сожалению, приводило к проблемам в продакшне. Теперь правила проще: do_not_merge_across_partitions_select_final=1 безусловно включает эту возможность. Если do_not_merge_across_partitions_select_final=0, автоматический режим используется только при enable_automatic_decision_for_merging_across_partitions_for_final=1, а в противном случае не используется. Чтобы максимально сохранить прежнее поведение, значения по умолчанию были установлены следующими: do_not_merge_across_partitions_select_final=0 и enable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov).
- При создании таблицы S3 с явно указанными столбцами ClickHouse теперь проверяет, что эти имена столбцов действительно присутствуют в схеме удалённого файла. Запросы, которые раньше работали при несовпадении имён столбцов, теперь будут завершаться ошибкой уже на этапе создания таблицы. Это закрывает #96089. #96194 (Konstantin Vedernikov).
- Запрещено использование подзапросов в ORDER BY и других ключевых выражениях таблицы. #96847 (Alexey Milovidov).
- По умолчанию включить
apply_row_policy_after_final. Изначально, когда optimize_move_to_prewhere_if_final=0, и ROW POLICY, и PREWHERE учитывали FINAL и применялись после FINAL. Это поведение было нарушено в #87303, где для фильтра ROW POLICY игнорировался параметр optimize_move_to_prewhere_if_final. Чтобы это исправить, в данном PR включается настройка apply_row_policy_after_final, добавленная в #91065. При включенном apply_row_policy_after_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).
- Интеграция с каталогом Google BigLake. Закрывает #95339. #97104 (Konstantin Vedernikov).
- Добавлена системная таблица
system.tokenizers, содержащая список всех доступных токенизаторов. #96753 (Robert Schulze).
- Добавлена новая системная таблица
system.user_defined_functions для мониторинга статуса загрузки UDF и настроек. #90340 (Xu Jia).
- Добавлена таблица
system.jemalloc_stats, показывающая статистику аллокатора памяти jemalloc (через malloc_stats_print) для диагностики использования памяти на серверах, собранных с jemalloc. Также в HTTP-интерфейс ClickHouse добавлена HTTP-конечная точка /jemalloc.html для интерактивной визуализации этой статистики. #97077 (Antonio Andelic).
- Добавлена таблица
system.jemalloc_profile_text для чтения и анализа профилей кучи jemalloc. Формат вывода задается настройкой jemalloc_profile_text_output_format (raw, symbolized или collapsed; по умолчанию — collapsed). Разрешение inline-фреймов задается jemalloc_profile_text_symbolize_with_inline (если параметр включен, inline-фреймы включаются ценой более медленной символизации; если отключен, они пропускаются для более быстрого вывода). Для формата collapsed параметр jemalloc_profile_text_collapsed_use_count определяет, взвешиваются ли стеки по числу активных аллокаций (true) или по объему активных байт (false, по умолчанию). Это упрощает профилирование памяти и визуализацию флеймграфов для профилей кучи jemalloc. Исправляет #93248. #97218 (Antonio Andelic).
- Добавлена настройка
default_dictionary_database, которая позволяет ClickHouse искать внешние словари, указанные без имени базы данных, в заданной базе данных по умолчанию. Это упрощает миграцию с глобальных словарей, определённых в XML, на словари отдельных баз данных, определённые в SQL, позволяя существующим запросам к словарям (например, dictGet(‘name’, …)) продолжать работать без изменений. #91412 (Dmitrii Plotnikov).
- Добавлена поддержка дополнительного ZooKeeper для
DatabaseReplicated. #91683 (RinChanNOW).
- Добавлены новая табличная функция
primes и новая системная таблица system.primes, содержащая простые числа в порядке возрастания. Закрывает #90839. #92776 (Nihal Z. Miaji).
- Асинхронные вставки поддерживают параллельный кворум. Вставленные данные реплицируются до достижения кворума. Если обнаруживаются дубликаты, запрос ожидает, пока ранее вставленные данные тоже не будут реплицированы. #93356 (Sema Checherinda).
- Добавлены функции
colorOKLABToSRGB и colorSRGBToOKLAB для преобразования значений из sRGB в OKLAB и обратно. #93361 (Pranav Tiwari).
- Новая настройка
deduplicate_insert, переопределяющая insert_deduplicate и async_insert_deduplicate. #94413 (Sema Checherinda).
- Настройка сервера
insert_deduplication_version позволяет выполнять переход на единый хеш дедупликации. #95409 (Sema Checherinda).
- Добавлена функция хеширования
xxh3_128. #96055 (Raúl Marín).
- Добавлен запрос
OPTIMIZE <table> DRY RUN PARTS <part names> для имитации слияний без коммита результирующей части. Это может быть полезно при тестировании: для проверки корректности слияний в новой версии, детерминированного воспроизведения ошибок, связанных со слияниями, и надёжного бенчмаркинга производительности слияний. #96122 (Anton Popov).
- Добавлена новая проверка, по умолчанию включенная настройкой
check_named_collection_dependencies, чтобы предотвратить удаление именованных коллекций, используемых таблицами. #96181 (Pablo Marcos).
- Добавлен
system.fail_points для просмотра существующих failpoint’ов в сервере и проверки, включены они или нет. Это поможет автоматизировать тестирование. #96762 (Pedro Ferreira).
- Добавлена поддержка ролевого доступа к каталогу Glue. Используйте настройки
aws_role_arn и, при необходимости, aws_role_session_name. #90825 (Antonio Andelic).
- Добавлен параметр
add_minmax_index_for_temporal_columns, который при включении автоматически создает индексы MinMax для всех столбцов Date, Date32, Time, Time64, DateTime и DateTime64. #93355 (Michael Jarrett).
- Поддержка расширенных псевдонимов таблиц в JOIN (запросы вида
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b). Закрывает #95131. #95331 (Yarik Briukhovetskyi).
- Добавлена поддержка
ALTER TABLE RENAME COLUMN для таблиц Iceberg. Ранее поддерживались только ADD COLUMN, DROP COLUMN и MODIFY COLUMN. #97455 (murphy-4o).
Экспериментальные возможности
- Текстовый индекс теперь доступен в статусе GA. #96794 (Robert Schulze).
- Тип данных
QBit для хранения векторов в квантованном битово-упакованном формате (используется для приближенного поиска ближайших соседей) теперь общедоступен и больше не требует включения экспериментальной настройки. #95358 (Raufs Dunamalijevs).
- Векторный поиск в ClickHouse теперь может использовать реплики в кластере, чтобы распределять нагрузку и поиск по частям векторного индекса. Это позволяет ClickHouse поддерживать крупные векторные индексы, которые превышают объем памяти одной VM. #95876 (Shankar Iyer).
- Добавлен AST-фаззер на стороне сервера, управляемый настройками
ast_fuzzer_runs и ast_fuzzer_any_query. Когда он включен, сервер после обычного выполнения каждого запроса запускает его случайные мутации, отбрасывая результаты. #97568 (Alexey Milovidov).
- В экспериментальный диалект KQL добавлена функция
iif. #94790 (happyso).
- Автоматическое определение схемы теперь учитывает
allow_experimental_nullable_tuple_type. Когда эта возможность включена, выведенные типы кортежей могут быть Nullable(Tuple(...)), поэтому отсутствующие вложенные объекты могут становиться NULL вместо кортежа из элементов NULL. #95525 (Nihal Z. Miaji).
- Настройка
use_statistics_cache теперь включена по умолчанию, поэтому статистика столбцов кэшируется в памяти для ускорения оптимизации запросов без необходимости заново загружать ее из каждой части. #95950 (Han Fei).
- Теперь для пропуска данных можно использовать любое детерминированное выражение в первичном ключе (например,
ORDER BY cityHash64(user_id)/ ORDER BY length(user_id)). Для детерминированных выражений ClickHouse может применить выражение к константам запроса и использовать результат в индексе первичного ключа для предикатов =, IN и has. Если выражение также инъективно (например, ORDER BY hex(p) или ORDER BY reverse(tuple(reverse(p), hex(p)))), индекс можно эффективно использовать и для отрицательных форм: !=, NOT IN и NOT has. Закрывает #10685. Закрывает #82161. #92952 (Nihal Z. Miaji).
- Улучшен формат хранения статистики. Теперь вся статистика сохраняется в одном файле. #93414 (Anton Popov).
- Разрешено параллельное чтение для удалённых движков таблиц/функций в файловом кэше. #71781 (Kseniia Sumarokova).
- Добавлена возможность использовать кэш страниц в пространстве пользователя с локальными файлами и табличными функциями объектного хранилища. #77874 (Michael Kolupaev).
- Исключены ненужные
memcpy в кэше страниц в пространстве пользователя. #77884 (Michael Kolupaev).
- Теперь для
concurrent_threads_scheduler по умолчанию используется max_min_fair вместо fair_round_robin. Это повышает справедливость при высокой нагрузке, отдавая приоритет запросам, которым выделено меньше слотов, поэтому короткие запросы не страдают из-за длинных. #95300 (Sergei Trifonov).
- Если запрос
FINAL использовал для фильтрации условие по первичному ключу, а затем индекс пропуска данных для других условий, то шаг обработки PrimaryKeyExpand теперь будет проверять на пересечение только изначально отобранные диапазоны первичного ключа. #94903 (Shankar Iyer).
- При использовании параллельных реплик с табличными функциями, такими как
s3(...), запросы, в которых табличная функция обёрнута в один подзапрос, теперь автоматически распараллеливаются по репликам, тогда как раньше распараллеливались только прямые обращения к табличным функциям. Закрывает #92264. #96332 (phulv94).
- Добавлена возможность разделять данные и системные файлы в кэше на отдельные сегменты. #87834 (MikhailBurdukov).
- Некоторые операции hash join ускорены за счёт реализации динамической диспетчеризации для
ColumnVector::replicate. #79573 (Raúl Marín).
- Повышение производительности параллельного hash JOIN в случаях со сложными предикатами. Ранее строки, не вошедшие в JOIN, обрабатывались в одном потоке, что неоптимально; суть этой оптимизации — распараллелить обработку таких строк между несколькими потоками. Можно включать и отключать с помощью настройки
parallel_non_joined_rows_processing. Включено по умолчанию. #92068 (Yarik Briukhovetskyi).
- Немного оптимизирован парсинг типа JSON. #93614 (Pavel Kruglov).
- Уменьшено потребление памяти AST. Оптимизация оправдана, поскольку поля не используются, если не используется подсветка и не выполняется парсинг VALUES. #93974 (Ilya Yatsishin).
- Оптимизировано потребление памяти объектами AST для именованных Tuple. Имена столбцов теперь хранятся в объекте Tuple как строки, а не в универсальных узлах литералов AST. #94704 (Ilya Yatsishin).
- Девиртуализация улучшена за счёт дополнительных параметров компоновщика. #94737 (Nikita Taranov).
- Повышена производительность клонирования реплики в таблицах ReplicatedMergeTree с большим числом частей благодаря пакетированию запросов ZooKeeper. #94847 (c-end).
- Когда на шаге чтения уже были фильтры PREWHERE, добавить новый фильтр было невозможно. Это изменение откладывает оптимизацию PREWHERE до оптимизации runtime filter для JOIN, чтобы runtime filters тоже можно было перенести в PREWHERE. #95838 (Alexander Gololobov).
- Ускорено сжатие кодеком
T64 благодаря использованию динамической диспетчеризации на x86. #95881 (Raúl Marín).
- Ускорен
uniq для числовых типов за счёт батчинга вставок, когда это возможно (без NULL, без -If, без GROUP BY, без IPv6 и String). #95904 (Raúl Marín).
- Низкоуровневые оптимизации для Keeper: было выявлено, что
ZooKeeper::observeOperations потребляет >20% CPU потока приёма ZooKeeper. Это изменение решает проблему следующим образом: 1. Для AggregatedZooKeeperLog::stats используется CityHash64 вместо SipHash, что более чем в 10 раз быстрее. 2. Для Coordination::ErrorCounter используется std::array<std::atomic<UInt32>, N> вместо std::unordered_map и std::mutex. #95962 (Miсhael Stetsyuk).
- Убрано 64-байтовое выравнивание для ProfileEvents::Counter, чтобы сэкономить память. #96097 (Azat Khuzhin).
- Оптимизация памяти: размер структуры
CachedOnDiskReadBufferFromFile сокращён в 50 раз. #96098 (Azat Khuzhin).
- Не копировать старые данные при изменении размера пустой хеш-таблицы. #96180 (Raúl Marín).
- Добавлена поддержка JOIN Runtime Filters для
RIGHT 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).
- Оптимизация отложенной материализации теперь применяется ко всем ветвям запроса
UNION ALL, а не только к первой. Запросы, которые объединяют несколько отсортированных и ограниченных чтений из разных таблиц MergeTree через UNION ALL, теперь будут использовать отложенное чтение столбцов в каждой ветви, снижая I/O. #96832 (Federico Ginosa).
- Оптимизировано вычисление индекса пропуска данных minmax при INSERT: устранено лишнее копирование данных и добавлен векторизованный расчёт min/max для числовых столбцов. #97392 (Raúl Marín).
- Движок
DeltaLake теперь берет результат count() из метаданных delta lake и показывает корректную статистику таблицы в system.tables (общее число байт/строк). #96190 (Kseniia Sumarokova).
- Неиспользуемые столбцы также исключаются из этапа чтения при чтении из MergeTree. Это особенно полезно, когда фильтр переносится в
PREWHERE. #89982 (János Benjamin Antal).
- Улучшена обработка запроса
SHOW TABLES: теперь извлекаются только имена таблиц; также улучшен getLightweightTablesIterator, чтобы он возвращал структуру, содержащую только имена таблиц. Исправляет #93835. #94467 (Smita Kulkarni).
- Улучшены
assumeNotNull, coalesce и ifNull, чтобы задействовать отсечение по первичному ключу и индексу пропуска данных для диапазонных предикатов, когда столбцы ключа обёрнуты в эти функции. Закрывает #94689. #94754 (Nihal Z. Miaji).
- В запрос Keeper getChildren добавлены расширения with_data и with_stat. Это позволяет за одну операцию получать не только список дочерних узлов, но и их
stat и/или data. #94826 (Nikolay Degterinsky).
- Анализ индексов выполняется только один раз (в большинстве случаев), независимо от того, будет ли в итоге выполняться локальный план или план с параллельными репликами. #94854 (Nikita Taranov).
- Добавлена возможность включать распределённый анализ индексов в зависимости от количества частей (
distributed_index_analysis_min_parts_to_activate) и размера индексов (distributed_index_analysis_min_indexes_size_to_activate). #95216 (Azat Khuzhin).
- Включена PREWHERE optimization для таблиц Iceberg. #95476 (Konstantin Vedernikov).
- Уменьшено потребление памяти у некоторых классов AST. #95514 (Raúl Marín).
- Ограничено число потоков конвейера, создаваемых при включенной настройке
split_intersecting_parts_ranges_into_layers. Это помогает избежать чрезмерного потребления памяти. #96478 (Nikita Taranov).
- Реализована оптимизация эквивалентных наборов для нескольких JOIN. Запросы с несколькими последовательными операциями
INNER JOIN теперь выигрывают от улучшенной оптимизации pushdown фильтров. Когда таблицы объединяются по эквивалентным столбцам (например, t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), фильтры, применённые к любой таблице в цепочке, автоматически проталкиваются для всех таблиц. Закрывает #96550. #96596 (Vladimir Cherkasov).
- Оптимизировано сканирование метаданных Delta Lake. Использованы изменения из PR delta-kernel https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
- В базе данных Replicated больше не обновляется кэш кластера для каждого фиктивного запроса. #96897 (Tuan Pham Anh).
- Используйте индекс первичного ключа при использовании фильтра
startsWithUTF8, если префикс содержит только символы ASCII. #97055 (vkcku).
- Добавлена трассировка OpenTelemetry для запросов Keeper. #91332 (Miсhael Stetsyuk).
- Новые параметры конфигурации:
logger.startup_console_level и logger.shutdown_console_level, позволяющие переопределить уровень логирования в консоль во время запуска и завершения работы ClickHouse соответственно. #95919 (Garrett Thomas).
- Учитывать переопределения из командной строки при перезагрузке конфигурации. Закрывает #80294. #80295 (Alexey Milovidov).
- Разрешены переопределения параметров именованной коллекции в формате ключ-значение в табличной функции
mongodb. #89616 (vanchaklar).
- Оптимизация чтения в порядке сортировки для таблиц Iceberg теперь работает со сложными функциями сортировки, такими как
icebergBucket и icebergTruncate, а не только с простыми ссылками на столбцы. #90256 (Konstantin Vedernikov).
- Добавлен новый столбец parts_postpone_reasons в system.mutations для улучшения диагностики; в нем отображаются причины отложенной обработки частей. #92206 (Shaohua Wang).
- Отслеживание изменений числа строк для чтения (из-за вставок/удалений или использования кэша условий запроса) в
DataflowStatisticsCache. #93636 (Nikita Taranov).
- Добавлена поддержка запроса SYSTEM RESET DDL WORKER [ON CLUSTER]. Он сбрасывает состояние DDLWorker в основном потоке. Это полезно для обновления активной реплики при изменении идентификаторов хостов. #93780 (Tuan Pham Anh).
- Добавлена поддержка
mutation_ids в system.part_log для типов событий MUTATE_PART и MUTATE_PART_START. #93811 (Shaohua Wang).
- Фоновые операции (Mutate, Merge) теперь можно настраивать независимо через профиль ‘background’. Ранее для таких операций использовались те же настройки, что и для обычных запросов, через профиль ‘default’. #93905 (Arsen Muk).
- В
system.crash_log добавлено больше информации. #94112 #95857 (Miсhael Stetsyuk).
- Добавлена новая метрика
QueryNonInternal для отслеживания количества выполняющихся не внутренних запросов. Эта метрика публикуется как ClickHouseMetrics_QueryNonInternal и помогает операторам контролировать параллелизм запросов относительно ограничения max_concurrent_queries, которое применяется только к не внутренним запросам. #94284 (Ashwath Singh).
- Добавлена поддержка сбора статистики входных байтов для столбцов из компактных частей в
RuntimeDataflowStatisticsCacheUpdater. #94626 (Nikita Taranov).
- Добавлена проверка на некорректную конфигурацию Keeper, приводящую к сбоям при формировании кластера. Закрывает #60932. #94682 (Konstantin Bogdanov).
- Улучшена десериализация JSON-префиксов при загрузке части. #94848 (Pavel Kruglov).
- Переработана операция записи с использованием полного конвейера INSERT, который запускает materialized views для целевой таблицы. #94890 (Kai Zhu).
- Используйте оптимизации плана поиска по векторному сходству только при наличии индекса для столбца поиска. #94998 (Eduard Karacharov).
- Проверять общий лимит памяти перед аутентификацией пользователя и выдавать
(total) memory limit exceeded, если общий лимит превышает допустимое значение. #95003 (Nikolai Kochetov).
- Добавлен параметр конфигурации
throw_on_unmatched_row_policies, который во включенном состоянии генерирует исключение, если пользователь выполняет запрос к таблице, для которой заданы политики строк, но ни одна из них к нему не применяется, — это предотвращает неоднозначное поведение, при котором из-за неправильной настройки управления доступом возвращаются все строки. #95014 (Vitaly Baranov).
- Динамическое обновление токенов доступа S3 в длительных запросах при использовании Unity Catalog. Это закрывает #93981. #95069 (Konstantin Vedernikov).
- Отключается механизм decay для dirty page в jemalloc, если ClickHouse испытывает длительное давление по памяти в течение
memory_worker_decay_adjustment_period_ms миллисекунд. Механизм decay для dirty page в jemalloc снова включается, если ClickHouse работает в нормальных условиях в течение того же промежутка времени. #95145 (Antonio Andelic).
- Поддержка дополнительного Zookeeper в S3Queue при использовании настройки
keeper_path из s3Queue. #95203 (Diego Nieto).
- Учитывается
max_parts_to_merge_at_once при TTL-слияниях частей с drop. #95315 (Kseniia Sumarokova).
- Добавлены
connection_address и connection_port в query_log для отображения физического соединения (address и port подменяются при подключении через прокси и auth_use_forwarded_address=1). #95471 (Yakov Olkhovskiy).
- Исправлен некорректный учёт памяти для кэша условий запроса. Основная проблема заключалась в том, что не учитывался ключ кэша, состоящий из нескольких строк (например, part_name, идентификатора таблицы и всего SQL-условия). #95478 (Nikita Mikhaylov).
- Сервер, запущенный со встроенной конфигурацией, позволит управлять пользователями и привилегиями и сохранять их в каталоге
access, как и при обычной конфигурации. Это упрощает тестирование. Также во встроенной конфигурации и в clickhouse-local были включены все улучшения access_control. #95481 (Alexey Milovidov).
- Улучшены сообщения об ошибках аутентификации S3: теперь при отказе в доступе они содержат подсказку проверить учетные данные. #95648 (Gerald Latkovic).
- Включён кэш статистики, а период его обновления установлен на 300 с. #95841 (Han Fei).
- В
system.aggregated_zookeeper_log добавлено имя компонента. #95882 (Antonio Andelic).
- Не выполнять чтение из объектного хранилища при запросах к таблицам
DeltaLake через system.tables. #95899 (Antonio Andelic).
enable_max_bytes_limit_for_min_age_to_force_merge теперь включён по умолчанию, если значение настройки compatibility — 26.2 или выше. #95917 (Christoph Wurm).
- Delta Lake теперь доступен на macOS. Закрывает #95979. #95985 (Alexey Milovidov).
- В предыдущих версиях при объединении конфликтующих выражений ALTER с UPDATE и RENAME COLUMN вместо корректного исключения возникала логическая ошибка. Закрывает #70678. #96022 (Alexey Milovidov).
- Улучшен вывод справки для всех приложений ClickHouse, добавлена опция —no-sudo и внесено несколько исправлений. Это продолжение #58244 от Ilya Yatsishin. #96025 (Alexey Milovidov).
- Добавлен алиас
distanceCosine для cosineDistance, так как у всех остальных функций расстояния уже есть алиасы в таком формате. #96065 (Raufs Dunamalijevs).
- Добавлена поддержка расширения Keeper
with_data для улучшения получения таблиц в Database Replicated. #96090 (Nikolay Degterinsky).
- chdig обновлён до v26.2.1 (новые возможности и поддержка macOS). #96113 (Azat Khuzhin).
- Улучшен pushdown фильтра для
numbers и primes. Теперь ClickHouse может определять консервативные границы значений по условиям WHERE, когда точные границы определить невозможно, и соответственно ограничивать генерацию последовательности (например, для WHERE number % 5 < 2 AND number > 100 AND number < 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 и реального времени с тайм-аутами сокетов. #96601 (Sergei Trifonov).
- Предотвращено повторное появление удалённых данных, если ADD COLUMN выполняется вскоре после мутации DROP COLUMN. #96713 (Alexey Milovidov).
- Изменён тип
function_id в system.instrumentation с LowCardinality(Int32) на Int32. #96726 (Copilot).
- При синхронном ожидании мутаций теперь учитываются отмена запроса и ограничения по времени. #96756 (Alexey Milovidov).
- Добавлена системная команда
SYSTEM RELOAD DELTA KERNEL TRACING <level> для изменения логирования delta-kernel, что может быть полезно при отладке. #96763 (Kseniia Sumarokova).
- Фильтрация по семейству IP-адресов, то есть настройки
dns_allow_resolve_names_to_ipv4/ipv6, применяется даже при отключённом DNS-кэше. #96810 (c-end).
- Улучшена диагностика jemalloc. #96840 (Azat Khuzhin).
- Исправлена ошибка
QUERY_CACHE_USED_WITH_SYSTEM_TABLE в веб-интерфейсе /play при выполнении запросов к системным таблицам. #96869 (Alexey Milovidov).
- Улучшен веб-интерфейс: favicon теперь меняется, показывая, что запрос выполняется; ошибки вспомогательных запросов (при загрузке баз данных и таблиц) теперь отображаются, а не молча игнорируются. Закрывает #85055. #96883 (Alexey Milovidov).
- Левую панель в интерфейсе
/play сделали кликабельной, чтобы показывать и скрывать список баз данных. #96884 (Alexey Milovidov).
DROP DATABASE теперь удаляет таблицы в порядке, обратном зависимостям, что повышает устойчивость к сбоям, если в базе данных есть таблицы с зависимостями при загрузке (например, таблицы Distributed, использующие joinGet). #97057 (Alexey Milovidov).
- Обновлён yaml-cpp, чтобы исключить пропуск некорректного YAML. #97333 (Azat Khuzhin).
- Показывать индикатор загрузки на боковой панели
play.html, пока таблицы подгружаются. #97531 (Alexey Milovidov).
- Добавлена кнопка копирования в буфер обмена для неформатированных результатов запроса во встроенном веб-интерфейсе (play.html). #97532 (Alexey Milovidov).
- Исправлен обфускатор запросов (
clickhouse-format --obfuscate), чтобы он в большем числе случаев генерировал SQL, который можно разобрать. #97584 (Alexey Milovidov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- После
ALTER, изменяющих только метаданные, например при расширении списка значений Enum, оптимизация агрегации с проекцией может завершиться исключением. #84143 (Alexey Milovidov).
- Materialized views теперь используют базу данных, в которой они были созданы, в качестве контекста выполнения, то есть: - можно не указывать базу данных явно в именах, используемых в
select-запросе представления - если база данных явно не указана, подразумевается та же база данных, в которой было создано materialized view. #88193 (Dmitry Kovalev).
- Исправлена подстановка параметров запроса в методах аутентификации CREATE USER при использовании предложения ON CLUSTER. Параметры запроса в методах аутентификации (например, password) не подставлялись, что приводило к ошибкам UNKNOWN_QUERY_PARAMETER на удалённых узлах. #92777 (xiaohuanlin).
- Исправлены несоответствия при анализе текстового индекса для функций
has, mapContainsKey и mapContainsValue. Ранее запросы с этими функциями могли возвращать разные результаты в зависимости от того, вычислялось ли выражение с использованием текстового индекса или без него. #93578 (Anton Popov).
- Исправлен сбой при подключении таблицы к базе данных
MaterializedPostgreSQL, если dropReplicationSlot генерирует исключение при раскрутке стека. #96871 (Alexey Milovidov).
- Сервер мог аварийно завершаться, если одновременно запускалось много резервных копий, конфликтующих из-за одних и тех же файлов. #93659 (Alexey Milovidov).
- Исправлена работа запросов с параллельными репликами и JOIN с таблицей non-MT. Закрывает #92056. #93902 (Igor Nikonov).
- Исправлена проблема, из-за которой столбцы Iceberg с точками в именах возвращали NULL в качестве значений. #94335 (Mikhail Koviazin).
- Исправлена обработка строк в кодировке UTF8 в
stringJaccardIndexUTF8 и повышена производительность. #94613 (Joanna Hulboj).
- Исправлены возможные переполнения в
WITH FILL STALENESS (они приводили к UB и/или бесконечным циклам). Исправлен возможный бесконечный цикл из-за больших скачков. Добавлена поддержка старого анализатора (в основном для стресс-тестов). #94663 (Azat Khuzhin).
- Исправлено возможное зависание распределённых запросов, когда имена хостов разрешаются в несколько адресов, а удалённая реплика перестаёт отвечать. #94726 (c-end).
- Исправлен некорректный результат при выполнении JOIN нескольких табличных выражений, когда самое левое табличное выражение представляет собой табличную функцию
-Cluster. Устраняет проблему #89996. #94748 (Konstantin Bogdanov).
- Исправлено некорректное отсечение по первичному ключу и индексу пропуска данных для предикатов, включающих
toWeek, toYearWeek, toStartOfWeek, toLastDayOfWeek и toDayOfWeek, а также устранены исключения в некоторых из этих функций для корректных запросов с LowCardinality(String). #94816 (Nihal Z. Miaji).
- Удалена ненужная возможность пропуска проверки разрешений в запросах
ATTACH для представления с безопасностью SQL. Это предотвращает потенциальное повышение привилегий, когда пользователь подключает представление с definer без проверки необходимого доступа. #94865 (pufit).
- Исправлен сбой при запуске
ReplicatedMergeTree, вызванный одновременным удалением каталогов delete_tmp_*. #94892 (myeongjun).
- Исправлена проблема с
INSERT в таблицы Iceberg с materialized views, из-за которой терялась информация о дедупликации и возникало исключение. #94938 (Daniil Ivanik).
- Исправлена ошибка, из-за которой
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME> удалял весь кэш во всём кластере. #94978 (Rory Crispin).
- Сохраняется постоянная гранулярность индекса (use_const_adaptive_granularity) после вертикальных слияний (v2 с исправлением для Nested и в целом). #95013 (Azat Khuzhin).
- Исправлена состояние гонки в файловом кэше в версии 26.1 после [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764). #95042 (Kseniia Sumarokova).
- Исправлена отмена выполнения табличной функции postgresql() с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #95136 (Roman Vasin).
- Исправлен вывод типов для квалифицированных столбцов исходных таблиц при использовании нескольких JOIN с предложением
USING. Ранее последующие JOIN некорректно обновляли типы исходных столбцов до общего супертипа, даже если столбец не участвовал в этом JOIN (например, в SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a) столбец t2.a используется только в первом JOIN, поэтому его тип должен быть супертипом t1.a и t2.a, без учёта t3.a). Это могло приводить к логическим ошибкам или сбоям, когда функции ожидали одни типы столбцов, а в плане выполнения фактически оказывались другие. #95157 (Vladimir Cherkasov).
- Преобразование столбца теперь выполняется только один раз при получении содержимого списка manifest .avro и файлов. #95164 (Daniil Ivanik).
- Исправлен некорректный расчёт размеров JSON-столбцов, который мог приводить к избыточному использованию памяти или некорректной статистике столбцов. #95207 (Azat Khuzhin).
- Исправлен неточный учёт памяти при применении крупных патч-частей после легковесных обновлений. Ранее применение крупных патчей могло приводить к чрезмерному использованию памяти, из-за чего процесс сервера мог быть принудительно завершён OOM killer’ом. #95231 (Anton Popov).
- Исправлено неопределённое поведение, которое могло приводить к некорректным результатам или к исключению, если распределённый запрос с
max_parallel_replicas во время анализа индексов переключался на локальную реплику. #95263 (Azat Khuzhin).
- Исправлена агрегация разреженных столбцов для
sum и временных рядов при group_by_overflow_mode = any. #95301 (Mikhail Koviazin).
- Исправлена проблема с надёжностью в политике диска
plain_rewritable: сетевая ошибка в середине удаления файла метаданных могла привести к тому, что хранилище оставалось в несогласованном состоянии. #95302 (Mikhail Artemenko).
- Заменён Date на Date32 для Iceberg. #95322 (Konstantin Vedernikov).
- Значение аргумента password табличной функции
redis теперь будет маскироваться в журнале и системных таблицах (например, в query_log). #95325 (János Benjamin Antal).
- Исправлена ошибка, из-за которой таблицы можно было удалить или изменить, пока по ним ещё выполнялся распределённый запрос, что могло приводить к исключениям или некорректным результатам. #95356 (Azat Khuzhin).
- Исправлена логическая ошибка, возникавшая в некоторых случаях при использовании отрицательного
LIMIT/OFFSET в распределённых запросах. #95357 (Nihal Z. Miaji).
- Исправлена ошибка, из-за которой clickhouse-client при подключении по SSH дважды запрашивал пароль. #95372 (Isak Ellmer).
- Устранена гонка данных в S3(Azure)Queue. #95385 (Kseniia Sumarokova).
- Исправлена ошибка в фильтре prewhere, вызванная лямбда-выражениями в prewhere. #95395 (Xiaozhe Yu).
- Исправлено
optimize_syntax_fuse_functions: sum/count/avg больше не переписываются в sumCount(), если аргумент агрегатной функции имеет тип Nullable. Закрывает #95390. #95441 (Nihal Z. Miaji).
- Предотвращено возможное аварийное завершение при отмене распределённых запросов. #95466 (Aleksandr Musorin).
- Исправлена дедупликация при стриминге из движка S3(Azure)Queue. #95467 (Kseniia Sumarokova).
- Исправлено обновление политик строкового доступа, назначенных исходному пользователю, при распределённых запросах. #95469 (Vitaly Baranov).
- Исправлена проверка зашифрованных дисков поверх plain_rewritable (устраняет возможную ошибку
It is not possible to register multiple plain-rewritable disks with the same object storage prefix). #95470 (Azat Khuzhin).
- У табличной функции
mergeTreeProjection отсутствовала проверка прав доступа, из-за чего пользователи без разрешения SELECT для таблицы (но с правами на табличные функции) могли читать данные из её проекций. В этом исправлении добавлена та же проверка прав доступа, которая уже есть у mergeTreeIndex и mergeTreeAnalyzeIndexes. #95480 (Alexey Milovidov).
- Исправлена возможная логическая ошибка при чтении подстолбца size из динамических подстолбцов типов Dynamic/JSON. #95573 (Pavel Kruglov).
- Исправлена регрессия в (экспериментальной) zero‑copy-репликации, появившаяся после #94262, из‑за которой разделяемые части могли быть удалены до того, как другие реплики завершали их получение. #95597 (filimonov).
- Исправлен сбой при применении
tupleElement к массивам JSON. Закрывает #95581. #95647 (Pavel Kruglov).
- Исправлено исключение logical error, возникавшее при использовании сопоставителя (
*) внутри лямбда-функции в предложении VALUES в JOIN с USING. Закрывает #93675. #95661 (Vladimir Cherkasov).
- Исправлена логическая ошибка
There was an error: Cannot obtain error message, возникавшая при ожидании распределённой DDL-операции и одновременном удалении базы данных Replicated. Исправление #95539. #95664 (Alexander Tokmakov).
- Исправлена ошибка, из-за которой функция
IN возвращала некорректные результаты со значениями NULL при включенном transform_null_in. Закрывает #65776. #95674 (Nihal Z. Miaji).
- Корректно обрабатываются типы LowCardinality Nullable в
CAST при включенной настройке cast_keep_nullable. Закрывает #95670. #95747 (Alexey Milovidov).
- Исправлено укрупнение партиционированных данных Delta Lake. #95773 (Kseniia Sumarokova).
- Исправлено состояние гонки для JOIN-столбца типа Nullable в runtime-фильтрах. #95775 (Hechem Selmi).
- Исправлена возможная логическая ошибка в запросе с matcher (
*, table.*) и analyzer_compatibility_join_using_top_level_identifier, когда столбец USING имеет разные типы в таблицах и в списке SELECT. Закрывает #90477. #95808 (Vladimir Cherkasov).
- Исправлены ошибки, связанные с безопасностью памяти, в операциях, выполняемых в параллельном пуле потоков (резервное копирование, агрегация, распределённые запросы), которые могли приводить к исключениям при возникновении ошибки во время планирования задач. #95818 (Raúl Marín).
- Исправлен сбой при выполнении DROP WORKLOAD одновременно с выполнением запросов, использующих удаляемую рабочую нагрузку. #95856 (Alexey Milovidov).
- Исправлена медленная работа при выполнении запросов к системным таблицам от имени пользователя с ограниченными привилегиями во множестве баз данных. Закрывает #89371. #95874 (pufit).
- Исправлено выполнение функции tupleElement для JSON с вложенными путями: ранее это могло приводить к неверному результату запроса. #95907 (Pavel Kruglov).
- Исправлена ошибка
NOT_SUPPORTED, которая могла возникнуть при использовании алгоритма JOIN direct с пустой таблицей семейства MergeTree. #95935 (Vladimir Cherkasov).
- Исправлено: клиент не предлагал и не автодополнял имена алиасов для настроек, закрывает #92190. #95945 (phulv94).
- Исправлено поле event_date в system.asynchronous_metric_log. #95947 (Raúl Marín).
- Исправлена обработка skipping paths в типе данных JSON. Ранее при
JSON(SKIP path) пропускались все ключи JSON с префиксом path, включая ключи вроде "pathpath", что могло приводить к потере данных при вставке. Теперь это исправлено: пропускается только ключ "path". #95948 (Pavel Kruglov).
- Часть с неизвестными проекциями не должна считаться безвозвратно утерянной. #95952 (Mikhail Artemenko).
- Исправлена ошибка, из-за которой пустая строка превращалась в
NULL в таблице Join с ключом Nullable(String). Закрывает #71414. #96002 (Alexey Milovidov).
- Теперь движок PostgreSQL может корректно читать
BOOLEAN[]. Закрывает проблему #72754. #96006 (Alexey Milovidov).
- Исправлен формат
ProtobufList для чтения из пустого файла. Закрывает #70059. #96007 (Alexey Milovidov).
- Исправлена ошибка в формате
ProtobufList, из-за которой для пустых таблиц создавалась фантомная запись. Закрывает #72596. #96010 (Alexey Milovidov).
- Исправлено несоответствие типов
UInt64 и Int32 в функции if в редком случае распределённых запросов и PREWHERE при выводе типов. Закрывает #70017. #96012 (Alexey Milovidov).
- Исправлены
JIT-скомпилированные запросы, использующие тип Bool. #96013 (Alexey Milovidov).
- Исправлена логическая ошибка при чтении столбца UUID из текстового столбца SQLite TEXT. Закрывает #71263. #96016 (Alexey Milovidov).
- Исправлено преобразование типов в движке SQLite для
DateTime, Date, UUID и других типов. Закрывает #73481. #96017 (Alexey Milovidov).
- Значения
FixedString некорректно экранировались в запросах к внешним базам данных SQLite и PostgreSQL. Закрывает #73519. В соавторстве с @jh0x. #96019 (Alexey Milovidov).
- Исправлен сбой из-за ошибки assert в WindowTransform при большом смещении PRECEDING. Закрывает #75852. #96026 (Alexey Milovidov).
- Исправлена ошибка, из-за которой могло происходить повреждение данных, когда параллельные асинхронные вставки используют одинаковые имена параметров, но содержат разные значения. #96035 (Seva Potapov).
- Исправлен период для глобальных профилировщиков (задаётся параметрами
global_profiler_real_time_period_ns и global_profiler_cpu_time_period_ns). Вместо заданного значения использовалось усечённое, из-за чего профилировщик срабатывал чаще, чем предполагалось. #96048 (Antonio Andelic).
- Ранее, если в записи файла манифеста Iceberg для position delete присутствовала ссылка на файл данных, но имела значение NULL, мы не получали корректные границы для соответствующих файлов данных. Этот PR исправляет эту ошибку. #96061 (Daniil Ivanik).
- Исправлена проблема с отзывом ролей по умолчанию. #96103 (Vitaly Baranov).
- Исправлена ошибка use-after-free при анализе индекса в редком случае, когда
use_primary_key отключен и имеется очень большое количество дизъюнкций условий, использующих индекс. #96112 (Alexey Milovidov).
- Исправлена регрессия в кодеке
Gorilla, возникавшая, когда явно указанный размер не соответствовал размеру типа данных, а размер буфера был слишком мал. В предыдущих версиях это приводило к исключению при декомпрессии. Закрывает #78253. #96118 (Alexey Milovidov).
- Предотвращена взаимная блокировка при загрузке словарей, когда один словарь ссылается на таблицу Merge, которая рекурсивно ссылается на него. Закрывает #78360. #96120 (Alexey Milovidov).
- Исправлено использование неинициализированного значения в
formatDateTime при использовании форматтеров переменной ширины, таких как в стиле MySQL и JODA. #96133 (Alexey Milovidov).
- Сочетание настроек
use_const_adaptive_granularity и index_granularity_bytes (что означает “неадаптивную гранулярность”) приводило к неверному вычислению количества строк для чтения и возникновению исключения. #96143 (Alexey Milovidov).
- Выполнение некорректной мутации ALTER UPDATE на файлоподобных таблицах в объектном хранилище, таких как S3 и Azure, могло приводить к разыменованию nullptr. Закрывает #92994. #96162 (Alexey Milovidov).
- Исправлено некорректное поведение
AccessRights::contains, из-за которого при частичном отзыве привилегий возвращались неверные результаты. #96170 (pufit).
- Исправлена коллизия хэша в кэше условий запроса для свернутых констант CTE, которая могла приводить к ошибочному результату запроса. Закрывает #96060. #96172 (Alexey Milovidov).
- Исправлена возможная взаимная блокировка в ProcessList. Она может возникнуть из-за инверсии блокировок, если трекер оверкоммита памяти срабатывает в момент добавления задачи в механизм проверки отмены. #96182 (Antonio Andelic).
- Исправлена ошибка, из-за которой запросы с OUTER JOIN (LEFT, RIGHT или FULL) в сочетании с несколькими INNER JOIN могли возвращать некорректные результаты из-за недопустимого изменения порядка JOIN. Если условие ON в OUTER JOIN ссылалось на столбцы из нескольких ранее присоединённых таблиц, оптимизатор не учитывал все зависимости между таблицами и мог неправильно изменить порядок JOIN, из-за чего часть строк терялась. Закрывает #95972. #96193 (Vladimir Cherkasov).
- Если для таблицы не определена статистика, ClickHouse не должен пытаться её загружать. Это позволяет избежать дополнительных накладных расходов (100+ мс) на проверку наличия файлов статистики. (тикет #96068). #96233 (Han Fei).
- Исправлено
optimize_syntax_fuse_functions: теперь sum/count/avg не переписываются в sumCount(), если аргумент агрегатной функции имеет тип LowCardinality(Nullable). Закрывает #95390. #96239 (Nihal Z. Miaji).
- Исправлено некорректное отсечение партиций для
not IN и функции not has в некоторых случаях. #96241 (Nihal Z. Miaji).
- Исправлена ошибка
stack-use-after-scope в индексе векторного сходства. #96259 (Alexey Milovidov).
- Исправлено: средство запуска тестов не распознавало комментарии с подсказкой об ошибке, если запросу предшествовал SQL-комментарий. #96336 (Yakov Olkhovskiy).
- Исправлена логическая ошибка в KeyCondition, возникавшая, когда у таблицы primary key имеет тип Nullable, а в запросе используется функция
coalesce, у которой первый аргумент — константа. #96340 (Alexey Milovidov).
- Взаимодействие
GROUPING SETS, group_by_use_nulls и типа данных Tuple с LowCardinality внутри него могло приводить к неожиданной структуре блока в конвейере выполнения запроса, что вызывало логическую ошибку. Это стало проявляться после добавления Nullable Tuple-ов. #96358 (Alexey Milovidov).
- Можно было создать таблицу, использовав пустое выражение
() в качестве индекса, что приводило к некорректному обращению к памяти. #96363 (Alexey Milovidov).
- Исправлен сбой в старом анализаторе при JOIN и повторяющихся псевдонимах. #96405 (Ilya Golshtein).
- Исправлена ошибка
Nested columns sizes are inconsistent with local_discriminators, вызванная некорректной оптимизацией фильтрации на месте для столбцов Variant. #96410 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
CREATE TABLE ... CLONE AS ... игнорировал полный квалификатор исходной таблицы. #96415 (Hasyimi Bahrudin).
- Исправлена отмена выполнения табличной функции
mysql с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #96437 (Roman Vasin).
- Исправлено состояние livelock в потоке проверки отмены для запросов с высокими значениями
max_execution_time. #96450 (Sergei Trifonov).
- Исправлена логическая ошибка, которая в некоторых случаях возникала при использовании дробного
LIMIT/OFFSET в распределённых запросах. #96475 (Nihal Z. Miaji).
- Исправлена ошибка разыменования нулевого указателя в некоторых выражениях с лямбда-функциями. #96479 (Alexey Milovidov).
- Исправлены некорректные результаты при преобразовании столбцов
LowCardinality в Nullable. #96483 (Nihal Z. Miaji).
- Исправлен сбой при создании таблицы Iceberg с секцией
ORDER BY, ссылающейся на несуществующий столбец или использующей позиционный аргумент. Закрывает #93280. #96484 (Konstantin Vedernikov).
- Исправлено исключение runtime filter для столбцов Tuple с Nullable-подполями. #96509 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR во встроенном считывателе Parquet V3, когда столбец фильтра PREWHERE содержит небулевы значения UInt8. #96594 (Alexey Milovidov).
- Исправлена неявная перестройка индекса в реплицируемых таблицах при изменении метаданных. #96600 (Raúl Marín).
- Исправлена гонка данных при DROP WORKLOAD. #96614 (Sergei Trifonov).
- Исправлена ошибка при записи в таблицы Iceberg, из-за которой при вставке в партиционированные таблицы данные могли некорректно распределяться по файлам партиций. #96620 (Konstantin Vedernikov).
- Исправлена ошибка
heap-use-after-free в CREATE TABLE с ограничениями constraints. #96669 (Nikita Taranov).
- Проверка witness version в bech32 во избежание переполнения буфера. #96671 (Raúl Marín).
- Исправлена проблема, из-за которой
system.tables возвращала ошибки, если REST-каталог озера данных создавался с недопустимым параметром auth_header. #96680 (Han Fei).
- Исправлено поведение, при котором
min(timestamp) возвращал значение эпохи (1970-01-01) в _minmax_count_projection после TTL-слияния, если все строки в блоке были отфильтрованы. #96703 (Raquel Barbadillo).
- Улучшена проверка параметра
iceberg_metadata_file_path, чтобы предотвратить обход каталогов и убедиться, что указанный файл метаданных находится в каталоге таблицы. #96754 (Daniil Ivanik).
- Исправлен сбой в
ifNull при использовании аргумента Variant в GROUP BY. #96790 (Alexey Milovidov).
- Исправлены коллизии ключей кэша между таблицами при настройке
table_disk=1. #96818 (Raufs Dunamalijevs).
- Исправлено зависание потока очистки MemoryWorker, вызванное состоянием гонки. #96819 (Antonio Andelic).
- Не записывать в журнал данные с учетными данными из каталогов Iceberg. #96831 (Konstantin Vedernikov).
- Исправлен код возврата
clickhouse-client после ошибки сервера. #96841 (Vitaly Baranov).
- Запросы с CROSS JOIN и включенными параллельными репликами могли возвращать неверный результат. Исправлено в #74337. #96848 (Igor Nikonov).
- Исправлена ошибка, из-за которой запросы
ALTER TABLE DROP COLUMN завершались сбоем, если ранее для того же столбца уже выполнялось легковесное обновление. #96861 (Anton Popov).
- Исправлено переполнение стека (аварийное завершение) при создании резервных копий в архивном формате (
.zip, .tzst) на диске объектного хранилища plain_rewritable. #96872 (Alexey Milovidov).
- Исправлено аварийное завершение сервера, возникавшее, когда резервное копирование завершалось с ошибкой из-за нехватки места на диске или других ошибок ввода-вывода в файловой системе пункта назначения. #96873 (Alexey Milovidov).
- Исправлены
EXCEPT ALL и INTERSECT ALL, которые игнорировали кратность строк и работали как их варианты DISTINCT. #96876 (Alexey Milovidov).
- Исправлено исключение
std::terminate в indexOfAssumeSorted, возникавшее при вызове с несовместимыми типами (например, для массива IPv4 и целочисленного искомого значения). #96877 (Alexey Milovidov).
- Исправлено Исключение
Bad cast from type DB::ColumnNullable to DB::ColumnString, возникавшее при использовании оконных функций с group_by_use_nulls = 1 и CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov).
- Исправлены некорректные результаты, возникавшие при преобразовании JIT-скомпилированными выражениями
DateTime в DateTime64 (например, в CASE/if/multiIf со смешанными типами DateTime). Значение переинтерпретировалось вместо корректного масштабирования, из-за чего после включения компиляции выражений получались неверные временные метки. #96879 (Alexey Milovidov).
- Исправлено исключение из-за логической ошибки в
CoalescingMergeTree, возникавшее, когда выражение индекса пропуска данных создаёт константный столбец (например, bloom_filter для ifNotFinite(1, c0) в случае целочисленного столбца). #96880 (Alexey Milovidov).
- Исправлен неверный номер порта в сообщении об ошибке при ошибочном подключении по HTTP к порту собственного протокола с включенным TLS. #96881 (Alexey Milovidov).
- Исправлено, что
SETTINGS, заданные для отдельных подзапросов, не применялись к табличным функциям, таким как file, в CTE и подзапросах. #96882 (Alexey Milovidov).
- Исправлена утечка памяти в объектах BIO при чтении сертификатов X509. #96885 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR в анализаторе запросов, возникавшее, если лямбда-выражение передавалось там, где ожидалось конкретное значение (например, в качестве аргумента аккумулятора для arrayFold). #96892 (Alexey Milovidov).
- Исправлено исключение
ColumnNullable is not compatible with original при приведении сложных вложенных типов (Array, состоящего из Nullable Tuple, содержащего Map со значениями типа Nullable Enum). #96924 (Alexey Milovidov).
- Устранено состояние гонки при параллельной загрузке сегментированного словаря
HASHED, которое иногда приводило к тому, что некоторые строки не загружались. #96953 (Alexey Milovidov).
- Исправлено состояние гонки между
REPLACE PARTITION и фоновыми мутациями, из-за которого после замены могли быть одновременно видны старые и новые данные. #96955 (Alexey Milovidov).
- Исправлена ошибка в функции
arrayJoin, из-за которой при использовании с INNER JOIN и предложением WHERE возникали дублирующиеся строки; причиной была оптимизация частичного проталкивания предикатов, которая ошибочно проталкивала фильтры с arrayJoin ниже JOIN. #96989 (Alexey Milovidov).
- Исправлен сбой (SEGFAULT) в
clearCaches, вызванный тем, что BlockIO::operator= не перемещал query_metadata_cache, что приводило к преждевременному уничтожению кэшированных снимков хранилища и обращению к хранилищу MergeTreeData после освобождения памяти. #96995 (Alexey Milovidov).
- Исправлена ошибка assertion в
IfTransformStringsToEnumPass, когда функция if или transform возвращает Nullable(String) (например, при GROUP BY ... WITH CUBE и group_by_use_nulls = true). #97002 (Alexey Milovidov).
- Исправлена ошибка, из-за которой при
INSERT ... SELECT с UNION ALL и JOIN в константные строковые столбцы после укрупнения блоков могли записываться неверные значения. #97019 (Hasyimi Bahrudin).
- Исправлено исключение
assert_cast (или скрытое повреждение данных в релизных сборках) при построении статистики столбцов после изменения типа столбца командой ALTER TABLE MODIFY COLUMN. #97027 (Alexey Milovidov).
- Исправлено чтение из неинициализированной памяти в Azure Blob Storage, протоколе SSH и интерфейсах Arrow Flight. #97053 (Alexey Milovidov).
- Исправлены случаи, когда индексы влияли на результат запросов с ROW POLICY/PREWHERE и FINAL. #97076 (Yarik Briukhovetskyi).
- Исправлено оставшееся условие гонки между
REPLACE PARTITION и фоновыми мутациями в таблицах MergeTree, из-за которого старые данные могли снова появляться. #97105 (Alexey Milovidov).
- Исправлена работа неявных индексов со столбцами-псевдонимами; теперь перед их созданием выполняется полная проверка. #97115 (Raúl Marín).
- Исправлена логическая ошибка в
FunctionVariantAdaptor для функций, которым требуются константные аргументы, таких как arrayROCAUC. #97116 (Bharat Nallan).
- Исправлены зависшие мутации в случае, когда
PartCheckThread повторно ставит в очередь GET_PART для части, уже обработанной мутацией, оставляя фантомные записи в parts_to_do. #97162 (Alexey Milovidov).
- Исправлена оценка числа строк в плане запроса для подзапросов с
ORDER BY ... LIMIT, из-за которой оптимизатор мог выбирать неоптимальный порядок JOIN. #97193 (Alexander Gololobov).
- Исправлено исключение
LOGICAL_ERROR в FunctionVariantAdaptor, возникавшее, когда функция, работающая со столбцами Variant, возвращает тип Nothing, что может происходить с пустыми массивами в запросах UNION ALL. #97213 (Alexey Milovidov).
- Исправлено состояние гонки при операциях многокомпонентного копирования в S3 (например, при
BACKUP/RESTORE в S3), которое могло вызывать исключения при одновременном доступе. #97227 (Azat Khuzhin).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда arrayJoin в секции WHERE ссылался на столбцы с обеих сторон JOIN. #97239 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR при чтении подстолбца .size у разреженного Nullable(String) в Tuple с PREWHERE. #97264 (Alexey Milovidov).
- Исправлено исключение “Количество строк в отложенном фрагменте не совпадает с количеством смещений” в
LazyMaterializingTransform при чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) с использованием ORDER BY ... LIMIT. #97270 (Alexey Milovidov).
- Исправлена потеря таблицы из базы данных при
SYSTEM RESTART REPLICA, если повторное создание таблицы завершается исключением, не связанным с ZooKeeper (например, из-за лимита памяти), что приводило к несовпадению дайджестов metadata в DatabaseReplicated. #97276 (Alexey Milovidov).
- Поле
readonly в system.merge_tree_settings теперь корректно отражает, что некоторые настройки MergeTree (например, index_granularity) всегда доступны только для чтения. #97277 (Robert Schulze).
- Исправлен сбой при оптимизации
count() для таблиц MergeTree, когда снимок хранилища создавался без данных. #97281 (Pablo Marcos).
- Исправлено возможное аварийное завершение при определении имён функций по отладочной информации для трассировок стека. #97294 (Azat Khuzhin).
- Исправлена логическая ошибка, связанная с analyzer_compatibility_join_using_top_level_identifier и столбцами ALIAS. Закрывает #96228. #97297 (Vladimir Cherkasov).
- Исправлено исключение
LOGICAL_ERROR в applyOrder при использовании столбцов с текстовым индексом в предложении QUALIFY. #97313 (Alexey Milovidov).
- Системная таблица
system.functions теперь для внутренних функций отображает categories = 'Internal' вместо categories = ''. #97315 (Robert Schulze).
- Запрос с цепочкой RIGHT JOIN и включенными параллельными репликами может давать некорректный результат. Исправлено в #74341. #97316 (Igor Nikonov).
- Исправлены ложные ошибки
TABLE_UUID_MISMATCH, которые могли возникать в refreshable materialized view и других сценариях при переименовании таблиц. #97323 (Azat Khuzhin).
- Исправлен segfault при резервном копировании
StorageKeeperMap, вызванный use-after-free висячего указателя на хранилище в отложенном батче резервного копирования. #97336 (Alexey Milovidov).
- Исправлена функция
exists со скалярным подзапросом внутри ALTER UPDATE/DELETE, когда включен параметр mutations_execute_subqueries_on_initiator. Скалярный подзапрос вычислялся некорректно, что могло привести к ошибке или к повреждённой команде мутации, из-за которой таблица не загружалась при следующем перезапуске сервера. #97347 (Kirill Kopnev).
- Исправлено логическое исключение
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8))), возникавшее при сравнении NULL со столбцом Variant, содержащим типы LowCardinality. #97379 (Alexey Milovidov).
- Исправлена возможная гонка при выполнении
EXCHANGE TABLES параллельно с включенным сегментированным кэшем запросов. #97411 (Konstantin Vedernikov).
- Исправлено исключение
LOGICAL_ERROR при преобразовании из Array в QBit, когда nullable_source из внешней обёртки Tuple заменяет преобразуемый столбец типа Array на столбец несовместимого типа. Закрывает #97389. #97413 (Alexey Milovidov).
- Исправлена неконсистентность при повторном форматировании AST для литералов кортежей с алиасом в скобках: например,
(('a', 'b') AS x) ошибочно переформатировалось в tuple(('a', 'b') AS x). #97418 (Alexey Milovidov).
- Исправлено исключение при асинхронных вставках с дедупликацией, возникавшее, когда ошибка парсинга приводила к созданию пустого блока без строк. #97460 (Sema Checherinda).
- Исправлено исключение “Количество строк в отложенном фрагменте не соответствует количеству смещений” в
LazyMaterializingTransform при чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) при использовании ORDER BY ... LIMIT. #97482 (Alexey Milovidov).
- Исправлены настройки вставки в Iceberg. Добавлен алиас для настройки
allow_experimental_insert_into_iceberg. #97483 (Konstantin Vedernikov).
- Исправлена ошибка
ACCESS_DENIED для пользователей без разрешения CREATE TEMPORARY TABLE, когда оптимизация optimize_inverse_dictionary_lookup преобразует предикаты dictGet(...). Теперь ClickHouse пропускает это преобразование и выполняет исходное выражение. Закрывает #97269. #97484 (Nihal Z. Miaji).
- Исправлен сбой assert (исключение в отладочных сборках и сборках с санитайзерами) в
Set и MergeTreeIndexSet при обработке столбцов с внутренними разреженными подстолбцами (например, столбцов Tuple из частей MergeTree с разными профилями разреженной сериализации). #97493 (Alexey Milovidov).
- Исправлено возможное обращение к памяти после её освобождения в StorageKafka2. #97520 (Bharat Nallan).
- Исправлена работа
INTO OUTFILE с TRUNCATE и настройкой into_outfile_create_parent_directories, когда путь вывода содержит каталоги. #97549 (Alexey Milovidov).
- Исправлена ошибка
BAD_ARGUMENTS при запросах к таблицам с лямбда-выражениями в столбцах ALIAS через табличную функцию merge() при включенном анализаторе. #97551 (Alexey Milovidov).
- Исправлено исключение
system.zookeeper_info, если zxid в Keeper равен 0. #97553 (Alexey Milovidov).
- Исправлена возможная логическая ошибка в словаре
ip_trie, если тип ключа отличается от String. #97555 (Bharat Nallan).
- Исправлена ошибка, из-за которой OAuth-аутентификация REST-каталога не работала для базового
RestCatalog (она работала только для производных каталогов, таких как OneLakeCatalog). Из-за этого REST-каталог по умолчанию перестал работать после добавления каталога BigLake. #97561 (Konstantin Vedernikov).
- Функции Geometry (
perimeterSpherical, areaSpherical и т. д.) теперь принимают отдельные подтипы геометрии (Polygon, Ring, Point и т. д.) помимо вариативного типа Geometry. #97571 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR при использовании isNull/isNotNull для подстолбцов типов Nullable(Tuple(... Nullable(T) ...)). Закрывает #97224. #97582 (Alexey Milovidov).
- Исправлено разыменование нулевого указателя при применении патч-частей в ходе легковесных обновлений. #97583 (Alexey Milovidov).
BaseSettings::readBinary передаёт индекс из accessor.find в field_infos[] без проверки на специальное значение «не найдено» (то есть -1), что может привести к выходу за границы std::vector. Проблему удалось выявить благодаря механизмам защиты libcxx. Вероятно, это происходило при десериализации плана запроса, когда более новый сервер отправляет настройку, неизвестную более старому серверу. Метод чтения на основе строк уже обрабатывает этот случай корректно; в readBinary такой же проверки не было. #97585 (Miсhael Stetsyuk).
- Исправлены некорректные результаты запросов
UNION ALL, в которых одна ветвь содержала предикат, всегда равный false: такая ветвь ошибочно читала данные вместо того, чтобы ничего не возвращать. #97620 (Bharat Nallan).
- Исправлена ошибка
UNSUPPORTED_METHOD, возникавшая при IN (col) с единственной ссылкой на столбец. #97646 (Alexey Milovidov).
- Исправлено Исключение логической ошибки при
GROUP BY ... WITH ROLLUP/CUBE, когда ключи содержат LowCardinality(Nullable(...)) внутри Nullable(Tuple(...)). #97647 (Alexey Milovidov).
- Исправлена несогласованность в форматировании AST для
NOT (1, 1, 1), которая могла приводить к LOGICAL_ERROR в отладочных сборках. #97653 (Alexey Milovidov).
- Исправлено исключение
keeper-converter при обработке пустых файлов журнала транзакций ZooKeeper. #97673 (Alexey Milovidov).
Улучшение сборки/тестирования/пакетирования
- ClickHouse теперь можно собирать с помощью clang-23 (master). #95578 (Alexey Milovidov).
- Исправлено принудительное выставление
is_local в false при настроенном bind_host; вместо этого добавлен интеграционный тест. Дополнение к #74741. #93109 #96018 (Zhigao Hong).
- Стресс-тесты: исправлены стресс-тесты и тесты обновления в CI. теги
no-{build} теперь игнорируются. добавлена рандомизация совместимости. #94693 (Nikita Fomichev).
- Опубликован бинарный файл parser_memory_profiler из сборки. Инструмент можно использовать для анализа потребления памяти деревом AST. #95826 (Ilya Yatsishin).
- Добавлен флаг
--symbolize для инструмента parser_memory_profiler, который создаёт файлы .heap.sym с разрешёнными именами символов в результатах. #96477 (Ilya Yatsishin).
- Зафиксированы версии сторонних Docker-образов в интеграционных тестах. #96500 (Alexey Milovidov).
- Восстановлена возможность динамической линковки
OpenSSL. Это не рекомендуется и не используется ни в каких продакшн-сборках, но такая возможность всё ещё остаётся для энтузиастов из интернета. #96506 (Govind R Nair).
- Диапазон
magic_enum уменьшен с [-100, 1000] до значения по умолчанию [-128, 127] с использованием специализации Coordination::OpNum для конкретного типа, что сокращает время сборки. #96632 (Alexey Milovidov).
- Удалены лишние шаблоны C++ из классов Function, чтобы сократить время сборки. #96646 (Alexey Milovidov).
- Перенесли генерацию
StorageSystemLicenses на этап конфигурации, чтобы повысить параллелизм сборки. #96697 (Alexey Milovidov).
- Распараллелено сканирование лицензий. #96727 (Raúl Marín).
- Добавлен функциональный тест без сохранения состояния для поддержки протокола SSH. #96996 (Alexey Milovidov).
- Kafka 3.9.0 добавлена в инфраструктуру функциональных тестов без сохранения состояния, что позволяет напрямую тестировать движки таблиц Kafka и Kafka2, где ClickHouse Keeper используется вместо ZooKeeper. Шесть новых тестов без сохранения состояния охватывают базовые сценарии записи и чтения, виртуальные столбцы, INSERT, несколько форматов, обработку повреждённых сообщений и хранение смещений через Keeper. #96997 (Alexey Milovidov).
- Добавлен CI-процесс для сборки оптимизированного тулчейна clang с PGO+BOLT. #96991 (Alexey Milovidov).
- В CI используется оптимизированная с помощью PGO сборка LLVM/Clang, что должно ускорить сборку на 20..30%. #97031 (Alexey Milovidov).
- Заменены математические функции glibc на реализации из llvm-libc. #90151 (Konstantin Bogdanov).
- Boost обновлён с 1.83 до 1.90, что исправляет сбой из-за срабатывания assert в
devector в отладочных сборках. #97037 (Alexey Milovidov).
- Обновлён
postgres до версии REL_18_1. #95189 (Konstantin Bogdanov).
- Используется
libexpat 2.7.3. #95218 (Konstantin Bogdanov).
- Используется
OpenSSL 3.5.5. #95345 (Konstantin Bogdanov).
- Используется
simdjson v4.2.4. #97129 (Konstantin Bogdanov).
- Используется
libarchive 3.8.5. #97131 (Konstantin Bogdanov).
- Используется
fast_float версии 8.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-образов для интеграционных тестов уровня 3: устаревшие (EOL) или удалённые базовые образы заменены на актуальные поддерживаемые версии. #97314 (Rahul).
- Добавлены запросы из бенчмарка TPC-DS. #97349 (Raufs Dunamalijevs).
- Отдельные cmake-опции для наборов инструкций x86 (
ENABLE_SSSE3, ENABLE_AVX2, NO_SSE3_OR_HIGHER, ARCH_NATIVE и т. д.) заменены одной числовой опцией X86_ARCH_LEVEL (1/2/3/4), соответствующей стандартным уровням микроархитектуры x86-64, которые уже используются системой диспетчеризации во время выполнения. #97354 (Raúl Marín).
- Устранено инстанцирование вариантов шаблона
division_by_nullable=true для операций, не связанных с делением, в FunctionBinaryArithmetic, что сокращает время компиляции и размер бинарного файла. #97496 (Raúl Marín).
- Уменьшена зависимость от
Exception.h: этот файл убран из часто используемых заголовков, таких как typeid_cast.h, assert_cast.h, Context_fwd.h, IDataType.h и различных заголовочных файлов Column. #97497 (Raúl Marín).
- Всегда используйте заголовочные файлы из комплекта
compiler-rt (интерфейсы sanitizer и XRay) вместо заголовков системного компилятора и по умолчанию собирайте библиотеки compiler-rt из исходников. #97499 (Raúl Marín).
- Исключено включение заголовков boost/multiprecision в
wide_integer_impl.h на платформах с достаточно точным long double, что ускоряет сборку. #96633 (Alexey Milovidov).
- Реализован джоб LLVM Code Coverage; на первом этапе он включён для ветки master. #90952 (Alexey Bakharew).
- В релизных сборках включён быстрый режим защиты libcxx. В основном это нужно для проверок выхода за границы. Судя по результатам тестов производительности, заметного влияния на производительность не ожидается. #94757 (Miсhael Stetsyuk).
Обратно несовместимое изменение
- Исправлено несогласованное форматирование, вызванное некорректной подстановкой псевдонимов в форматтере. Это закрывает #82833. Это закрывает #82832. Это закрывает #68296. Это изменение потенциально нарушает обратную совместимость: когда анализатор отключен, некоторые запросы CREATE VIEW с IN, ссылающимся на псевдоним, не могут быть обработаны. Чтобы избежать этой несовместимости, включите анализатор (по умолчанию он включен начиная с версии 24.3). #82838 (Alexey Milovidov).
- Кодеки
DEFLATE_QPL и ZSTD_QAT были удалены. Пользователям рекомендуется до обновления перекодировать существующие данные, сжатые с помощью DEFLATE_QPL или ZSTD_QAT, в другой кодек. Обратите внимание: для использования этих кодеков должны были быть включены настройки enable_deflate_qpl_codec и enable_zstd_qat_codec. #92150 (Robert Schulze).
- Улучшена отладка UDF: включён захват stderr в
system.query_log.exception. Ранее stderr из UDF записывался только в файлы и не отображался в журнале запросов, из-за чего отладка была невозможна. Теперь stderr по умолчанию вызывает исключения и полностью накапливается (до 1 МБ) перед тем, как сгенерировать исключение, поэтому полные трассировки Python и сообщения об ошибках появляются в system.query_log.exception, что упрощает диагностику. #92209 (Xu Jia).
- Пустой список столбцов в условии
JOIN USING () теперь считается синтаксической ошибкой. Ранее предполагалось, что во время выполнения запроса это будет INVALID_JOIN_ON_EXPRESSION. В некоторых случаях, например при JOIN с хранилищем Join, это приводило к LOGICAL_ERROR; исправление закрывает #82502. #92371 (Vladimir Cherkasov).
- По умолчанию для SKIP REGEXP в типе JSON используется частичное совпадение. Закрывает #79250. #92847 (Pavel Kruglov).
- Отменено изменение “Allow INSERT into simple ALIAS columns” (отменяет ClickHouse/ClickHouse#84154). Оно не работает с пользовательскими форматами, и для него нет отдельной настройки. #92849 (Azat Khuzhin).
- Настройка, вызывающая ошибку, если каталог озера данных не имеет доступа к объектному хранилищу. #93606 (Konstantin Vedernikov).
- Движок базы данных
Lazy удалён и больше не доступен. Закрывает #91231. #93627 (Alexey Milovidov).
- Удалён режим
transposed_with_wide_view для metric_log — из-за ошибки он неработоспособен. Задать system.metric_log в этом режиме больше нельзя. Это частично отменяет #78412. #93867 (Alexey Milovidov).
- Теперь для рабочих нагрузок по умолчанию используется вытесняющее планирование CPU. См. настройку сервера
cpu_slot_preemption. #94060 (Sergei Trifonov).
- Экранировать имена файлов индексов, чтобы избежать повреждения частей. После этого изменения ClickHouse не сможет загружать индексы с не-ASCII-символами в имени, созданные в предыдущих версиях. Для этого можно использовать настройку MergeTree
escape_index_filenames. #94079 (Raúl Marín).
- Настройки формата
exact_rows_before_limit, rows_before_aggregation, cross_to_inner_join_rewrite, regexp_dict_allow_hyperscan, regexp_dict_flag_case_insensitive, regexp_dict_flag_dotall и dictionary_use_async_executor теперь переведены в разряд обычных настроек (не настроек формата). Это исключительно внутреннее изменение и не имеет заметных для пользователя побочных эффектов, кроме (маловероятного) случая, когда вы указали какие-либо из этих настроек в определениях движков таблиц Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog или NATS. В таких случаях эти настройки раньше игнорировались, а теперь при таких определениях генерируется ошибка. #94106 (Robert Schulze).
- Функции
joinGet/joinGetOrNull теперь требуют наличия привилегии SELECT для базовой таблицы Join. После этого изменения для выполнения joinGet('db.table', 'column', key) требуется, чтобы у пользователя была привилегия SELECT как для столбцов ключа, определённых в таблице Join, так и для извлекаемого столбца-атрибута. Запросы без этих привилегий будут завершаться ошибкой ACCESS_DENIED. Для перехода предоставьте необходимые разрешения с помощью GRANT SELECT ON db.join_table TO user для полного доступа к таблице или GRANT SELECT(key_col, attr_col) ON db.join_table TO user для доступа на уровне столбцов. Это изменение затрагивает всех пользователей и приложения, использующие joinGet/joinGetOrNull, если явные привилегии SELECT ранее не были настроены. #94307 (Vladimir Cherkasov).
- Для запросов
CREATE TABLE ... AS ... теперь проверяется SHOW COLUMNS. Ранее проверялся SHOW TABLES, но для такой проверки разрешений это некорректный grant. #94556 (pufit).
- Формат вывода
Hash теперь не зависит от размеров блоков. #94503 (Alexey Milovidov). Обратите внимание, что из-за этого хеш-значения в выводе будут отличаться от предыдущих версий.
- HTTP API и встроенный веб-интерфейс для ClickHouse Keeper. #78181 (pufit и speeedmaster).
- Дедупликация async insert теперь работает с зависимыми materialized views. При коллизии по block_id исходный блок фильтруется: из него удаляются строки, связанные с block_id, а оставшиеся строки преобразуются всеми соответствующими SELECT-запросами materialized views; в результате исходный блок пересобирается без конфликтующих строк. #89140 (Sema Checherinda). Теперь можно использовать дедупликацию с async inserts, когда задействованы materialized views. #93957 (Sema Checherinda).
- Добавлены новый синтаксис и новый механизм, упрощающие и расширяющие функциональность индексов-проекций. Это продолжение работы из https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
- Добавлена поддержка текстовых индексов для столбцов
Array. #89895 (Jimmy Aguilar Mena).
- Параметр
use_variant_as_common_type теперь включён по умолчанию, что позволяет использовать несовместимые типы внутри Array, в запросах UNION и в ветвях if/multiIf/case. #90677 (Alexey Milovidov).
- Добавлена новая системная таблица
zookeeper_info. Реализовано в #88014. #90809 (Smita Kulkarni).
- Добавлена поддержка типа
Variant во всех функциях. #90900 (Bharat Nallan).
- Добавляет метрику
ClickHouse_Info в конечную точку Prometheus /metrics, содержащую в основном информацию о версии, что позволяет строить графики и отслеживать подробные сведения о версии с течением времени. #91125 (Christoph Wurm).
- Добавлена новая четырёхбуквенная команда
rcfg для Keeper, позволяющая изменять конфигурацию кластера. Эта команда предоставляет более широкие возможности изменения конфигурации, чем стандартный запрос reconfigure. В качестве аргумента команда принимает строку json. Полный набор байтов, отправляемых в TCP-интерфейс, должен выглядеть так: rcfg{json_string_length_big_endian}{json_string}. Вот как могут выглядеть некоторые примеры команды: {"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin).
- Добавлена функция
reverseBySeparator, которая меняет порядок подстрок в строке, разделённой указанным разделителем, на обратный. Закрывает #91463. #91780 (Xuewei Wang).
- Добавляет новую настройку
max_insert_block_size_bytes, которая позволяет точнее управлять формированием вставляемых блоков. #92833 (Kirill Kopnev).
- DDL-запросы с предложением
ON CLUSTER можно выполнять для базы данных Replicated, если включена настройка ignore_on_cluster_for_replicated_database. В этом случае имя кластера будет проигнорировано. #92872 (Kirill).
- Добавлена функция
mergeTreeAnalyzeIndexes. #92954 (Azat Khuzhin).
- Добавлена новая настройка
use_primary_key. Установите её в false, чтобы отключить отсечение гранул по первичному ключу. #93319 (Nihal Z. Miaji).
- Добавлена табличная функция
icebergLocalCluster. #93323 (Anton Ivashkin).
- Добавлена функция
cosineDistanceTransposed, которая приблизительно вычисляет косинусное расстояние между двумя точками. #93621 (Raufs Dunamalijevs).
- Добавлен столбец
files в таблицу system.parts, показывающий количество файлов в каждой части данных. #94337 (Match).
- Добавлен max-min-справедливый планировщик для управления параллелизмом. Обеспечивает более справедливое распределение ресурсов при высокой переподписке, когда множество запросов конкурируют за ограниченные слоты CPU. Короткие запросы не страдают из-за длительных запросов, которые со временем накопили больше слотов. Включается значением
max_min_fair настройки сервера concurrent_threads_scheduler. #94732 (Sergei Trifonov).
- В клиенте ClickHouse появилась возможность переопределять TLS SNI при подключении к серверу. #89761 (Matt Klein).
- Добавлена поддержка временных таблиц в вызовах функции
joinGet. #92973 (Eduard Karacharov).
- Поддержка векторов удаления в движке таблицы
DeltaLake. #93852 (Kseniia Sumarokova).
- Добавлена поддержка deletion vectors в
deltaLakeCluster. #94365 (Kseniia Sumarokova).
- Поддержка Google Cloud Storage для озер данных. #93866 (Konstantin Vedernikov).
Экспериментальные возможности
- Параметр
use_skip_indexes_on_data_read теперь включен по умолчанию. Этот параметр позволяет выполнять фильтрацию в потоковом режиме одновременно с чтением, что улучшает производительность запросов и сокращает время запуска. #93407 (Shankar Iyer).
- Повышена производительность
DISTINCT для столбцов LowCardinality. Закрывает #5917. #91639 (Nihal Z. Miaji).
- Оптимизирована агрегатная функция
distinctJSONPaths: теперь она читает только JSON-пути из частей данных, а не весь JSON-столбец. #92196 (Pavel Kruglov).
- В JOIN теперь проталкивается больше фильтров. #85556 (Nikita Taranov).
- Поддержано больше случаев проталкивания из условия ON в JOIN, когда фильтр использует входные данные только с одной стороны. Поддерживаются JOIN
ANY, SEMI, ANTI. #92584 (Dmitry Novik).
- Разрешено использовать эквивалентные множества для проталкивания фильтров при
SEMI JOIN. Закрывает #85239. #92837 (Dmitry Novik).
- Пропускаем чтение левой стороны hash JOIN, если правая сторона пуста. Раньше левая сторона читалась до первого непустого блока, что могло приводить к большому объёму лишней работы при интенсивной фильтрации или агрегации. #94062 (Alexander Gololobov).
- Использование метода “fastrange” (Daniel Lemire) для партиционирования данных внутри конвейера выполнения запроса. Это может улучшить параллельную сортировку и JOIN-операции. #93080 (Alexey Milovidov).
- Повышена производительность оконных функций, когда PARTITION BY совпадает с ключом сортировки или является его префиксом. #87299 (Nikita Taranov).
- Внешний фильтр теперь проталкивается в представления, что позволяет применять PREWHERE на локальных и удалённых узлах. Устранена проблема #88189. #88316 (Igor Nikonov).
- Реализована JIT-компиляция для ещё большего числа функций. Закрывает #73509. #88770 (Alexey Milovidov совместно с Taiyang Li).
- Если индекс пропуска данных, используемый в запросе
FINAL, построен по столбцу, входящему в первичный ключ, дополнительный этап проверки пересечения по первичному ключу с другими частями не требуется и больше не выполняется. Устраняет #85897. #93899 (Shankar Iyer).
- Улучшены производительность и использование памяти при дробных
LIMIT и OFFSET. #91167 (Ahmed Gouda).
- Исправлено использование более быстрой логики произвольного чтения в префетчере ридера Parquet V3. Закрывает #90890. #91435 (Arsen Muk).
- Повышена производительность
icebergCluster. Закрывает #91462. #91537 (Yang Jiang).
- Не выполнять фильтрацию по виртуальным столбцам для константных фильтров. #91588 (c-end).
- Снижено использование памяти при INSERT и слияниях с частями Wide в очень широких таблицах за счёт включения адаптивных буферов записи. Добавлена поддержка адаптивных буферов записи для зашифрованных дисков. #92250 (Azat Khuzhin).
- Повышена производительность полнотекстового поиска с текстовым индексом и токенизатором
sparseGrams за счёт сокращения числа токенов, по которым выполняется поиск в индексе. #93078 (Anton Popov).
- Функция
isValidASCII была оптимизирована для случаев с положительным результатом, то есть для входных значений, полностью состоящих из ASCII. #93347 (Robert Schulze).
- Оптимизация read-in-order теперь распознаёт случаи, когда столбцы ORDER BY являются константами из-за условий WHERE, что позволяет эффективно читать данные в обратном порядке. Это полезно для многотенантных запросов, таких как
WHERE tenant='42' ORDER BY tenant, event_time DESC, которые теперь могут использовать InReverseOrder без необходимости полной сортировки.”. #94103 (matanper).
- Добавлен специализированный класс AST для Enum, который хранит значения параметров в виде пар (string, integer) вместо дочерних элементов ASTLiteral для оптимизации потребления памяти. #94178 (Ilya Yatsishin).
- Распределённый анализ индексов на нескольких репликах. Полезно при использовании совместно используемого хранилища и очень больших объёмов данных в кластере. Это применимо к SharedMergeTree (ClickHouse Cloud) и может быть применимо к другим типам таблиц MergeTree с совместно используемым хранилищем. #86786 (Azat Khuzhin).
- Снижены накладные расходы на JOIN Runtime Filters за счет их отключения в следующих случаях: - в фильтре Блума установлено слишком много битов - на этапе выполнения отфильтровывается слишком мало строк. #91578 (Alexander Gololobov).
- Используйте буфер в памяти для входных данных коррелированных подзапросов, чтобы не вычислять их многократно. Часть #79890. #91205 (Dmitry Novik).
- Разрешить всем репликам при чтении с использованием параллельных реплик параллельно перехватывать осиротевшие диапазоны. Это улучшает балансировку нагрузки и снижает задержки на длинном хвосте. #91374 (zoomxi).
- Внешняя агрегация/сортировка/JOIN теперь учитывают настройку запроса
temporary_files_codec во всех контекстах. Исправлена проблема с отсутствующими profile events для grace hash join. #92388 (Vladimir Cherkasov).
- Сделали более надёжным определение использования памяти запросом при сбросе на диск во время агрегации/сортировки. #92500 (Azat Khuzhin).
- Оценка общего числа строк и статистики NDV (числа различных значений) для столбцов ключа агрегации. #92812 (Alexander Gololobov).
- Оптимизировано сжатие списка postings с помощью simdcomp. #92871 (Peng Jian).
- Переработана обработка режима Ordered в S3Queue с использованием бакетов. Это также должно повысить производительность за счёт сокращения числа запросов к Keeper. #92889 (Kseniia Sumarokova).
- Функции
mapContainsKeyLike и mapContainsValueLike теперь могут использовать текстовый индекс для mapKeys() и mapValues() соответственно. #93049 (Michael Jarrett).
- Снижено использование памяти в не-Linux-системах (включена немедленная очистка «грязных» страниц jemalloc). #93360 (Eduard Karacharov).
- Реализована принудительная очистка арен jemalloc, если отношение объёма грязных страниц к
max_server_memory_usage превышает memory_worker_purge_dirty_pages_threshold_ratio. #93500 (Eduard Karacharov).
- Снижено использование памяти для AST. #93601 (Nikolai Kochetov).
- В некоторых случаях мы замечали, что ClickHouse не соблюдает лимит памяти при чтении из таблицы. Это исправлено. #93715 (Nikita Mikhaylov).
- Расширения Keeper
CHECK_STAT и TRY_REMOVE теперь включены по умолчанию. #93886 (Mikhail Artemenko).
- Разбор нижних и верхних границ имён файлов для позиционных удалений из записей manifest file в Iceberg для более точного выбора соответствующих файлов данных. #93980 (Daniil Ivanik).
- Добавлены ещё две настройки для управления максимальным количеством динамических подстолбцов в JSON-столбце. Первая — настройка MergeTree
merge_max_dynamic_subcolumns_in_compact_part (аналогично уже добавленной merge_max_dynamic_subcolumns_in_wide_part), которая ограничивает количество динамических подстолбцов, создаваемых при слиянии в Compact part. Вторая — настройка уровня запроса max_dynamic_subcolumns_in_json_type_parsing, которая ограничивает количество динамических подстолбцов, создаваемых при разборе JSON-данных; она позволяет задавать этот лимит при вставке. #94184 (Pavel Kruglov).
- В некоторых случаях немного оптимизировано укрупнение блоков для JSON-столбцов. #94247 (Pavel Kruglov).
- Уменьшен размер очередей пула потоков с учетом опыта эксплуатации в продакшне. Добавлена явная проверка потребления памяти перед чтением каких-либо данных из MergeTree. #94692 (Nikita Mikhaylov).
- Сделано так, чтобы при нехватке CPU планировщик отдавал предпочтение потоку MemoryWorker, поскольку это защищает процесс ClickHouse от критической угрозы. #94864 (Nikita Mikhaylov).
- Очистка грязных страниц jemalloc теперь выполняется в отдельном потоке, а не в основном потоке MemoryWorker. Если очистка выполняется медленно, это может задерживать обновление использования RSS, что может приводить к аварийному завершению процесса из-за нехватки памяти. Добавлен новый параметр конфигурации
memory_worker_purge_total_memory_threshold_ratio, чтобы запускать очистку грязных страниц в зависимости от доли общего использования памяти. #94902 (Antonio Andelic).
system.blob_storage_log теперь поддерживается для Azure Blob Storage. #93105 (Alexey Milovidov).
- Реализован
blob_storage_log для Local и HDFS. Исправлена ошибка, из-за которой S3Queue использовал для записи в blob_storage_log не имя диска. В blob_storage_log добавлен столбец error_code. Тестовый файл конфигурации разделён, чтобы упростить локальное тестирование. #93106 (Alexey Milovidov).
clickhouse-client и clickhouse-local будут подсвечивать группы цифр (тысячи, миллионы и т. д.) внутри числовых литералов во время ввода. Это закрывает #93100. #93108 (Alexey Milovidov).
- В
clickhouse-client добавлена поддержка аргументов командной строки с пробелами вокруг знака равенства. Закрывает #93077. #93174 (Cole Smith).
- С
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap> CLI-клиент теперь может, как и раньше, использовать Ctrl-R для обычного поиска, а Ctrl-T — для нечёткого поиска. #87785 (Larry Snizek).
- Оператор очистки кэша
SYSTEM DROP [...] CACHE создавал ложное впечатление, что этот оператор отключает кэш. ClickHouse теперь поддерживает оператор SYSTEM CLEAR [...] CACHE, который звучит понятнее. Старый синтаксис по-прежнему доступен. #93727 (Pranav Tiwari).
- Поддержка составного первичного ключа в
EmbeddedRocksDB. Закрывает #32819. #33917 (usurai).
- Теперь можно использовать неконстантный IN со скалярами (запросы вида
val1 NOT IN if(cond, val2, val3)). #93495 (Yarik Briukhovetskyi).
- Предотвращена передача заголовков
x-amz-server-side-encryption в S3-запросах HeadObject, UploadPart и CompleteMultipartUpload, поскольку они не поддерживаются. #64577 (Francisco J. Jurado Moreno).
- Отслеживание hive-партиционирования в режиме ordered в S3Queue. Закрывает #71161. #81040 (Anton Ivashkin).
- Оптимизировано резервирование места в файловом кэше.
FileCache::collectCandidatesForEviction теперь будет выполняться без уникальной блокировки. #82764 (Kseniia Sumarokova).
- Добавлена поддержка составной стратегии ротации (размер + время) для журнала сервера. #87620 (Jianmei Zhang).
- CLI-клиент теперь может использовать
<warnings>false</warnings> вместо параметра командной строки --no-warnings. #87783 (Larry Snizek).
- Добавлена поддержка агрегатной функции
avg, принимающей в качестве аргументов значения типов Date, DateTime и Time. Закрывает #82267. #87845 (Yarik Briukhovetskyi).
- Оптимизация
use_join_disjunctions_push_down по умолчанию включена. #89313 (Alexey Milovidov).
- Добавлена поддержка большего числа движков таблиц и типов источников данных в коррелированных подзапросах. Закрывает #80775. #90175 (Dmitry Novik).
- Если схема параметризованного представления явно задана, она отображается. Закрывает #88875, #81385. #90220 (Grigorii Sokolik).
- Корректная обработка пропуска в записях журнала Keeper, если они находятся до последнего зафиксированного индекса. #90403 (Antonio Andelic).
- Улучшена работа настройки
min_free_disk_bytes_to_perform_insert с томами JBOD. #90878 (Aleksandr Musorin).
- Добавлена возможность указывать настройку
storage_class_name в именованных коллекциях для движка таблицы S3 и табличной функции s3. #91926 (János Benjamin Antal).
- Добавлена поддержка вставки в auxiliary ZooKeeper через
system.zookeeper. #92092 (RinChanNOW).
- Добавлены новые метрики для Keeper: события профиля
KeeperChangelogWrittenBytes, KeeperChangelogFileSyncMicroseconds, KeeperSnapshotWrittenBytes и KeeperSnapshotFileSyncMicroseconds, а также гистограммные метрики KeeperBatchSizeElements и KeeperBatchSizeBytes. #92149 (Miсhael Stetsyuk).
- Добавлена новая настройка
trace_profile_events_list, которая ограничивает трассировку с помощью trace_profile_event указанным списком имён событий. Это позволяет точнее собирать данные при высоких рабочих нагрузках. #92298 (Alexey Milovidov).
- Добавлена поддержка SYSTEM NOTIFY FAILPOINT для приостанавливаемых failpoint. — Добавлена поддержка SYSTEM WAIT FAILPOINT fp PAUSE/RESUME. #92368 (Shaohua Wang).
- В
system.data_skipping_indices добавлен столбец creation (неявный/явный). #92378 (Raúl Marín).
- Разрешена передача описания столбцов dyn-таблиц YTsaurus в источник словаря. #92391 (MikhailBurdukov).
- В #63985 мы добавили возможность указывать все параметры, необходимые для настройки TLS, отдельно для каждого порта (см. composable protocols), так что теперь не нужно полагаться на глобальную конфигурацию TLS. Однако реализация по-прежнему неявно требует наличия глобального раздела конфигурации
openSSL.server, что конфликтует со сценариями, где для разных портов нужны разные настройки TLS. Например, в развертываниях keeper-in-server нам нужны отдельные конфигурации TLS для взаимодействия между узлами Keeper и для подключений клиента ClickHouse. #92457 (Miсhael Stetsyuk).
- Добавлена новая настройка
input_format_binary_max_type_complexity, которая ограничивает общее число узлов типов, декодируемых в бинарном формате, чтобы предотвратить передачу вредоносных полезных нагрузок. #92519 (Raufs Dunamalijevs).
- В
system.background_schedule_pool{,_log} теперь отражаются выполняющиеся задачи. Добавлена документация. #92587 (Azat Khuzhin).
- Выполнять текущий запрос при поиске по Ctrl+R в клиенте, если в истории не найдено совпадений. #92749 (Azat Khuzhin).
- Добавлена поддержка
EXPLAIN indices = 1 в качестве алиаса для EXPLAIN indexes = 1. Закрывает #92483. #92774 (Pranav Tiwari).
- Ридер Parquet теперь позволяет читать столбцы Tuple или Map в формате JSON:
select x from file(f.parquet, auto, 'x JSON') работает, даже если тип столбца x в f.parquet — Tuple или Map. #92864 (Michael Kolupaev).
- Поддержка пустых Tuple в ридере Parquet. #92868 (Michael Kolupaev).
- Переход к копированию с возможностью чтения и записи для Azure Blob Storage, если нативное копирование завершается ошибкой BadRequest (например, из-за недопустимого списка блоков). Ранее это выполнялось только для ошибки Unauthorized, которая наблюдалась при копировании blob между разными аккаунтами хранилища. Однако иногда также возникает ошибка “The specified block list is invalid”. Поэтому теперь условие обновлено так, чтобы переходить к чтению & записи при любых сбоях нативного копирования. #92888 (Smita Kulkarni).
- Исправлено ограничение частоты запросов к конечной точке метаданных EC2 при выполнении большого числа параллельных S3-запросов с учетными данными профиля экземпляра EC2. Ранее каждый запрос создавал собственный
AWSInstanceProfileCredentialsProvider, из-за чего к сервису метаданных EC2 отправлялись параллельные запросы, что могло приводить к тайм-аутам и ошибкам HTTP response code: 403. Теперь поставщик учетных данных кэшируется и используется всеми запросами совместно. #92891 (Sav).
- Переработана настройка
insert_select_deduplicate, чтобы сохранить обратную совместимость. #92951 (Sema Checherinda).
- Логировать фоновые задачи, которые выполняются медленнее среднего (
background_schedule_pool_log.duration_threshold_milliseconds=30), чтобы избежать избыточного логирования задач. #92965 (Azat Khuzhin).
- В предыдущих версиях некоторые имена функций C++ в
system.trace_log и system.symbols отображались некорректно («искажёнными»), а функция demangle плохо с ними справлялась. Закрывает #93074. #93075 (Alexey Milovidov).
- Добавлена настройка резервного копирования
backup_data_from_refreshable_materialized_view_targets, позволяющая не включать в резервную копию refreshable materialized view. RMV со стратегией обновления APPEND всегда резервируются. #93076 (Julia Kartseva). #93658 (Julia Kartseva)
- Использовать минимальную отладочную информацию вместо её полного отсутствия для тяжёлых единиц трансляции, таких как функции. #93079 (Alexey Milovidov).
- Добавлена поддержка совместимости MinIO в AWS S3 C++ SDK благодаря реализации сопоставления кодов ошибок для специфических ошибок MinIO. Это изменение позволяет ClickHouse корректно обрабатывать ошибки сервера MinIO и выполнять повторные попытки при использовании развертываний MinIO вместо AWS S3, повышая надежность для пользователей, использующих Объектное хранилище в самоуправляемых кластерах MinIO. #93082 (XiaoBinMu).
- Запись символизированных профилей jemalloc (без необходимости использовать бинарный файл при создании профиля кучи). #93099 (Azat Khuzhin).
- Восстановлена работа инструмента
clickhouse git-import — ранее он не работал с большими и некорректными коммитами. См. https://presentations.clickhouse.com/2020-matemarketing/. #93202 (Alexey Milovidov).
- Не показывать пароли из URL-хранилища в журнале запросов. #93245 (Konstantin Vedernikov).
- Добавлена поддержка типа
Geometry для flipCoordinates. #93303 (Bharat Nallan).
- Улучшен UX команды SYSTEM INSTRUMENT ADD/REMOVE: для имён функций теперь используются строковые литералы String, исправлены все соответствующие функции, а также разрешено использовать function_name в
REMOVE. #93345 (Pablo Marcos).
- Добавлена новая настройка
materialize_statistics_on_merge, которая включает или отключает материализацию статистики при слиянии. Значение по умолчанию — 1. #93379 (Han Fei).
- ClickHouse теперь может разбирать
SELECT в запросах DESCRIBE SELECT без круглых скобок. Закрывает #58382. #93429 (Yarik Briukhovetskyi).
- Добавлена рандомизация проверок корректности кэша с заданной вероятностью. #93439 (Kseniia Sumarokova).
- Добавлена настройка
type_json_allow_duplicated_key_with_literal_and_nested_object, позволяющая использовать дублирующиеся пути в JSON, где один является литералом, а другой — вложенным объектом, например {"a" : 42, "a" : {"b" : 42}}. Некоторые данные могли быть созданы до добавления этого ограничения на дублирующиеся пути в https://github.com/ClickHouse/ClickHouse/pull/79317, и дальнейшие манипуляции с такими данными теперь могут приводить к ошибкам. С этой настройкой такие старые данные по-прежнему можно использовать без ошибок. #93604 (Pavel Kruglov).
- Не выводить значения простых типов в Pretty JSON на отдельных строках. #93836 (Pavel Kruglov).
- При большом количестве операторов
alter table ... modify setting ... может не удаваться получить блокировку за 5 секунд. Лучше возвращать timeout, а не logical error. #93856 (Han Fei).
- Предотвращён избыточный вывод при синтаксической ошибке. До этого изменения выводился весь SQL-скрипт, который мог содержать множество запросов. #93876 (Alexey Milovidov).
- Реализован корректный расчёт размера в байтах для запроса
check со статистикой в Keeper. #93907 (Mikhail Artemenko).
- Добавлен параметр
use_hash_table_stats_for_join_reordering, который определяет, использовать ли статистику размера хеш-таблицы во время выполнения для изменения порядка JOIN. Этот параметр по умолчанию включен, что сохраняет существующее поведение collect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov).
- Теперь пользователи могут частично просматривать вложенные глобальные настройки сервера в таблице
system.server_settings (например, logger.level). Это применимо только к настройкам с фиксированной структурой (без списков, перечислений, повторяющихся элементов и т. д.). #94001 (Hechem Selmi).
QBit теперь можно проверять на равенство. #94078 (Raufs Dunamalijevs).
- Когда Keeper обнаруживает поврежденный снимок или несогласованные журналы изменений, он генерирует исключение вместо того, чтобы требовать ручного прерывания или автоматически очищать файлы. Это должно сделать поведение Keeper более безопасным, поскольку оно теперь опирается на ручное вмешательство. #94168 (Antonio Andelic).
- Исправлена ситуация, когда при сбое
CREATE TABLE могли оставаться артефакты. #94174 (Azat Khuzhin).
- Исправлена ошибка доступа к неинициализированной памяти (ошибка в OpenSSL) при использовании защищённого паролем TLS-ключа. #94182 (Konstantin Bogdanov).
- Обновлён chdig до v26.1.1. #94290 (Azat Khuzhin).
- Добавлена поддержка более общего партиционирования для режима ordered в S3Queue. #94321 (Bharat Nallan).
- Добавлен алиас
use_statistics для настройки allow_statistics_optimize. Это лучше соответствует существующим настройкам use_primary_key и use_skip_indexes. #94366 (Robert Schulze).
- Включена настройка
input_format_numbers_enum_on_conversion_error для проверки существования элемента при преобразовании чисел в Enum. #94384 (Elmi Ahmadov).
- В режиме
ordered для S3(Azure)Queue очистка сбойных узлов теперь выполняется с учётом лимитов отслеживания (раньше это делалось только в режиме unordered — и для сбойных, и для обработанных узлов; теперь это будет выполняться и для ordered, но только для сбойных узлов). #94412 (Kseniia Sumarokova).
- В
clickhouse-local для пользователя default включено управление доступом. У пользователя default в clickhouse-local отсутствовала привилегия access_management, из-за чего операции вроде DROP ROW POLICY IF EXISTS завершались ошибкой ACCESS_DENIED, хотя у этого пользователя не должно быть ограничений. #94501 (Alexey Milovidov).
- Добавлена поддержка named collection для словарей и таблиц YTsaurus. #94582 (MikhailBurdukov).
- Добавлена поддержка именованных коллекций, определяемых в SQL, в BACKUP/RESTORE для S3 и Azure Blob Storage. Закрывает #94604. #94605 (Pablo Marcos).
- Добавлена поддержка бакетизации на основе ключа партиционирования для S3Queue в режиме ordered. #94698 (Bharat Nallan).
- Добавлена асинхронная метрика, показывающая время выполнения самого долгого слияния. #94825 (Raúl Marín).
- Добавлена проверка принадлежности файла перед применением позиционного удаления с использованием IcebergBitmapPositionDeleteTransform. #94897 (Yang Jiang).
- Теперь
view_duration_ms показывает время, в течение которого группа была активна, а не суммарную длительность потоков в ней. #94966 (Sema Checherinda).
- Снято ограничение на максимальное количество поисковых токенов в функциях
hasAnyTokens и hasAllTokens, которое ранее составляло 64. Пример: SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); Этот запрос приводил бы к ошибке BAD_ARGUMENTS, поскольку содержит 65 поисковых токенов. В этом PR ограничение полностью снято, и тот же запрос будет выполняться без ошибки. #95152 (Elmi Ahmadov).
- Добавлена настройка
input_format_numbers_enum_on_conversion_error для преобразования чисел в Enum с проверкой наличия элемента. Закрывает: #56144. #56240 (Nikolay Degterinsky).
- Ресурсы парсера формата теперь совместно используются при чтении data file и position delete file в таблицах Iceberg, что позволяет сократить число выделений памяти. #94701 (Yang Jiang).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка, из-за которой в обработчиках предопределённых запросов пробельные символы в конце интерпретировались как данные при вставке. #83604 (Fabian Ponce).
- Исправлена ошибка INCOMPATIBLE_TYPE_OF_JOIN в хранилище Join при применении оптимизации преобразования outer join в inner join. Исправляет #80794. #84292 (Vladimir Cherkasov).
- Исправлено исключение “Invalid number of rows in Chunk” при использовании hash JOIN с включенным
allow_experimental_join_right_table_sorting. #86440 (yanglongwei).
- Теперь в MergeTree имена файлов всегда заменяются хешами, если файловая система нечувствительна к регистру. Ранее в системах с нечувствительной к регистру файловой системой (например, macOS) это могло приводить к повреждению данных, если несколько имён столбцов/подстолбцов различались только регистром. #86559 (Pavel Kruglov).
- Добавлена полная проверка разрешений на этапе создания для запроса, лежащего в основе materialized view. #89180 (pufit).
- Исправлен сбой в функции
icebergHash при константном аргументе. #90335 (Michael Kolupaev).
- Исправлена логическая ошибка, из-за которой мутация вне транзакции изменяла части в активной транзакции, которая в итоге откатывалась. #90469 (Shaohua Wang).
system.warnings теперь корректно обновляется после преобразования обычной базы данных в базу данных atomic. #90473 (sdk2).
- Исправлено срабатывание assertion при чтении из файла Parquet, если часть выражения prewhere используется в другой части запроса. #90635 (Max Kainov).
- Исправлен сбой в одноузловом кластере при чтении из Iceberg в режиме split-by-buckets. Закрывает #90913. #91553 (Konstantin Vedernikov).
- Исправлена возможная логическая ошибка в движке Log при чтении подстолбцов. Закрывает #91710. #91711 (Pavel Kruglov).
- Исправлена логическая ошибка: ‘Хранилище не поддерживает транзакции’ при ATTACH AS REPLICATED. #91772 (Shaohua Wang).
- Исправлена некорректная работа runtime-фильтров, когда у LEFT ANTI JOIN есть дополнительное постусловие. #91824 (Alexander Gololobov).
- Исправляет ошибку в null-safe сравнении с типом Nothing. Закрывает #91834. Закрывает #84870. Закрывает #91821. #91884 (Yarik Briukhovetskyi).
- Исправлены ошибки декодирования DELTA_BYTE_ARRAY в нативном ридере Parquet, которые затрагивали строковые данные с высокой степенью повторяемости. #91929 (Daniel Muino).
- Кэшировать схему в глоб-шаблонах только для того файла, по которому она была определена, а не для всех файлов при определении схемы. Закрывает #91745. #92006 (Pavel Kruglov).
- Исправлена ошибка
Couldn't pack tar archive: Failed to write all bytes, вызванная некорректным заголовком с размером записи в архиве. Исправляет #89075. #92122 (Julia Kartseva).
- Поток запроса в insert select теперь освобождается, чтобы предотвратить закрытие HTTP-соединения. #92175 (Sema Checherinda).
- Исправлена логическая ошибка в запросах с несколькими JOIN, использующих предложение
USING и join_use_nulls. #92251 (Vladimir Cherkasov).
- Исправлена логическая ошибка при изменении порядка JOIN с join_use_nulls, закрыт https://github.com/clickhouse/clickhouse/issues/90795. #92289 (Vladimir Cherkasov).
- Исправлено неконсистентное форматирование AST для arrayElement с отрицательным литералом. Закрывает #92288 Закрывает #92212 Закрывает #91832 Закрывает #91789 Закрывает #91735 Закрывает #88495 Закрывает #92386. #92293 (Pavel Kruglov).
- Исправлен возможный сбой при использовании настройки
join_on_disk_max_files_to_merge. #92335 (Bharat Nallan).
- Связанный issue #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
- Исправлено отсутствие проверки прав доступа в
SYSTEM SYNC FILE CACHE. Закрывает #92101. #92372 (Kseniia Sumarokova).
- Исправлен проход
count_distinct_optimization для оконных функций и нескольких аргументов. #92376 (Raúl Marín).
- Исправлена ошибка “Невозможно записать в финализированный буфер”, возникавшая при использовании некоторых агрегатных функций с оконными функциями. Закрывает #91415. #92395 (Jimmy Aguilar Mena).
- Исправлена логическая ошибка в
CREATE TABLE ... AS urlCluster() и движке базы данных Replicated. Исправление закрывает #92216. #92418 (Kseniia Sumarokova).
- Наследовать настройки информации о сериализации исходной части во время мутации в MergeTree. Это исправляет возможный некорректный результат запроса к мутированной части после изменений в сериализации типов данных. #92419 (Pavel Kruglov).
- Исправлен возможный конфликт между столбцом и подстолбцом с одинаковым именем, приводивший к использованию некорректной сериализации и ошибкам запросов. Закрывает #90219. Закрывает #85161. #92453 (Pavel Kruglov).
- Исправлены
LOGICAL_ERROR, вызванные нежелательным изменением плана запроса при преобразовании OUTER JOIN в INNER JOIN. Также ослаблены требования к оптимизации, чтобы её можно было применять в случаях, когда к ключам агрегации в JOIN применяются инъективные функции. #92503 (János Benjamin Antal).
- Исправлена возможная ошибка
SIZES_OF_COLUMNS_DOESNT_MATCH при сортировке пустого столбца типа tuple. Закрывает #92422. #92520 (Pavel Kruglov).
- Добавлена проверка несовместимых типизированных путей в типе JSON. Закрывает #91577. #92539 (Pavel Kruglov).
- Исправлена взаимная блокировка в
SHOW CREATE DATABASE для базы данных Backup. #92541 (Azat Khuzhin).
- Использовать корректный код ошибки при проверке индекса hypothesis. #92559 (Raúl Marín).
- Исправлено разрешение подстолбцов типа Dynamic в псевдонимах столбцов в анализаторе. Ранее подстолбец типа Dynamic в псевдониме столбца оборачивался в
getSubcolumn и в некоторых случаях вообще не разрешался. Закрывает #91434. #92583 (Pavel Kruglov).
- Предотвращён сбой в
tokens() при NULL во втором аргументе. #92586 (Raúl Marín).
- Исправлено потенциальное падение, вызванное изменением на месте базовых константных столбцов PREWHERE. Это могло произойти при уменьшении размера столбца (
IColumn::shrinkToFit) или фильтрации (IColumn::filter), которые могли параллельно выполняться в нескольких потоках. #92588 (Arsen Muk).
- Создание и материализация текстовых индексов для таблиц, содержащих крупные части (более 4 294 967 295 строк), временно отключены. Это ограничение предотвращает некорректные результаты запросов, поскольку текущая реализация индексов пока не поддерживает части такого размера. #92644 (Anton Popov).
- Исправляет логическую ошибку
Too large size (A) passed to allocator при выполнении операций JOIN. Закрывает #92043. #92667 (Yarik Briukhovetskyi).
- Исправлена ошибка, из-за которой индексы
ngrambf_v1 с длиной n-граммы (1-й параметр) > 8 приводили к исключению. #92672 (Robert Schulze).
- Исправлено неперехваченное исключение при фоновой перезагрузке named collections при использовании хранилища ZooKeeper. Закрывает https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
- Исправляет некорректную логику проверки grant с подстановочными символами. Предыдущая попытка https://github.com/ClickHouse/ClickHouse/pull/90928 устраняла критическую уязвимость, но в итоге оказалась слишком строгой, из-за чего некоторые операторы
GRANT с подстановочными символами завершались ошибкой из-за несвязанных отзывов привилегий. #92725 (pufit).
- Исправлена ошибка в логике пропуска данных: при использовании
not match(...) в WHERE возвращались некорректные результаты. Закрывает #92492. #92726 (Nihal Z. Miaji).
- Не пытайтесь удалять временные каталоги при запуске, если таблица семейства MergeTree создана на диске в режиме только для чтения. #92748 (Alexey Milovidov).
- Исправлена ошибка “Невозможно добавить действие в пустую ExpressionActionsChain” для ALTER TABLE REWRITE PARTS (v2). #92754 (Azat Khuzhin).
- Предотвращён сбой при чтении из разорванного
Connection. #92807 (Raufs Dunamalijevs).
- Исправлена логическая ошибка
Failed to set file processing within 100 retries в хранилище S3Queue в режиме Ordered. Теперь вместо неё выводится предупреждение. Эта ошибка могла возникать в версиях до 25.10, если истекал сеанс Keeper, однако в версиях 25.10+ она по-прежнему будет возникать лишь как предупреждение, поскольку теоретически её всё ещё можно получить при высоком параллелизме обработки в режиме Ordered. #92814 (Kseniia Sumarokova).
- Ранее некоторые запросы, использовавшие сегментирование по PK при ложном условии, завершались с ошибкой. Теперь это исправлено. Необходимо для https://github.com/ClickHouse/ClickHouse/pull/89313. #92815 (Yarik Briukhovetskyi).
- Исправлен расчёт несжатых размеров текстовых индексов в таблице
system.parts. #92832 (Anton Popov).
- Исправлено использование первичного индекса в легковесных обновлениях с оператором
IN, содержащим подзапросы в предикате WHERE. #92838 (Anton Popov).
- Исправлено создание подсказки типа для path ‘skip’ в JSON. Исправление закрывает #92731. #92842 (Pavel Kruglov).
- В движке таблицы S3 не следует кэшировать ключ партиционирования, если используются недетерминированные функции. #92844 (Miсhael Stetsyuk).
- Исправлена возможная ошибка
FILE_DOESNT_EXIST после выполнения мутации разреженного столбца с ratio_of_defaults_for_sparse_serialization=0.0. Закрыт #92633. #92860 (Pavel Kruglov).
- Исправлено определение схемы Parquet в старом ридере Parquet (по умолчанию не используется), когда JSON-столбец идет после столбца Tuple. Исправлена ошибка в старом ридере Parquet (по умолчанию не используется), из-за которой он завершался с ошибкой на пустых Tuple. #92867 (Michael Kolupaev).
- Исправлена логическая ошибка при использовании нескольких JOIN с постоянным условием и
join_use_nulls, закрыт #92640. #92892 (Vladimir Cherkasov).
- Исправлена возможная ошибка
NOT_FOUND_COLUMN_IN_BLOCK при вставке в таблицу с подстолбцом в выражении партиционирования. Закрывает #93210. Закрывает #83406. #92905 (Pavel Kruglov).
- Исправлена ошибка
NO_SUCH_COLUMN_IN_TABLE в движке Merge при работе с таблицами, использующими псевдонимы. Закрывает #88665. #92910 (Pavel Kruglov).
- Исправлен случай, когда NULL != NULL, для full_sorting_join на столбце LowCardinality(Nullable(T)). #92924 (Vladimir Cherkasov).
- Исправлено несколько сбоев, возникавших при слиянии текстовых индексов в таблицах
MergeTree. #92925 (Anton Popov).
- При необходимости во время TTL-агрегации восстанавливаются обертки LowCardinality для результатов выражений SET, чтобы избежать исключений при оптимизации таблицы. #92971 (Seva Potapov).
- Исправлена логическая ошибка при анализе индекса, возникавшая при использовании пустого массива в функции
has. Закрывает #92906. #92995 (Nihal Z. Miaji).
- Исправлено возможное зависание при завершении работы фонового пула планировщика (может приводить к зависанию сервера при остановке). #93008 (Azat Khuzhin).
- Исправлена возможная ошибка FILE_DOESNT_EXIST после мутации разреженного столбца при изменении значения
ratio_of_defaults_for_sparse_serialization на 1.0 с помощью ALTER. #93016 (Pavel Kruglov).
- Исправлена ошибка в логике пропуска данных, из-за которой использование
not materialize(...) или not CAST(...) в WHERE приводило к некорректным результатам. Закрывает #88536. #93017 (Nihal Z. Miaji).
- Исправлено возможное использование устаревших частей из-за TOCTOU-гонки для общих частей. #93022 (Azat Khuzhin).
- Исправлен crash при десериализации некорректного aggregate state
groupConcat со смещениями, выходящими за допустимые границы. #93028 (Raufs Dunamalijevs).
- Исправлено состояние, при котором после предварительной отмены распределённых запросов соединение оставалось в неисправном состоянии. #93029 (Azat Khuzhin).
- Исправлен результат JOIN, когда ключ JOIN с правой стороны — разреженный столбец. Это закрывает #92920. Мне удалось воспроизвести ошибку только с
set compatibility='23.3'. Не уверен, нужно ли делать бэкпорт. #93038 (Amos Bird).
- Устранена возможная ошибка
Cannot finalize buffer after cancellation в estimateCompressionRatio(). Исправлено: #87380. #93068 (Azat Khuzhin).
- Исправлено слияние текстовых индексов, построенных на основе сложных выражений (таких как
concat(col1, col2)). #93073 (Anton Popov).
- Исправлено применение проекции, если фильтр содержит подстолбцы. Закрывает #92882. #93141 (Pavel Kruglov).
- Исправлена логическая ошибка, которая в некоторых случаях возникала при добавлении JOIN runtime-фильтров в план запроса. Причиной было некорректное возвращение дублированных константных столбцов с одной из сторон JOIN. #93144 (Alexander Gololobov).
- Специальная функция
__applyFilter, используемая JOIN Runtime Filters, в некоторых допустимых случаях возвращала ILLEGAL_TYPE_OF_ARGUMENT. #93187 (Alexander Gololobov).
- Предотвращено схлопывание разных интерполированных столбцов в один и тот же столбец блока, когда такие столбцы фактически являются псевдонимами одного и того же столбца. #93197 (Yakov Olkhovskiy).
- Не добавлять runtime filter при выполнении JOIN с уже заполненной правой таблицей. #93211 (Alexander Gololobov).
- Исправлена очистка постоянных наблюдений в Keeper после завершения неактивного сеанса. Закрывает #92480. #93213 (Konstantin Vedernikov).
- Исправлен ORDER BY для кортежа в Iceberg. Закрывает #92977. #93225 (Konstantin Vedernikov).
- Исправлена ошибка, связанная с настройкой S3Queue
s3queue_migrate_old_metadata_to_buckets. Закрывает #93392, #93196, #81739. #93232 (Kseniia Sumarokova).
- Удаляются неиспользуемые столбцы при перестроении проекции во время слияния. Это снижает использование памяти и уменьшает число временных частей. #93233 (Nikolai Kochetov).
- Исправлено удаление неиспользуемых столбцов из подзапросов при наличии скалярного коррелированного подзапроса. До этого исправления столбец мог быть удалён, если использовался только в коррелированном подзапросе, из-за чего запрос завершался ошибкой
NOT_FOUND_COLUMN_IN_BLOCK. #93273 (Dmitry Novik).
- Исправлено возможное отсутствие подстолбца в MV при изменении исходной таблицы. Закрывает #93231. #93276 (Pavel Kruglov).
- Исправлено планирование запросов для движка таблицы
Merge при использовании анализатора, из-за которого при слиянии локальных и удалённых/Distributed таблиц для hostName() могла возникать ошибка ILLEGAL_COLUMN. Закрывает #92059. #93286 (Jinlin).
- Исправлен случай, при котором
NOT IN с неконстантными аргументами в виде массивов возвращал неверное значение + добавлена поддержка неконстантных функций Array. Закрывает #14980. #93314 (Yarik Briukhovetskyi).
- Исправлена ошибка
Not found column в оптимизации use_top_k_dynamic_filtering. Исправление #93186. #93316 (Nikolai Kochetov).
- Исправлена проблема с пересборкой текстовых индексов, созданных поверх подстолбцов. #93326 (Anton Popov).
- Исправлена обработка пустого массива при передаче его вторым аргументом в функциях
hasAllTokens и hasAnyTokens. #93328 (Anton Popov).
- Исправлена логическая ошибка при использовании runtime filters в запросе с totals для таблицы в правой части. #93330 (Alexander Gololobov).
- Сервер больше не падает, если функция
tokens вызывается с неконстантными параметрами токенизатора (2-м, 3-м и 4-м параметрами), например, SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze).
- Исправлена уязвимость, связанная с переполнением целого числа при десериализации состояния
groupConcat, которая могла приводить к нарушениям безопасности памяти при использовании специально сформированных состояний агрегатной функции. #93426 (Raufs Dunamalijevs).
- Исправлен анализ текстового индекса для столбцов типа Array в случаях, когда индекс не содержит токенов (все массивы пусты или все токены пропускаются токенизатором). #93457 (Anton Popov).
- Позволяет избежать oauth-входа в клиенте ClickHouse, если имя пользователя и пароль указаны в строке подключения. #93459 (Krishna Mannem).
- Исправлена поддержка предоставляемых учетных данных Azure ADLS Gen2 в DataLakeCatalog: разбор ключей
adls.sas-token.* из REST-каталогов Iceberg и исправлен разбор URL ABFSS. #93477 (Karun Anantharaman).
- Исправлена поддержка GLOBAL IN в анализаторе (ранее множество заново создавалось на удалённом узле). #93507 (Azat Khuzhin).
- Исправлено извлечение подстолбца при десериализации непосредственно в разреженные столбцы. #93512 (Pavel Kruglov).
- Исправлена ошибка прямого чтения из текстового индекса при дублирующихся поисковых запросах. #93516 (Anton Popov).
- Исправление ошибки NOT_FOUND_COLUMN_IN_BLOCK при включенном runtime filter, если в таблицах, участвующих в JOIN, один и тот же столбец возвращается несколько раз (например, SELECT a, a, a FROM t). #93526 (Alexander Gololobov).
- Исправлена ошибка, из-за которой clickhouse-client при подключении по ssh дважды запрашивал пароль. #93547 (Isak Ellmer).
- Убедитесь, что ZooKeeper корректно завершается при остановке (исправлено возможное зависание при остановке в крайне редких случаях). #93602 (Azat Khuzhin).
- Исправлена LOGICAL_ERROR при восстановлении ReplicatedMergeTree из-за состояния гонки при дедупликации. #93612 (Pablo Marcos).
- Исправлена работа с разреженным столбцом при обновлении TTL во время прямой десериализации в разреженные столбцы в некоторых входных форматах. Это устраняет возможную логическую ошибку
Unexpected type of result TTL column. #93619 (Pavel Kruglov).
- Исправлены функции работы с индексом H3, которые иногда аварийно завершались или зависали при вызове с недопустимыми входными данными. #93657 (Michael Kolupaev).
- Использование индекса
ngram_bf для данных в кодировке не UTF-8 приводило к чтению неинициализированной памяти, значения из которой могли попасть в результирующую структуру индекса. Закрывает #92576. #93663 (Alexey Milovidov).
- Проверка соответствия размера распакованного буфера ожидаемому значению. #93690 (Raúl Marín).
- Предотвращена возможность получать список столбцов таблицы через движок таблицы
merge без проверки разрешения SHOW COLUMNS. #93695 (János Benjamin Antal).
- Исправлена материализация индексов пропуска данных, созданных на основе подстолбцов. #93708 (Anton Popov).
- Мы сохраняем shared pointers на хранилища в
QueryPipeline::resources::storage_holders, чтобы объекты IStorage не уничтожались, пока существует PipelineExecutor. #93746 (Miсhael Stetsyuk).
- Исправлено подключение существующих БД Replicated, если межсерверный хост менялся после перезапуска. #93779 (Tuan Pham Anh).
- Исправлен assert
!read_until_position в ReadBufferFromS3, возникавший при включенном кэше. #93809 (Kseniia Sumarokova).
- Исправлена логическая ошибка в редком случае, когда пустой кортеж используется со столбцом типа
Map. Закрывает #93784. #93814 (Nihal Z. Miaji).
- Исправлено повреждение
_part_offset, возникавшее при перестроении проекций во время слияний, а также оптимизирована обработка проекций за счёт устранения лишнего чтения столбца _part_offset и пропуска ненужных столбцов при вычислении проекций. Это продолжает оптимизации, начатые в #93233. #93827 (Amos Bird).
- Убрана обработка ‘Bad version’. #93843 (Anton Ivashkin).
- Исправлена проблема, из-за которой
optimize_inverse_dictionary_lookup не работал с распределённым запросом, когда ключ имеет знаковый целочисленный тип. Закрывает #93259. #93848 (Nihal Z. Miaji).
- Исправлена проблема, из-за которой
lag/lead не работали с распределённым запросом remote(). Закрывает #90014. #93858 (Nihal Z. Miaji).
- Исправлена ошибка диспетчеризации системного инструмента. #93937 (Pablo Marcos).
- В https://github.com/ClickHouse/ClickHouse/pull/89173 мы добавили дополнительное поле в структуру, которую
TraceSender отправляет через внутренний канал. Однако размер буфера не был обновлён (здесь), поэтому в буфер записывается больше данных, чем допускает buffer_size, что приводит к нескольким сбросам. А поскольку TraceSender::send вызывается из разных потоков, сбросы из разных потоков могут чередоваться, нарушая инвариант, на который полагается принимающая сторона (TraceCollector). #93966 (Miсhael Stetsyuk).
- Исправлено приведение типов к супертипу при выполнении операции JOIN для хранилища
Join с предложением USING. Исправляет #91672. Исправляет #78572. #94000 (Dmitry Novik).
- Исправлена ошибка, из-за которой FilterStep добавлялся некорректно при применении runtime filter для JOIN к таблице Merge. #94021 (Alexander Gololobov).
- Запрос
SELECT, содержащий предикат по нескольким столбцам с индексами пропуска данных bloom filter, при наличии условий OR и NOT мог возвращать некорректные результаты. Теперь это исправлено. #94026 (Shankar Iyer).
- Исправлена операция CLEAR для столбца с зависимыми индексами. #94057 (Raúl Marín).
- Исправлено использование неинициализированного значения в
ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov).
- Исправлена некорректная проверка типизированных путей в JSON. Эта проверка была добавлена в https://github.com/ClickHouse/ClickHouse/pull/92842 и может вызывать ошибку при запуске существующих таблиц. #94070 (Pavel Kruglov).
- Исправлен crash при анализе filter в присутствии OUTER JOIN. Исправляет #90979. #94080 (Dmitry Novik).
- Исправлена точность
uniqTheta при параллельном использовании ключей агрегации UInt8 (max_threads > 1 — по умолчанию). #94095 (Azat Khuzhin).
- Исправлен сбой, вызванный исключением, возникшим при вызове
socket.setBlocking(true) внутри SCOPE_EXIT. #94100 (Miсhael Stetsyuk).
- Устранена потеря данных, возникавшая, когда
DROP PARTITION удалял части, созданные более поздними записями журнала в ReplicatedMergeTree. #94123 (Tuan Pham Anh).
- Исправлена ошибка в ридере Parquet v3 при обработке массивов, пересекающих границы страниц. Это происходит, например, с файлами, записанными Arrow без включённой статистики страниц или индекса страниц. Затрагивает только столбцы типа Array. Вероятный симптом — примерно один массив на каждый ~1 МБ данных оказывается усечённым. До этого исправления в качестве обходного решения используйте следующую настройку:
input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev).
- Исправлено избыточное количество наблюдений в ReplicatedMergeTree при ожидании записи в журнале. #94133 (Azat Khuzhin).
- Функции
arrayShuffle, arrayPartialShuffle и arrayRandomSample теперь материализуют константные столбцы, чтобы разные строки получали разные результаты. #94134 (Joanna Hulboj).
- Исправлена гонка данных при вычислении табличных функций в materialized views. #94171 (Alexey Milovidov).
- Исправлено разыменование nullptr в движках баз данных
PostgreSQL (при некорректном запросе). Закрывает #92887. #94180 (Alexey Milovidov).
- Исправлена утечка памяти в refreshable materialized view при использовании запросов
SELECT с несколькими подзапросами. #94200 (Antonio Andelic).
- Исправлено состояние гонки данных между
DataPartStorageOnDiskBase::remove и system.parts. Закрывает #49076. #94262 (Alexey Milovidov).
- Удалён неверный спецификатор
noexcept у оператора присваивания копированием HashTable, который мог приводить к аварийному завершению (std::terminate) при исключениях из-за нехватки памяти. #94275 (Nikita Taranov).
- Ранее при создании проекции с дублирующимися столбцами в GROUP BY (например,
GROUP BY c0, c0) и вставке данных возникала ошибка std::length_error, если включен optimize_row_order. Закрывает #94065. #94277 (Alexey Milovidov).
- Исправлена трудноуловимая ошибка в клиенте ZooKeeper при подключении, которая приводила к зависаниям и аварийным завершениям. #94320 (Azat Khuzhin).
- Исправлена ошибка, из-за которой оптимизация преобразования функций в подстолбцы не применялась к подстолбцам. #94323 (Pavel Kruglov).
- Исправлен потенциально некорректный результат во вложенных RIGHT JOIN при включённом
enable_lazy_columns_replication. Из-за ошибки все строки в реплицируемых столбцах некорректно возвращали одно и то же значение вместо своих собственных значений. Закрыто #93891. #94339 (Vladimir Cherkasov).
- Исправлен pushdown фильтра для SEMI JOIN с использованием множеств эквивалентности. Pushdown фильтра не выполняется, если типы аргументов изменились. Исправляет #93264. #94340 (Dmitry Novik).
- Исправлено использование DeltaLake CDF с движком базы данных DataLake (интеграция каталогов Delta Lake). Закрывает #94122. #94342 (Kseniia Sumarokova).
- Исправлено некорректное значение метрики
FilesystemCacheSizeLimit при использовании политики кэша SLRU. #94363 (Kseniia Sumarokova).
- При создании движка базы данных Backup с менее чем двумя аргументами теперь возвращается более понятное сообщение об ошибке (
Wrong number of arguments вместо std::out_of_range: InlinedVector::at(size_type) const failed bounds check.). #94374 (Robert Schulze).
- Игнорирует невозможный отзыв глобальных привилегий на уровне базы данных для привилегий с grant option. #94386 (pufit).
- Исправлено чтение разреженных смещений в компактных частях. Закрывает #94385. #94399 (Pavel Kruglov).
- Не запрещать ALTER столбцов с неявными индексами, даже если используется режим
throw параметра alter_column_secondary_index_mode. #94425 (Raúl Marín).
- Исправлен сбой в
TCPHandler при чтении Protocol::Client::IgnoredPartUUIDs несколькими вызовами receivePacketsExpectQuery. #94434 (Miсhael Stetsyuk).
- Исправлено маскирование чувствительных данных в
system.functions. #94436 (Vitaly Baranov).
- Исправлено разыменование nullptr при отключённой опции
send_profile_events. Эта возможность была недавно добавлена в Python-драйвер ClickHouse. Закрывает #92488. #94466 (Alexey Milovidov).
- Исправлена несовместимость файлов .mrk текстового индекса при слиянии. #94494 (Peng Jian).
- Когда
read_in_order_use_virtual_row включён, код обращался к столбцам индекса, исходя из полного размера первичного ключа, не проверяя, был ли индекс усечён, что приводило к использованию освобождённой / неинициализированной памяти. Закрывает #85596. #94500 (Alexey Milovidov).
- Исправлена ошибка, возникавшая из-за несоответствия типов при отправке внешних таблиц в подзапросах с GLOBAL IN, если используются типы Nullable. Закрывает #94097. #94511 (Alexey Milovidov).
- В предыдущих версиях запросы с несколькими условиями индекса для одного и того же выражения могли ошибочно генерировать исключение
Not found column. Закрывает #60660. #94515 (Alexey Milovidov).
- Исправлена некорректная обработка столбца JOIN типа Nullable в runtime-фильтрах. #94555 (Alexander Gololobov).
- Создание рабочей нагрузки внутри другой рабочей нагрузки, которая в данный момент используется, больше не приводит к сбою. #94599 (Sergei Trifonov).
- Исправлен сбой при оптимизации ANY LEFT JOIN, когда
isNotNull вычисляется для отсутствующего столбца. #94600 (Molly).
- Исправлено вычисление выражения по умолчанию при обращении к другим столбцам с вычисляемыми значениями по умолчанию. #94615 (Alexey Milovidov).
- Исправлены проблемы с разрешениями при операциях BACKUP/RESTORE. #94617 (Pablo Marcos).
- Исправлен сбой из-за некорректного приведения типов, когда тип данных —
Nullable(DateTime64). #94627 (Miсhael Stetsyuk).
- Исправлена ошибка, из-за которой некоторые распределённые запросы с
ORDER BY могли возвращать столбцы ALIAS с переставленными значениями (то есть столбец a показывал данные столбца b, и наоборот). #94644 (filimonov).
- Исправлена запись результатов keeper-bench в файл. #94654 (Antonio Andelic).
- Исправлены некорректные оценки в статистике типа MinMax, когда столбец содержит отрицательные числа с плавающей точкой. #94665 (zoomxi).
- Исправлено чтение файлов Parquet, когда ключом в map является struct. #94670 (Konstantin Vedernikov).
- Исправлен потенциально некорректный результат RIGHT JOIN при использовании сложных условий ON. Закрыт #92913. #94680 (Vladimir Cherkasov).
- Сохранение постоянной гранулярности индекса (
use_const_adaptive_granularity) после вертикальных слияний. #94725 (Azat Khuzhin).
- Исправлена ошибка мутаций со скалярными подзапросами и зависимостями таблицы. Если у таблицы были зависимости (индекс или проекции), связанные со столбцом, скалярные подзапросы могли вычисляться и кэшироваться без данных, что приводило к некорректным изменениям. #94731 (Raúl Marín).
- Исправлено переключение AsynchronousMetrics cpu_pressure на резервный вариант при возникновении ошибки. #94827 (Raúl Marín).
- В функции
getURLHostRFC отсутствовали проверки выхода за границы перед разыменованием указателей. При передаче пустой строки в domainRFC происходило чтение неинициализированной памяти, что приводило к ошибкам MSan. #94851 (Alexey Milovidov).
- Исправлен режим «только для чтения» у зашифрованных дисков. #94852 (Azat Khuzhin).
- Исправлена логическая ошибка при дробных
LIMIT/OFFSET при использовании старого анализатора с distributed таблицами. Закрывает #94712. #94999 (Ahmed Gouda).
- Исправлено падение в некоторых случаях, когда JOIN Runtime Filters включены по умолчанию. #95000 (Alexander Gololobov).
- Улучшено маскирование паролей в URL-адресе, используемом в движке таблицы
URL() и табличной функции url(). #95006 (Vitaly Baranov).
- Функция
toStartOfInterval теперь работает так же, как toStartOfX, где X — это Day, Week, Month, Quarter, Year, если включён enable_extended_results_for_datetime_functions. #95011 (Kirill Kopnev).
- Исправлены сравнения с константными строками, которые не учитывали настройки
cast_string_to_date_time_mode, bool_true_representation, bool_false_representation и input_format_null_as_default. Закрывает #91681. #95040 (Nihal Z. Miaji).
- Исправлено состояние гонки в файловом кэше. #95064 (Alexey Milovidov).
- Исправлено редкое проявление состояния гонки в ридере Parquet. #95068 (Alexey Milovidov).
- Исправлено падение в оптимизации top K, когда
LIMIT равен нулю. Закрывает #93893. #95072 (Alexey Milovidov).
- При преобразовании из DateTime/целых чисел в Time64 с помощью
toTime извлекается компонент времени суток, но эта функция не является монотонной. Шаблон ToDateTimeMonotonicity ошибочно утверждал, что это преобразование монотонно, из-за чего в отладочных сборках возникало Исключение “Invalid binary search result in MergeTreeSetIndex”. #95125 (Alexey Milovidov).
- Список записей в файле манифеста пересоздавался только при необходимости (раньше это происходило на каждой итерации). #95162 (Daniil Ivanik).
Улучшения сборки/тестирования/пакетирования
Последнее изменение 29 июня 2026 г.