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

Релиз ClickHouse 26.4, 2026-04-30. Презентация, Видео

Обратно несовместимое изменение

  • Оператор IN теперь использует семантику точного соответствия значений для типа Bool: значениям Bool соответствуют только 0 и 1 в наборе. Ранее числовые значения больше 255 в наборе IN при сравнении с Bool ошибочно приводились к true, поэтому SELECT CAST(1, 'Bool') IN (256) возвращал 1. Теперь он корректно возвращает 0. Закрывает #92980. #93115 (Ashrith Bandla).
  • Библиотека H3 обновлена до v4, что повышает точность вычисления длины, площади и других метрик. Это обратно несовместимое изменение, поскольку новые результаты отличаются от прежних. #100348 (Alexey Milovidov).
  • Теперь запрещено использовать SELECT как некавыченный идентификатор в элементе списка выражений WITH. #101059 (Aruj Bansal).
  • Этот патч меняет то, как таблица Merge обрабатывает виртуальные столбцы. Если базовая таблица содержит _table или _database, эти столбцы будут считываться из хранилища; в противном случае они будут заполняться после этапа чтения на шаге expression. #101742 (Mikhail Artemenko).
  • Оператор IN теперь также отклоняет преобразования Decimal с потерей точности внутри составных типов (Tuple, Array, Map), что делает его поведение согласованным со скалярными сравнениями верхнего уровня. Ранее проверки точности применялись только к скалярным значениям верхнего уровня: например, CAST('33.3', 'Decimal64(1)') IN (33.33) корректно возвращал 0, но CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) ошибочно возвращал 1, поскольку преобразование с потерей точности происходило внутри Array. Теперь в обоих случаях корректно возвращается 0. #101812 (Nihal Z. Miaji).
  • Значения по умолчанию для http_max_fields уменьшены с 1,000,000 до 1,000, а для http_max_field_name_size — со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до аутентификации. Добавлены настройки http_max_request_header_size и http_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda).

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

  • Добавлен автоматический сброс на диск для 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&#95;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).

Релиз ClickHouse 26.3 LTS, 2026-03-26. Презентация, Видео

Обратно несовместимое изменение

  • Понижение версии после обновления может привести к потере данных. Версии сериализации типов данных теперь распространяются на вложенные типы данных. Например, раньше версия сериализации String with_size_stream применялась только к столбцам String верхнего уровня и элементам Tuple. Теперь она применяется к любому типу String внутри любого вложенного типа, такого как Array/Map/Variant/JSON/и т. д. Это поведение управляется настройкой MergeTree propagate_types_serialization_versions_to_nested_types, которая теперь включена по умолчанию. После этого изменения вновь созданные части данных не могут читаться старыми версиями, но старые части без проблем читаются новой версией. Обновление безопасно, а вот понижение версии — нет: если вам потребуется откатиться после обновления до 26.3, данные, записанные версией 26.3 в столбцы с вложенными типами, будут нечитаемы! Подробности см. в #101429. #94859 (Pavel Kruglov).
  • Удалён тип индекса пропуска данных hypothesis. Это была малоизвестная экспериментальная возможность с ограниченной практической ценностью. При создании таблиц с INDEX ... TYPE hypothesis теперь будет возникать ошибка. #96874 (Alexey Milovidov).
  • Удалена экспериментальная функция detectProgrammingLanguage. #99567 (Alexey Milovidov).
  • Исправлен приоритет оператора NOT в соответствии со стандартом SQL: теперь NOT имеет более низкий приоритет, чем IS NULL, BETWEEN, LIKE и арифметические операторы. Например, NOT (x) IS NULL теперь разбирается как NOT (x IS NULL), а не как (NOT x) IS NULL. Это может изменить результат запросов, которые зависели от прежнего (нестандартного) поведения. #97680 (Alexey Milovidov).
  • Исправляет метаданные обычных проекций, чтобы проекции с ключами сортировки по нескольким столбцам распознавались корректно. Основано на #90429. #91352 (Amos Bird).
  • Исправлены файлы индекса пропуска данных, которые не учитывали настройку replace_long_file_name_to_hash, из-за чего возникали ошибки “Имя файла слишком длинное” и нарушалось чтение индексов с длинными именами. Теперь имена файлов индекса пропуска данных хешируются, если они превышают 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).
  • Разрешена оптимизация чтения в порядке сортировки и отсечение по первичному ключу, если целевой тип CASTNullable, а преобразование монотонно; например, при 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&#95;allowed&#95;keys в PostgreSQLDictionarySource.cpp, из-за чего было невозможно настроить режим SSL для подключений словарей к PostgreSQL. В результате словари не могли подключаться к серверам PostgreSQL, где требуется SSL (например, к AWS RDS, где SSL обязателен по умолчанию), поскольку подключение не проходило согласование TLS, а сервер отклонял незашифрованный резервный вариант. #98014 (mcalfin).
  • Показывать понятную ошибку “no such file” при передаче несуществующего пути к файлу в clickhouse или clickhouse-local вместо сбивающего с толку общего сообщения. #98048 (Raúl Marín).
  • Текстовые индексы теперь можно создавать для столбцов Nullable([Fixed]String) и Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
  • Не удаляйте именованные коллекции, от которых зависят источники словарей. #98127 (Pablo Marcos).
  • Включена поддержка алгоритма 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).

Релиз ClickHouse 26.2, 2026-02-26. Презентация, Видео

Обратно несовместимое изменение

  • Дедупликация по умолчанию включена для всех вставок. Раньше она была отключена для асинхронных вставок и MV, но включена для синхронных вставок. Цель — сделать одинаковые значения по умолчанию для обоих способов вставки. Если в вашем кластере дедупликация явно отключена, чтобы сохранить прежнее поведение, нужно явно установить deduplicate_insert='backward_compatible_choice'. То же самое касается deduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda).
  • Улучшен формат хранения статистики: теперь вся статистика хранится в одном файле. #93414 (Anton Popov). Если вы не включали статистику таблиц явно, этот пункт можно проигнорировать.
  • Ограничен объём метаданных S3(Azure)Queue, хранимых в памяти. Системные таблицы переименованы: azure_queue в azure_queue_metadata_cache, а system.s3queue — в s3queue_metadata_cache. #95809 (Kseniia Sumarokova).
  • Ранее при применении функции к столбцу Variant при несовместимости подтипа variant с функцией молча возвращались значения NULL; теперь генерируется исключение, что может нарушить работу запросов, которые опирались на такое поведение с молчаливым возвратом NULL. #95811 (Bharat Nallan).
  • Столбцы DATE из PostgreSQL теперь в ClickHouse автоматически определяются как Date32 (в предыдущих версиях они определялись как Date, что приводило к переполнению значений за пределами узкого диапазона). Разрешена вставка значений Date32 обратно в PostgreSQL. Закрывает #73084. #95999 (Alexey Milovidov).
  • Семантика настройки do_not_merge_across_partitions_select_final стала понятнее. Ранее эта возможность могла включаться автоматически, даже если настройка не была явно задана в конфигурации. Это неоднократно вызывало путаницу и, к сожалению, приводило к проблемам в продакшне. Теперь правила проще: do_not_merge_across_partitions_select_final=1 безусловно включает эту возможность. Если do_not_merge_across_partitions_select_final=0, автоматический режим используется только при enable_automatic_decision_for_merging_across_partitions_for_final=1, а в противном случае не используется. Чтобы максимально сохранить прежнее поведение, значения по умолчанию были установлены следующими: do_not_merge_across_partitions_select_final=0 и enable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov).
  • При создании таблицы S3 с явно указанными столбцами ClickHouse теперь проверяет, что эти имена столбцов действительно присутствуют в схеме удалённого файла. Запросы, которые раньше работали при несовпадении имён столбцов, теперь будут завершаться ошибкой уже на этапе создания таблицы. Это закрывает #96089. #96194 (Konstantin Vedernikov).
  • Запрещено использование подзапросов в ORDER BY и других ключевых выражениях таблицы. #96847 (Alexey Milovidov).
  • По умолчанию включить apply_row_policy_after_final. Изначально, когда optimize_move_to_prewhere_if_final=0, и ROW POLICY, и PREWHERE учитывали FINAL и применялись после FINAL. Это поведение было нарушено в #87303, где для фильтра ROW POLICY игнорировался параметр optimize_move_to_prewhere_if_final. Чтобы это исправить, в данном PR включается настройка apply_row_policy_after_final, добавленная в #91065. При включенном apply_row_policy_after_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 теперь включён по умолчанию, если значение настройки compatibility26.2 или выше. #95917 (Christoph Wurm).
  • Delta Lake теперь доступен на macOS. Закрывает #95979. #95985 (Alexey Milovidov).
  • В предыдущих версиях при объединении конфликтующих выражений ALTER с UPDATE и RENAME COLUMN вместо корректного исключения возникала логическая ошибка. Закрывает #70678. #96022 (Alexey Milovidov).
  • Улучшен вывод справки для всех приложений ClickHouse, добавлена опция —no-sudo и внесено несколько исправлений. Это продолжение #58244 от Ilya Yatsishin. #96025 (Alexey Milovidov).
  • Добавлен алиас distanceCosine для cosineDistance, так как у всех остальных функций расстояния уже есть алиасы в таком формате. #96065 (Raufs Dunamalijevs).
  • Добавлена поддержка расширения Keeper with_data для улучшения получения таблиц в Database Replicated. #96090 (Nikolay Degterinsky).
  • chdig обновлён до v26.2.1 (новые возможности и поддержка macOS). #96113 (Azat Khuzhin).
  • Улучшен 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).

Релиз ClickHouse 26.1, 2026-01-29. Презентация, Видео

Обратно несовместимое изменение

  • Исправлено несогласованное форматирование, вызванное некорректной подстановкой псевдонимов в форматтере. Это закрывает #82833. Это закрывает #82832. Это закрывает #68296. Это изменение потенциально нарушает обратную совместимость: когда анализатор отключен, некоторые запросы CREATE VIEW с IN, ссылающимся на псевдоним, не могут быть обработаны. Чтобы избежать этой несовместимости, включите анализатор (по умолчанию он включен начиная с версии 24.3). #82838 (Alexey Milovidov).
  • Кодеки DEFLATE_QPL и ZSTD_QAT были удалены. Пользователям рекомендуется до обновления перекодировать существующие данные, сжатые с помощью DEFLATE_QPL или ZSTD_QAT, в другой кодек. Обратите внимание: для использования этих кодеков должны были быть включены настройки enable_deflate_qpl_codec и enable_zstd_qat_codec. #92150 (Robert Schulze).
  • Улучшена отладка UDF: включён захват stderr в system.query_log.exception. Ранее stderr из UDF записывался только в файлы и не отображался в журнале запросов, из-за чего отладка была невозможна. Теперь stderr по умолчанию вызывает исключения и полностью накапливается (до 1 МБ) перед тем, как сгенерировать исключение, поэтому полные трассировки Python и сообщения об ошибках появляются в system.query_log.exception, что упрощает диагностику. #92209 (Xu Jia).
  • Пустой список столбцов в условии JOIN USING () теперь считается синтаксической ошибкой. Ранее предполагалось, что во время выполнения запроса это будет INVALID_JOIN_ON_EXPRESSION. В некоторых случаях, например при JOIN с хранилищем Join, это приводило к LOGICAL_ERROR; исправление закрывает #82502. #92371 (Vladimir Cherkasov).
  • По умолчанию для SKIP REGEXP в типе JSON используется частичное совпадение. Закрывает #79250. #92847 (Pavel Kruglov).
  • Отменено изменение “Allow INSERT into simple ALIAS columns” (отменяет ClickHouse/ClickHouse#84154). Оно не работает с пользовательскими форматами, и для него нет отдельной настройки. #92849 (Azat Khuzhin).
  • Настройка, вызывающая ошибку, если каталог озера данных не имеет доступа к объектному хранилищу. #93606 (Konstantin Vedernikov).
  • Движок базы данных Lazy удалён и больше не доступен. Закрывает #91231. #93627 (Alexey Milovidov).
  • Удалён режим transposed_with_wide_view для metric_log — из-за ошибки он неработоспособен. Задать system.metric_log в этом режиме больше нельзя. Это частично отменяет #78412. #93867 (Alexey Milovidov).
  • Теперь для рабочих нагрузок по умолчанию используется вытесняющее планирование CPU. См. настройку сервера cpu_slot_preemption. #94060 (Sergei Trifonov).
  • Экранировать имена файлов индексов, чтобы избежать повреждения частей. После этого изменения ClickHouse не сможет загружать индексы с не-ASCII-символами в имени, созданные в предыдущих версиях. Для этого можно использовать настройку MergeTree escape_index_filenames. #94079 (Raúl Marín).
  • Настройки формата exact_rows_before_limit, rows_before_aggregation, cross_to_inner_join_rewrite, regexp_dict_allow_hyperscan, regexp_dict_flag_case_insensitive, regexp_dict_flag_dotall и dictionary_use_async_executor теперь переведены в разряд обычных настроек (не настроек формата). Это исключительно внутреннее изменение и не имеет заметных для пользователя побочных эффектов, кроме (маловероятного) случая, когда вы указали какие-либо из этих настроек в определениях движков таблиц Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog или NATS. В таких случаях эти настройки раньше игнорировались, а теперь при таких определениях генерируется ошибка. #94106 (Robert Schulze).
  • Функции joinGet/joinGetOrNull теперь требуют наличия привилегии SELECT для базовой таблицы Join. После этого изменения для выполнения joinGet('db.table', 'column', key) требуется, чтобы у пользователя была привилегия SELECT как для столбцов ключа, определённых в таблице Join, так и для извлекаемого столбца-атрибута. Запросы без этих привилегий будут завершаться ошибкой ACCESS_DENIED. Для перехода предоставьте необходимые разрешения с помощью GRANT SELECT ON db.join_table TO user для полного доступа к таблице или GRANT SELECT(key_col, attr_col) ON db.join_table TO user для доступа на уровне столбцов. Это изменение затрагивает всех пользователей и приложения, использующие joinGet/joinGetOrNull, если явные привилегии SELECT ранее не были настроены. #94307 (Vladimir Cherkasov).
  • Для запросов CREATE TABLE ... AS ... теперь проверяется SHOW COLUMNS. Ранее проверялся SHOW TABLES, но для такой проверки разрешений это некорректный grant. #94556 (pufit).
  • Формат вывода Hash теперь не зависит от размеров блоков. #94503 (Alexey Milovidov). Обратите внимание, что из-за этого хеш-значения в выводе будут отличаться от предыдущих версий.

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

  • HTTP API и встроенный веб-интерфейс для ClickHouse Keeper. #78181 (pufit и speeedmaster).
  • Дедупликация async insert теперь работает с зависимыми materialized views. При коллизии по block_id исходный блок фильтруется: из него удаляются строки, связанные с block_id, а оставшиеся строки преобразуются всеми соответствующими SELECT-запросами materialized views; в результате исходный блок пересобирается без конфликтующих строк. #89140 (Sema Checherinda). Теперь можно использовать дедупликацию с async inserts, когда задействованы materialized views. #93957 (Sema Checherinda).
  • Добавлены новый синтаксис и новый механизм, упрощающие и расширяющие функциональность индексов-проекций. Это продолжение работы из https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
  • Добавлена поддержка текстовых индексов для столбцов Array. #89895 (Jimmy Aguilar Mena).
  • Параметр use_variant_as_common_type теперь включён по умолчанию, что позволяет использовать несовместимые типы внутри Array, в запросах UNION и в ветвях if/multiIf/case. #90677 (Alexey Milovidov).
  • Добавлена новая системная таблица zookeeper_info. Реализовано в #88014. #90809 (Smita Kulkarni).
  • Добавлена поддержка типа Variant во всех функциях. #90900 (Bharat Nallan).
  • Добавляет метрику ClickHouse_Info в конечную точку Prometheus /metrics, содержащую в основном информацию о версии, что позволяет строить графики и отслеживать подробные сведения о версии с течением времени. #91125 (Christoph Wurm).
  • Добавлена новая четырёхбуквенная команда rcfg для Keeper, позволяющая изменять конфигурацию кластера. Эта команда предоставляет более широкие возможности изменения конфигурации, чем стандартный запрос reconfigure. В качестве аргумента команда принимает строку json. Полный набор байтов, отправляемых в TCP-интерфейс, должен выглядеть так: rcfg{json_string_length_big_endian}{json_string}. Вот как могут выглядеть некоторые примеры команды: {"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin).
  • Добавлена функция reverseBySeparator, которая меняет порядок подстрок в строке, разделённой указанным разделителем, на обратный. Закрывает #91463. #91780 (Xuewei Wang).
  • Добавляет новую настройку max_insert_block_size_bytes, которая позволяет точнее управлять формированием вставляемых блоков. #92833 (Kirill Kopnev).
  • DDL-запросы с предложением ON CLUSTER можно выполнять для базы данных Replicated, если включена настройка ignore_on_cluster_for_replicated_database. В этом случае имя кластера будет проигнорировано. #92872 (Kirill).
  • Добавлена функция mergeTreeAnalyzeIndexes. #92954 (Azat Khuzhin).
  • Добавлена новая настройка use_primary_key. Установите её в false, чтобы отключить отсечение гранул по первичному ключу. #93319 (Nihal Z. Miaji).
  • Добавлена табличная функция icebergLocalCluster. #93323 (Anton Ivashkin).
  • Добавлена функция cosineDistanceTransposed, которая приблизительно вычисляет косинусное расстояние между двумя точками. #93621 (Raufs Dunamalijevs).
  • Добавлен столбец files в таблицу system.parts, показывающий количество файлов в каждой части данных. #94337 (Match).
  • Добавлен max-min-справедливый планировщик для управления параллелизмом. Обеспечивает более справедливое распределение ресурсов при высокой переподписке, когда множество запросов конкурируют за ограниченные слоты CPU. Короткие запросы не страдают из-за длительных запросов, которые со временем накопили больше слотов. Включается значением max_min_fair настройки сервера concurrent_threads_scheduler. #94732 (Sergei Trifonov).
  • В клиенте ClickHouse появилась возможность переопределять TLS SNI при подключении к серверу. #89761 (Matt Klein).
  • Добавлена поддержка временных таблиц в вызовах функции joinGet. #92973 (Eduard Karacharov).
  • Поддержка векторов удаления в движке таблицы DeltaLake. #93852 (Kseniia Sumarokova).
  • Добавлена поддержка deletion vectors в deltaLakeCluster. #94365 (Kseniia Sumarokova).
  • Поддержка Google Cloud Storage для озер данных. #93866 (Konstantin Vedernikov).

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

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

  • Параметр 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&#95;const&#95;adaptive&#95;granularity) после вертикальных слияний. #94725 (Azat Khuzhin).
  • Исправлена ошибка мутаций со скалярными подзапросами и зависимостями таблицы. Если у таблицы были зависимости (индекс или проекции), связанные со столбцом, скалярные подзапросы могли вычисляться и кэшироваться без данных, что приводило к некорректным изменениям. #94731 (Raúl Marín).
  • Исправлено переключение AsynchronousMetrics cpu_pressure на резервный вариант при возникновении ошибки. #94827 (Raúl Marín).
  • В функции getURLHostRFC отсутствовали проверки выхода за границы перед разыменованием указателей. При передаче пустой строки в domainRFC происходило чтение неинициализированной памяти, что приводило к ошибкам MSan. #94851 (Alexey Milovidov).
  • Исправлен режим «только для чтения» у зашифрованных дисков. #94852 (Azat Khuzhin).
  • Исправлена логическая ошибка при дробных LIMIT/OFFSET при использовании старого анализатора с distributed таблицами. Закрывает #94712. #94999 (Ahmed Gouda).
  • Исправлено падение в некоторых случаях, когда JOIN Runtime Filters включены по умолчанию. #95000 (Alexander Gololobov).
  • Улучшено маскирование паролей в URL-адресе, используемом в движке таблицы URL() и табличной функции url(). #95006 (Vitaly Baranov).
  • Функция toStartOfInterval теперь работает так же, как toStartOfX, где X — это Day, Week, Month, Quarter, Year, если включён enable_extended_results_for_datetime_functions. #95011 (Kirill Kopnev).
  • Исправлены сравнения с константными строками, которые не учитывали настройки cast_string_to_date_time_mode, bool_true_representation, bool_false_representation и input_format_null_as_default. Закрывает #91681. #95040 (Nihal Z. Miaji).
  • Исправлено состояние гонки в файловом кэше. #95064 (Alexey Milovidov).
  • Исправлено редкое проявление состояния гонки в ридере Parquet. #95068 (Alexey Milovidov).
  • Исправлено падение в оптимизации top K, когда LIMIT равен нулю. Закрывает #93893. #95072 (Alexey Milovidov).
  • При преобразовании из DateTime/целых чисел в Time64 с помощью toTime извлекается компонент времени суток, но эта функция не является монотонной. Шаблон ToDateTimeMonotonicity ошибочно утверждал, что это преобразование монотонно, из-за чего в отладочных сборках возникало Исключение “Invalid binary search result in MergeTreeSetIndex”. #95125 (Alexey Milovidov).
  • Список записей в файле манифеста пересоздавался только при необходимости (раньше это происходило на каждой итерации). #95162 (Daniil Ivanik).

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

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