обратно несовместимое изменение
- Доступ к S3 из пользовательских SQL-запросов теперь по умолчанию больше не использует собственные облачные учетные данные сервера (environment, IMDS/IRSA, instance profile, AWS config files, STS на основе
role_arn, GCP OAuth metadata); такой запрос должен использовать явные учетные данные или NOSIGN. В именованных коллекциях значение use_environment_credentials теперь по умолчанию равно 0. Прежнее поведение можно вернуть для отдельного запроса с помощью use_environment_credentials = 1 (или глобально через конфигурацию <s3>) вместе с новой настройкой s3_allow_server_credentials_in_user_queries (по умолчанию отключена). Явно указанные учетные данные и учетные данные из конфигурации, подготовленной оператором, не затрагиваются. При запуске сервера или RESTORE постоянная таблица S3/S3Queue, динамический диск S3 или DataLakeCatalog, чье определение использует такие учетные данные, теперь загружается анонимно (и остается недоступной до повторной настройки учетных данных) вместо прерывания запуска; это поведение управляется новой настройкой сервера s3_load_table_anonymously_if_credentials_restricted (по умолчанию включена). #106855 (Raúl Marín).
- Glob-шаблон
**/ (любое количество каталогов) теперь также соответствует тому же каталогу. Ранее **/ в glob-шаблонах не обрабатывался как особый случай, поэтому data/**/file.txt не соответствовал data/file.txt (нулевой уровень каталогов). #97676 (Alexey Milovidov).
- Формат архивов резервных копий
zip/zipx теперь не допускается для резервных копий, хранящихся в объектном хранилище — прямые пункты назначения S3(...)/AzureBlobStorage(...) и пункты назначения Disk(...) на базе S3 или Azure — как для BACKUP, так и для RESTORE. Для чтения центрального каталога zip требуется произвольный доступ к файлу, что очень медленно в объектном хранилище. Вместо этого используйте формат на основе tar, например tar.gz. #101770 (Yash ).
- Поддерживаемый диапазон
DateTime64 расширен с [1900-01-01, 2299-12-31] до [0000-01-01, 9999-12-31]. Значения за пределами прежнего диапазона теперь вычисляются корректно (через cctz), а не ограничиваются граничными значениями. При precision 8 или 9 диапазон остается более узким, поскольку тики хранятся как Int64 (при наносекундной точности максимум по-прежнему 2262-04-11). Обратная совместимость: если вы раньше использовали дату и время вне диапазона, но полагались на очень специфические правила насыщения внутри старого диапазона, имейте в виду, что теперь результаты изменятся и станут более корректными. #107907 (Alexey Milovidov).
AggregatingMergeTree теперь отклоняет при создании таблицы схемы, в которых столбец не является ни частью ключа сортировки, ни мерой состояния агрегации (AggregateFunction/SimpleAggregateFunction). Такие столбцы молча схлопываются до произвольного значения во время фоновых слияний, что приводит к неверным результатам для запросов, использующих GROUP BY или фильтрацию по этим столбцам. Установите allow_dimensions_outside_sorting_key = 1, чтобы вернуть прежнее поведение. Закрывает #751. #108087 (Alexey Milovidov).
- Удалена конфигурация планирования рабочих нагрузок на основе config (разделы конфигурации сервера
resources и workload_classifiers). Вместо этого используйте запросы CREATE RESOURCE и CREATE WORKLOAD. Устаревшие разделы конфигурации игнорируются с предупреждением. #108286 (Sergei Trifonov).
- ClickHouse теперь всегда использует единый хеш для дедупликации вставок — как для синхронных, так и для асинхронных вставок; прежние механизмы дедупликации для отдельных вставок удалены. Настройка сервера
insert_deduplication_version сохранена как защитный механизм при миграции: сервер отказывается запускаться, если для неё задано устаревшее значение (old_separate_hashes или compatible_double_hashes). Чтобы обновиться с версии, где использовалось устаревшее значение, сначала запустите релиз с поддержкой compatible_double_hashes (он записывает и устаревшие, и единые хеши). Для реплицируемых таблиц запускайте его как минимум в течение replicated_deduplication_window_seconds (по умолчанию один час; окна по умолчанию сохраняют единые хеши всех вставок за этот интервал, чего считается достаточно для цикла повторных попыток вставки). Для нереплицируемых таблиц с non_replicated_deduplication_window > 0 это окно определяется количеством вставок, а не временем, поэтому используйте compatible_double_hashes как минимум на протяжении такого количества вставок. Затем удалите эту настройку (или установите значение new_unified_hash) перед обновлением до этой версии. #108361 (Sema Checherinda). Если вы никогда не задавали insert_deduplication_version, этот пункт можно игнорировать.
- Удалены давно устаревшие функции
snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake и dateTime64ToSnowflake. Они были объявлены устаревшими ещё в v24.6 в пользу snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID и dateTime64ToSnowflakeID, которые теперь и следует использовать. Настройка allow_deprecated_snowflake_conversion_functions (которая раньше снова включала их) теперь устарела и не оказывает никакого эффекта. #108711 (Alexey Milovidov).
- Значение настройки
use_legacy_to_time теперь по умолчанию равно 0, поэтому toTime преобразует значения в тип данных Time, а не преобразует дату и время в фиксированную дату. Прежнее поведение по-прежнему доступно через функцию toTimeWithFixedDate или при установке use_legacy_to_time = 1. #108729 (Alexey Milovidov).
- Модели Naive Bayes (используемые
naiveBayesClassifier) теперь настраиваются как словарь с layout NAIVE_BAYES, который при загрузке строится из таблицы с предварительно агрегированными по классам значениями n-gram counts, вместо прежней конфигурации на стороне сервера (XML-файл конфигурации со ссылками на сериализованные файлы моделей .bin), которая больше не поддерживается — существующие модели необходимо пересоздать в виде словарей. Вместе с naiveBayesClassifier добавлены три новые функции: naiveBayesClassifierWithProb возвращает предсказанный класс вместе с его вероятностью, naiveBayesClassifierWithAllProbs возвращает все классы с их вероятностями, а naiveBayesNgrams разбивает текст на n-граммы так же, как это делает словарь, что позволяет строить обучающие данные из исходных размеченных текстов. Кроме того, было внесено несколько оптимизаций производительности: на языковой модели триграмм кодовых точек размером 9.7 MiB используется примерно в 49 раз меньше оперативной памяти (с 1.84 GiB до 38 MiB), загрузка происходит примерно в 11 раз быстрее, и классификация выполняется примерно в 11 раз быстрее. #108773 (Nihal Z. Miaji).
- Функция
hasColumnInTable больше не принимает необязательные аргументы hostname, username и password для проверки столбца на произвольном удалённом сервере; остаётся только форма hasColumnInTable(database, table, column). Удалённый режим создавал угрозу безопасности: он позволял любому пользователю инициировать исходящие подключения к произвольным хостам и приводил к утечке учётных данных в журнал запросов, при этом не был ограничен какой-либо привилегией. #110881 (Alexey Milovidov).
- Добавлен
EXPLAIN ANALYZE для анализа производительности запросов: запрос выполняется, а фактические метрики выполнения отображаются в привычном формате плана запроса. #106586 (Kirill Kopnev). #110668 (Kirill Kopnev).
- Добавлена поддержка предложений
WHERE в определениях проекций. Проекции с WHERE материализуют только строки, соответствующие предикату, и оптимизатор может использовать их (на основе стоимости), когда WHERE запроса подразумевает WHERE проекции. #102347 (S Bala Vignesh).
- Добавлена настройка
skip_unavailable_shards_mode (также доступная как настройка движка Distributed) для управления тем, какие исключения от удаленного сегмента будут незаметно игнорироваться при включенном skip_unavailable_shards. #79091 (cjw).
- Добавлена агрегатная функция
groupFormat, которая форматирует строки в каждой группе в указанном формате вывода и возвращает результат в виде строки. #93201 (Yang Hu).
- Добавлен
AWS_MSK_IAM как поддерживаемое значение для kafka_sasl_mechanism, что позволяет ClickHouse аутентифицироваться в Amazon MSK с использованием ролей IAM без необходимости управлять учетными данными SASL/SCRAM. #96100 (kalavt).
- Добавлен комбинатор агрегатной функции
-Tuple, который независимо применяет базовую агрегатную функцию к каждому элементу столбца Tuple и возвращает Tuple с результатами, сохраняя имена элементов: sumTuple(t) для t = (a, b) возвращает (sum(a), sum(b)). Агрегатные функции с несколькими аргументами принимают по одному кортежу на аргумент, сопоставляя элементы по позиции: corrTuple((a1, a2), (b1, b2)) возвращает (corr(a1, b1), corr(a2, b2)). В отличие от -ForEach для массивов, элементы могут иметь разные типы, при этом типы и имена результатов для каждого элемента сохраняются. #98190 (RinChanNOW).
- Текстовые индексы теперь поддерживают аргумент
postprocessor — произвольное выражение, которое преобразует каждый токен после токенизации (например, lower). #98939 (Jimmy Aguilar Mena). #108606 (Jimmy Aguilar Mena).
- Добавлена системная таблица
system.stemmers, в которой перечислены все языки, которые можно указать для функции stem. #100611 (Jimmy Aguilar Mena).
- Добавлена поддержка
WITH TIES для отрицательного LIMIT. #100930 (Nihal Z. Miaji).
- Добавлена поддержка постфиксных операторов стандартного SQL
AT TIME ZONE и AT LOCAL как синтаксического сахара для toTimeZone. Выражение expr AT TIME ZONE zone теперь эквивалентно toTimeZone(expr, zone), а expr AT LOCAL — toTimeZone(expr, timeZone()). #106092 (lizepeng).
- Движок таблицы
URL и табличная функция url теперь направляются к соответствующему backend в зависимости от схемы URL: file:// обрабатывается движком File, s3:///gs:///gcs:///oss:// — S3, az:///azure:///abfss:///abfs:// — AzureBlobStorage, hdfs:// — HDFS, а http(s):// — как и раньше движком URL. Настройка url_base применяется до выбора по схеме. Направляются только схемы S3, разрешаемые url_scheme_mappers по умолчанию; другие S3-compatible схемы поставщиков (cos, obs, …) не поддерживаются таким образом и требуют прямого использования движка или функции s3. #106093 (Alexey Milovidov).
- Добавлены движки таблиц
Remote и RemoteSecure — постоянные аналоги табличных функций remote и remoteSecure. Теперь помимо CREATE TABLE ... AS remote(...) работает и CREATE TABLE ... ENGINE = Remote('addresses', db, table, ...). #106189 (Alexey Milovidov).
- Добавлены не зависящие от движка команды
SYSTEM STOP, SYSTEM START, SYSTEM PAUSE, SYSTEM CANCEL и SYSTEM REFRESH, а также их общесерверные формы ... ALL BACKGROUND, чтобы через единый интерфейс управлять фоновой активностью таблиц Kafka, RabbitMQ, NATS, S3Queue/AzureQueue и refreshable materialized views. Для refreshable materialized views они служат псевдонимами существующих команд SYSTEM ... VIEW. В рамках поддержки этих механизмов управления для NATS таблицы JetStream теперь подтверждают сообщения только после успешной вставки (at-least-once; раньше сообщения автоматически подтверждались при доставке и могли теряться, если вставка завершалась ошибкой). Новая настройка nats_wait_for_flush_interval (по умолчанию false, что сохраняет прежнее поведение с низкой задержкой) позволяет удерживать цикл consumption открытым на весь интервал flush вместо выполнения flush сразу после опустошения queue. Новая настройка nats_commit_on_select заставляет прямой SELECT из таблицы JetStream потреблять (подтверждать) прочитанные сообщения. #107476 (Samuel Krempaský).
- Добавлена поддержка передачи пользовательского запроса в табличные функции и движки таблиц
mysql, postgresql и sqlite (вместо имени таблицы) с его отправкой во внешнюю СУБД как есть; запрос можно записать либо как подзапрос (SELECT ...), либо как query('SELECT ...'). Структура результирующей таблицы выводится из query result, а сама такая таблица доступна только для чтения. Закрывает #46758. Основано на первоначальной реализации Denis Vidiaev (#79652). #107740 (Alexey Milovidov).
- В ClickHouse Web интерфейс (Play) добавлены вкладки для одновременной работы с несколькими запросами. Вкладки, их заголовки, параметры, активное состояние и небольшие снимки результатов сохраняются между перезагрузками (крупные результаты и изображения не восстанавливаются), интегрированы с историей браузера и URL, а переключаться между ними можно колесом мыши. #107826 (Alexey Milovidov).
- Представлен движок таблицы
QueryRunner. Записи, вставленные в таблицу QueryRunner, представляют собой запросы, которые этот движок выполняет. Движок можно использовать для асинхронного выполнения запросов, пакетного выполнения сгенерированных запросов, направления запросов в удалённые кластеры, бенчмарков, фаззинга и тестирования с теневым трафиком. #107888 (Miсhael Stetsyuk).
- Добавлен выходной формат
GeoJSON для записи документов GeoJSON FeatureCollection, при этом для каждой строки создаётся один объект feature. Единственный столбец с геотипом (Point, LineString, MultiLineString, Polygon, MultiPolygon, Ring или Geometry) становится geometry этого feature; столбец с именем id становится id feature; а все оставшиеся столбцы становятся properties feature, при этом единственный столбец объектного типа с именем properties (JSON, Map или именованный Tuple) записывается напрямую как объект properties. Ring записывается как Polygon с одним кольцом. Новая настройка format_geojson_validate_geometry (включена по умолчанию) определяет, будут ли геометрии, не являющиеся корректными фигурами GeoJSON, — например, Polygon менее чем с четырьмя точками или незамкнутое кольцо Polygon — отклоняться при чтении и записи. Кроме того, входной формат GeoJSON теперь выводит столбец id как Nullable(String) вместо String, поэтому feature с отсутствующим или явно заданным членом "id": null читается как NULL и остаётся отличимым от пустой строки "". Основано на первоначальной реализации Mark Needham (#98124). #108065 (Nihal Z. Miaji).
- Добавлена функция
dotProductTransposed (псевдоним scalarProductTransposed), которая вычисляет приближённое скалярное произведение между столбцом QBit и опорным вектором, дополняя существующие функции L2DistanceTransposed и cosineDistanceTransposed. #108100 (Alexey Milovidov). Также добавлены квантованные функции транспонированного расстояния cosineDistanceTransposedQuantized, L2DistanceTransposedQuantized и dotProductTransposedQuantized, которые работают с QBit(Int8) кодов Lloyd-Max из quantizeBFloat16ToInt8, деквантуя сохранённые коды на лету. Опорный вектор типа с плавающей точкой представляет собой полноточный запрос и сравнивается с точностью Float32 (запрос Float64 сужается); опорный Array(Int8) деквантуется сам, что даёт симметричное расстояние quantized-vs-quantized. #109405 (Alexey Milovidov).
- В тип данных
QBit добавлен необязательный параметр stride (QBit(T, dimension, stride)), который сохраняет группы размерностей в отдельных потоках, чтобы векторный поиск мог эффективно читать только первые размерности (например, для Matryoshka embeddings). Функции транспонированного расстояния принимают необязательный четвёртый аргумент used_dims для чтения уменьшенного числа размерностей. #108103 (Alexey Milovidov).
- Добавлена поддержка типа элементов
Int8 в типе данных QBit, что позволяет хранить квантованные 8-битные целочисленные векторы и выполнять по ним векторный поиск с транспонированным расстоянием (L2DistanceTransposed, cosineDistanceTransposed). #108105 (Alexey Milovidov).
- Новая функция
randomHadamardTransform(vector[, seed[, output_dims]]): детерминированное рандомизированное преобразование Адамара для вектора с плавающей точкой — ортогональный поворот с сохранением нормы, полезный для предварительной обработки embeddings перед квантованием, а также (в усечённом виде) как случайная проекция Джонсона–Линденштраусса / subsampled-randomized-Hadamard. #108227 (Alexey Milovidov).
- Добавлена поддержка настройки отложенной загрузки словарей для каждого словаря отдельно с помощью параметра
dictionary_lazy_load в определении словаря, который переопределяет глобальную настройку сервера dictionaries_lazy_load, так что одни словари могут загружаться отложенно, а другие — сразу. #108314 (Miсhael Stetsyuk).
- Добавлена встроенная страница поиска по документации, доступная по пути
/docs HTTP interface, которая обеспечивает мгновенный поиск по таблице system.documentation и отображает справочную документацию (с подсветкой синтаксиса, математическими формулами и перекрестными ссылками). #108345 (Alexey Milovidov).
- Добавлена функция
xxHash64Spark, которая вычисляет совместимые со Spark значения xxHash64 для входных данных String и NULL, используя seed 42, и возвращает Int64. #108436 (Lalit Yadav).
ALTER USER, ALTER ROLE и ALTER SETTINGS PROFILE теперь принимают SET name = value как Alias for MODIFY SETTING name = value. Это изменяет отдельные настройки на месте, сохраняя остальные, в отличие от bare SETTINGS, который заменяет весь список настроек. Это снижает вероятность случайно стереть другие настройки пользователя. #108722 (Groene AI).
- Добавлена поддержка
ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK expr, позволяющая изменять выражение существующего ограничения на месте. #108768 (Alexey Milovidov).
- Web UI: добавлен переключатель цветового кодирования для каждого столбца (значок 🌈 в заголовке столбца), позволяющий переключаться между режимами bar, heatmap, categorical и без визуализации. Выбранные режимы сохраняются в URL и истории браузера. #108873 (Alexey Milovidov).
Keeper теперь корректно обрабатывает opcode CreateContainer (19) из ZooKeeper, управляемый новым opt-in feature flag create_container (по умолчанию отключен, как и create_ttl). После включения, по завершении полного upgrade всего ensemble, внешние клиенты ZooKeeper (например, Java ZooKeeper 3.9+) могут создавать узлы-контейнеры в Keeper вместо получения ConnectionLoss; для узлов-контейнеров возвращается ожидаемое sentinel-значение ephemeralOwner, а фоновый поток GC на лидере автоматически удаляет контейнеры без дочерних узлов. Обычный request Create, содержащий флаг режима создания CONTAINER без opcode 19, по-прежнему отклоняется (ZBADARGUMENTS): ни один известный клиент ZooKeeper не использует такую комбинацию. Это только server-side compatibility протокола: собственный клиент ZooKeeper в ClickHouse (zkutil) не изменился и не имеет API для самостоятельного создания узлов-контейнеров. #108908 (unintended).
- Добавлены функции
geoToUTM, UTMToGeo, geoToMGRS и MGRSToGeo для преобразования между географическими координатами WGS84 и системами координат UTM и MGRS. #108939 (Alexey Milovidov).
- Добавлена функция
digits(n, offset[, length]), которая возвращает цифры числа n, начиная с 1-based смещения offset и охватывая length цифр, либо до конца числа, если length не указан. #109012 (Umang Agrawal).
- Добавлена арифметическая функция
sqr для вычисления квадрата числа. #109061 (Lalit Yadav).
- Добавлена новая функция
dictGetRoot, которая возвращает самого верхнего предка (корень) ключа в иерархическом словаре. Это удобный эквивалент dictGetHierarchy(dict_name, key)[-1]. #109459 (Alexey Milovidov).
- Добавлены команды
SYSTEM UNLOAD DICTIONARY и SYSTEM UNLOAD DICTIONARIES, позволяющие освобождать память, занимаемую словарём, без удаления его определения. Словари будут повторно загружаться по требованию при следующем обращении. #109639 (Matheus Nerone).
- Добавлены функции
geometryIntersectCartesian и geometryIntersectSpherical, которые определяют, пересекаются ли две геометрии. В отличие от polygonsIntersectCartesian/polygonsIntersectSpherical, они принимают любой geometry data type (Point, LineString, MultiLineString, Ring, Polygon, MultiPolygon), включая общий тип Geometry, при этом два аргумента могут быть разных типов. #110062 (Alexey Milovidov).
- Параметры запроса (подстановки
{name:Type}) теперь можно использовать в качестве значений настроек — как в clause SETTINGS запроса (например, SELECT или INSERT), так и в автономных запросах SET, например: SELECT ... SETTINGS max_threads = {threads:UInt64} и SET max_threads = {threads:UInt64}. #108760 (Alexey Milovidov).
Экспериментальные возможности
- Раскрытие подстановочных шаблонов для табличной функции
url и движка таблицы URL: подстановочные шаблоны в пути URL раскрываются путём обхода HTTP-страниц индекса (HTML или списков каталогов в plaintext) и извлечения совпадающих URL, с ограничениями на размер страницы индекса и количество читаемых каталогов. Включается настройкой allow_experimental_url_wildcard_from_index_pages. #95181 (Yue Ni).
- Текстовые индексы теперь могут хранить позиции токенов (аргумент индекса
support_phrase_search), чтобы поддерживать точное сопоставление фраз с прямым чтением для функции hasPhrase. Требуется включить настройку MergeTree allow_experimental_text_index_phrase_search. #103172 (Elmi Ahmadov). Изначально этот аргумент был представлен под именем positions. #109900 (Elmi Ahmadov).
- Добавлена поддержка compaction файлов manifest для таблиц
Iceberg через OPTIMIZE TABLE ... MANIFEST (под защитой настройки allow_experimental_iceberg_compaction). Закрывает #95174. #98178 (Smita Kulkarni). Исправлен OPTIMIZE TABLE ... MANIFEST для таблиц Iceberg, когда кортежи партиций в manifest не соответствуют их спецификации партиции. #111368 (Smita Kulkarni).
- Добавлены вариант Real Doubles (RD) и необязательный аргумент
ALP(AUTO|STD|RD) для экспериментального кодека ALP. ALP без параметров теперь автоматически выбирает между существующей схемой STD и RD, а не всегда использует STD. #99654 (Nazarii Piontko).
- Добавлен SLRU-кеш в памяти для десериализованных файлов metadata
Paimon (manifest list и manifests). При включении через настройку use_paimon_metadata_files_cache повторные запросы к одной и той же таблице Paimon пропускают повторную загрузку и повторный разбор metadata из Объектного хранилища. #104657 (XiaoBinMu).
- Добавлены “драйверы” для исполняемых пользовательских функций. Драйвер, объявленный в
<user_defined_executable_function_drivers_config>, можно использовать в CREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...', чтобы компилировать или иным образом обрабатывать пользовательский фрагмент кода во время создания функции и получать готовую к запуску исполняемую UDF. Полученная configuration сохраняется в <dynamic_user_defined_executable_functions_path>, а исходный запрос сохраняется как ATTACH FUNCTION, чтобы функция переживала перезапуски сервера. Proof-of-concept-драйвер c_function_body компилирует и запускает тела функций C внутри изолированных контейнеров Docker в режиме executable_pool. Основано на первоначальной реализации Daniil Timižev (#77128). #105131 (Alexey Milovidov).
SELECT count(*) FROM t WHERE col <op> default(col) теперь может обслуживаться из статистики разреженности по столбцам в serialization.json без какого-либо сканирования данных, когда predicate точно разделяет столбец на значения по умолчанию и отличные от значений по умолчанию (при новой экспериментальной настройке optimize_trivial_count_with_sparsity_filter, отключённой по умолчанию). #105890 (Raúl Marín).
- API-запросы Prometheus Query API к
/api/v1/query и /api/v1/query_range теперь записываются в system.query_log с метриками read_rows и read_bytes. #106611 (James Cunningham).
- Экспериментальный путь чтения
ReaderExecutor (use_reader_executor, по умолчанию отключён) теперь может держать соединение с удалённым источником открытым и повторно использовать его при последовательных чтениях, уменьшая число запросов к объектному хранилищу при сканировании. #107735 (Sema Checherinda). Теперь он также поддерживает чтение зашифрованных файлов с глобальным кэшем заголовков шифрования, который настраивается через настройку сервера encryption_header_cache_size и очищается командой SYSTEM DROP ENCRYPTION HEADERS CACHE. #109702 (Sema Checherinda).
- Добавлена поддержка чтения по распределённому плану запроса для
SELECT ... FINAL на таблицах семейства MergeTree, если включён make_distributed_plan. #108148 (Alexander Gololobov).
- Добавлено экспериментальное выполнение запросов
MergeTree на основе плана с использованием параллельных реплик. #108504 (Igor Nikonov).
- Добавлено экспериментальное семейство векторных кодеков
Quantize, а также включаемое по выбору двухэтапное приблизительное преобразование векторного поиска поверх квантованных сопутствующих потоков. #108565 (Shankar Iyer).
- Возвращён экспериментальный кодек сжатия с потерями
SZ3 с ограничением ошибки для столбцов Float32/Float64 (и их массивов), изначально реализованный Konstantin Vedernikov (#83088). Для него требуется allow_experimental_codecs. #108788 (Alexey Milovidov). Исправлено чтение данных, сжатых с помощью SZ3('ALGO_LORENZO_REG', ...), которое ранее завершалось ошибкой CORRUPTED_DATA, а также устранено неопределённое поведение при сжатии нефинитных значений с плавающей точкой (NaN и бесконечностей). #110762 (Alexey Milovidov).
- Добавлен экспериментальный кодек
ZXC — асимметричный LZ-кодек с медленным сжатием и очень быстрой распаковкой, с коэффициентом сжатия между LZ4 и ZSTD. Для него требуется allow_experimental_codecs = 1, а system.compression_codecs помечает его как экспериментальный. #110620 (Alexey Milovidov). #111007 (Alexey Milovidov).
- Теперь вы можете аутентифицироваться в OneLake с помощью заранее полученного Bearer-токена через настройку
onelake_bearer_token вместо onelake_client_id и onelake_client_secret. Это позволяет избежать передачи долгоживущего секрета клиента. Токен не обновляется, поэтому после истечения срока его действия базу данных нужно пересоздать. #109104 (Asya Shneerson).
- Функции ИИ больше не принимают именованную коллекцию как первый позиционный аргумент. Учётные данные берутся из настроек
ai_function_text_default_credentials / ai_function_embedding_default_credentials или из ключа credentials в необязательном завершающем аргументе Map(String, String), который также содержит настраиваемые параметры (model, max_tokens, temperature, system_prompt, instructions, dimensions). #109232 (George Larionov). Функция aiEmbed теперь принимает model как обязательный позиционный аргумент (aiEmbed(text, model[, params])) вместо чтения его из именованной коллекции, что обеспечивает воспроизводимость эмбеддингов. #110619 (George Larionov).
- Исправлено значение
data_uncompressed_bytes для skip-индексов, упакованных в skp_idx.packed (через packed_skip_index_max_bytes): сообщаемый несжатый размер был равен сжатому, что также могло мешать активации distributed_index_analysis. #109272 (Raúl Marín).
- Добавлено экспериментальное packed-хранилище data part для таблиц
MergeTree, в котором большинство файлов part хранятся в одном архиве data.packed вместо отдельного файла для каждого потока (проекции и несколько служебных файлов, таких как txn_version.txt, по-прежнему записываются отдельно). Оно управляется настройками min_bytes_for_full_part_storage, min_rows_for_full_part_storage и min_level_for_full_part_storage и по умолчанию отключено. После того как таблица начинает записывать packed parts, старые версии server уже не могут их читать, поэтому включение этого формата делает невозможным понижение версии server. #108118 (Raúl Marín).
- Добавлена экспериментальная table function
eval, которая вычисляет константное expression в строку запроса и выполняет получившийся запрос SELECT. Возможность по умолчанию отключена и может быть включена с помощью настройки allow_experimental_eval_table_function. Автор: Yue Ni. #110132 (Alexey Milovidov).
- Добавлена поддержка сжатия
zstd в экспериментальный HTTP-handler Prometheus remote-write v1. #110907 (James Cunningham).
- Запись в таблицы
DeltaLake (настройка allow_experimental_delta_lake_writes) переведена в статус Beta. #107034 (Kseniia Sumarokova).
- Добавлены
ProfileEvents DistributedPlanRemoteTasks, DistributedPlanLocalExecution и DistributedPlanHostsUsed для наблюдения за выполнением экспериментальных distributed query plans (make_distributed_plan). #107985 (Shankar Iyer).
- Удалено экспериментальное хранилище на базе RocksDB в Keeper (
experimental_use_rocksdb). Скоро появится новое, более совершенное on-disk хранилище. #108000 (Michael Kolupaev).
- Distributed index analysis (экспериментальная возможность, управляемая настройкой
distributed_index_analysis) теперь отправляет большие списки имен data part на remote server как скаляры, а не встраивает их в query text. Это позволяет избежать возможных сбоев из-за ограничений max_ast_elements / max_query_size и устраняет overhead на parsing AST. #110419 (Azat Khuzhin).
- Оптимизированы экспериментальные aggregation functions
timeSeries*ToGrid: buckets теперь выровнены и по step, и по window, а финальная aggregation выполняется намного быстрее, когда window значительно больше step. Формат serialization aggregation state был изменен несовместимым образом (эти функции экспериментальные). #106724 (Vitaly Baranov).
- External target tables таблицы
TimeSeries теперь регистрируются как ссылочные зависимости: аналогично materialized views, это запрещает dropping external target table до удаления таблицы TimeSeries, которая на нее ссылается (если включен check_referential_table_dependencies). #108388 (Vitaly Baranov).
- Добавлена функция PromQL
increase. #111023 (Vitaly Baranov).
JOIN теперь может использовать индекс первичного ключа или индекс пропуска данных в левой таблице для отсечения гранул. Управляется настройкой enable_join_runtime_filters_index_analysis. #109085 (Shankar Iyer).
- Сериализация и десериализация векторов тривиально сериализуемых типов теперь используют один вызов буферизованного ввода-вывода вместо обработки отдельных элементов. #89842 (Jimmy Aguilar Mena).
- Оптимизированы обратные обращения к словарю: предикат равенства с константой, такой как
WHERE dictGet(dict, attr, key_expr) = value, теперь напрямую сворачивается в фильтр по ключу (key_expr = const, key_expr IN [...] или WHERE 0) вместо переписывания в подзапрос IN (SELECT ... FROM dictionary(...)), а константный путь dictGetKeys теперь выполняется параллельно. #91164 (Nihal Z. Miaji).
- Добавлена новая настройка
merge_tree_generic_exclusion_search_max_steps, которая ограничивает число шагов, затрачиваемых универсальным алгоритмом поиска с исключением на анализ индекса первичного ключа каждой части данных. Бюджет сначала расходуется на самые большие оставшиеся диапазоны ключей, поэтому даже небольшой бюджет позволяет отсечь основную часть данных; диапазоны, которые не были полностью проанализированы, читаются целиком, поэтому результаты запроса остаются корректными, но может быть прочитано больше гранул. Ограничение применяется нестрого: оно может быть превышено максимум на merge_tree_coarse_index_granularity шагов, плюс на один шаг для каждого диапазона, на которые эта часть уже разбита (например, кэшем условий запроса). Значение по умолчанию 0 означает неограниченное число шагов. #92779 (Michael Jarrett).
- Запросы с
ORDER BY и LIMIT к представлениям поверх таблиц Distributed теперь используют оптимизацию merge-sorted-streams: внешний ORDER BY/LIMIT проталкивается во внутренний запрос простого представления, поэтому каждый шард сортирует свои данные локально, а координатор объединяет заранее отсортированные потоки вместо полной сортировки. #94102 (matanper).
optimize_or_like_chain теперь включена по умолчанию. Закрывает #87779. #94517 (Alexey Milovidov).
- Ротируемые нереплицируемые системные таблицы логов
MergeTree без TTL теперь помечаются как table_readonly, чтобы избежать ненужных фоновых операций. Настройка table_readonly для MergeTree теперь также подавляет всю фоновую работу в обычной таблице MergeTree — обычные слияния, TTL (DELETE/MOVE/recompression) и слияния с повторным сжатием, фоновые мутации и фоновые перемещения частей — и отклоняет команды изменения партиций (ATTACH/MOVE/DROP/DROP DETACHED/FETCH/REPLACE PARTITION и MOVE PARTITION ... TO TABLE в эту таблицу), в дополнение к вставкам, мутациям и OPTIMIZE, которые уже отклонялись. В результате таблица table_readonly с TTL больше не удаляет свои устаревшие данные, пока эта настройка включена. #95079 (Mathuranath Metivier).
- Улучшена производительность получения одной записи пользователя из
system.users, когда на сервере много пользователей. #96699 (Alistair Evans).
- Упорядоченное чтение с параллельными репликами теперь использует ту же логику разбиения таблицы на
max_threads частей, что и локальное чтение, для лучшего параллелизма. #101434 (Nikita Taranov).
- Используются границы minmax-индекса партиций, чтобы отсеивать больше гранул при анализе primary key для таблиц
MergeTree, когда столбец primary key также входит в ключ партиционирования. Например, в таблице MergeTree с ORDER BY (id, event_time) и PARTITION BY toYYYYMM(event_time) ClickHouse будет использовать minmax-индекс партиции по event_time при анализе primary key index, чтобы точнее решать, какие гранулы можно отсечь. Это поведение управляется новой настройкой use_partition_minmax_for_primary_key_pruning (включена по умолчанию). #103480 (UnamedRus).
- Включён кэш условий запроса для запросов, использующих динамическую фильтрацию Top-K (
ORDER BY ... LIMIT n). Запись в кэше разделяется по параметрам плана Top-K, поэтому один и тот же запрос повторно использует закэшированные результаты фильтра WHERE, а другое значение LIMIT, столбец сортировки или направление сортировки создаёт новую запись. #104478 (Alexey Milovidov).
- Добавлена настройка
use_constant_folding_in_index_analysis (по умолчанию отключена). Когда она включена, анализ primary key, MinMax и skip-index в MergeTree подставляет константы уровня партиции в предикат фильтра отдельно для каждой части, улучшая pruning для фильтров, ветви которых зависят от значений партиции, например (a = 1 AND b >= 1) OR (a = 2 AND b > 10) с PARTITION BY a. #104582 (Mikhail Artemenko).
LIMIT теперь проталкивается в aggregation-in-order, чтобы обеспечить раннее завершение, когда ключ GROUP BY совпадает с ключом ORDER BY и ключом сортировки таблицы, что значительно сокращает число считываемых строк. #104859 (Konstantin Bogdanov).
- Обновление profile events теперь выполняется до 30 раз быстрее благодаря per-CPU атомарным операциям для общесерверных и пользовательских счётчиков. Это поведение управляется настройкой сервера
user_profile_events_per_cpu (она использует около 640 КиБ на пользователя на 64 ядрах, поэтому при очень большом числе пользователей её может быть разумно оставить отключённой). #105056 (Azat Khuzhin).
allow_aggregate_partitions_independently теперь включена по умолчанию. Когда ключ GROUP BY соответствует ключу партиционирования, ClickHouse может агрегировать каждую партицию независимо и пропускать этап глобального слияния. Эвристики времени выполнения автоматически отключают эту оптимизацию, если структура партиций делает её невыгодной (слишком мало партиций, слишком много партиций или сильно неравномерные размеры партиций). #105128 (Alexey Milovidov).
- Запросы векторного поиска с пересчётом оценок (
vector_search_with_rescoring = 1) теперь вычисляют точное расстояние только для строк, возвращённых векторным индексом, применяя точный фильтр по позиции строки вместо brute-force-пересчёта оценок для соседних строк из той же гранулы MergeTree. #105591 (Sergey Kuznetsov). #108846 (Sergey Kuznetsov).
- Повышена производительность алгоритма join
partial_merge на ключах FixedString: теперь он сравнивает серии значений сразу, а не выполняет отдельный вызов сравнения для каждого значения. #105737 (Artem Zuikov).
SHOW TABLES и system.tables для каталогов озера данных (Iceberg REST, Glue, Unity, Hive, Paimon) теперь проталкивают в каталог предикаты, ограниченные пространством имен, что позволяет избежать полного сканирования каталога. Закрывает #105022. #106029 (Smita Kulkarni).
- Ограничили объем неотслеживаемой памяти на CPU, чтобы избежать overcommit и ошибок нехватки памяти (лимиты задаются настройками сервера
max_per_cpu_untracked_memory и per_cpu_untracked_memory_thread_buffer). #106055 (Azat Khuzhin).
- Ускорили операторы, которые сканируют отсортированный поток в поисках серий одинаковых значений ключа —
DISTINCT in order, LIMIT BY in order, отрицательный LIMIT BY in order, full_sorting_merge и partial_merge JOIN. #106502 (Nihal Z. Miaji).
- Реализовали нативные reader и writer для форматов
Arrow и ArrowStream, не использующие библиотеку Apache Arrow, что позволяет избежать лишних копирований и преобразований данных. Теперь они используются по умолчанию (настройки input_format_arrow_use_native_reader и output_format_arrow_use_native_writer) и работают быстрее как при чтении, так и при записи. #106522 (Alexey Milovidov).
- Снова включили LTO для jemalloc после исправления повреждения кэша потоков, возникавшего при LTO, что повышает производительность. #106898 (Azat Khuzhin).
- Снизили использование памяти и повысили производительность
JOIN. Правая сторона hash join теперь использует компактную 8-байтную ссылку на строку на основе индекса, поэтому элементы hash-таблицы для ALL JOIN стали такими же компактными, как и для ANY JOIN, при любом типе ключей. Бенчмарк проводился на крупных запросах parallel_hash JOIN — INNER и ANY JOIN таблиц размером 100–300 миллионов строк по ключам UInt64 и String, как с уникальными, так и с повторяющимися ключами: медианный запрос стал примерно на 12% быстрее и использовал примерно на 15% меньше пикового потребления памяти, при этом ни один запрос не стал медленнее. INNER JOIN по ключам UInt64 дали наибольший прирост (медианно примерно на 21% быстрее при снижении использования памяти на 38%). #107189 (Harikrishnan Prabakaran).
- Одноколоночные ключи JOIN типа
LowCardinality(String) без Nullable теперь нативно поддерживаются в hash join. #107264 (Nikita Taranov).
- Добавили алгоритм перебора порядка JOIN
dpsub (dynamic programming over subsets), который строит оптимальные планы JOIN с меньшими накладными расходами на оптимизацию, чем dpsize, и поддерживает не только INNER JOIN. #107351 (Fisnik Kastrati).
- Ускорили загрузку файлового кэша при запуске, кодируя размер каждого файла кэша в его имени (
<offset>_<size>), что позволяет избежать вызова stat для каждого файла. Поддержка загрузки файлов кэша, записанных старыми версиями, сохранена. #107415 (Alexey Milovidov).
- Повысили производительность
arrayElement для Array(LowCardinality(String)) и map-функций LIKE для Map с ключами или значениями типа LowCardinality(String) за счет устранения ненужной материализации строк. #107450 (Michael Jarrett).
- Исключили преобразование одноуровневой агрегации в двухуровневую при малом использовании памяти, отслеживая память самого состояния агрегации, а не память всего запроса. #107490 (Hechem Selmi).
- Ускорили анализ агрегирующих запросов: ключ кэша для статистики размера hash-таблицы агрегации теперь вычисляется по плану запроса вместо построения полного AST запроса. #107643 (Dmitry Novik).
- Производительность
INTERSECT ALL и EXCEPT ALL (режима по умолчанию для INTERSECT и EXCEPT) повышена в несколько раз за счёт использования значения строки в качестве ключа мультимножества вместо хеширования каждой строки с помощью SipHash. #107649 (Raúl Marín).
- Фильтры политик строк теперь перестраиваются без удержания блокировки кэша, что повышает масштабируемость запросов при одновременном выполнении
CREATE ROW POLICY и DROP ROW POLICY. #107917 (Azat Khuzhin).
- Ускорены функции
match, extract, extractAll, replaceRegexpOne и replaceRegexpAll для простых регулярных выражений за счёт компиляции в нативный код с помощью LLVM. Это управляется новой настройкой compile_regular_expressions (включена по умолчанию); шаблоны регулярных выражений вне поддерживаемого подмножества автоматически обрабатываются движком RE2. #108004 (Alexey Milovidov).
- Ускорена распаковка ZSTD на AArch64 (ARM) для столбцов с небольшими смещениями совпадений, таких как целочисленные столбцы фиксированной ширины, за счёт векторизации перекрывающихся копирований с короткими смещениями с помощью NEON. Например, распаковка столбца
UInt64 на AWS Graviton 4 теперь выполняется до ~2.3x быстрее. #108049 (Alexey Milovidov).
- Для сжатия и распаковки gzip/zlib/deflate теперь используется библиотека
libdeflate, что повышает скорость (сжатие — ~1.15× при лучшем коэффициенте, распаковка — ~1.4–1.5×) для данных .gz/HTTP/url/s3 и кодека Parquet GZIP. #108074 (Alexey Milovidov).
- Улучшена производительность запросов текстового поиска в сочетании с фильтром по первичному ключу. #108114 (Anton Popov).
- Для оптимизации последующих запусков теперь используется runtime-статистика, собранная во время первого выполнения запроса: алгоритм
hash JOIN может автоматически переключаться на parallel_hash на основе собранной статистики. #108125 (Hechem Selmi). Размер runtime-фильтров JOIN теперь оптимизируется с использованием размера хеш-таблицы из runtime-статистики JOIN; это управляется новой настройкой join_runtime_filter_size_from_hash_table_stats. #108313 (Hechem Selmi).
- Повышена скорость распаковки LZ4 для столбцов фиксированного размера с низкой мощностью. #108175 (Nikita Taranov).
- Ускорены функции
trimLeft/trimRight/trimBoth, удаляющие пробелы по умолчанию (и их псевдонимы ltrim/rtrim/trim): последовательные строки, которым не требуется обрезка, копируются одним батчем, а посимвольная проверка пробелов выполняется только для строк, у которых действительно есть пробел в начале или в конце. #108177 (Groene AI).
- Повышена производительность
replaceAll и replaceRegexpAll, когда шаблон — один символ, а замена — тоже один символ (например, replaceRegexpAll(s, ' ', '_')). Такие замены больше не меняют структуру строки, поэтому теперь столбец копируется один раз, а совпадающие байты переписываются на месте вместо выполнения отдельного цикла поиска для каждого совпадения. #108178 (Groene AI).
- Улучшена производительность функции
pointInPolygon при работе с константным многоугольником. Кэш предварительно обработанных многоугольников теперь использует в качестве ключа исходные константные аргументы, поэтому константный многоугольник разбирается только один раз (при cache miss), а не заново для каждого входного блока. #108184 (Groene AI).
- Ускорен разбор канонического представления даты и времени
YYYY-MM-DD hh:mm:ss в режиме best-effort (date_time_input_format = 'best_effort', cast_string_to_date_time_mode = 'best_effort'), который используется по умолчанию. Это устраняет регрессию производительности разбора, появившуюся после переключения этих значений по умолчанию с basic на best_effort. #108187 (Groene AI).
- Исключено ведение счётчиков селективности в
system.predicate_statistics_log на пути чтения MergeTree, когда эта возможность отключена (predicate_statistics_sample_rate = 0, значение по умолчанию). Это убирает атомарное обновление на гранулу и O(rows) popcount фильтра при каждом чтении, устраняя регрессию производительности, наиболее заметную на AArch64. #108190 (Groene AI).
- Ускорен разбор чисел с плавающей запятой из текста при
precise_float_parsing = 1, так что он стал не медленнее, а на большинстве входных данных даже быстрее парсера по умолчанию. Также обновлена включённая в поставку библиотека fast_float до v8.2.10. #108205 (Raúl Marín).
- Для функций кодирования и декодирования base64 теперь используется библиотека
simdutf, что повышает их производительность. #108333 (Konstantin Bogdanov).
- Оптимизирован
DISTINCT для дорогих ключей с высокой кардинальностью. #108366 (Nihal Z. Miaji).
- В сборках не для Linux (macOS и FreeBSD) jemalloc больше не очищает грязные страницы слишком активно (один системный вызов
madvise на каждый free); теперь, как и в Linux, используется фоновый поток очистки с конечным dirty_decay_ms. Это значительно ускоряет рабочие нагрузки с интенсивным выделением памяти, такие как рекурсивные CTE (~2x в бенчмарке рекурсивных CTE на macOS), при пренебрежимо малом влиянии на RSS. #108430 (Alexey Milovidov).
- Ускорено планирование запросов в анализаторе для выражений, которые ссылаются на один и тот же алиас
WITH или многократно повторяют одно и то же подвыражение (например, глубоко вложенные цепочки if/multiIf), за счёт отказа от повторной сборки общих подвыражений при построении DAG действий. #108523 (Dmitry Novik).
- Runtime filters теперь строятся по ключам равенства, даже если предложение
ON также содержит предикаты неравенства, что уменьшает число строк, попадающих в hash join, для JOIN, сочетающих условия равенства и неравенства. LEFT ANTI JOIN не затронут. #108579 (Antonio Álvarez Caballero).
- Глобально включён
-fno-math-errno во всей кодовой базе, что позволяет компилятору лучше оптимизировать математические функции. #108628 (Nikita Taranov).
- Порог software-prefetch для hash tables агрегации и JOIN снижен с
4 * L2 cache size до L2 cache size, чтобы prefetch включался, как только hash table перестаёт помещаться в L2. Это устраняет регрессию для GROUP BY и JOIN на hash tables среднего размера (~1-8 MiB) на платформах с большим заявленным L2 (например, AArch64 с L2 на 2 MiB). #108655 (Groene AI).
- Повышена производительность оконных функций. Оконные запросы к широким таблицам с
SELECT * теперь потребляют значительно меньше памяти и выполняются быстрее. Оконные агрегатные функции, включая quantile*, uniq* и groupArray, работают быстрее с OVER () и OVER (ORDER BY ... RANGE ...). Функция cume_dist тоже ускорена, а окна с PARTITION BY или ORDER BY теперь лучше работают на столбцах с большим количеством повторяющихся значений. #108688 (Nihal Z. Miaji).
- Ускорен анализ запросов с большим количеством или очень длинными цепочками сравнений через
AND: оптимизация optimize_and_compare_chain теперь ограничивается бюджетом вычислений (новая настройка optimize_and_compare_chain_max_hash_work) вместо хеширования значительной части дерева запроса, а при разрешении lambda-выражений больше не пересчитываются хеши тел lambda для защиты от рекурсии. #108757 (Alexey Milovidov).
- Исправлена регрессия производительности при многопоточном чтении столбцов
JSON/Dynamic: получение значения настройки input_format_binary_max_type_complexity для каждого значения приводило к конкуренции за счётчик ссылок в общем контексте запроса, из-за чего параллельные чтения фактически сериализовались; теперь значение настройки кэшируется отдельно в каждом потоке. #108797 (Seva Potapov).
- Исправлена регрессия производительности (появившаяся в #71781), из-за которой чтение множества небольших файлов из объектного хранилища через
s3 и другие табличные функции переставало использовать prefetching и возвращалось к синхронным чтениям, что заметно замедляло однопоточные чтения и чтения с низким параллелизмом при работе с большим количеством мелких файлов. #108872 (Nikita Fomichev). Начальный prefetch для небольших объектов теперь также выполняется, когда чтение из объектного хранилища идёт через файловый кэш (filesystem_cache_name), поэтому чтение множества небольших файлов (например, при ингестии S3Queue) с включённым кэшем больше не является синхронным и ограниченным задержками. #109478 (Nikita Fomichev).
- Разбор глубоко вложенных литералов массивов и кортежей теперь выполняется за линейное, а не за квадратичное время. #108892 (Alexey Milovidov).
- Снижены накладные расходы из-за конкуренции за блокировки в алгоритме JOIN
parallel_hash. #108938 (Hechem Selmi).
- Ускорена работа
estimateCompressionRatio для столбцов с кодированием T64 за счёт аналитического вычисления сжатого размера вместо фактического сжатия. #109054 (Raufs Dunamalijevs).
- Устранено однопоточное узкое место на этапе shuffle в распределённых планах выполнения запросов: теперь каждый входящий stream независимо распределяет свои строки по бакетам назначения, вместо того чтобы пропускать весь поток данных через одно преобразование. #109206 (Alexander Gololobov).
- Снижено потребление CPU сервером Keeper в режиме простоя. #109255 (Michael Kolupaev).
- Ускорены сериализация и слияние столбцов
JSON, чьи общие данные содержат много разрежённых path: при flattening общих данных в отдельные столбцы по path устранено посрочное сканирование всех накопленных столбцов path, а пропуски теперь заполняются пакетно вместо вставки значений по умолчанию по одной ячейке за раз. #109341 (Groene AI).
- Снижены накладные расходы CPU на вычисление выражений для queries с большим количеством столбцов (например, при векторном поиске по столбцу
QBit с малым stride, когда каждый вектор разворачивается в сотни битовых подстолбцов, которые затем передаются в один вызов *DistanceTransposed). #109380 (Alexey Milovidov).
- Повышена производительность H3 Geo-функций (
h3ToGeoBoundary, h3ToGeo, h3CellAreaM2/h3CellAreaRads2, geoToH3) за счёт совместного вычисления пар sine/cosine и устранения избыточных тригонометрических вызовов при преобразовании координат. Результаты не изменились (побитово идентичны). #109399 (Alexey Milovidov).
- До 7 раз повышена производительность сравнений (
<, >, <=, >=) для широких целочисленных типов (Int128, UInt128, Int256, UInt256 и типов на их основе, таких как Decimal128), а также преобразования целых чисел со знаком в Int256 (до 7 раз на данных со смешанными знаками) за счёт устранения ветвлений в коде сравнения и знакового расширения. #109474 (Manuel).
- Оптимизированы
uniqCombined (включая случай aggregation без keys) и uniqHLL12. #109794 (Anton Popov). #109831 (Anton Popov).
- Функции
arraySort и arrayReverseSort работают в несколько раз быстрее на числовых массивах (включая Decimal и DateTime64) при вызове без lambda. #109832 (Manuel).
- Ускорены
addDays, addWeeks, subtractDays и subtractWeeks для значений DateTime и DateTime64 в часовых поясах с фиксированным смещением (например, UTC) за счёт использования быстрого арифметического пути. #109836 (Manuel).
- Оптимизирован анализ text index. #109886 (Anton Popov).
- Распараллелена обработка несоединённых строк в join algorithm
parallel_hash ещё в двух случаях: при наличии остаточного filter и в случае малых join keys (одноуровневая хеш-таблица). #110008 (Hechem Selmi).
- Ответы встроенного web UI (Play UI, панели мониторинга и обработчики статических файлов) теперь сжимаются в соответствии с header
Accept-Encoding клиента с использованием zstd, gzip, deflate, brotli, lz4, xz, snappy или bzip2. Например, страница /play уменьшается с ~350 КБ в несжатом виде до менее 120 КБ при использовании zstd, что сокращает время загрузки на медленных соединениях. Уже сжатые Response остаются без изменений, а для корректного разбиения CDN и cache по вариантам выдаётся Vary: Accept-Encoding. #110108 (Sayantanu Dey).
- Теперь фильтр можно проталкивать ниже оконной функции или
LIMIT BY, когда это безопасно: предикат, заданный над ними (внешний WHERE вокруг подзапроса или конъюнкт в QUALIFY), который ссылается только на столбцы PARTITION BY окна или только на столбцы ключа LIMIT BY (для LIMIT n BY при n >= 1 и без OFFSET), теперь опускается до уровня хранилища и позволяет задействовать отсечение по первичному ключу и партициям, индексы пропуска данных и проекции. Например, SELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x' больше не читает всю таблицу и не вычисляет оконную функцию для неё целиком. #110114 (Groene AI). #110116 (Groene AI).
- При
join_use_nulls = 1 WHERE, отбрасывающий NULL и ссылающийся на столбцы с обеих сторон внешнего JOIN (например, WHERE l.k = 42 AND r.k = 42), теперь преобразует JOIN в INNER (или LEFT/RIGHT) и позволяет выполнять отсечение по первичному ключу, как и при join_use_nulls = 0. Ранее в этом случае такое преобразование не выполнялось, и обе таблицы читались целиком. #110121 (Groene AI).
- Функции с одним неконстантным аргументом
Nullable теперь используют общую с результатом null map аргумента вместо выделения и слияния новой. #110151 (Manuel).
- Убрано одно выделение памяти в куче на каждую проверку гиперпрямоугольника при анализе индекса первичного ключа, что ускоряет фильтрацию по меткам на 5–26% в зависимости от структуры запроса. #110153 (Manuel).
- Повышена производительность функций
arrayMin и arrayMax для числовых массивов примерно в 1,3–1,5 раза за счёт векторизованной редукции вместо цикла посэлементного сравнения. #110163 (Manuel).
- Векторизована декомпрессия кодека
Delta. Декодирование теперь выполняется в 1,5–5 раз быстрее для 8-/16-/32-битных типов данных, что ускоряет сканирование столбцов, сжатых кодеком Delta, до 20%. #110189 (Manuel).
- Ускорены string search functions (
like, position, match, countSubstrings, hasToken и т. д.) для столбцов Enum с константной искомой строкой: теперь поиск выполняется только по уникальным именам enum, а затем результаты сопоставляются со строками, вместо поиска по каждой строке отдельно. #110325 (Alexey Milovidov).
- Ускорены агрегатные функции
groupBitOr/groupBitAnd/groupBitXor и семейство функций для дисперсии (varPop, varSamp, stddevPop, stddevSamp, skewPop, skewSamp, kurtPop, kurtSamp, covarPop, covarSamp, corr) за счёт векторизованной пакетной обработки: ускорение до 4 раз с комбинатором -If при непредсказуемых условиях и до 3 раз для семейства дисперсии без него. #110461 (Manuel).
- Ускорен анализ text index (этап, на котором выбирается, какие гранулы читать): теперь используется поиск по исключению вместо перебора всех гранул, а также исключено создание временного битового массива для каждой проверки диапазона. #110530 (Anton Popov).
- В автоматической оптимизации
PREWHERE теперь учитывается размер подстолбцов Map на диске. Это исправляет регрессию производительности в PREWHERE, появившуюся в #99200. Часть #110462. #110623 (Pavel Kruglov).
- Ускорен разбор значений
UUID из текста (например, JSONExtract в LowCardinality(UUID), toUUID, CAST AS UUID) за счет проверки и преобразования шестнадцатеричных цифр за один проход вместо двух. #110625 (Groene AI).
- Значительно повышена производительность агрегатных функций
timeSeries*ToGrid за счет более быстрых реализаций сортировки и хеш-таблиц. #110875 (Nikita Mikhaylov).
- Запросы вида
SELECT * FROM t WHERE id теперь используют пропуск данных по индексу для столбца id. Закрывает #89222. #89603 (Aditya Chopra).
- Добавлена настройка
query_plan_merge_expression_into_join (включена по умолчанию), которая позволяет объединять шаги вычисления выражений со шагами JOIN при оптимизации переупорядочивания JOIN. Это позволяет переупорядочивать JOIN между подзапросами, оборачивающими JOIN (например, когда JOIN находится внутри подзапроса с вычисляемыми столбцами), что улучшает оптимизацию сложных деревьев JOIN. #98533 (Vladimir Cherkasov).
- Оптимизированы цепочки
AND с несколькими условиями сравнения для одного и того же выражения: обнаруживаются противоречия (например, a < 3 AND a > 5 → false) и удаляются избыточные условия (например, a = 3 AND a < 5 → a = 3). #99736 (Xiaozhe Yu).
- Materialized CTEs, на которые ссылаются из нескольких ветвей запроса
UNION, теперь материализуются один раз и совместно используются всеми ветвями. Ранее каждая ветвь получала собственную копию CTE, которая встраивалась в запрос и вычислялась отдельно. #102107 (Dmitry Novik).
- Потоки в
BackgroundSchedulePool теперь создаются лениво, по мере необходимости, а не все сразу при запуске сервера. Новая настройка сервера background_schedule_pool_initial_size (по умолчанию 16) задает, сколько воркеров создается заранее; при необходимости пул увеличивается до background_schedule_pool_size. Это уменьшает число простаивающих потоков на серверах с низкой нагрузкой. Закрывает #85265. #105066 (Alexey Milovidov).
- Пропускается ненужная загрузка файлов меток для расширенной сериализации общих данных типа
JSON. #107051 (Pavel Kruglov).
- Кэш предварительно обработанных константных полигонов для функции
pointInPolygon теперь общий для всех запросов и потоков и ограничен новой настройкой сервера point_in_polygon_cache_size (по умолчанию 256 MiB, 0 отключает кэш, настройку можно менять во время выполнения). Ранее кэш хранил до max_threads копий каждого предварительно обработанного полигона, неограниченно разрастался при появлении разных полигонов и никогда не освобождался до перезапуска сервера. Его можно очистить командой SYSTEM DROP POINT IN POLYGON CACHE, а текущее использование отображается в system.metrics как PointInPolygonCacheBytes, PointInPolygonCacheCells и PointInPolygonCacheSizeLimit. Закрывает #106393. #107247 (Nihal Z. Miaji).
- Keeper больше не удерживает внутреннюю блокировку снимков во время сериализации и записи снимка на диск или перемещения снимков между дисками, поэтому передача снимков другим узлам и обработка Raft больше не задерживаются из-за локального создания снимка. #107595 (Antonio Andelic).
- Распараллелено фоновое вытеснение файлового кэша (управляется настройками
keep_free_space_ratio). Добавлена новая настройка keep_free_space_eviction_threads для управления параллелизмом, а значение по умолчанию для keep_free_space_remove_batch увеличено со 100 до 250. #108147 (Kseniia Sumarokova).
- Число одновременно подготавливаемых частей при копировании в Azure Blob Storage по схеме read-then-write (используется резервными копиями, когда нативное копирование недоступно) ограничено значением
max_inflight_parts_for_one_file, что предотвращает чрезмерное использование памяти при параллельном копировании большого числа крупных файлов. #108232 (Smita Kulkarni).
- Все три кэша текстового индекса теперь включены глобально — раньше они были включены только внутри запросов. Кроме того, размер кэша списков вхождений теперь равен нулю, что фактически снова его отключает, поскольку списки вхождений велики и их кэширование обходится слишком дорого. #108274 (Robert Schulze).
- Добавлено потоковое сжатие marks в памяти при их загрузке, чтобы уменьшить пиковое потребление памяти. Закрывает #108285. #108325 (Pavel Kruglov).
- Новая настройка файлового кэша
reserve_granularity (по умолчанию 4 MiB) заранее резервирует место более крупными гранулами, снижая конкуренцию за блокировки на горячем пути резервирования пространства файлового кэша. #108369 (Kseniia Sumarokova).
- Уменьшен объём памяти, используемой метаданными файлового кэша (для каждого file segment и каждого ключа). #108477 (Kseniia Sumarokova).
- Запросы к
system.iceberg_history с фильтрами WHERE по столбцам database и table теперь обращаются только к соответствующим базам данных, что может сэкономить время, если на сервере много несвязанных удалённых баз данных. #108492 (Den Kalantaevskii).
- Из файлового кэша удалены лишние блокировки, чтобы снизить конкуренцию за них. #108932 (Kseniia Sumarokova).
- Снижено использование памяти при обработке метаданных
BACKUP и RESTORE. При открытии резервной копии (для RESTORE или в качестве базы для инкрементального BACKUP) метаданные .backup теперь разбираются как поток, а не загружаются в XML-дерево документа в памяти, что для больших (особенно инкрементальных) резервных копий позволяет избежать выделения многогигабайтного DOM-дерева. #109107 (Julia Kartseva). При завершении BACKUP больше не копируются метаданные всех файлов во временный вектор, что для резервных копий с миллионами файлов раньше временно требовало несколько гигабайт памяти. #109861 (Julia Kartseva). При записи записей резервной копии также больше не копируется список метаданных файлов текущего хоста. #111162 (Julia Kartseva).
- Снижено потребление памяти в агрегаторе. #109224 (Konstantin Vedernikov).
- Добавлена поддержка кэша условий запроса для локальных файлов
Parquet, читаемых через движок таблицы File (ранее это поддерживалось только для Объектного хранилища и озёр данных). #109247 (Alexey Milovidov).
- Использование памяти кэшем заголовков текстового индекса снижено в 2–2,5 раза. В кэш помещается больше заголовков частей данных (настройка
text_index_header_cache_size), что уменьшает число чтений с диска для запросов текстового поиска. #109332 (Anton Popov).
- Транспонированные функции расстояния для векторов
L2DistanceTransposed, cosineDistanceTransposed и dotProductTransposed теперь применяют оптимизацию частичного чтения битовых плоскостей к столбцам Nullable(QBit), считывая только запрошенные битовые плоскости вместо всего столбца. #109358 (Alexey Milovidov).
IS NOT DISTINCT FROM и IS TRUE теперь используют первичный ключ и MinMax-индексы для отсечения гранул, как и =. Ранее k IS NOT DISTINCT FROM 42 и (k = 42) IS TRUE сканировали все гранулы. #110006 (Groene AI).
- Соединения из пула больше не проверяются с помощью
Ping перед каждым использованием. Это убирает обмен Ping-Pong, который добавлялся к каждому повторно используемому соединению, уменьшая задержку распределённых запросов и clickhouse-benchmark. Неактуальное соединение в пуле обнаруживается с помощью poll с нулевым тайм-аутом (неблокирующая проверка, не добавляющая лишнего сетевого обмена) и восстанавливается повторным подключением. #110068 (Alexey Milovidov).
- Исправлены ложные переподключения HTTP keep-alive-соединений из пула поверх TLS (HTTPS, S3). Проверка неактуального соединения использовала
poll на сокете, из-за чего активное защищённое соединение с непрочитанной TLS-записью после рукопожатия (session ticket или KeyUpdate) ошибочно определялось как закрытое; теперь используются неблокирующий MSG_PEEK для обычных сокетов и SSL_peek/SSL_has_pending для TLS-сокетов, что также корректно определяет штатное завершение TLS и TLS-запись, пришедшую лишь частично. #110402 (Alexey Milovidov).
- Запросы, ускоренные динамической фильтрацией TopK (
ORDER BY ... LIMIT k), теперь полнее используют кэш условий запроса: кэш заполняется даже тогда, когда к запросу применяется отложенная материализация, и такие запросы могут повторно использовать записи, ранее сохранённые обычным запросом с тем же предикатом WHERE. #110507 (Shankar Iyer).
- Шаблон
LIKE/NOT LIKE без подстановочных шаблонов (%, _) теперь использует точный диапазон первичного ключа, поэтому читает то же количество гранул, что и эквивалентный предикат =/!=, а не более широкий префиксный диапазон. #107077 (Groene AI).
- Исправлено избыточное состязание за блокировки сегментов файлов (регрессия производительности, появившаяся в 26.1) при чтении данных через файловый кэш. #109577 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой индекс пропуска данных, определённый на подстолбцах
Tuple, не использовался, когда к полю обращались через tupleElement(t, 'name'), tupleElement(t, N) или t.N, а полный кортеж также читался в том же запросе (например, SELECT *). Теперь все эти формы отсекают гранулы так же, как и обращение к именованному подстолбцу t.name. #110056 (Groene AI).
- Исправлены медленные запросы
ORDER BY ... LIMIT на таблицах Distributed, когда prefer_localhost_replica выбирает локальную реплику: из плана локального шарда был удалён предварительный limit, который мешал отложенной материализации и динамической top-K-фильтрации. #110136 (Michael Jarrett).
- Исправлена проблема, из-за которой текстовый индекс не использовался для оператора
ILIKE, если индекс был определён по выражению, а не по обычному столбцу (например, assumeNotNull(col) с препроцессором lower(...)): такие запросы читали все гранулы вместо использования индекса. Это закрывает #110350. #110595 (Elmi Ahmadov).
- Снижено состязание за блокировки в файловом кэше: запросы, читающие из кэша, больше не блокируются на блокировке очереди с приоритетами при обновлении LRU-приоритета записи. #109065 (Antonio Andelic).
- Запросы к текстовому индексу, использующие выражение
postprocessor только для фильтрации (например, if(..., '', token)), теперь отбрасывают пустые токены заранее, вместо того чтобы материализовать их построчно, что повышает производительность. #109049 (Elmi Ahmadov).
- Снижено состязание за блокировки в очередях системных логов, что уменьшает хвостовую задержку запросов в нагруженных кластерах. #110539 (Sean Haynes).
- Повышена производительность функций поиска подстроки (
position, countSubstrings, multiSearch*, replaceAll, replaceOne и их регистронезависимых и UTF-8-вариантов) с неконстантной искомой строкой — до 1.5x — за счёт использования SIMD-ускоренных поисковиков строк на пути построчной обработки вместо наивной реализации. #110580 (Raúl Marín).
- Отложенная материализация теперь применяется к запросам
ReplacingMergeTree с FINAL, фильтром и небольшим LIMIT даже без ORDER BY. Столбцы, не нужные для фильтра и слияния FINAL, извлекаются только для строк, оставшихся после limit, что делает такие запросы значительно быстрее, когда они выбирают широкие столбцы с селективным фильтром. Управляется параметрами query_plan_optimize_lazy_materialization и query_plan_max_limit_for_lazy_materialization. #110722 (Nikolai Kochetov).
- Улучшена производительность async insert, когда включена дедупликация и одна операция flush разбивается на несколько партиций: ClickHouse теперь повторно использует вычисленные хеши дедупликации между партициями вместо того, чтобы заново вычислять их для каждой из них. #111150 (Valery Petrov).
- Добавлена настройка
input_format_csv_missing_nullable_as_empty_string (по умолчанию отключена). Когда она включена, отсутствующее значение в столбце Nullable(String) во входных CSV-данных читается как пустой String вместо NULL, независимо от input_format_csv_empty_as_default. #58225 (kevinyhzou). #107577 (Alexey Milovidov).
- Функции
toDateOrNull, toDateTimeOrNull и toDateTime64OrNull теперь принимают целочисленные аргументы всех встроенных целочисленных типов (они интерпретируются так же, как в toDate, toDateTime и toDateTime64, с необязательным аргументом часового пояса) и возвращают NULL для значений вне диапазона результирующего типа. Например, toDateTimeOrNull(1583851242, 'Asia/Shanghai') возвращает 2020-03-10 22:40:42, а toDateTimeOrNull(4294967296) возвращает NULL. #79791 (Jitendra).
- В таблицу
system.grants добавлен столбец is_wildcard, который показывает, использует ли grant сопоставление по префиксу с подстановочным знаком (например, GRANT SELECT ON db*.*). Раньше в system.grants нельзя было отличить grants с подстановочными знаками от точных grants с тем же именем. Закрывает #92835. #98577 (DQ).
- Добавлена поддержка сжатия Snappy в HTTP-интерфейсе (
Accept-Encoding: snappy), а также настройка snappy_mode, позволяющая выбирать между блочным форматом Hadoop Snappy и форматом кадрирования Snappy для общего snappy I/O file/url. #100752 (Alexey Milovidov).
- Добавлена поддержка совместимости со старым analyzer через настройку
analyzer_compatibility_allow_non_aggregate_in_having. Если она включена, неагрегатные условия переносятся из HAVING в WHERE. #104232 (Dmitry Novik).
- Добавлена новая настройка сервера
memory_worker_rss_speculative_reserve_ratio (по умолчанию 1.0), из-за которой глобальный трекер памяти спекулятивно резервирует память сверх наблюдаемого RSS, если рост RSS между выборками опережает учёт трекера. Благодаря этому MEMORY_LIMIT_EXCEEDED для выделений возникает раньше, а kernel OOM-killer срабатывает с меньшей вероятностью. Установите коэффициент в 0, чтобы отключить эту спекуляцию. #104976 (Alexey Milovidov).
- Добавлены опциональные метрики Prometheus для активности вытеснения файлового кэша (
filesystem_cache_evictions_total, filesystem_cache_evicted_bytes_total, filesystem_cache_evicted_segment_hits, filesystem_cache_evicted_segment_size_bytes и их варианты для каждого пользователя с меткой user_id), доступные для каждого кэша через system.dimensional_metrics, system.histogram_metrics и конечную точку Prometheus. Они управляются настройками конфигурации cache disk expose_prometheus_eviction_metrics и expose_prometheus_eviction_metrics_per_user (обе по умолчанию выключены), которые можно переключать во время выполнения через SYSTEM RELOAD CONFIG. #105020 (Sacheendra Talluri).
EXPLAIN [PLAN] actions=1, compact=1, pretty=1 теперь используется по умолчанию. #105036 (Kirill Kopnev).
- Обновлён
delta-kernel-rs (библиотека, лежащая в основе интеграции DeltaLake) до v0.23.0. #105861 (Smita Kulkarni).
- В
clickhouse-disks добавлены команды du и wc. Первая выводит общий размер указанного файла или каталога в байтах, вторая — количество байтов, строк и слов в файле. #106268 (Asya Shneerson).
- Добавлена новая асинхронная Метрика
UntrackedMemory (видна в system.asynchronous_metrics), которая показывает память, уже выделенную потоками, но еще не учтенную в глобальном счетчике отслеживания памяти: каждый поток локально накапливает небольшие выделения и затем сообщает о них одним пакетом. Это помогает объяснить расхождения между MemoryTracking и фактическим использованием памяти процессом. Сообщения об ошибке MEMORY_LIMIT_EXCEEDED теперь также включают объем неотслеживаемой памяти, что упрощает понимание того, почему запрос или сервер достиг лимита памяти. #106386 (Miсhael Stetsyuk).
- ClickStack (UI для обсервабилити) обновлен до версии 2.28.0. #106406 (Aaron Knudtson).
- Добавлена поддержка
BFloat16 в dotProduct, а также повышена производительность за счет пакетной обработки SIMD-пути. #106569 (Nikita Taranov).
- Настройки
max_named_collection_num_to_throw, max_table_num_to_throw, max_replicated_table_num_to_throw, max_view_num_to_throw, max_dictionary_num_to_throw и max_database_num_to_throw теперь можно изменять без перезапуска сервера. #106821 (Maxim Orlovsky).
- Для настройки
s3_storage_class_name добавлена поддержка значений REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, GLACIER_IR и EXPRESS_ONEZONE (в дополнение к STANDARD и INTELLIGENT_TIERING). #107251 (Aditya Kumar).
- Для движка базы данных
MaterializedPostgreSQL добавлена настройка времени создания materialized_postgresql_use_extended_date_and_time_types. По умолчанию (если она включена) столбцы PostgreSQL date/timestamp определяются как Date32/DateTime64; если задать ей значение 0 во время CREATE DATABASE, будут определены более узкие типы Date/DateTime. Эта настройка не применяется к движку таблицы MaterializedPostgreSQL. #107428 (Alexey Milovidov).
- Квантификатор массива
SOME / ALL (expr OP SOME(array) / expr OP ALL(array)) теперь также поддерживает предикаты сравнения по ключевым словам IS DISTINCT FROM и IS NOT DISTINCT FROM, а также строковые предикаты поиска LIKE, ILIKE, NOT LIKE, NOT ILIKE и REGEXP, которые переписываются в arrayExists / arrayAll. #107454 (Alexey Milovidov).
- Исправлена утечка памяти, возникавшая при неудачном открытии базы данных SQLite (например, когда табличной функции
sqlite или движку базы данных SQLite передается путь, который невозможно открыть). #107807 (Alexey Milovidov).
- В Web UI (
play.html) подсказка с сочетанием клавиш для запуска теперь показывает Cmd+Enter на Mac и Ctrl+Enter на других платформах вместо постоянного Ctrl/Cmd+Enter, а часть , +Shift to run all отображается только при наличии нескольких запросов. #107817 (Alexey Milovidov). #108957 (Alexey Milovidov).
- Движок таблицы
Alias теперь поддерживает чтение с параллельных реплик, если целевая таблица относится к семейству MergeTree. #107830 (Kai Zhu).
- Добавлен тип статистики столбцов
uniq_v2 — легковесная альтернатива статистике uniq, основанная на скетче uniqCombined64. #107863 (Han Fei). Тип статистики столбцов minmax объявлен устаревшим, а значение по умолчанию для auto_statistics_types изменено на basic, uniq_v2. #108680 (Han Fei).
- Функции ИИ (
aiGenerate, aiEmbed, aiClassify, aiExtract, aiTranslate) теперь повторяют попытки при временных сетевых сбоях (сбросе соединения, ошибках TLS-подключения, тайм-аутах, недоступности адресов), если задан параметр ai_function_max_retries, что соответствует поведению повторных попыток у табличной функции url. Ранее повторные попытки выполнялись только для HTTP-ответов с ошибками со стороны провайдера. #107927 (Alexey Milovidov).
INSERT в таблицу MergeTree теперь учитывает отмену запроса и max_execution_time при записи большого числа частей, вместо того чтобы потенциально продолжать выполняться еще долго после принудительной остановки. #107929 (Michael Kolupaev).
- В Web UI (
play.html) значок Web Terminal теперь можно открыть в новой вкладке браузера щелчком средней кнопкой мыши или Ctrl/Cmd/Shift+щелчком. #108006 (Alexey Milovidov).
- Генерация SQL с помощью ИИ в клиенте больше не отправляет параметр
temperature, если он не задан явно через ai.temperature в конфигурации. Это исправляет генерацию SQL с помощью ИИ для моделей, которые не принимают параметр temperature. #108014 (Alexey Milovidov).
- В сборки с открытым исходным кодом добавлены таблица
system.masking_policies и интроспекция SHOW MASKING POLICIES. Сами masking policies по-прежнему остаются возможностью ClickHouse Cloud, поэтому в сборках с открытым исходным кодом таблица пуста, но запросы интроспекции больше не завершаются ошибкой. #108030 (Alexey Milovidov).
- Kafka consumer на базе Keeper теперь случайным образом меняет порядок захвата временных блокировок партиций между репликами, что улучшает равномерность распределения партиций и снижает конкуренцию за блокировки. Ранее это перемешивание фактически не работало. #108033 (Alexey Milovidov).
- В Web UI (
play.html) добавлено автодополнение на основе system.completions и SQL-лексера на базе WASM. #108059 (Alexey Milovidov).
clickhouse-client и clickhouse-local теперь показывают подсказки автодополнения по мере ввода (встроенный “призрачный” текст) с наиболее подходящим вариантом, когда курсор находится в конце строки ввода. Наиболее релевантные подсказки (недавно использованные и идентификаторы, уже присутствующие в запросе) показываются первыми. Перемещайтесь с помощью Up/Down (или Ctrl-Up/Ctrl-Down); принимайте одиночную или выбранную подсказку с помощью Tab или Right, а выбранную подсказку — с помощью Enter; Tab также открывает классический список дополнений. Управляется новой опцией --hints (включена по умолчанию; требует --highlight). #108070 (Alexey Milovidov).
- Добавлена поддержка функции
length для типа данных QBit — она возвращает размерность вектора как константу. #108071 (Alexey Milovidov). Также поддерживается CAST из QBit в Array с восстановлением исходного вектора — это преобразование, обратное уже существующему преобразованию из Array в QBit. #108072 (Alexey Milovidov).
- Запросы к REST-каталогам озёр данных (например, OneLake) теперь включают заголовок ClickHouse
User-Agent. #108117 (Konstantin Vedernikov).
arrayFold теперь корректно обрабатывает отмену запроса и max_execution_time. Ранее свёртка по очень длинному массиву полностью выполнялась внутри одного вызова функции и не могла быть прервана, поэтому KILL QUERY и ограничения по времени игнорировались до завершения свёртки. #108192 (Groene AI).
MVTEncodeGeom теперь привязывает геометрию к целочисленной пиксельной сетке перед обрезкой и обрезает полигоны с помощью библиотеки wagyu, поэтому обрезанный результат получается корректным (самопересекающиеся кольца исправляются) и выровненным по границам, как в PostGIS ST_AsMVTGeom. #108248 (Saarthak Gupta).
- Добавлены
ProfileEvents для отдельных фаз подготовки запроса к выполнению: QueryParseMicroseconds, QueryAnalysisMicroseconds, QueryPlanBuildMicroseconds и QueryPipelineBuildMicroseconds. Они показывают, на что тратится время до выполнения запроса (разбор, анализ, построение плана запроса, построение конвейера), и доступны в system.query_log и system.events. #108282 (Jordi Villar).
- Операции
ALTER TABLE, которые привели бы к созданию метаданных таблицы, превышающих max_query_size, теперь отклоняются заранее, что предотвращает ситуации, при которых таблицу не смогут загрузить такие компоненты, как распределение DDL и восстановление реплики. #108283 (Andrew Kravchuk).
- В
system.backups и system.backup_log добавлены столбцы settings и engine_settings. settings показывает настройки резервного копирования/восстановления, запрошенные для операции (например, allow_s3_native_copy, deduplicate_files, structure_only), а engine_settings — настройки, фактически использованные модулями чтения и записи движка резервного копирования (например, настройки S3 request, такие как allow_native_copy, которые могут отличаться от запрошенных после слияния конфигурации конечной точки). Это позволяет увидеть, с какими именно настройками фактически выполнялась операция BACKUP/RESTORE. #108334 (Julia Kartseva).
- В
system.documentation добавлен столбец source, содержащий путь к исходному файлу, где определена документация для каждой сущности. Теперь в этой таблице также документируются кодеки сжатия, profile events, текущие метрики, асинхронные метрики и сами системные таблицы (вместе с их столбцами), а документация настроек теперь включает их тип и значение по умолчанию. #108346 (Alexey Milovidov). Пустое значение настройки по умолчанию теперь отображается как пустая строка, а не как пустые обратные кавычки. #108708 (Alexey Milovidov).
- Добавлена поддержка асинхронного чтения с удалённых реплик (
async_socket_for_remote) в macOS за счёт реализации примитивов polling на основе epoll поверх kqueue. Это позволяет распределённым запросам читать шарды параллельно в macOS, а не последовательно. #108403 (Raúl Marín).
- Добавлена поддержка
BFloat16 в функциях бинарной математики. #108442 (Zhang Yifan).
MergeTree теперь может читать сжатый поток, блоки которого используют разные кодеки. Это необходимая предпосылка на стороне чтения для адаптивного выбора кодека (#105404). #108592 (Raufs Dunamalijevs).
- Автоматическое значение
max_threads и аналогичных настроек теперь отображается в system.settings как auto(8), а не как 'auto(8)'; окружающие одинарные кавычки были давним артефактом, встроенным в само значение. Совместимость между версиями сохранена: прежняя форма в кавычках по-прежнему принимается при разборе настроек, полученных от более старых серверов. #108657 (Alexey Milovidov).
- Несколько улучшений удобства использования веб-интерфейса
/schema: загрузка схемы по Enter, полосы прокрутки с учётом темы, читаемые имена таблиц, согласованная группировка независимых таблиц по базам данных, отсутствие выделения текста при перетаскивании и форма аутентификации в стиле play (Credential Management API, учётные данные, передаваемые через URL, с удалением пароля и проверкой учётных данных в реальном времени). #108724 (Alexey Milovidov).
- Режим отложенного применения posting list для текстового индекса больше не является экспериментальным и может быть выбран с помощью
text_index_posting_list_apply_mode = 'lazy' без allow_experimental_text_index_lazy_apply. Настройка порога плотности была переименована из text_index_density_threshold в text_index_lazy_intersection_density_threshold. #108814 (Anton Popov).
- В
DataLakeCatalog добавлен тип каталога delta_sharing для Iceberg REST-конечной точки Databricks Delta Sharing, у которой плоские пространства имен и которая игнорирует фильтр списка parent. Используйте его вместо catalog_type = 'rest' для таких конечных точек, где иначе SHOW TABLES будет зависать. #108865 (Seva Potapov).
- Добавлена новая опция
clickhouse-client/clickhouse-local --echo-query-separator, которая выводит пользовательский разделитель перед отформатированным эхо запроса, благодаря чему проще отличить введённый запрос от его переформатированной версии. По умолчанию отключена. #108888 (David Meng).
- Улучшения панели баз данных веб-интерфейса: количество таблиц теперь отображается в скобках рядом с именем базы данных, когда она раскрыта. #108891 (Alexey Milovidov). Кнопка обновления рядом с раскрытой базой данных перезагружает список её таблиц. #108958 (Alexey Milovidov). При повторном открытии панели ранее раскрытые базы данных восстанавливаются. #108964 (Alexey Milovidov).
- Теперь в
EXPLAIN WHATIF можно вычислять совокупный эффект skip-index: показывается доля данных для пересечения всех существующих подходящих гипотетических индексов. #108934 (Yarik Briukhovetskyi).
- Исправлен сброс позиции горизонтальной прокрутки результирующей таблицы в веб-интерфейсе при переходе по ссылке в ячейке и возврате на страницу. #108941 (Alexey Milovidov).
MySQL database engine, движок таблицы и table function теперь сопоставляют пространственные типы столбцов MySQL (LINESTRING, POLYGON, MULTILINESTRING, MULTIPOLYGON и обобщённый GEOMETRY) с соответствующими геометрическими типами ClickHouse вместо String. Это поведение управляется новым флагом geometry настройки mysql_datatypes_support_level, включённым по умолчанию. POINT по-прежнему всегда преобразуется в Point. Обобщённый столбец GEOMETRY сопоставляется с универсальным типом Geometry; чтение значения, чей подтип не имеет аналога в ClickHouse (MULTIPOINT, GEOMETRYCOLLECTION), генерирует исключение при чтении. #108944 (Alexey Milovidov).
- Веб-интерфейс (
play.html): полная навигация с клавиатуры — перемещение клавишами со стрелками в панели баз данных и результирующей таблице, доступ с клавиатуры к кнопкам панели инструментов, переключателю темы и меню загрузки, а также видимые контуры фокуса. #108972 (Alexey Milovidov).
- HTTP-интерфейс: если учётные данные переданы одновременно через URL-параметры (
user/password) и заголовок Authorization, приоритет теперь имеют URL-параметры, а не отклоняется запрос. Это исправляет ошибку, из-за которой загрузка результатов из веб-интерфейса (play.html) завершалась сбоем с AUTHENTICATION_FAILED (ошибка 516), когда браузер запоминал Basic credentials. #108980 (Alexey Milovidov).
- Восстановлена настройка
show_data_lake_catalogs_in_system_tables, которая теперь управляет только видимостью DataLakeCatalog в system.tables, system.columns и system.completions. Добавлена настройка show_remote_databases_in_system_tables, включённая по умолчанию, чтобы пользователи могли отдельно скрывать базы данных MySQL и PostgreSQL из этих системных таблиц. #109082 (Pablo Marcos).
- По умолчанию теперь используется точный (максимально близкий к представимому) алгоритм разбора чисел с плавающей точкой, а настройка
precise_float_parsing применяется к входным форматам (CSV, TSV, JSON, VALUES, …) и числовым литералам, а не только к toFloat*/CAST. Установите precise_float_parsing = 0, чтобы вернуть прежнее поведение, которое в некоторых случаях быстрее, но менее точно. Закрывает #60146. Закрывает #74647. Закрывает #68914. #109086 (Raúl Marín).
- Запрос с одним CTE теперь форматируется с теми же переносом строки и отступом, что и запрос с несколькими CTE. Ранее
WITH a AS (...) оставлял CTE на той же строке, что и WITH, тогда как при двух и более CTE WITH размещался на отдельной строке, а каждый CTE — с отступом. #109092 (Groene AI).
- Web UI: если выделенное автодополнение совпадает с уже введённым словом или с тем же словом в другом регистре (например, когда для введённого
hash предлагается HASH), нажатие Right/Tab/Enter больше не переписывает слово и не перехватывается автодополнением — клавиша, как и ожидается, перемещает курсор или вставляет новую строку. #109106 (Alexey Milovidov). #109384 (Alexey Milovidov).
- В Web UI (
play.html) добавлены радужные скобки, подсветка парных скобок, совпадающих идентификаторов и групп цифр — как в clickhouse-client. #109108 (Alexey Milovidov).
- В Web UI клавиши
Tab и Shift+Tab теперь увеличивают и уменьшают отступ у выбранных строк на 4 пробела. #109110 (Alexey Milovidov).
- Web UI: позиция синтаксической ошибки в редакторе запросов теперь подсвечивается красным фоном. Подсветка снимается, как только пользователь возвращает фокус в редактор. #109112 (Alexey Milovidov).
clickhouse-compressor --stat и определение default-codec для старых частей теперь сообщают о повреждённых заголовках блоков как о повреждении, а не как о вводящей в заблуждение ошибке конца файла. #109157 (Raufs Dunamalijevs).
- ClickHouse Keeper теперь учитывает настройку
os_collect_psi_metrics и пропускает сбор PSI-метрик, если она отключена. #109179 (Maxim Orlovsky).
- В Web UI, когда отображаются вкладки запросов, параметры подключения (
host, user, password) теперь скрыты за кнопкой с ключом в правом верхнем углу и показываются по запросу в выпадающем меню. #109243 (Alexey Milovidov).
- Web UI: результат из одного значения (одна строка, один столбец, например
SHOW CREATE TABLE) теперь показывается во всю высоту вместо ограничения тремя строками. #109245 (Alexey Milovidov).
- В Web UI щелчок по таблице на панели баз данных средней кнопкой мыши, с Shift или с модификатором открытия новой вкладки платформы (Cmd в macOS, Ctrl в остальных случаях) теперь открывает запрос к ней в новой вкладке Web UI. #109246 (Alexey Milovidov).
- Для удалённых файлов
Parquet в объектном хранилище кэш условий запроса теперь использует в качестве ключа ETag в дополнение к пути, чтобы перезапись объекта на месте больше не приводила к выдаче устаревших кэшированных результатов. #109310 (Alexey Milovidov).
- В Web UI пустые строки и NULL больше не раскрашиваются в режиме категориальной раскраски. #109342 (Alexey Milovidov).
- В веб-интерфейсе: при нажатии на значок таблицы на панели базы данных теперь отображается список её столбцов со значками типов, полосой размера, пропорциональной compressed size, и всплывающей подсказкой с compressed/uncompressed size и коэффициентом сжатия. #109346 (Alexey Milovidov).
- В веб-интерфейсе: если заголовок вкладки обрезан, при наведении теперь показывается всплывающая подсказка с его полным текстом. #109354 (Alexey Milovidov).
- В веб-интерфейсе: щелчок средней кнопкой мыши по заголовку вкладки (или Ctrl/Shift/Cmd+щелчок) теперь дублирует вкладку. #109357 (Alexey Milovidov).
- В веб-интерфейсе: области итогового прогресса и статистики запроса теперь изменяются равномерно, чтобы при узком окне браузера их содержимое не переносилось некрасиво. #109363 (Alexey Milovidov).
- В веб-интерфейсе: выбранная на панели базы данных теперь используется как база данных по умолчанию для запросов, запускаемых из редактора. #109372 (Alexey Milovidov).
- Добавлена поддержка
reinterpret из Array элементов фиксированного размера в String — обратного преобразования к уже существующему reinterpret из String/FixedString в Array. #109383 (Alexey Milovidov).
- В веб-интерфейсе: переключатели цветового кодирования по столбцам больше не отображаются, если результат содержит не более одной строки. #109385 (Alexey Milovidov).
- Разрешён
CAST между типами QBit, различающимися типом элемента и/или stride, при условии, что размерность остаётся той же (например, CAST(x AS QBit(Float64, N)) из QBit(Float32, N)). Изменения только stride выполняются без потерь; при изменении типа элемента применяется семантика соответствующего преобразования Array (например, при преобразовании Float32 в BFloat16 возможна потеря точности, а accurateCast / accurateCastOrNull отклоняют строки, которые нельзя представить точно). #109387 (Alexey Milovidov).
- Functions
quantizeBFloat16ToInt8 и dequantizeInt8ToBFloat16 теперь также принимают аргументы Array и QBit, применяя кодек Lloyd-Max ко всему вектору (и возвращая Array/QBit с соответствующим типом элемента) в дополнение к уже существующим скалярным перегрузкам. #109398 (Alexey Milovidov).
- В веб-интерфейсе: ссылка Documentation теперь передаёт в URL имя current user. #109419 (Alexey Milovidov).
- Добавлена поддержка
arraySum, arrayAvg и arrayProduct для массивов BFloat16. #109420 (Alexey Milovidov).
- Спецификатор формата MySQL
%f в parseDateTime / parseDateTime64 (и их вариантах OrZero / OrNull) теперь принимает от 1 до 6 дробных цифр, которые интерпретируются как микросекунды с выравниванием влево, как в MySQL STR_TO_DATE, вместо прежнего требования ровно 6. Также исправлено неправильное выравнивание таблиц PrettyCompact в примерах документации встроенных функций. #109421 (Alexey Milovidov).
- Веб-интерфейс: вкладки запросов теперь сохраняются между переключениями — каждая вкладка хранит свой отрисованный результат (включая изображения и диаграммы) и выполняющийся запрос, когда вы переключаетесь на другую вкладку и обратно, а долгие запросы продолжают выполняться в фоне. В заголовках вкладок для запросов теперь показываются спиннер, шкала прогресса и галочка завершения. #109425 (Alexey Milovidov).
- Веб-интерфейс: теперь корректно отображается ошибка, если запрос завершается с ошибкой после того, как часть результата уже была передана потоком, вместо показа клиентской
SyntaxError: Unexpected end of JSON input (или, при http_write_exception_in_output_format, пометки завершившегося с ошибкой запроса как успешного). #109430 (Alexey Milovidov).
- В веб-интерфейс добавлены закреплённые столбцы: столбец можно закрепить из его заголовка, чтобы он оставался видимым (у края экрана), пока таблица результатов прокручивается по горизонтали. #109439 (Alexey Milovidov).
- В расширенной панели мониторинга (
/dashboard) диаграммы для конкретных метрик теперь можно добавлять напрямую по имени метрики в том виде, в каком оно указано в исходном коде или документации, что упрощает добавление нескольких метрик во время сеансов отладки. #109449 (Mikhail Artemenko).
- Веб-интерфейс: исправлено закрытие выпадающего списка настроек соединения при выделении текста мышью и перетаскивании курсора за его границу. #109451 (Alexey Milovidov).
- Веб-интерфейс: при наведении на заголовок столбца таблицы результатов теперь во всплывающей подсказке показываются полные имя столбца и тип, чтобы усечённые заголовки можно было прочитать целиком. #109463 (Alexey Milovidov). Исправлено усечение заголовков столбцов многоточием даже в случаях, когда столбец был достаточно широким, чтобы показать заголовок полностью. #110397 (Alexey Milovidov).
- Добавлена поддержка словарей с кэшем на SSD (layout
SSD_CACHE) и движка таблицы FileLog в сборках для macOS. #109493 (Raúl Marín).
- Веб-интерфейс: при открытии страницы больше не восстанавливаются вкладки с пустыми запросами. #109529 (Alexey Milovidov).
- Исправлены нечитаемые подсказки автодополнения при вводе и слишком яркие цвета в интерактивном клиенте в терминалах, у которых
TERM не содержит 256 (например, Ghostty, kitty, Alacritty, foot): яркие цвета теперь всегда выводятся как коды ярких цветов aixterm вместо отката к полужирному + тёмному цвету, который современные терминалы отображают как тёмный, плохо читаемый цвет на тёмном фоне. #109622 (Alasdair Brown).
- В сборках для macOS включены jemalloc per-CPU arenas и профилирование выделений памяти. #109684 (Raúl Marín).
- Разрешено изменять некоторые настройки аутентификации базы данных каталога озера данных
OneLake с помощью ALTER DATABASE ... MODIFY SETTING. #110019 (alesapin).
- Движок
Hive теперь читает метаданные файлов ORC (индексы min/max, количество строк) с помощью собственного ORC-ридера ClickHouse вместо адаптера ORC из Apache Arrow. #110086 (Alexey Milovidov).
- Размер бинарного файла уменьшен примерно на 10.5 MB за счёт того, что операции сравнения и арифметические операции для редко используемых смешанных пар типов (
Decimal и целое число другой разрядности, а также пары с Int128/UInt128/Int256/UInt256) теперь выполняются через приведение к общему типу, а не через отдельный скомпилированный kernel для каждой комбинации типов. Для пар одинаковых типов, часто используемых пар и ограниченных памятью plus/minus/multiply отдельные kernel сохранены; результаты, типы результатов и исключительные случаи не изменились. #110131 (Alexey Milovidov).
- Подзапрос в правой части
IN, единственный столбец которого представляет собой массив на одну размерность глубже, чем левый аргумент, теперь интерпретируется как множество элементов массива (как литерал массива или функция, возвращающая массив), а не завершается с запутанной ошибкой несоответствия типов. Например, x IN (SELECT groupArray(x) FROM ...) теперь работает. #110169 (Alexey Milovidov).
- Чтение из движка таблицы
SQLite или табличной функции sqlite больше не загружает впустую целое ядро CPU, когда база данных SQLite заблокирована другим соединением. Теперь чтение простаивает в ожидании снятия блокировки и остаётся доступным для отмены. #110248 (Groene AI).
- Значения затраченного времени, скорости и отношения в сообщениях журнала и исключений теперь округляются до трёх цифр, поэтому числа вроде
1.345844286 sec. больше не выводятся с полной точностью. #110277 (Alexey Milovidov).
- В веб-интерфейсе (Play)
BFloat16 теперь распознаётся как число с плавающей запятой, и его столбцы выравниваются по правому краю и соответствующим образом раскрашиваются. #110433 (Alexey Milovidov).
- Добавлена поддержка секции
SETTINGS для движка таблицы PostgreSQL и табличной функции postgresql (например, SETTINGS postgresql_connection_pool_size = 50), что обеспечивает паритет возможностей с движком MySQL. #110614 (Alexey Milovidov).
SHOW CREATE TABLE (а также SHOW CREATE VIEW / SHOW CREATE DICTIONARY) теперь предлагает в сообщении об ошибке таблицу с похожим именем, если запрошенная таблица не существует, так же, как это делают запросы SELECT. #110633 (Alexey Milovidov).
- Настройка
merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_once теперь включена по умолчанию: селектор слияний теперь автоматически уменьшает максимальное число частей, объединяемых за один раз, в зависимости от того, насколько заполнена партиция. См. #91163. #110726 (Mikhail Artemenko).
- Команды очистки PostgreSQL
RESET, UNLISTEN и DISCARD теперь принимаются как операции без действия в PostgreSQL wire protocol, а не завершаются синтаксической ошибкой. Это улучшает совместимость с драйверами, такими как Skunk, которые отправляют RESET ALL и UNLISTEN * при установке и очистке соединения. #110780 (Alexey Milovidov).
- Изменено значение по умолчанию настройки
auto_statistics_types с basic, uniq на basic, uniq_v2. #110878 (Han Fei).
randomHadamardTransform теперь вычисляет точное преобразование с сохранением длины для векторов любой длины, у которой наибольший нечётный множитель не превышает 64 (например, 3584 = 512 * 7, что часто встречается в моделях эмбеддингов), расширяя прежние семейства 2^N, 2^k * {12, 20} и 2^k * 9. Полное преобразование для длины, которую нельзя представить точно, теперь вызывает исключение вместо того, чтобы молча дополнять вектор нулями до большей длины; передайте output_dims, чтобы вычислить усечённую проекцию произвольной длины. #111006 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR при резервном копировании базы данных Replicated, которая одновременно удаляется и создаётся заново; такие резервные копии теперь корректно завершаются ошибкой CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT. #100651 (Alexey Milovidov).
- Теперь, если zip-архив не удаётся распаковать, показывается реальная исходная ошибка (например, когда архив читается из S3, а буфер чтения не поддерживает
seek). Раньше фактическая ошибка скрывалась за общим сообщением Couldn't unpack zip archive: Code = -100 / Couldn't open zip archive. #105103 (Groene AI).
- Исправлена сбивающая с толку подсказка “Maybe you meant X?” после перезапуска сервера (или
DETACH DATABASE/ATTACH DATABASE): при удалении уже удалённой таблицы в качестве альтернативы могло предлагаться только что удалённое имя. #106238 (Groene AI).
- Исправлена логическая ошибка (
Logical error: 'removed', приводившая к аварийному завершению сервера в debug-сборках) в фоновой очереди удаления таблиц; она срабатывала, когда один и тот же явный UUID повторно использовался в нескольких запросах CREATE OR REPLACE TABLE, из-за чего в очередь попадало более одной удалённой таблицы с этим UUID. #107031 (Groene AI).
- Исправлена логическая ошибка
Inconsistent AST formatting, которая могла аварийно завершить сервер в debug- и sanitizer-сборках, если лямбда-выражение с псевдонимом использовалось как операнд оператора доступа (элемент кортежа .N или элемент массива []) не на первой позиции в списке выражений, например SELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t. #107092 (Groene AI).
- Табличная функция cluster (
urlCluster, fileCluster, s3Cluster, …), вложенная в другой распределённый запрос, например clusterAllReplicas(..., urlCluster(...)), теперь отклоняется с ошибкой BAD_ARGUMENTS вместо сбоя с логической ошибкой (Distributed task iterator is not initialized). #107107 (Groene AI).
OPTIMIZE ... DRY RUN, прерванный из-за тайм-аута запроса (max_execution_time с timeout_overflow_mode = 'break'), теперь возвращает TIMEOUT_EXCEEDED вместо логической ошибки, связанной с rows_sources (которая приводила к аварийному завершению сервера в debug/sanitizer-сборках). #107114 (Groene AI).
- Прекращено логирование безвредной ошибки
Net Exception: Socket is not connected при завершении сеанса ZooKeeper на macOS. clickhouse keeper-client больше не выводит эту ложную ошибку в stderr при завершении работы. #107438 (Groene AI).
- Исправлено переполнение знакового целого числа, когда refreshable materialized view повторно пытается выполнить неудавшееся обновление при
refresh_retries, установленном в очень большое значение (близкое к максимуму Int64). Это переполнение могло приводить к аварийному завершению сервера в сборках с sanitizer неопределённого поведения. #108005 (Groene AI).
- Исправлен
LOGICAL_ERROR (аварийное завершение сервера в debug/sanitizer-сборках), возникавший, когда JOIN использует null-safe оператор сравнения (<=> / IS NOT DISTINCT FROM), а один из ключей — скалярный подзапрос, например ... JOIN t2 ON (SELECT x FROM t1) <=> t2.k, при использовании старого анализатора (enable_analyzer = 0). Теперь такой запрос возвращает обычную ошибку NOT_FOUND_COLUMN_IN_BLOCK вместо логической ошибки. #108123 (Groene AI).
- Запросы векторного поиска, выбирающие столбец
_distance, теперь возвращают корректную ошибку вместо сбоя с логической ошибкой. #108423 (Robert Schulze).
- Исправлен
std::future_error (The associated promise has been destructed prior to the associated state becoming ready), который мог возникать и приводить к аварийному завершению сервера в debug- и sanitizer-сборках, если не удавалось запланировать финальную асинхронную задачу завершения multipart upload для S3/Azure (например, при исчерпании пула потоков). Теперь вместо этого сообщается фактическая ошибка планирования. #108730 (Groene AI).
- Устранены чрезмерный вывод логов сервера и слишком большое сообщение об ошибке при компиляции очень большого регулярного выражения (например, шаблона
LIKE или match с сотнями тысяч подстановочных символов); теперь такие шаблоны завершаются с понятной ошибкой CANNOT_COMPILE_REGEXP. #108821 (Raúl Marín).
- Исправлено неопределённое поведение при преобразовании в строку типа пакета протокола вне допустимого диапазона (например, в сообщениях об ошибках
Unexpected packet from server / Received ... packet) при рассинхронизированном или подвергнутом фаззингу соединении. #108885 (Groene AI).
- Исправлена вводящая в заблуждение внутренняя ошибка (
Method getResultType is not supported for TABLE query tree node), возникавшая, когда табличное выражение использовалось как левый аргумент оператора IN; теперь такие запросы выдают понятное сообщение об ошибке. #109412 (Alexey Milovidov).
- Исправлено чтение таблицы Iceberg с файлом метаданных, номер версии которого состоял только из цифр, но выходил за пределы диапазона 32-битного целого числа (например,
v99999999999999999999.metadata.json). Ранее такое имя приводило к неясному std::out_of_range (STD_EXCEPTION) вместо понятной ошибки BAD_ARGUMENTS. #109619 (Groene AI).
- Исправлена возможная ошибка
Logical error: 'ReadBuffer is canceled. Can't read from it.', возникавшая, когда построчный формат ввода (например, TSV/CSV) не мог разобрать входные данные, а базовое чтение уже было отменено (например, из-за некорректного HTTP-чанка или усечённого тела). Построение подробной диагностики разбора больше не читает данные из отменённого буфера. #109708 (Groene AI).
- Фильтрующие выражения в row policy, использующие
arrayJoin (или его алиас unnest), теперь отклоняются с понятной ошибкой; ранее такие policy вызывали логическую ошибку column->size() == num_rows во время выполнения запроса. #109753 (Raúl Marín). #109973 (Raúl Marín).
- Чтение таблицы Paimon, чья схема содержит неподдерживаемый вложенный тип (например, поле
ROW), теперь сообщает понятную ошибку BAD_ARGUMENTS с указанием неподдерживаемого типа вместо простого DB::Exception. (OK) с кодом ошибки 0 и без сообщения. #109762 (Groene AI).
- Исправлен
LOGICAL_ERROR (std::length_error), возникавший, когда запрос с экспериментальной настройкой make_distributed_plan = 1 использовал слишком большое значение distributed_plan_default_reader_bucket_count или distributed_plan_default_shuffle_join_bucket_count. Такие значения теперь отклоняются с ошибкой INVALID_SETTING_VALUE. #109770 (Groene AI).
- Исправлен
LOGICAL_ERROR (query tree node does not have valid source node), возникавший, когда рекурсивный CTE разрешал идентификатор из внешней области видимости как коррелированный столбец (при allow_experimental_correlated_subqueries = 1). Такие запросы теперь возвращают понятную ошибку UNSUPPORTED_METHOD. #109863 (Groene AI).
- Исправлено переполнение знакового целого числа, когда
ORDER BY ... WITH FILL пропускает очень большой промежуток в столбце Int64/UInt64 (например, шаг 2 через промежуток вблизи 2^63). Такое переполнение приводило к неопределённому поведению при использовании sanitizer’ов и молча приводило к переполнению по кругу в release-сборках. #109937 (Groene AI).
- Исправлена логическая ошибка
Bad cast from type DB::FunctionNode to DB::ConstantNode (аварийное завершение server в debug/sanitizer-сборках) при выполнении SELECT ... ORDER BY ... WITH FILL для таблицы Distributed с низким значением optimize_const_name_size. #109938 (Groene AI).
- Исправлена логическая ошибка
Invalid number of rows in Chunk, возникавшая, когда цель INTERPOLATE была псевдонимом столбца WITH FILL при использовании старого analyzer (enable_analyzer = 0). Такие запросы теперь отклоняются с понятной ошибкой INVALID_WITH_FILL_EXPRESSION. #110103 (Groene AI).
- Исправлена логическая ошибка (аварийное завершение server в debug/sanitizer-сборках), возникавшая, когда функциям
indexHint/ignore/isZeroOrNull передавался аргумент, тип которого разрешался в Nothing, например внутри выражений вроде indexHint(assumeNotNull(materialize(NULL))). #110192 (Groene AI).
- Исправлена логическая ошибка
Too large size (...) passed to allocator, которая могла возникать, когда для настройки размера буфера чтения, такой как max_read_buffer_size или max_read_buffer_size_local_fs, задавалось значение вне допустимого диапазона. Такие значения теперь ограничиваются 256 MiB при проверке корректности настроек, а также дополнительно в месте использования для INSERT ... FROM INFILE, который читает файлы внутри клиента ClickHouse, где эта проверка не применяется. #110207 (Alexey Milovidov).
CHECK TABLE теперь сообщает о фактическом повреждении projection part, если не удалось загрузить её metadata, вместо вводящей в заблуждение ошибки Columns doesn't match ... Expected: 0 columns. #110262 (Raúl Marín).
- Несоответствие типов, когда значение, прочитанное из источника PostgreSQL (например, через table function
postgresql или движок таблицы PostgreSQL), не может быть разобрано в объявленный тип столбца (например, столбец text, объявленный как Int32), теперь сообщается как корректная ошибка запроса; ранее это приводило к аварийному завершению server в debug- и sanitizer-сборках. #110264 (Groene AI).
- Добавлена поддержка query profiler, profiler’ов памяти и trace, а также symbolization для
system.trace_log на macOS. #109825 (Raúl Marín).
- Обновлен
chdig до v26.7.1: сжатые трассировки стека для общего доступа, шаблоны запроса, поддержка памяти с раздельными Arena, улучшения Perfetto и исправления совместимости. #110938 (Azat Khuzhin).
- Исправлен некорректный вывод монотонности для
intDiv на беззнаковом ключе, деленном на знаковую константу, из-за которого могло отключаться отсечение по индексу основного ключа для предикатов IN/NOT IN, пересекающих знаковую границу результирующего типа; в отладочных сборках также возникал LOGICAL_ERROR Invalid binary search result in MergeTreeSetIndex. #107586 (Groene AI).
- Добавлена настройка
allow_lossy_numeric_supertype (по умолчанию отключена). Когда она включена, if, multiIf, coalesce, ifNull, array и map для числовых аргументов, у которых нет общего типа без потери точности (например, Decimal и Float64 или Int64 и Float64), приводятся к Float64 вместо Variant, поэтому результат можно использовать с агрегатными функциями, такими как sum, avg, min и max. Соответствующие сообщения об ошибках агрегатных функций теперь упоминают эту настройку по имени. Закрывает #106707. #107236 (Groene AI).
- Конечная точка Prometheus (для конфигураций только с метриками) и асинхронный сбор метрик теперь запускаются до загрузки таблиц, чтобы метрики были доступны во время потенциально долгой фазы загрузки метаданных. #108402 (Christoph Wurm).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка, из-за которой
TRUNCATE TABLE и DROP PARTITION завершались сбоем на таблицах с большим количеством блоков дедупликации: их удаление одним запросом к ZooKeeper могло превысить ограничение jute.maxbuffer по умолчанию в 1 МБ. #105991 (Clayton McClure). Это затрагивает только пользователей Apache ZooKeeper (не рекомендуется) вместо ClickHouse Keeper.
- Исправлена работа с полными именами столбцов (
database.table.column) в предложении WHERE мутаций, таких как DELETE FROM и ALTER TABLE ... UPDATE/DELETE, для таблиц семейства MergeTree; ранее такие запросы завершались ошибкой об отсутствующих столбцах. Закрывает #71760. #109491 (Mikhail Artemenko).
- Исправлен кэш результатов запросов для PromQL-запросов. Диалект
promql обходил проверку недетерминированных функций и мог отдавать устаревшие результаты, привязанные к now(); HTTP API Prometheus (/api/v1/query, /api/v1/query_range) при этом вообще не сохранял записи кэша. #110887 (Nikita Mikhaylov).
- Исправлена ошибка, из-за которой сервер не запускался, если переменная окружения
TZ была пустой. Закрывает #68920. #68921 (Ardenwick).
- Исправлена ошибка, из-за которой сервер не запускался, если движок базы данных
Backup ссылался на ставшую недоступной резервную копию (например, если её файлы были удалены или нижележащее хранилище недоступно). Теперь база данных загружается без таблиц, вместо того чтобы препятствовать запуску всего сервера. #83188 (Vitaly Orlov).
- При использовании фоновых вставок в таблицы с движком
Distributed задержки, вызванные повторяющимися ошибками при отправке данных на удалённые шарды, теперь уменьшаются после устранения этих ошибок. Ранее задержка могла только расти и никогда не сбрасывалась. #87378 (Andrei Kochemirovskii).
- Исправлены
broken_data_files в system.distribution_queue и метрика BrokenDistributedFilesToInsert, которые всегда показывали 0 для повреждённых файлов, обнаруженных при сканировании очереди async-insert движка Distributed при запуске. #92124 (KG.Xu).
- Исправлено восстановление логирования после переполнения диска. Ранее, когда диск для логов заполнялся, ClickHouse переходил в состояние сбоя и непрерывно засорял syslog сообщениями об ошибках (потенциально записывая более 100 ГБ/час), не восстанавливаясь даже после освобождения места на диске. Теперь система логирования автоматически восстанавливается, как только на диске снова появляется место, без необходимости перезапуска сервера. #93127 (jaehanbyun).
- Статические учётные данные S3 теперь передаются при чтении таблиц Unity
DataLakeCatalog, когда vended_credentials отключён, что предотвращает ошибки анонимного доступа к объектному хранилищу. #96910 (kgeg401).
- Исправлен сбой в коде разбора схемы движка таблицы
DeltaLake. #97112 (Kseniia Sumarokova).
- Исправлена проблема безопасности, из-за которой неаутентифицированный TCP-клиент мог проверять существование таблиц и состояние репликации через interserver-порт. #99854 (Shaohua Wang).
- Исправлена синтаксическая ошибка, возникавшая, когда за подзапросом в
DESCRIBE TABLE следует псевдоним. Исправляет #100031. #100205 (Yarik Briukhovetskyi).
- Исправлено Исключение в correlated subqueries, возникавшее, когда outer columns становились
Nullable при group_by_use_nulls с ROLLUP/CUBE. #100365 (Alexey Milovidov).
- Исправлено аварийное завершение server (в сборках с sanitizer) и незаметная потеря данных при запуске table, когда откаченная transactional часть
MergeTree пересекается с committed частью. #100992 (Tuan Pham Anh).
- Исправлен возврат некорректных результатов функцией
indexOfAssumeSorted для столбцов Array(LowCardinality(String)) в таблицах MergeTree. #101771 (Yash ).
- Исправлено некорректное pruning по primary key, когда ключ сортировки table оборачивает столбец
Date в toDateTime (например, ORDER BY toDateTime(date_column)), а запрос фильтрует по исходному столбцу сравнением вида WHERE date_column >= '...'. toDateTime(Date) вызывает overflow для значений Date, выходящих за диапазон DateTime (после 2106-02-07), поэтому сохранённый ключ становится немонотонным; ClickHouse больше не использует pruning по primary key для этой комбинации ключа и предиката, поскольку это могло бы отбросить granules, содержащие подходящие строки. Закрывает #101744. #101814 (Nihal Z. Miaji).
- Исправлено поведение, при котором
intDivOrNull, moduloOrNull и positiveModuloOrNull возвращали 0 вместо NULL, а intDivOrNull и intDivOrZero вызывали исключение вместо возврата NULL / 0, когда деление приводило к исключению с плавающей запятой (деление на ноль или INT_MIN / -1), в том числе для смешанных signed/unsigned argument. #101976 (Yarik Briukhovetskyi).
- Исправлены Исключения
LOGICAL_ERROR при чтении таблиц Iceberg или DeltaLake в редких случаях, таких как concurrent обновления metadata Iceberg или чтение через merge table function поверх таблиц DeltaLake. #102033 (Groene AI).
- Исправлена ошибка, из-за которой исходящие HTTP request (например, функция
aiGenerate, table function url, S3) завершались с No route to host на хостах, у которых объявлены и IPv4-, и IPv6-адреса, когда маршрутизируется только одно семейство адресов. HTTP connection pool теперь переключается на следующий разрешённый адрес, если первый завершается сетевой ошибкой, вместо того чтобы сразу возвращать ошибку уже при самом первом request. #103786 (Alexey Milovidov).
- Исправлено аварийное завершение server во время
RESTORE резервных копий, содержащих таблицы с циклическими dependencies. #103824 (Konstantin Bogdanov).
- Schema inference для столбцов Arrow
time32/time64 (например, SELECT * FROM file(..., 'Arrow')) теперь определяет Time64 вместо DateTime64; всё, что далее зависит от ранее определявшегося типа, после обновления будет видеть новый тип. Кроме того, значения Time/Time64 теперь можно экспортировать в Arrow с выбором подходящего временного типа Apache Arrow в зависимости от precision. Исправляет #104038. #104316 (/bin/cat).
- Исправлена race condition между
ALTER TABLE ... RENAME COLUMN и конкурентным OPTIMIZE TABLE ... FINAL (или любым фоновым merge) в MergeTree, из-за которой данные переименованного столбца могли незаметно заменяться значениями по умолчанию. #104822 (Groene AI).
- Исправлена logical error
Block structure mismatch, возникавшая при конкурентном INSERT, пока выполняется ALTER TABLE ... RENAME COLUMN, в базе данных Atomic с lazy_load_tables = 1 после DETACH DATABASE/ATTACH DATABASE. #104852 (Groene AI).
- Исправлено поведение
groupConcat, когда смешиваются параметрическая форма и форма с двумя аргументами, например groupConcat(',', 2)(x, '/'): параметр, ограничивающий число строк, незаметно игнорировался, поэтому возвращались все строки вместо запрошенного количества; теперь разделитель из второго аргумента корректно переопределяет параметр. #104882 (Yarik Briukhovetskyi).
- Исправлена
LOGICAL_ERROR (Expected one block from input stream), возникавшая в KILL QUERY/KILL MUTATION/KILL PART_MOVE_TO_SHARD/KILL TRANSACTION, когда их WHERE clause содержит подзапрос, вычисляемый для каждой строки, либо когда max_block_size настолько мал, что внутренний SELECT по соответствующей таблице system.* выдаёт более одного блока. #104927 (Groene AI).
- Исправлен
CAST из меньших interval в более крупные, возвращавший неверные результаты (например, CAST(toIntervalSecond(60) AS IntervalMinute) возвращал 0 вместо 1). Закрывает #104986. #105058 (Yarik Briukhovetskyi).
- Исправлена logical error (
Assertion 'row < chunk.getNumRows()' failed) в запросах LIMIT ... WITH TIES, выполняемых с конвейером чтения в порядке сортировки (optimize_read_in_order = 1 и read_in_order_use_virtual_row_per_block = 1). #105102 (Groene AI).
- Исправлена утечка в refreshable materialized views (
MATERIALIZED VIEW ... REFRESH ...): временную внутреннюю таблицу, которую refresh выводил из использования через EXCHANGE TABLES, нельзя было удалить, если её размер превышал max_table_size_to_drop, поэтому каждый последующий refresh создавал ещё одну временную внутреннюю таблицу, увеличивая каталог данных представления, пока не заканчивалось место на диске. Внутренний drop в задаче refresh теперь обходит max_table_size_to_drop и max_partition_size_to_drop; эти защитные ограничения по-прежнему применяются к выполняемому пользователем DROP TABLE самого представления. Закрывает #104900. #105106 (Groene AI).
- Исправлена неожиданная ошибка
DATA_TYPE_CANNOT_BE_USED_IN_KEY в запросах ALTER, которые не изменяют ключ сортировки (изменение settings, comments, codecs, добавление столбца, не входящего в ключ, и т. д.), для таблиц MergeTree, у которых в ключе сортировки используется SimpleAggregateFunction (или другой тип, допустимый только при allow_suspicious_primary_key = 1). #105111 (Groene AI).
- Исправлено обращение к уже освобождённой памяти при запросе столбцов состояния реплик
system.clusters (таких как is_active, unsynced_after_recovery, recovery_time) в момент, когда база данных Replicated удаляется или отсоединяется. Кроме того, безвредные исключения Keeper, которые в этом участке кода ранее подавлялись (затронутая база данных считается временно недоступной и пропускается), теперь записываются в журнал с уровнем Information вместо Error, поэтому при значении по умолчанию send_logs_level = 'warning' они больше не доходят до клиентов. #105149 (Groene AI).
- Исправлена проблема, из-за которой при выполнении нескольких команд в
clickhouse-local --ignore-error в сообщение об ошибке для каждой лексической ошибки или ошибки несогласованных скобок попадали все последующие команды. #105480 (Groene AI).
- Исправлен редкий сбой server, возникавший при одновременном удалении или замене refreshable materialized views и планировании их обновления. #105588 (Groene AI).
- Для таблиц
Iceberg, у которых формат файла данных не Parquet, ALTER TABLE ... DELETE и ALTER TABLE ... UPDATE теперь отклоняются с понятной ошибкой NOT_IMPLEMENTED вместо сбоя server или незаметного повреждения таблицы. #105893 (Groene AI).
- Исправлены неверные результаты для представления, определённого с помощью
EXCEPT или INTERSECT, если его операндом была цепочка UNION, после DETACH/ATTACH или перезапуска server. Форматтер не добавлял скобки вокруг дочерних выражений UNION у INTERSECT/EXCEPT, из-за чего сохранённый SQL повторно разбирался с обратным старшинством. #105935 (Groene AI).
- Исправлено ошибочное определение данных
JSON как TSKV при автоопределении format. Закрывает #100797. #106009 (Pavel Kruglov).
- Запрещено создавать индекс пропуска данных
minmax непосредственно на столбцах JSON — впоследствии это могло приводить к сбою вставки с исключением NO_COMMON_TYPE, когда вставлялись массивы со смешанными типами. Вместо этого создавайте индекс на типизированных подстолбцах (например, INDEX idx json.field TYPE minmax). #106094 (linhaojie).
- Исправлена logical error (
Parsed partition value ... doesn't match partition value for an existing part with the same partition ID), возникавшая при выполнении OPTIMIZE TABLE ... PARTITION ... и других запросов, которые определяют значение партиции, в таблицах с ключом партиционирования типа Time. #106202 (Groene AI).
- Исправлена ситуация, при которой data part ошибочно помечалась как имеющая повреждённую projection после того, как легковесное удаление не оставляло после себя projection part — либо когда projection пересобиралась с нулевым количеством выходных строк, либо когда она удалялась (
lightweight_mutation_projection_mode = 'rebuild'/'drop'). Это состояние ранее отключало оптимизацию projection для запросов к этой part. #106273 (Shaohua Wang).
- Исправлено поведение
removeDirectory на дисках объектного хранилища plain (таких как s3_plain): он удалял все файлы внутри непустого каталога так, как будто удаление было рекурсивным; теперь удаление непустого каталога завершается ошибкой CANNOT_RMDIR, а рекурсивное удаление явно обрабатывает его содержимое. #106281 (RinChanNOW).
- Исправлена logical error (
Part ... doesn't exist), которая могла прервать работу server во время recovery quorum INSERT после аппаратной ошибки Keeper, если quorum одновременно помечался как завершившийся неудачей. #106424 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR из-за дублирующихся имен столбцов при применении политик доступа на уровне строк. #106438 (János Benjamin Antal).
- Исправлено поведение
CREATE OR REPLACE TABLE и REPLACE TABLE, при котором на диске оставалась «зависшая» таблица _tmp_replace_*, а исходная таблица заменялась пустой, если размер существующей целевой таблицы превышал max_table_size_to_drop. Теперь проверка размера выполняется до подмены, поэтому при нарушении операция корректно прерывается, а в сообщении об ошибке используется видимое пользователю имя таблицы. #106782 (Groene AI).
- Исправлено поведение
JSON_QUERY/JSON_VALUE/JSON_EXISTS, которые возвращали Dynamic вместо String/UInt8 для аргументов типа Dynamic. Закрывает #106461. #106877 (Pavel Kruglov).
- Исправлены неверные результаты при запросах к таблице
ReplacingMergeTree с FINAL и фильтром по текстовому индексу, когда был включен query_plan_optimize_lazy_final. Отложенная оптимизация FINAL строила шаги чтения, которые не воспроизводили прямое чтение из текстового индекса, из-за чего фильтр отбрасывал все подходящие строки. #106894 (Jimmy Aguilar Mena).
query_masking_rules теперь применяется к сообщениям, дописываемым к исключениям, чтобы учетные данные, закодированные для URL, в суффиксах (in file/uri ...) ошибок из табличных функций jdbc/odbc не раскрывались при настроенных правилах маскирования. #106916 (Gaurav Dubey).
- Исправлена проблема, из-за которой части помечались как поврежденные и переводились в состояние detached при любой перезагрузке части (перезапуске сервера,
DETACH/ATTACH) для таблиц со столбцом LowCardinality(Nullable(...)) в ключе партиционирования. Начиная с 26.5, для каждой части не записывался файл индекса minmax, если минимальное и максимальное значения такого столбца были NULL, при этом проверка целостности части по-прежнему требовала этот файл. Части, записанные затронутыми версиями, не содержат файл индекса minmax и по-прежнему требуют повторного ATTACH вручную. Закрывает #106837. #106945 (Pedro Ferreira).
- Исправлено исключение
LOGICAL_ERROR (Unexpected expression in JOIN ON section. Expected boolean (UInt8), got 'Nothing'), возникавшее, когда предикат неэквивалентного JOIN ... ON ссылался на столбец типа Nothing, например созданный с помощью ARRAY JOIN []. #106981 (Groene AI).
- Исправлены редкое исключение
LOGICAL_ERROR (Attempt to release query context that does not exist) и сопровождавший его сбой сервера при чтении таблиц MergeTree через диск файлового кэша, созданный с enable_filesystem_query_cache_limit = 1. #107028 (Groene AI).
- Исправлен сбой сервера при перемещении пустой части на диск
plain_rewritable (например, с помощью ALTER TABLE ... MOVE PARTITION ... TO DISK для пустой части, сохраненной из-за remove_empty_parts = 0). #107040 (Groene AI).
- Исправлен неверный порядок строк в запросах
ORDER BY к UNION ALL при включенных optimize_read_in_order и read_in_order_use_virtual_row. Закрывает #106879. #107053 (Vladimir Cherkasov).
- Исправлен
LOGICAL_ERROR (Unsupported argument types) в функции geohashesInBox, возникавший, когда её аргументы координат содержали смесь константных и неконстантных значений или когда координата имела тип BFloat16. Смешанные const/non-const аргументы Float32 теперь работают, а аргументы BFloat16 отклоняются с понятной ошибкой. #107063 (Groene AI).
- Исправлены неверные результаты (дублирующиеся строки) для
SELECT DISTINCT поверх GROUP BY с WITH CUBE, WITH ROLLUP или GROUPING SETS по тем же ключам. Оптимизация query_plan_remove_redundant_distinct больше не удаляет DISTINCT в этих случаях, поскольку модификаторы группировки создают дополнительные строки, в которых столбцы ключа получают значения по умолчанию, и они могут совпадать с реальными значениями групп. #107072 (Groene AI).
- Исправлен неверный результат в
OUTER JOIN, когда фильтр WHERE представляет собой конъюнкцию с константным членом (например, p AND 1 или WHERE p QUALIFY NULL, где QUALIFY NULL объединяется с WHERE). Константная часть конъюнкции могла быть протолкнута в неподлежающую сохранению сторону JOIN и удалена из фильтра после JOIN, из-за чего JOIN создавал несовпавшие строки со значениями по умолчанию в столбцах этой стороны, и эти строки ошибочно проходили фильтр. #107084 (Groene AI).
- Исправлено поведение пользовательских функций
executable_pool, настроенных с <lifetime>, из-за которого они не подхватывали изменения в базовом скрипте. Ранее только SYSTEM RELOAD FUNCTIONS перечитывал изменённый скрипт; периодические перезагрузки по <lifetime> продолжали выполнять старую версию. #107087 (Groene AI).
- Исправлено исключение
LOGICAL_ERROR (Cannot find input column ... on its position in inputs of expression actions DAG) для коррелированного скалярного подзапроса над источником, который дважды проецирует один и тот же идентификатор столбца (например, SELECT number, *), когда correlated_subqueries_default_join_kind = 'left'. #107112 (Groene AI).
- Исправлена гонка данных в глобальном для server сборщике трассировок между worker thread, запускающим свой профилировщик, и остановкой server. #107307 (Groene AI).
- Инкрементные резервные копии больше не сохраняют учётные данные
S3 в локаторе <base_backup> файла метаданных .backup. Резервные копии, созданные с use_same_s3_credentials_for_base_backup = 1 или с явными учётными данными базовой резервной копии, совпадающими с локатором этой резервной копии, сохраняют несекретный маркер и восстанавливаются без дополнительных настроек на этапе восстановления; для резервных копий, созданных с другими явными учётными данными базовой резервной копии или дополнительными аргументами authentication для базовой резервной копии, передавайте их в RESTORE с настройкой base_backup. Резервные копии, созданные старыми версиями со встроенными учётными данными, по-прежнему можно восстановить. #107357 (Pablo Marcos).
- Исправлена ситуация, когда заголовок
CSVWithNames и CSVWithNamesAndTypes содержал меньше столбцов, чем данные, если включена output_format_csv_serialize_tuple_into_separate_columns (по умолчанию). Заголовок (и строка с типами) теперь разворачивает столбцы Tuple в конечные поля с точечными именами (например, t.a, t.b), так что число столбцов в заголовке соответствует данным. Это поведение управляется новой настройкой output_format_csv_header_serialize_tuple_into_separate_columns (по умолчанию 1); её можно установить в 0, чтобы вернуть прежний заголовок с одним именем. #107371 (Groene AI).
- Исправлено чтение таблиц
Iceberg v3, чьи data files Parquet содержат зарезервированные столбцы происхождения строк (например, _row_id); встроенный reader Parquet больше не вызывает ICEBERG_SPECIFICATION_VIOLATION для зарезервированных идентификаторов field, которые не входят в schema table. #107377 (Greg Maher).
- Исправлено редкое аварийное завершение server при остановке (
std::future_error: The associated promise has been destructed prior to the associated state becoming ready), вызванное тем, что запланированная задача удалялась из очереди пула потоков до запуска. #107383 (Groene AI).
- Исправлены движки table и database
MaterializedPostgreSQL: теперь можно реплицировать одну table или database из схемы PostgreSQL, отличной от схемы по умолчанию (materialized_postgresql_schema), в том числе если table с одинаковыми именами существуют в нескольких схемах одной и той же database (раньше они использовали общие публикацию и слот репликации и конфликтовали друг с другом). #107425 (Alexey Milovidov).
- Исправлена остановка репликации всей database в
MaterializedPostgreSQL (с LOGICAL_ERROR: Columns number mismatch), если структура одной реплицируемой table менялась, пока server был недоступен. Теперь пропускается только затронутая table, и ее можно восстановить с помощью DETACH/ATTACH. #107427 (Alexey Milovidov).
BACKUP database MaterializedPostgreSQL больше не зависает навсегда с Table ... were created or changed its definition during scanning, а также теперь действительно сохраняет данные table в резервную копию (это делегируется базовому ReplacingMergeTree), которую затем можно восстановить как автономный ReplacingMergeTree. #107433 (Alexey Milovidov).
- Исправлена регрессия, из-за которой настройка
compatibility = '26.6' (неявно включающая стратегию партиционирования hive) молча принимала {_partition_id} в путях table S3/Объектное хранилище вместо того, чтобы выдавать BAD_ARGUMENTS. #107437 (Lefteris).
- Исправлена утечка памяти во встроенном
mongo-c-driver, которая могла возникать при чтении из MongoDB (например, через словарь MongoDB или table function mongodb), если за retryable-ошибкой чтения следовал неудачный повторный выбор server. #107448 (Groene AI).
- Исправлено Исключение при вставке в table
Iceberg, чьи metadata были созданы external engine и не содержали необязательных массивов snapshots, metadata-log или snapshot-log. Теперь такие вставки завершаются успешно, а не с ошибкой. #107473 (Shaohua Wang).
- Исправлено требование привилегии
ALTER UPDATE для DELETE FROM (легковесное удаление) в дополнение к ALTER DELETE. Теперь пользователь, которому выдана только ALTER DELETE, может выполнять DELETE FROM, как и указано в документации. #107491 (Shaohua Wang).
- Исправлен
NOT_FOUND_COLUMN_IN_BLOCK при чтении файлов, партиционированных Hive, с use_hive_partitioning = 1 и предложением WHERE/PREWHERE, которое фильтрует реальный (не виртуальный) столбец, при этом также выбирается столбец партиции Hive. #107505 (Groene AI).
- Исправлен
LOGICAL_ERROR (Different order of columns in UNION subquery), возникавший, когда старый analyzer (enable_analyzer = 0) читал подмножество столбцов из подзапроса, у которого дочерние элементы UNION представляют собой операции над множествами INTERSECT/EXCEPT. #107511 (Groene AI).
- Исправлено молчаливое преобразование значений
NULL в пустые строки при вставке данных Arrow/ORC в столбец LowCardinality(Nullable(...)). Эта регрессия появилась в 26.5. #107532 (Jimmy Aguilar Mena).
- Исправлена логическая ошибка (
Stream ... variant_discr ... is not found), которая могла возникать при слиянии или чтении части MergeTree, созданной в результате мутации таблицы со столбцом Dynamic. #107562 (Alexey Milovidov).
- Исправлена логическая ошибка (
WhichDataType(const_type).isArray()), возникавшая при анализе первичного ключа, когда pointInPolygon вызывается с константным аргументом-полигоном обёрточного типа, например Variant или Dynamic (например, pointInPolygon((x, y), if(c, [(0, 0), ...], NULL))). #107589 (Groene AI).
- Исправлена логическая ошибка (
Last stored last_written_position in meta file ... is bigger than current last_written_pos) в движке FileLog, которая могла возникать, если отслеживаемый файл удаляли и создавали заново с повторным использованием того же inode. #107617 (Groene AI).
- Исправлено редкое аварийное завершение сервера (
std::future_error: The associated promise has been destructed prior to the associated state becoming ready) при обработке запроса клиента ZooKeeper, когда асинхронный запрос к Keeper отбрасывался во время отправки, например при нехватке памяти. #107647 (Groene AI).
- Исправлен
RESTORE для таблиц ReplicatedMergeTree: части с дублирующимся содержимым из резервной копии теперь сохраняются, а не дедуплицируются молча. #107652 (Pablo Marcos).
- Исправлен runtime join filter, из-за которого для столбцов
JSON могли возвращаться неверные результаты. Закрывает #107646. #107663 (Pavel Kruglov).
- Исправлены некорректные результаты распределённых запросов, выбирающих столбцы
ALIAS с общим подвыражением: столбцы могли смещаться, и значения возвращались не под тем столбцом. #107675 (Vladimir Cherkasov).
- Квоты с ключом
normalized_query_hash теперь учитывают все ресурсы (read_rows, read_bytes, result_rows, result_bytes, execution_time, written_bytes, errors) для каждого шаблона запроса, как и счётчики количества запросов, вместо того чтобы учитывать их в одном общем бакете на пользователя. #107681 (Alexey Milovidov).
- Исправлена логическая ошибка
Block structure mismatch in UnionStep stream (аварийное завершение сервера в debug/sanitizer builds, Code: 49 в release builds), которая возникала, когда соседние ветви в UNION/INTERSECT/EXCEPT различались только условием WHERE, и условие одной из ветвей сворачивалось в константный столбец Const. #107719 (Groene AI).
- Исправлены логические ошибки (
Bad cast), вызванные несогласованным удалением LowCardinality, вложенного в столбцы Variant и Dynamic, например в concat, format и при анализе первичного ключа. Закрывает #107598. #107773 (Pavel Kruglov).
- Исправлен серьёзный перекос в распределении работы при использовании параллельных реплик, когда кластер содержит неактивные реплики (например, устаревшие записи, оставшиеся после автомасштабирования). Такие реплики больше не учитываются координатором чтения, поэтому нагрузка распределяется между активными репликами, а не сваливается на одну из них. #107805 (Alexey Milovidov).
- Исправлено исключение
Not-ready Set is passed as the second argument, которое могло возникать, если при построении множества для подзапроса IN во время анализа primary key сбой происходил без явной ошибки (например, тайм-аут подзапроса с overflow_mode = 'break'), из-за чего множество навсегда оставалось непостроенным в конвейере выполнения запроса. #107924 (Alexey Milovidov).
- Исправлен сбой сервера в predicate pushdown (
enable_optimize_predicate_expression, legacy analyzer), когда подзапрос UNION встречается внутри условия JOIN ... ON. #107930 (Groene AI).
- Исправлены ложные ошибки
CHECKSUM_DOESNT_MATCH и ошибки чтения Parquet (а для некоторых форматов — и незаметно неверные результаты), возникавшие, когда объект S3 или S3-compatible (например, GCS) перезаписывался на месте во время чтения. Теперь такие операции чтения завершаются понятной, retryable ошибкой, а не возвращают данные, сшитые из двух версий объекта; поведение управляется новой настройкой s3_validate_etag_on_read (включена по умолчанию). #107934 (Shaohua Wang).
- Исправлена ошибка
SELECT с NOT_FOUND_COLUMN_IN_BLOCK на таблице с data-skipping индексом set, когда ROW POLICY фильтрует её с помощью всегда истинного условия в сочетании с проверкой по неиндексированному столбцу. #107971 (Shaohua Wang).
- Исправлен parsing параметров команды executable user-defined function: плейсхолдеры с пустыми или недопустимыми именами больше не принимаются как параметры. #107983 (Goutam Adwant).
- Исправлена регрессия производительности для подстолбцов
Map с PREWHERE. Закрывает #107912. Вызвана изменением #99200. #107988 (Pavel Kruglov).
- Исправлена запись за пределы допустимого диапазона при чтении столбца
Variant из повреждённого блока Native, в котором discriminator’ы ссылаются на несуществующий индекс варианта. #107991 (uwezkhan).
- Исправлены неверные query results из-за некорректного pruning по primary key и партициям, когда
toStartOfDay, toStartOfISOYear, toDaysSinceYearZero, toRelativeSecondNum, toRelativeMinuteNum, toRelativeHourNum, toRelativeWeekNum, toRelativeDayNum, toMonthNumSinceEpoch или toYearNumSinceEpoch применяется к key column Date32, содержащему даты вне диапазона, представимого этой функцией (в частности, даты до 1970-01-01). Эти функции сообщают primary index, что они монотонны, но раньше для таких arguments происходило переполнение с циклическим переходом, из-за чего индекс мог отбрасывать granules, которые на самом деле содержали подходящие строки; теперь значения насыщаются на границах типа результата, а сами функции сохраняют монотонность во всём диапазоне Date32. #108018 (Nihal Z. Miaji).
- Исправлен
accurateCastOrNull для Tuple, элемент которого имеет тип Dynamic/Variant: настоящий исходный NULL трактовался как ошибка преобразования. Для целевого элемента Nullable исходный NULL теперь остаётся элементом NULL (как и в случае с обычным источником Tuple(Nullable(...))); для целевого элемента без Nullable исходный NULL теперь делает NULL весь кортеж вместо подстановки значения элемента по умолчанию; ошибки разбора/переполнения по-прежнему делают NULL весь кортеж. #108023 (Groene AI). Также исправлена логическая ошибка при приведении столбца Dynamic или Variant, вложенного в Tuple, к типу элемента без Nullable с помощью accurateCastOrNull или accurateCastOrDefault. #108061 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
numericIndexedVectorPointwiseMultiply возвращала пустой результат при умножении на вектор, полностью состоящий из единиц, но с другой конфигурацией BSI (bit-sliced index). #108027 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
toTime64 и CAST(... AS Time64) не ограничивали выходящие за диапазон значения пределами диапазона Time64 в режимах переполнения saturate и ignore, что могло приводить к появлению значений, которые отображаются одинаково, но сравниваются как разные. #108028 (Alexey Milovidov).
getClientHTTPHeader теперь корректно считается недетерминированным, поэтому его результат больше не переиспользуется по ошибке кешем результатов запросов. #108029 (Alexey Milovidov).
clickhouse-client --port 9440 снова автоматически включает защищённое соединение (TLS); это перестало работать после рефакторинга, из-за которого порт перестал передаваться в проверку защищённого соединения. #108032 (Alexey Milovidov).
- Временная ошибка при обновлении частей данных таблицы только для чтения больше не приводит к полной остановке фоновой задачи обновления. #108034 (Alexey Milovidov).
- Исправлено отставание предупреждений о перегрузке памяти/CPU/мутаций в
system.warnings на один цикл асинхронных метрик (и их отсутствие в первом цикле). #108035 (Alexey Milovidov).
- Табличная функция
mongodb теперь принимает oid_columns, переданный как именованный argument (например, oid_columns='_id'), вместо того чтобы отклонять его с BAD_ARGUMENTS. #108039 (Alexey Milovidov).
- Исправлено Исключение
Bad cast from type DB::ColumnNullable to DB::ColumnVector<...> (логическая ошибка), возникавшее, когда квалифицированная звёздочка (t.*) выбирает ключ JOIN USING, а этот JOIN вложен под PASTE/CROSS/JOIN через запятую или внешний ON JOIN, при join_use_nulls = 0. #108043 (Groene AI).
- Исправлена некорректная обработка утверждений нулевой ширины (
\b, ^, $) в regexp-функциях “match all” extractAll, extractAllGroupsVertical, extractAllGroupsHorizontal, countMatches и splitByRegexp. Например, extractAll('new york is the greatest', '\b(\w)') теперь корректно возвращает первую букву каждого слова, а не каждую букву. #108047 (Alexey Milovidov).
- Исправлено поведение
CREATE TABLE ... AS SELECT в базах данных Atomic, из-за которого после сбоя запроса оставалась пустая таблица — например, когда у пользователя нет доступа к таблице, на которую ссылается подзапрос. Ранее при повторной попытке вместо исходной ошибки сообщалось, что таблица уже существует. Теперь таблица создаётся через временную таблицу и становится видимой только после полного заполнения. #108048 (Alexey Milovidov).
- Разрешено выполнять запросы к словарю
range_hashed или complex_key_range_hashed, использующему диапазон DateTime64, Decimal или диапазон с плавающей запятой, с соответствующим аргументом для dictGet/dictHas. Ранее такие запросы завершались ошибкой must be convertible to Int64, а открытые интервалы диапазонов Decimal/DateTime64 некорректно возвращали значение по умолчанию. #108052 (Alexey Milovidov).
- Исправлено Исключение (
CANNOT_PARSE_TEXT) при загрузке словаря с составным ключом, если столбцы ключа не были первыми в определении словаря, для локального source ClickHouse, использующего явный запрос. Теперь исходные столбцы сопоставляются со структурой словаря по имени, а не по позиции. #108053 (Alexey Milovidov).
- Исправлена ошибка в table function
values, из-за которой возникал ARGUMENT_OUT_OF_BOUND, если использовался десятичный литерал, который нельзя точно представить в узком столбце с плавающей запятой (например, 0.1 для столбца Float32), например: SELECT * FROM values('x Float32', 0.1). Теперь такие значения принимаются и преобразуются в ближайшее представимое значение, как и в CAST и INSERT ... VALUES. #108055 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR (No available columns) при выполнении SELECT count() (или других тривиальных запросов) на таблице, где пользователю предоставлена привилегия SELECT только для столбца ALIAS. #108056 (Alexey Milovidov).
- Исправлено поведение
mapFilter, mapSort (и его вариантов) и mapConcat, из-за которого LowCardinality удалялся из типов ключа и значения у Map. Ранее mapFilter для столбца Map(LowCardinality(String), String) возвращал Map(String, String), что могло повредить метаданные таблицы, созданной через CREATE TABLE ... AS SELECT, и приводить к сбою CHECK TABLE. #108057 (Alexey Milovidov).
- Исправлены некорректные результаты при использовании
hasToken на текстовых индексах с токенизатором, отличным от splitByNonAlpha. #108066 (Robert Schulze).
- Исправлено зависание
SYSTEM RELOAD DICTIONARIES (и RELOAD DICTIONARY), возникавшее, когда множество MySQL-словарей, определённых в XML, использовали один общий пул соединений через share_connection. Теперь такие пулы учитывают connection_pool_size и connection_wait_timeout (по умолчанию 5 секунд) из конфигурации, как и словари, определённые через named collections. #108083 (Alexey Milovidov).
- Разрешён
EXISTS <dictionary> для пользователя, у которого есть только привилегия SHOW DICTIONARIES на словарь (ранее требовался SHOW TABLES). #108084 (Alexey Milovidov).
- Исправлено поведение
CREATE TABLE dst AS src SETTINGS ... (и аналогичных вариантов с ORDER BY/PARTITION BY, но без явного ENGINE), которое молча отбрасывало движок исходной таблицы, секции хранения (например, табличный TTL и ключи) и настройки. Теперь движок и не переопределённые секции хранения наследуются от исходной таблицы, а указанные настройки объединяются с настройками исходной таблицы поверх них. #108085 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
INSERT в таблицы MergeTree завершался сбоем с filesystem error: in rename: Permission denied в файловых системах на базе Windows (WSL, CIFS/SMB, Docker Desktop bind mounts). Причиной было то, что компонент записи part оставлял файловые дескрипторы открытыми во время переименования каталога part. #108089 (Alexey Milovidov).
- Исправлен сбой (разыменование нулевого указателя) при выполнении запроса к таблице
Hive без секции WHERE, например SELECT * FROM hive_table. #108094 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR (“Unexpected return type from if”) при чтении столбца с apply_mutations_on_fly = 1 после ALTER UPDATE col = ... WHERE <cond> с неконстантным или ложным условием, за которым следует ALTER MODIFY COLUMN col <new type>. #108128 (Groene AI).
- Исправлено поведение
toStartOfInterval и dateTrunc, которые возвращали округлённое значение вместо начала содержащего интервала, когда входные данные имели более высокую точность, чем единица интервала. Например, toStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond) возвращал 10:11:12.001 вместо 10:11:12.000. Перегрузка с явно заданной точкой отсчёта тоже была затронута. Закрывает #103535. #108186 (Yarik Briukhovetskyi).
- Скрыта конфиденциальная информация в столбце
view_query таблицы system.query_views_log. #108214 (Valerii Mordovskii).
- Исправлено зависание таблицы
MergeTree, присоединённой с устаревшим индексом пропуска данных hypothesis (удалённый тип индекса, сохранённый только для совместимости с ATTACH). Ранее легковесный DELETE, OPTIMIZE, обычный INSERT или отфильтрованный SELECT для такой таблицы завершались ошибкой ILLEGAL_INDEX (“Index of type ‘hypothesis’ is no longer supported”), а мутация DELETE бесконечно повторялась. Теперь такой индекс считается инертным: он без изменений переносится при merge/мутациях, пропускается при вставке и планировании запросов, и его по-прежнему можно удалить с помощью ALTER TABLE ... DROP INDEX. #108217 (Groene AI).
- Исправлено то, что настройка
type_json_allow_duplicated_key_with_literal_and_nested_object не работала с типизированными путями в JSON. #108218 (Pavel Kruglov).
- Исправлен
LOGICAL_ERROR (Different list of shards in child plans) при выполнении запроса с make_distributed_plan = 1 к таблице MergeTree, у которой есть обычная или агрегатная проекция. #108256 (Groene AI).
- Исправлены
replaceRegexpOne и replaceRegexpAll, чтобы . по умолчанию сопоставлялся с символами новой строки, как и в других функциях регулярных выражений. #108265 (linjiayu1025-collab).
- Исправлена логическая ошибка при приведении
Array(Dynamic) или Array(Variant) к QBit с помощью accurateCastOrNull, например accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI).
- Теперь
index_granularity_bytes учитывается для столбцов состояний AggregateFunction. Ранее ограничение размера гранулы в байтах для таких столбцов игнорировалось (например, для состояний uniqExact в таблицах AggregatingMergeTree и агрегирующих проекциях), из-за чего гранулы получались значительно больше заданного предела, что увеличивало read amplification и расход памяти во время выполнения запроса. #108297 (Groene AI).
- Исправлено двойное вычисление условий в легковесных
UPDATE/DELETE, которое могло приводить к некорректному поведению для недетерминированных условий и лишней работе для детерминированных. Закрывает #86032. #108323 (ofeliacode).
- Исправлено исключение в предопределённом HTTP-обработчике, возникавшее, когда в запросе отсутствовал заголовок, для которого регулярное выражение
headers_regexp допускает пустое значение. #108324 (Vitaly Baranov).
- Исправлена работа
arrayPartialSort с неконстантным аргументом limit. #108327 (Vitaly Baranov).
- Исправлена проблема, из-за которой отменённый или завершённый через
KILL INSERT мог ещё долго продолжать выполняться при построении индекса пропуска данных (например, неограниченного индекса set(0) по столбцу с большим числом уникальных значений). Теперь построение индекса останавливается сразу после отмены запроса. #108351 (Shaohua Wang).
- Исправлена ситуация, когда
SELECT из табличной функции primes не реагировал на отмену: при большом step (или limit) запрос мог ещё долго выполняться после KILL QUERY или тайм-аута. Теперь он останавливается сразу. #108353 (Shaohua Wang).
- Исправлен разбор имён типов данных, содержащих подстроку
INT (например, имени в стиле функции вроде quantileInterpolatedWeighted, используемого в позиции типа данных). Такие имена ошибочно принимались за целочисленные типы MySQL, и их первая группа аргументов (...) незаметно поглощалась как модификатор ширины отображения, что могло нарушать корректность повторного разбора отформатированного запроса. #108354 (Groene AI).
- Исправлена несогласованность, из-за которой некорректный
ARRAY JOIN, за которым следовали запятая и заключённый в скобки список таблиц, ошибочно разбирался как CROSS JOIN вместо того, чтобы быть отклонённым. #108365 (Raúl Marín).
- Скрыты секретные аргументы таких функций, как
encrypt, decrypt и HMAC, в выводе EXPLAIN actions, EXPLAIN header и EXPLAIN PIPELINE, когда format_display_secrets_in_show_and_select отключён (по умолчанию). #108386 (Raúl Marín).
- Исправлена работа
CREATE OR REPLACE для refreshable materialized view с целью TO: ранее операция ошибочно отклонялась, поскольку целевая таблица уже принадлежит заменяемому представлению. #108392 (Nikolay Degterinsky).
- Исправлен сбой сервера (
Received signal 4, illegal instruction), который мог быть вызван некорректным или рассинхронизированным потоком собственного TCP-протокола. Перед разбором исходный адрес, переданный клиентом, теперь проверяется на то, что это числовой host:port, вместо того чтобы позволять нечисловому порту попадать в перехватываемую функцию libc getservbyname. #108410 (Groene AI).
- Исправлен сбой сервера при завершении работы, если при остановке базы данных генерируется исключение (например, когда
flush таблицы упирается в тайм-аут ZooKeeper). Остальная часть последовательности завершения работы больше не пропускается, поэтому системные логи сбрасываются, а их потоки дожидаются завершения через join перед выходом сервера. #108417 (Groene AI).
- Исправлены функции регулярных выражений (
match, extract, extractAll, replaceRegexpOne, replaceRegexpAll и т. д.), которые молча возвращали неверные результаты, если шаблон содержал байт NUL (\0). Теперь NUL обрабатывается как обычный литеральный байт, в соответствии с RE2. #108427 (Alexey Milovidov).
- Исправлено поведение
clickhouse-local, который возвращал пустой ответ на HTTP-запросы OPTIONS, когда http_options_response не настроен, из-за чего веб-интерфейс (/play) показывал соединение как неработающее, хотя запросы выполнялись. #108428 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR (“Invalid action query tree node …”), возникавшее, когда distributed query одновременно выполнял дедупликацию структурно идентичных дубликатов столбцов ALIAS и ссылался на table function с аргументом именованной коллекции в виде key = value (например, oss(s3_conn, filename = '...')). #108435 (Groene AI).
- Исправлен сбой сервера (
LOGICAL_ERROR: 'Unexpected exception in refresh scheduling'), который мог происходить при запуске, когда координируемый refreshable materialized view в базе данных Replicated подключался к Keeper, не поддерживающему флаг возможности MULTI_READ (например, после понижения версии Keeper). Теперь представление корректно останавливается вместо аварийного завершения сервера. #108441 (Groene AI).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK (например, Column _part not found) при выборке virtual columns из таблицы MergeTree в режиме параллельных реплик, в том числе через SELECT * с asterisk_include_virtual_columns = 1. #108451 (Groene AI).
- Для
SYSTEM RESET DDL WORKER теперь требуется новая привилегия SYSTEM RESET DDL WORKER. Ранее любой аутентифицированный пользователь (включая readonly) мог выполнять эту команду и многократно сбрасывать состояние DDL-воркера, блокируя DDL с предложением ON CLUSTER. #108460 (Groene AI).
- Путь к модели для
catboostEvaluate ограничен директорией user_files, как и у table function file и dictionary sources. Ранее функция принимала произвольный путь в файловой системе без проверки ограничения, что позволяло проверять существование файлов вне user_files и инициировать их чтение. Теперь модели должны располагаться внутри user_files. #108463 (Groene AI).
- Для функции
hasColumnInTable теперь требуется привилегия SHOW COLUMNS на целевую таблицу — та же, что нужна для DESCRIBE и SHOW CREATE TABLE. Ранее любой пользователь мог вызывать hasColumnInTable, чтобы проверять имена столбцов и существование таблиц и баз данных без какой-либо проверки доступа. #108464 (Groene AI).
- Исправлено чрезмерное выделение памяти при десериализации специально сформированных состояний агрегатных функций
mannWhitneyUTest, rankCorr, largestTriangleThreeBuckets, quantileGK, sequenceMatch/sequenceCount и groupArrayIntersect. Некорректное состояние могло объявить огромное число элементов и заставить сервер попытаться выделить десятки гигабайт памяти на основе всего нескольких байт входных данных; теперь такие состояния отклоняются с ошибкой TOO_LARGE_ARRAY_SIZE. #108465 (Groene AI).
- Проверяется, что цель перенаправления в ответе S3
301 Moved Permanently соответствует remote_url_allow_hosts (RemoteHostFilter). Ранее обработка 301 в AWS SDK переходила на конечную точку, заданную атакующим в ответе (заголовок Location или элемент <Endpoint>), без проверки хоста, поэтому вредоносный или скомпрометированный S3-compatible сервер мог перенаправить ClickHouse на произвольный хост (SSRF). Для перенаправления 307 эта проверка уже выполнялась; теперь оба варианта работают одинаково. #108466 (Groene AI).
- Исправлена утечка учётных данных: устаревшие настройки
storage_aws_access_key_id, storage_aws_secret_access_key, storage_catalog_credential и storage_auth_header движка базы данных DataLakeCatalog отображались в открытом виде в system.databases.engine_full и SHOW CREATE DATABASE. Теперь они маскируются как [HIDDEN]. #108470 (Groene AI).
- Исправлена идентификация пользователя по
ssl_certificate: одиночный wildcard * теперь соответствует ровно одному компоненту имени (RFC 6125 6.4.3). Ранее wildcard в субъекте CN или DNS: SAN (например, *.corp.example.com) также соответствовал именам с несколькими метками, таким как evil.deep.corp.example.com, что позволяло владельцу сертификата для более глубокого поддомена аутентифицироваться как wildcard-пользователь. Сопоставление URI: SAN не изменилось. #108472 (Groene AI).
- Исправлена SQL-инъекция в протоколе MySQL: аргумент
SHOW TABLE STATUS LIKE и значение SET <mysql_setting>, отправляемое через MySQL interface (порт 9004), теперь разбираются и заново заключаются в кавычки, а не дословно подставляются в переписанный запрос. Также исправлено поведение, при котором KILL QUERY <id> через MySQL interface молча игнорировал многозначные идентификаторы соединений. #108474 (Groene AI).
- Чувствительные значения, передаваемые как параметры строки запроса HTTP (например, привязки query-параметров
param_*, такие как param_secret_key/param_aws_secret_access_key, параметр password или параметры signature в стиле S3), больше не записываются в system.text_log или спаны OpenTelemetry в исходном виде. Строка журнала Request URI теперь маскирует значения параметров, чьи имена выглядят чувствительными, заменяя их на [HIDDEN]. #108475 (Groene AI).
- Конфигурация
http_forbid_headers теперь принудительно применяется при определении схемы для табличной функции url и движка хранения URL. Ранее запрещённый заголовок всё равно отправлялся по сети при определении схемы (например, с форматом Regexp или DESCRIBE), а его тело ответа могло затем попасть в ошибку разбора, раскрывая секреты. Теперь фильтр заголовков проверяется до любого сетевого доступа на пути определения схемы, что соответствует уже существующему поведению urlCluster. #108476 (Groene AI).
- Исправлены неверные результаты при использовании
SELECT ... SAMPLE ... вместе с кэшем условий запроса (настройка use_query_condition_cache, включена по умолчанию). #108488 (Groene AI).
- Исправлен сбой сервера (переполнение стека), вызванный глубоко вложенными выражениями, такими как
[[[ ... ]]] или array(array( ... )), когда для max_parser_depth задано большое значение. #108493 (Raúl Marín).
- Исправлено бесконечное зависание движка таблицы
RabbitMQ при DROP TABLE или остановке сервера, когда брокер закрывает AMQP-соединение из-за пропущенных heartbeat-сигналов без отправки TCP RST. Все блокирующие вызовы цикла событий теперь имеют тайм-аут 30 секунд, поэтому остановка всегда завершается. #108497 (Aly Ayman).
- Вторичные запросы, выполняемые в рамках внутренних запросов, теперь будут логироваться как внутренние запросы. #108506 (Miсhael Stetsyuk).
- Движок таблицы
ArrowFlight и табличная функция arrowFlight теперь учитывают список разрешённых хостов <remote_url_allow_hosts>. Ранее хост и порт соединения не проверялись, поэтому запрос мог обращаться к хостам, отсутствующим в этом списке. #108507 (Groene AI).
- Команды протокола MySQL
COM_FIELD_LIST (mysql_list_fields) и COM_INIT_DB (USE database) теперь применяют то же управление доступом, что и их SQL-эквиваленты (SHOW COLUMNS/DESCRIBE и USE). Ранее они могли раскрывать имена столбцов таблиц, на которые у пользователя были только частичные привилегии на столбцы, а также переключать текущую базу данных без привилегии SHOW DATABASES. #108508 (Groene AI).
http_forbid_headers теперь сопоставляется регистронезависимо. Имена HTTP-заголовков регистронезависимы, поэтому запрет Authorization теперь также блокирует authorization, AUTHORIZATION и другие варианты регистра. Настроенные шаблоны header_regexp теперь тоже сопоставляются регистронезависимо без необходимости явно указывать флаг (?i). #108509 (Groene AI).
- Исправлен сбой сервера (segmentation fault), который мог возникать, когда распределённый запрос ссылался на ещё не материализованный
MATERIALIZED CTE как на внешнюю таблицу, а удалённый источник создавался лениво. #108547 (Groene AI).
- Исправлены неправильные результаты, когда кэш условий запроса (
use_query_condition_cache = 1) повторно использовал исключение меток, полученное из индекса пропуска данных, для запроса, в котором выполнялся другой набор индексов пропуска данных, например с use_skip_indexes = 0, ignore_data_skipping_indices или иным режимом use_skip_indexes_for_disjunctions. Записи кэша, полученные из индекса пропуска данных, теперь привязываются к фактическому набору выполненных индексов пропуска данных. #108548 (Groene AI).
- Исправлено несколько ошибок в
changeYear, changeMonth, changeDay, changeHour, changeMinute и changeSecond с аргументами типа DateTime64: столбец результата создавался с жёстко заданным scale по умолчанию 3 вместо scale аргумента, что приводило к LOGICAL_ERROR (writeSlice expects same column types), когда результат передавался в arrayPushBack/arrayPushFront/arrayConcat; входные данные с наносекундной точностью (scale 9) вызывали DECIMAL_OVERFLOW; а входные данные с долями секунды до эпохи возвращали неправильную календарную секунду. Также исправлено поведение timeSlots для DateTime64: ранее функция игнорировала scale необязательного аргумента Size в объявленном return type и возвращала неправильные временные метки для максимального scale в Size. #108551 (Groene AI). #108681 (Takumi Hara). #108994 (Groene AI).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когда составному предикату назначался псевдоним в GROUP BY, а затем на него снова ссылались при включенном enable_identifier_resolve_cache (по умолчанию). #108553 (Groene AI).
- Исправлена логическая ошибка (
Equal values are not contiguous within the range assumed to be sorted), возникавшая при выполнении DISTINCT поверх чтения STREAM (SELECT DISTINCT ... FROM table STREAM). Оптимизации чтения в порядке сортировки больше не применяются к чтениям STREAM, которые выдают строки в порядке коммитов, а не в порядке ключа сортировки. #108568 (Groene AI).
- Исправлены случаи, когда проекции возвращали типовое значение по умолчанию для столбца’а (например,
0) вместо объявленного значения DEFAULT (например, -1) в двух ситуациях: при чтении столбца, добавленного через ALTER TABLE ... ADD COLUMN ... DEFAULT после создания проекции (чтение из базовой таблицы уже работало корректно), и после истечения TTL столбца в части Wide. #108569 (Shaohua Wang). #109013 (Shaohua Wang).
- Исправлена ошибка
ReadBuffer is canceled. Can't read from it., которая могла возникать при повторной попытке загрузки в S3 (например, резервной копии) после временной ошибки чтения. #108573 (Groene AI).
- Исправлено поведение
ATTACH PARTITION ... FROM, из-за которого отклонялись таблицы, чьи первичные ключи эквивалентны, но объявлены по-разному (в одном случае явный PRIMARY KEY, в другом — неявный из ORDER BY). #108590 (Jordi Orihuela).
- Исправлен сбой прямого чтения из текстового индекса, возникавший, когда несколько текстовых индексов были частично материализованы. Исправляет #108530. #108607 (Anton Popov).
- Исправлено раскрытие метаданных, при котором
DESCRIBE loop('db', 'table') и DESCRIBE loop(<inner table function>) обходили проверку доступа SHOW COLUMNS / к источнику, позволяя непривилегированному пользователю читать схему столбцов таблицы. #108624 (Groene AI).
- Исправлен виртуальный столбец
_etag для движков таблиц S3Queue и AzureQueue: он был объявлен, но никогда не заполнялся, поэтому SELECT _etag всегда возвращал пустую строку. Теперь он возвращает ETag объекта, как и движок S3 и табличная функция s3. #108625 (Groene AI).
- Исправлено чтение файлов
Arrow, ArrowStream и основанных на Arrow файлов ORC, у которых столбец временной метки содержит фиксированное числовое смещение UTC (например, +05:30, -08:00, 00:00) или не-IANA-маркер fixed в качестве часового пояса; ранее это приводило к ошибке Cannot load time zone ... (BAD_ARGUMENTS). #108633 (Groene AI).
- Исправлено исключение (
LOGICAL_ERROR: Join is supported only for pipelines with one output port или NOT_IMPLEMENTED: MergeJoinAlgorithm is not implemented for strictness Semi), возникавшее, когда join_algorithm = 'full_sorting_merge' использовался для SEMI/ANTI JOIN, включая JOIN, полученные при декорреляции коррелированного подзапроса EXISTS. Теперь full_sorting_merge отклоняет комбинации strictness/kind, которые не может выполнить, поэтому планировщик переключается на другой включенный алгоритм или сообщает, что JOIN не может быть выполнен. #108658 (Groene AI).
- Исправлено переполнение буфера кучи при построении text index с
positions = 1 на множестве различных коротких токенов. #108659 (Groene AI).
- Запрос, читающий из S3 или записывающий в S3, который отменяется (например, через
KILL QUERY) во время выполнения s3 request, теперь помечается как отменённый, а не как сетевая/S3 ошибка, вводящая в заблуждение. В частности, отменённые backup или restore в S3 теперь показывают BACKUP_CANCELLED/RESTORE_CANCELLED в system.backups. #108673 (Julia Kartseva).
- Исправлена ошибка запуска, из-за которой database
DataLakeCatalog, созданная в старой версии (25.12 или ранее) с некорректным auth_header, не могла быть attached после обновления до 26.2 или новее, что не позволяло запустить server. Теперь auth_header проверяется только при CREATE, а при ATTACH каталог создаётся лениво при первом использовании, а не во время запуска, поэтому одна неверно настроенная или недоступная база данных каталога больше не блокирует запуск server. #108674 (Groene AI).
- Исправлена logical error (
Sort order of blocks violated) во время слияния, а также некорректные reads, когда не-nullable элемент LowCardinality столбца Nullable(Tuple(...)) используется как подстолбец (например, как ключ сортировки). #108679 (Groene AI).
- Исправлен возможный crash (use-after-free), когда
SYSTEM FLUSH DISTRIBUTED выполняется одновременно с DROP TABLE для той же Distributed table. #108684 (Groene AI).
- Исправлен crash при декодировании Base64-ключа аккаунта Azure, достижимый через
azureBlobStorage (и связанные Azure table functions и хранилища), когда key не является корректным Base64: байт >= 0x80 вызывал чтение за пределами границ, а любой некорректный байт приводил к undefined behaviour. Некорректные ключи теперь корректно отклоняются. #108716 (Groene AI).
- Исправлена ошибка
NUMBER_OF_COLUMNS_DOESNT_MATCH, возникающая, когда subquery по Distributed table читает два или более столбца ALIAS, разворачивающихся в одно и то же expression (например, a1 String ALIAS toString(x), a2 String ALIAS toString(x)), и результаты этого subquery передаются во внешний запрос, например SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (Groene AI).
- Исправлено поведение
CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE, при котором новая materialized view оставалась не подписанной на свою исходную таблицу, из-за чего молча отбрасывалась каждая строка, вставленная после replace. #108728 (Alexey Milovidov).
- Исправлено Исключение (
Cannot find sharding key column, а в debug- и sanitizer-сборках — аварийное завершение server), возникавшее, когда ключ сегментирования Distributed table представлял собой expression, которое analyzer сворачивал в константу, например if(1, toInt32(id), toInt32(id) + 1), при optimize_skip_unused_shards = 1. #108737 (Groene AI).
- Исправлена logical error (
Bad cast from type DB::ColumnNullable to DB::ColumnString) и возможные неверные результаты при использовании group_by_use_nulls с константным ключом группировки LowCardinality в GROUPING SETS/ROLLUP/CUBE. #108771 (Alexey Milovidov).
- Исправлена проблема, из-за которой отсечение по партициям и первичному ключу незаметно отключалось, если ключевой столбец
LowCardinality(FixedString) (или LowCardinality(Nullable(FixedString))) был обёрнут в функцию в ключе, например PARTITION BY sipHash64(k) % N с WHERE k = 'literal'. В таких запросах сканировались все партиции вместо их отсечения. #108777 (Groene AI).
- Исправлена logical error (аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когда
INSERT ... SELECT через таблицу Alias или в таблицу TimeSeries отменялся без исключения, например при timeout_overflow_mode = 'break'. #108783 (Groene AI). #108796 (Shaohua Wang).
- Исправлена logical error
Bad cast from type DB::ColumnSparse to DB::ColumnString (аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когда groupConcat применяется к Tuple, у которого элемент String хранится в разреженном виде. #108790 (Groene AI).
- Исправлен
TYPE_MISMATCH в mapFilter, mapSort, mapReverseSort, mapPartialSort и mapConcat, когда значение Map содержит вложенный Map с LowCardinality, например mapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y'))). #108798 (Groene AI).
- Исправлена ситуация, когда
insert_quorum = 'auto' не отклонял вставки сразу, если в живых оставалось меньше большинства реплик. Теперь такие вставки сразу завершаются ошибкой TOO_FEW_LIVE_REPLICAS вместо записи локальной части и последующего тайм-аута с UNKNOWN_STATUS_OF_INSERT. #108800 (Gagan Dhakrey).
- Исправлена ошибка, из-за которой строка
WITH TOTALS в JOIN могла содержать значения по умолчанию (например, 0) вместо константных значений из константного подзапроса на одной из сторон JOIN. Неправильный результат появлялся только при некоторых порядках JOIN или при использовании настройки query_plan_join_swap_table. #108807 (Vladimir Cherkasov).
- Исправлена segmentation fault (разыменование нулевого указателя), которая могла возникать, когда завершение работы сервера происходило одновременно с остановкой таблицы
S3Queue/AzureQueue. #108810 (Miсhael Stetsyuk).
- Исправлено аварийное завершение при запуске (
Cannot allocate ThreadStack, EINVAL) в glibc-сборках, работающих на CPU с большим размером стека сигналов (например, Intel Sapphire Rapids / Granite Rapids с ядром с поддержкой AMX), где размер альтернативного стека сигналов не округлялся вверх до величины, кратной размеру страницы. #108813 (Groene AI).
- Исправлена ситуация, когда distributed queries иногда завершались ошибкой
UNEXPECTED_PACKET_FROM_SERVER (expected TablesStatusResponse, got ProfileInfo), если из пула повторно использовалось connection, которое предыдущий отменённый запрос оставил в рассинхронизированном состоянии. #108854 (Alexey Milovidov).
- Исправлена logical error (исключение в release-сборках, аварийное завершение server в debug- и sanitizer-сборках), которая могла возникать при вызове функции с более чем одним аргументом
LowCardinality для distributed таблицы, например concatAssumeInjective((SELECT toLowCardinality('p')), s), используемом в качестве ключа GROUP BY с table function remote. Сообщения были такими: Default functions implementation for LowCardinality is supported only with a single LowCardinality argument или Expected the argument ... to have N rows, but it has M. #108871 (Groene AI).
- Исправлено поведение
reinterpret(x, 'Decimal128(scale)') (а также для целевых типов Decimal32/Decimal64/Decimal256/DateTime64): в некоторых случаях создавался результирующий столбец, у которого внутренняя scale совпадала со scale источника, а не с запрошенной scale целевого типа, если источник и цель имели один и тот же физический тип. Значения были корректны, но объект столбца был структурно несовместим со своим объявленным типом. #108878 (Groene AI).
- Исправлена
LOGICAL_ERROR (New empty part is about to materialize but the directory already exist), которая могла приводить к аварийному завершению server в debug- и sanitizer-сборках, когда операция DROP/DETACH/MOVE/REPLACE PARTITION над таблицей MergeTree выполнялась после того, как предыдущая аналогичная операция была прервана (например, из-за отката transaction или сбоя) и оставила после себя устаревший каталог tmp_empty_<part>. Теперь такой устаревший каталог освобождается и используется повторно вместо завершения с ошибкой. #108879 (Groene AI).
- Исправлено, что ClickHouse Keeper возвращал некорректное значение
dataLength = 0 в Stat ответов Create2, а клиент ClickHouse ZooKeeper не десериализовал Stat из ответов Create2. #108909 (unintended).
- Исправлено поведение
clickhouse-local, который отклонял пустое значение параметра, записанное вплотную к = (например, --format_csv_null_representation=''); теперь он ведет себя так же, как --format_csv_null_representation "" и SET format_csv_null_representation = ''. #108910 (Vismay).
- Исправлена
LOGICAL_ERROR (Inconsistent AST formatting), из-за которой server аварийно завершался в debug- и sanitizer-сборках при форматировании data type Tuple, в котором смешаны именованные и неименованные элементы (например, Tuple(a UInt8, UInt16)). #108915 (Groene AI).
- Исправлен segmentation fault при слиянии состояний агрегатной функции
uniqExact с GROUPING SETS, ROLLUP или CUBE и max_threads > 1. #108928 (Raúl Marín).
- Исправлены возможные неправильные результаты или выход за границы при чтении, когда
INSERT откатывается после ошибки в середине пакета (например, в таблицах Buffer, при асинхронных вставках или в движках Kafka/RabbitMQ/FileLog), пока действует отложенная репликация столбцов (enable_lazy_columns_replication). #108935 (Groene AI).
- Теперь
join_any_take_last_row учитывается во всех поддерживаемых путях JOIN на основе хеширования, включая JOIN с автоматическим spilling to disk. #108936 (János Benjamin Antal).
- Исправлен bug в analyzer, из-за которого
FINAL для одной таблицы в JOIN (например, FROM t1 FINAL JOIN t2) ошибочно применялся и к другим соединяемым таблицам, из-за чего такие запросы могли выполняться медленнее. #108979 (Vladimir Cherkasov).
- Исправлен
LOGICAL_ERROR (“Cannot find __grouping_set column in header of MergingAggregatedTransform with grouping sets” или “Chunk info was not set for chunk in MergingAggregatedTransform”), который мог возникать при отключенном analyzer в UNION ALL/INTERSECT/EXCEPT, где в одной ветке используется GROUP BY GROUPING SETS с параллельными репликами, а в другой — FINAL. #109003 (Groene AI).
- Исправлен
LOGICAL_ERROR в автоматическом планировщике параллельных реплик, который мог возникать, когда automatic_parallel_replicas_mode включен, а parallel_replicas_min_number_of_rows_per_replica больше 0. #109011 (Groene AI).
- Исправлено чрезмерное выделение памяти при schema inference формата
MsgPack: поврежденный входной поток, в котором заголовок array/map/string/binary указывает огромное число элементов, больше не приводит к единовременному многогигабайтному выделению памяти и отклоняется как некорректный ввод. Это устраняет состояние out-of-memory в release-сборках (и аварийное завершение allocation-size-too-big при использовании sanitizer). #109019 (Groene AI).
- Исправлено игнорирование
use_client_time_zone для строковых литералов DateTime/DateTime64, интерпретируемых на сервере (асинхронный INSERT, литералы SELECT). Теперь клиент передает свой локальный часовой пояс как session_timezone, когда включен use_client_time_zone, поэтому разбор на стороне сервера соответствует пути синхронного INSERT. #109051 (Groene AI).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK, возникавшая, когда query_plan_optimize_lazy_final включен одновременно с фильтром WHERE, частично перенесенным в PREWHERE (через optimize_move_to_prewhere_if_final). #109073 (Groene AI).
- Исправлена ошибка при использовании квалифицированной звездочки, такой как
b.*, в запросе, где b — это алиас таблицы (или подзапроса/CTE), совпадающий по имени с несоставным столбцом другой таблицы. Такие запросы больше не завершаются ошибкой и корректно выбирают все столбцы b. #109078 (Vladimir Cherkasov).
- Исправлена logical error
Block structure mismatch in JoinStep (аварийное завершение сервера в debug- и sanitizer-сборках), возникавшая, когда коррелированный подзапрос преобразуется в JOIN, а исходное отношение содержит одно и то же имя столбца более одного раза, например WITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM t с correlated_subqueries_default_join_kind = 'right'. #109114 (Groene AI).
- Исправлено зависание, при котором запрос, читающий через файловый кэш, мог продолжать ждать незавершенную загрузку после отмены с помощью
KILL QUERY, а удаление refreshable materialized view или выполнение для нее SYSTEM STOP VIEW, если ее обновление зависло в таком ожидании, приводило к блокировке. #109116 (Murphy).
- Исправлено игнорирование настройки
parallel_view_processing при вставке в таблицу с materialized view — начиная с 25.10, view всегда выполнялись параллельно независимо от этой настройки. #109170 (Antonio Andelic).
- Исправлена несогласованность в парсере: список столбцов
INSERT принимал квалифицированный сопоставитель столбцов, записанный как t.* LIKE '<pattern>' / t.* ILIKE '<pattern>', но отклонял его каноническую форму t.COLUMNS('<regexp>'), из-за чего нарушался round-trip формата запроса (и происходило аварийное завершение сервера в debug- и sanitizer-сборках). #109176 (Groene AI).
- Исправлены немонотонные приращения
ProfileEvents: счётчики NetworkReceiveBytes и AIOWriteBytes могли увеличиваться на отрицательную величину (с переполнением до огромного значения) при тайм-ауте сокета или сбое AIO, а для MemoryOvercommitWaitTimeMicroseconds использовались немонотонные часы. #109180 (Azat Khuzhin).
- Исправлен вывод схемы для форматов
Arrow, ArrowStream, Avro, а также устаревших средств чтения ORC и Parquet, которые возвращали Nullable(Tuple) для nullable-столбцов структур, хотя тип Nullable(Tuple) недопустим (allow_experimental_nullable_tuple_type отключён). DESCRIBE возвращал тип, который CREATE TABLE не принимает, поэтому создание таблицы или вставка данных с использованием выведенной схемы завершались ошибкой Nullable Tuple type is not allowed. #109185 (Nihal Z. Miaji).
- Исправлен неверный результат коррелированных
EXISTS и скалярных подзапросов, когда корреляция присутствует только в проекции подзапроса вместе с некоррелированным предложением WHERE (в этом случае подзапрос мог вычисляться в false / NULL для каждой строки). Исправляет #105760. #109186 (Dmitry Novik).
- Исправлено поведение
CREATE USER ... HOST LIKE 'a', 'b' (и эквивалентного ALTER USER), при котором молча сохранялся только первый шаблон. Теперь все указанные шаблоны HOST LIKE сохраняются в списке разрешённых хостов пользователя. #109187 (Groene AI).
- Исправлено поведение, при котором текстовый индекс, определённый для
mapValues(map) или mapKeys(map), молча не использовался при запросах к таблице через таблицу с движком Distributed и analyzer. Индекс использовался для локальной таблицы и через табличные функции cluster/remote, но при запросе через таблицу с движком Distributed пропускался (и приводил к ошибке INDEX_NOT_USED при force_data_skipping_indices). #109188 (Groene AI).
- Исправлена ложная ошибка
LOGICAL_ERROR (There was an error on <host>: Cannot obtain error message (probably it's a bug)), которая могла аварийно завершить сервер в debug- и sanitizer-сборках при выполнении DDL-запроса для базы данных Replicated, если её узел статуса finished для конкретного хоста в Keeper уже был очищен. #109192 (Groene AI).
- Исправлено поведение, при котором коэффициенты
SAMPLE с exponent, величина которого переполняет Int32 (например, SAMPLE 1e-3000000000), молча обрабатывались как SAMPLE 1. #109197 (Raúl Marín).
- Исправлена проверка доступа для
SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER, которая ошибочно требовала привилегию SYSTEM PREWARM MARK CACHE вместо SYSTEM PREWARM PRIMARY INDEX CACHE. #109198 (Raúl Marín).
- Исправлено падение запросов
ALTER для таблиц MergeTree, созданных с пользовательской настройкой disk (SETTINGS disk = disk(...)). Исправляет #63019. #109199 (Mikhail Artemenko).
- Исправлен сбой сервера при чтении состояний агрегатных функций
cramersV, cramersVBiasCorrected, contingency или theilsU, если они объединяются из оконного контекста (OVER ()) и обычной агрегации через цепочки операций над множествами (EXCEPT, INTERSECT) или вложенные UNION ALL, например с помощью комбинатора -Merge. #109200 (Groene AI).
- Исправлен неверный результат для
ANY JOIN с константным условием ON (например, t1 ANY INNER JOIN t2 ON 1): запрос возвращал полное декартово произведение вместо результата ANY JOIN. #109207 (Vladimir Cherkasov).
- Исправлен сбой сервера при асинхронной вставке с дедупликацией, когда
optimize_on_insert делает вставляемый блок пустым (например, если строки суммируются в ноль в SummingMergeTree). #109229 (Den Kalantaevskii).
- Исправлены
SYSTEM DROP REPLICA и SYSTEM DROP DATABASE REPLICA ... FROM ZKPATH: теперь они отклоняют пустые пути ZooKeeper или пути, состоящие только из корня, на этапе разбора с BAD_ARGUMENTS, направляют вспомогательные пути Keeper в именованный Keeper и канонизируют пути Keeper, чтобы локальные проверки самозащиты не могли ошибочно выбрать не ту реплику или обойти защиту целевой реплики. #109230 (Groene AI).
- Исправлен приоритет настроек S3: теперь блок конечной точки
<s3> с областью действия URL имеет приоритет над верхнеуровневыми значениями <s3> по умолчанию. #109251 (Bharat Nallan).
- Исправлена ошибка, из-за которой значения
DEFAULT для столбца не применялись при INSERT INTO TABLE FUNCTION (например, remote или file) со встроенными данными VALUES, когда сервер сам разбирает встроенные данные (send_table_structure_on_insert_with_inline_data = 0). Явный NULL, вставленный в столбец без Nullable с DEFAULT, превращался в 0 вместо объявленного значения по умолчанию. Теперь это работает так же, как обычный INSERT в таблицу и HTTP-протокол. #109258 (Groene AI).
- Исправлена ошибка
CREATE TABLE ... AS SELECT из s3Cluster (и других кластерных табличных функций, таких как fileCluster/urlCluster), которая приводила к сбою с NOT_FOUND_COLUMN_IN_BLOCK внутри базы данных Replicated. #109266 (Groene AI).
- Исправлено различие в результатах
SHOW TABLES и SELECT ... FROM system.tables для баз данных каталогов озёр данных: таблицы, которые ClickHouse не может читать, теперь последовательно скрываются в обоих случаях. #109273 (Smita Kulkarni).
- Исправлена ошибка, из-за которой слияние таблицы
MergeTree с проекциями при включённой настройке enable_block_number_column или enable_block_offset_column приводило к созданию частей проекции, содержащих лишний столбец _block_number/_block_offset. После этого объединённая часть проекции переставала соответствовать определению проекции и частям проекции, созданным при вставке, поэтому CHECK TABLE и OPTIMIZE ... DRY RUN сообщали о ней как о повреждённой (CORRUPTED_DATA). #109284 (Groene AI).
- Разрешено читать Avro
array из записей {key, value} с двумя полями в столбец ClickHouse Map. Именно такое кодирование Iceberg и Spark создают для MAP<K, V> с ключом нестрокового типа (собственные map в Avro поддерживают только строковые ключи). Ранее такой файл можно было читать как Array(Tuple(key, value)), но не как Map(K, V), что приводило к ошибке Type Map(...) is not compatible with Avro array. #109289 (Groene AI).
- Исправлен сбой сервера при
CREATE HYPOTHETICAL INDEX ... TYPE set (и ngrambf_v1/tokenbf_v1), если обязательный аргумент индекса опущен. Теперь такие операторы отклоняются с понятной ошибкой. #109294 (Groene AI).
- Исправлен
LOGICAL_ERROR (Current component is empty), который мог возникать при операциях мутации, таких как KILL MUTATION, над таблицей MergeTree, хранящей свои метаданные в Keeper, если включена настройка сервера enforce_keeper_component_tracking. #109297 (Groene AI).
- Исправлено чтение временных меток
ORC за пределами примерно 2262 года в столбец DateTime64 с scale меньше 9. Встроенный reader ORC ранее преобразовывал каждую временную метку через фиксированный промежуточный DateTime64(9), что приводило к overflow Int64 на наносекундном масштабе и отклонению таких значений с VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE, даже если запрошенный scale DateTime64 (например, DateTime64(6), как в Iceberg) позволяет представить это значение. Теперь временные метки читаются сразу в запрошенном scale, а date_time_overflow_behavior учитывается, если значение не помещается даже в целевой scale. #109302 (Groene AI).
clickhouse-local, работающий как сервер (после SYSTEM START LISTEN HTTP), теперь обслуживает HTTP-соединения, используя TabSeparated как output format по умолчанию, как и clickhouse-server, вместо интерактивного значения по умолчанию PrettyCompact. Это исправляет подключение к clickhouse-local по HTTP через драйверы, такие как clickhouse-connect. Интерактивная сессия в terminal по-прежнему отображает результаты в формате PrettyCompact. #109362 (Alexey Milovidov).
- Исправлен временный сбой
Code: 499 ... InvalidPart (S3_ERROR) при S3 multipart-загрузках. MinIO может кратковременно сообщать об отсутствии только что загруженной части при CompleteMultipartUpload; теперь для этой ошибки выполняются повторные попытки, как и для уже обрабатываемой NoSuchKey, с ограничением s3_max_unexpected_write_error_retries. #109364 (Groene AI).
- Исправлена ошибка
UNKNOWN_IDENTIFIER при ALTER TABLE ... DROP COLUMN, когда у другого столбца есть выражение DEFAULT или MATERIALIZED, которое определяет и использует встроенный alias. #109374 (Alexey Milovidov).
- Исправлена data race (и вызванный ею редкий crash) при параллельном merge состояний агрегатной функции
uniqExact с двухуровневыми sets, что могло происходить при GROUPING SETS, ROLLUP и CUBE. #109389 (Groene AI).
- Исправлена ошибка (
NOT_FOUND_COLUMN_IN_BLOCK или std::bad_function_call в старых версиях) при выполнении CREATE TABLE ... ON CLUSTER ... AS SELECT, читающего Distributed-таблицу в кластере с двумя или более шардами. #109407 (Alexey Milovidov).
- Исправлены merge для таблиц с
TTL ... GROUP BY (rollup): части, которые уже были полностью агрегированы, могли снова и снова бесконечно планироваться на merge, а таблицы со столбцами MATERIALIZED или с включенными persistent virtual columns обрабатывались некорректно — теперь такие столбцы агрегируются с помощью any. Закрывает #105647. #109410 (Mikhail Artemenko). #109532 (Mikhail Artemenko).
- Исправлено поведение
IN с обычным столбцом типа Array в правом аргументе: ранее выражение могло молча возвращать неверный результат (всегда false) или генерировать исключение; теперь x IN arr ведёт себя как has(arr, x). #109416 (Alexey Milovidov).
- Исправлены ошибки
UNKNOWN_IDENTIFIER в операциях ALTER TABLE (RENAME/ADD/MODIFY COLUMN, а также MATERIALIZE INDEX на таблице с недавно вставленными частями) для таблиц MergeTree с неявным индексом min-max по persistent virtual columns _block_number/_block_offset (включается через add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column). #109428 (Groene AI). #110236 (Groene AI).
- Исправлен
LOGICAL_ERROR в arrayFold для неконстантного аргумента Array(LowCardinality(T)) (например, arrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0))), который завершался ошибкой Arguments of 'plus' have incorrect data types (с аварийным завершением сервера в debug- и sanitizer-сборках). #109462 (Groene AI).
- Исправлено поведение
CHECK TABLE для таблицы ReplicatedMergeTree: корректная часть больше не помечается как повреждённая, если во время проверки возникает временная retryable ошибка ZooKeeper (например, потеря connection); теперь такие ошибки отображаются как retryable ошибка запроса. #109465 (Alexey Milovidov).
- Исправлены segfault в
groupArrayLastMerge и aggregate function largestTriangleThreeBuckets: deserialization состояния агрегатной функции теперь проверяется, поэтому повреждённое состояние больше не приводит к выходу за границы памяти. #109485 (Miсhael Stetsyuk). #109492 (Miсhael Stetsyuk).
- Исправлена ситуация, когда глобальное ограничение
max_rows_in_join / max_bytes_in_join не применялось к join algorithm parallel_hash, из-за чего запрос с join_overflow_mode = 'throw' мог молча завершиться успешно вместо генерации SET_SIZE_LIMIT_EXCEEDED. #109488 (Hechem Selmi).
- Исправлено чтение таблиц Paimon, разбитых на партиции по столбцу
BIGINT, значение которого не помещается в Int32. Такие значения партиции усекались (например, 9223372036854775807 становилось -1), что приводило к неверному пути партиции и завершалось ошибкой файловой системы. #109510 (Groene AI).
- Исправлен crash при чтении таблиц Iceberg с файлами equality delete. Если столбец в файле equality delete допускал NULL, а в схеме таблицы не допускал NULL (или наоборот), значения, прочитанные из файла delete, вставлялись в столбец другого типа через непроверенное приведение (ошибочное смешение типов столбцов), что повреждало столбец и приводило к аварийному завершению сервера. #109551 (Miсhael Stetsyuk).
- Исправлено то, что
connect_timeout, а также тайм-ауты чтения и записи для MySQL не вступали в силу: попытка connection к не отвечающему серверу MySQL могла зависнуть более чем на две минуты даже при connect_timeout = 1, потому что периодические сигналы выборочного профилировщика запросов постоянно сбрасывали внутренний дедлайн poll в клиенте MySQL. #109592 (Shaohua Wang).
- Исправлен
LOGICAL_ERROR (creation_csn is not set while removal_csn is set to 1), который мог возникать, когда нетранзакционный TRUNCATE выполнялся одновременно с незакоммиченной транзакцией, вставившей данные в ту же таблицу. Теперь такой TRUNCATE больше не удаляет части, созданные ещё не закоммиченными транзакциями. #109598 (Tuan Pham Anh).
- Исправлены ошибки
TYPE_MISMATCH при чтении столбцов struct в Parquet, если их физическая nullability отличается от запрошенного типа ClickHouse: не-nullable группа Parquet теперь может читаться как Nullable(Tuple(...)), а нативный reader Parquet теперь может читать физически nullable struct (группу OPTIONAL в Parquet) как Nullable(Tuple(...)). #109615 (Groene AI). #109898 (Groene AI).
- Исправлена незаметная потеря данных, возникавшая, когда после
INSERT ... VALUES в потоке из нескольких запросов шёл завершающий SQL-комментарий (например, VALUES (1) -- comment) при использовании server-side inline parsing для вставок (send_table_structure_on_insert_with_inline_data = 0). Этот комментарий разбирался как данные строки после завершающего ;, из-за чего последующие запросы в потоке молча пропускались. #109643 (Groene AI).
- Исправлен segfault, возникавший, если запрос поступал в короткий промежуток во время остановки server после ошибки при запуске. #109675 (Miсhael Stetsyuk).
- Исправлены устаревшие skip-индексы (
text, bloom_filter и т. д.) и проекции после материализации легковесных обновлений с помощью ALTER TABLE ... APPLY PATCHES. Ранее файлы индексов и проекций, зависящие от столбца, обновлённого через patch, оставались без изменений, поэтому запросы, использующие их, могли возвращать неверные результаты (например, hasToken не находил обновлённую строку, а проекция возвращала устаревшие агрегаты после удаления израсходованной patch part). #109709 (Groene AI).
- Исправлена проблема, из-за которой
system.tables молча пропускала базы данных для пользователей с правами на уровне отдельных баз данных, когда запрос читал только столбцы name/database. Добавленный в 26.2. #109723 (Samay Sharma).
- Исправлен
LOGICAL_ERROR при записи столбца LowCardinality(Time) в формат Arrow с output_format_arrow_low_cardinality_as_dictionary = 1. #109730 (Groene AI).
- Исправлена проблема, из-за которой
ObjectStorageQueue/AzureQueue (и table function azureBlobStorage) молча пропускали object, когда Объектное хранилище возвращало пустую страницу списка вместе с токеном продолжения. Azure Blob Storage ведёт себя именно так (например, когда список пересекает внутреннюю границу партиции), а асинхронный итератор списка воспринимал пустую страницу как конец списка и отбрасывал токен. Теперь он следует токену продолжения. #109761 (Gal Ben Moshe).
- Исправлена ошибка, из-за которой partition pruning не возвращал ни одной строки для таблица Iceberg, партиционированных по столбцу временной метки (
DateTime64). #109764 (Den Kalantaevskii).
- Исправлено исключение
ILLEGAL_COLUMN в функции conv для аргументов FixedString; теперь они корректно приводятся к String. Закрывает #109670. #109771 (hp).
- Функция
getClientHTTPHeader теперь обрабатывает имена заголовков как регистронезависимые в соответствии с RFC 9110; в частности, заголовок authorization теперь отфильтровывается независимо от регистра. Закрывает #103957. #109791 (Mikhail f. Shiryaev).
- Исправлена проблема, из-за которой
max_execution_time (с timeout_overflow_mode = 'throw') иногда вообще не отменял запрос: если внутренний механизм отслеживания тайм-аута уже ждал запрос с более поздним deadline, то запрос с более ранним deadline, зарегистрированный позже, мог быть полностью пропущен и продолжать выполняться намного дольше допустимого времени. #109792 (Shaohua Wang).
- Исправлено имя файла для сжатых gzip файлов метаданных Iceberg. ClickHouse записывал их как
v{N}.gzip.metadata.json (токен HTTP Content-Encoding), тогда как спецификация Iceberg ожидает расширение gz: v{N}.gz.metadata.json. В результате Spark и другие читатели Hadoop catalog не могли найти метаданные, записанные ClickHouse. Теперь ClickHouse записывает v{N}.gz.metadata.json и по-прежнему читает устаревшее имя gzip для обратной совместимости. #109812 (Groene AI).
- Исправлена ошибка
NOT_IMPLEMENTED (“Method getDataAt is not supported for Nullable(String)”), которая могла возникать при JOIN с enable_join_runtime_filters = 1 (включено по умолчанию начиная с 26.2), когда ключ JOIN на build side имел тип LowCardinality(Nullable(...)) со значениями NULL, а runtime filter переключался на свой bloom filter. #109824 (Groene AI).
- Внешние движки баз данных (например,
PostgreSQL) больше не выполняют pushdown сравнений диапазона (>=, >, <=, <) для столбцов UUID. ClickHouse и внешние СУБД по-разному упорядочивают UUID, поэтому такой pushdown незаметно исключал строки из результата; теперь такие предикаты вычисляются в ClickHouse. #109833 (Vismay).
- Исправлен сбой сервера, возникавший, когда lambda-выражение передавалось туда, где higher-order function ожидает конкретное значение (например, аккумулятор
arrayFold, как в arrayFold(lambda, arr, another_lambda)). Теперь такие запросы отклоняются с ILLEGAL_TYPE_OF_ARGUMENT вместо аварийного завершения при enable_analyzer = 0. #109840 (Groene AI).
- Исправлены table function
icebergLocal и движок IcebergLocal, которые объявляли azure вместо local в качестве типа объектного хранилища, из-за чего они не проходили проверку типа диска (Disk type doesn't match) при использовании с локальным диском через SETTINGS disk = '...'. #109872 (Pedro Ferreira).
- Исправлено чтение таблиц Iceberg, партиционированных по одному и тому же исходному столбцу более одного раза (например,
PARTITIONED BY (hours(ts), ts)). Ранее такие таблицы завершались ошибкой Cannot add column ...: column with this name already exists (ILLEGAL_COLUMN). #109895 (Groene AI).
- Исправлены неверные результаты запроса, вызванные тем, что индекс первичного ключа неправильно отсеивал гранулы для таблиц с обратным (
DESC) ключевым столбцом, когда части не имеют финальной отметки (неадаптивная granularity, index_granularity_bytes = 0). #109901 (Nihal Z. Miaji).
- Исправлен случай, когда
generateRandomStructure иногда создавал недопустимую строку структуры с двумя слитно записанными типами данных (например, Decimal32(7)IPv4), если вложенность типов превышала внутренний предел глубины, из-за чего результат невозможно было распарсить. #109928 (Groene AI).
- Исправлена ошибка
NOT_IMPLEMENTED (Method getDataAt is not supported for Nullable(String) in case if value is NULL), возникавшая, когда text-индекс строился по Array(LowCardinality(Nullable(String))) (включая поля Nested, хранящиеся в таком виде), а индексируемый массив содержал элемент NULL. Теперь элементы массива со значением NULL пропускаются при построении индекса, что соответствует поведению Array(Nullable(String)). #110055 (Groene AI).
- Исправлены неверные результаты, когда индекс пропуска данных
minmax строится по столбцу LowCardinality(Nullable(...)): предикаты WHERE/PREWHERE/HAVING ... IS NULL, проталкиваемые в хранилище, ранее отбрасывали все гранулы и возвращали 0 строк, даже если столбец содержал значения NULL. #110061 (Groene AI).
- Исправлено поведение
distinct_overflow_mode = 'break': теперь DISTINCT возвращает частичный результат, накопленный до достижения лимита, и прекращает чтение источника, как и задокументировано. Ранее фрагмент, на котором превышался max_rows_in_distinct / max_bytes_in_distinct, отбрасывался (что приводило к усечённым или пустым результатам), а запрос продолжал чтение и вставку в хеш-таблицу до конца входных данных, что могло закончиться MEMORY_LIMIT_EXCEEDED. #110075 (Sergey Kuznetsov).
- Исправлена логическая ошибка
ChunkInfoRowNumbers does not exist при OPTIMIZE TABLE Iceberg-таблицы, содержащей файл данных в формате, отличном от Parquet (например, ORC), который новее всех файлов позиционного удаления. #110107 (Alexey Milovidov).
- Исправлены
max_bytes_in_distinct и max_bytes_in_set: строковые ключи хранятся в arena, которая не учитывалась при проверке лимитов, поэтому DISTINCT / IN по строковым ключам могли занимать памяти больше байтового лимита на полный размер полезной нагрузки ключей (без ограничения по длине ключа). Теперь лимиты учитывают arena, в соответствии с документацией; запросы со строковыми ключами, близкие к байтовому лимиту, теперь могут достигать его раньше (и это корректно). #110120 (Sergey Kuznetsov).
- Исправлена ошибка
LOGICAL_ERROR (Bad cast from type ColumnLowCardinality to ColumnString), когда identity (или результат scalar subquery) оборачивает значение, содержащее вложенный LowCardinality, а запрос использует WITH TOTALS/WITH ROLLUP. #110138 (Groene AI).
- Исправлено чтение файлов
Npy с внутренними размерностями нулевого размера: теперь число materialized строк и результаты count с оптимизацией и без неё совпадают. #110146 (Yanjun Qiu).
- Исправлен квадратичный рост времени выполнения (и отсутствие реакции на
max_execution_time) в aggregation in order при группировке по нескольким ключам, когда sort order является лишь префиксом grouping key. #110159 (Alexey Milovidov).
- Исправлена логическая ошибка (
Unexpected number of columns in result sample block), возникавшая, когда фильтр, содержащий correlated subquery (например, exists((SELECT ...))), оптимизировался с convert_query_to_cnf или optimize_and_compare_chain. #110187 (Alexey Milovidov).
- Исправлено Исключение (
UNION mode UNION_DEFAULT must be normalized), возникавшее, когда мутация DELETE или ALTER UPDATE использовала операцию над множествами (UNION/UNION ALL/UNION DISTINCT/EXCEPT/INTERSECT) внутри подзапроса в условии WHERE или в присваивании UPDATE. #110196 (Alexey Milovidov).
- Исправлена логическая ошибка
ReadBuffer is canceled. Can't read from it. (аварийное завершение сервера в debug/sanitizer-сборках), которая могла возникать при чтении zip-архива (например, во время RESTORE из zip-резервной копии), если предыдущее чтение из того же архива прерывалось с ошибкой посреди потока. #110197 (Groene AI).
- Исправлены медленное завершение работы сервера и отсутствие отклика у
KILL MUTATION, когда мутация с x IN (subquery) строила множество подзапроса во время анализа первичного ключа; теперь построение множества отменяется сразу. #110198 (Alexey Milovidov).
- Keeper теперь отклоняет установку настроек coordination
max_requests_batch_size и max_requests_append_size в значение 0 вместо того, чтобы застревать в бесконечном append-entries-цикле в многоузловой конфигурации. #110200 (Alexey Milovidov).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK при использовании GROUP BY ALL для кортежного выражения вместе с ORDER BY. #110206 (Alexey Milovidov).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK при INSERT в таблицу с ограничением CHECK, ссылающимся на подстолбец (например, x.null у столбца Nullable или arr.size0 у Array). #110208 (Alexey Milovidov).
- Исправлено чтение таблиц Iceberg, у которых порядок сортировки по умолчанию ссылается на столбец, требующий кавычек (например,
@timestamp). Такие таблицы были нечитаемы, потому что синтезированный ORDER BY хранилища строился из исходного имени столбца и не разбирался, приводя к SYNTAX_ERROR. #110233 (Groene AI).
- Исправлено поведение
system.tables для базы данных DataLakeCatalog (Iceberg/Glue), при котором весь запрос аварийно завершался или таблицы молча пропадали, если не удавалось разрешить метаданные одной таблицы. Теперь такая таблица остаётся в списке по имени, со значениями по умолчанию/NULL в столбцах, для которых требуется открытый объект хранилища (engine, total_rows и т. д.), независимо от database_datalake_require_metadata_access. Прямой доступ к повреждённой таблице по-прежнему возвращает ошибку. #110242 (Groene AI).
- Исправлено возможное аварийное завершение (heap-buffer-overflow), когда столбец состояния агрегатной функции семейства
quantileTDigest использовался как ключ GROUP BY и одновременно сериализовался несколькими потоками. #110263 (Groene AI).
- Исправлена ошибка при
INSERT в таблицу DataLakeCatalog Microsoft Fabric / OneLake с IncorrectEndpointError (HTTP 400): запись в ADLS Gen2 (DFS) теперь направляется на хост конечной точки .dfs, а не на хост .blob. Примечание: при использовании remote_url_allow_hosts для INSERT в список разрешённых должны быть добавлены оба хоста Fabric — .blob (чтение) и .dfs (запись). #110290 (Mohammad Lareb Zafar).
- Исправлено аварийное завершение сервера при разборе некоторых PRQL-запросов (
SET dialect = 'prql'). Паника внутри компилятора prqlc приводила к аварийному завершению процесса вместо того, чтобы возвращаться как ошибка запроса. #110316 (Groene AI).
- Исправлены случаи, когда запрос мог незаметно возвращать неверные результаты, если часть проекции была записана до изменения набора столбцов проекции (например, после обновления между версиями, которые по-разному материализуют источник столбца
ALIAS, или после того, как ALTER TABLE ... MODIFY COLUMN переназначает столбец ALIAS, используемый проекцией), а затем читалась через проекцию или участвовала в слиянии: отсутствующий столбец заполнялся значениями по умолчанию вместо реальных данных. Такие части теперь читаются из базовой таблицы, а при слиянии проекция заново строится из базовых данных. #110328 (Shaohua Wang).
- Исправлено поведение, при котором
ORDER BY ... WITH FILL не учитывал max_execution_time и медленно отменялся при генерации большого диапазона заполнения (особенно с INTERPOLATE). #110332 (Alexey Milovidov).
- Исправлена логическая ошибка (аварийное завершение сервера в debug/sanitizer-сборках), возникавшая при выполнении многокомандного
ALTER, например UPDATE ..., DELETE ..., для Iceberg table. Такие мутации теперь отклоняются с понятной ошибкой NOT_IMPLEMENTED. #110347 (Groene AI).
- Исправлена ошибка парсера, из-за которой
COMMENT ошибочно воспринимался как неявный alias, когда запрос SELECT заканчивался сразу после простого идентификатора таблицы (например, ... FROM t COMMENT 'x'), что приводило к вводящей в заблуждение синтаксической ошибке вместо применения комментария к представлению/таблице. #110372 (Aditya Kumar).
- Исправлен сбой сервера (native stack overflow), возникавший при копировании или уничтожении глубоко вложенного литерала
Array/Tuple/Map/Object, например в запросе с очень глубоко вложенным литералом при увеличенном max_parser_depth. #110393 (Raúl Marín).
- Исправлены два случая, когда векторный поиск мог возвращать меньше строк, чем ожидалось: значения
vector_search_index_fetch_multiplier ниже 1.0 могли обрезать вычисленное число извлекаемых строк до нуля и давать пустой результат (такие значения теперь отклоняются), а оптимизация векторного поиска теперь пропускается для запросов LIMIT ... WITH TIES, поскольку она ограничивала поиск ровно N кандидатами и отбрасывала строки, совпадающие с N-й строкой. #110452 (Tamish Mhatre). #110453 (Tamish Mhatre).
- Исправлены логическая ошибка
Expected CommonSubplanReferenceStep to reference CommonSubplanStep, ошибка Subplan cannot be used to build pipeline и логическая ошибка Trying to extract chunk from ChunkBuffer before all inputs are finished для IN (subquery), где подзапрос содержит коррелированный подзапрос, а Set строится во время анализа индекса. #110491 (Alexey Milovidov).
- Исправлена подстановка параметров запроса внутри определений именованного предложения
WINDOW. Ранее параметры там незаметно оставались неподставленными, а незаданный параметр Identifier мог приводить к исключению Logical error: '!part.empty()' во время EXPLAIN SYNTAX. #110506 (Alexey Milovidov).
- Исправлен сбой запуска сервера для таблиц
MergeTree на дисках объектного хранилища, когда оставшийся файл txn_version.txt.tmp повреждал метаданные на уровне диска. #110519 (Alexey Milovidov).
- Исправлена logical error в файловом кэше (
Expected file ... not to exist), которая могла возникать, когда фоновая загрузка кэша завершалась ошибкой, не связанной с файловой системой (например, при выполнении OPTIMIZE для Iceberg table), оставляя после себя пустой осиротевший файл кэша. #110549 (Groene AI).
- Исправлено чтение повреждённого потока в формате
Native, у которого число типов Dynamic или число путей JSON/Object близко к SIZE_MAX: такой некорректный входной поток теперь отклоняется с понятной ошибкой INCORRECT_DATA вместо неперехваченного std::length_error. #110590 (Alexey Milovidov).
- Исправлено падение сервера в database engine
MaterializedPostgreSQL, которое могло происходить, если table была detached (или её structure изменялась), пока она всё ещё находилась в очереди на синхронизацию. #110596 (Alexey Milovidov).
- Исправлено некорректное поведение
SET param_<name> в клиенте (и флагов --param_<name>), когда имя parameter совпадало с именем встроенной setting, например limit, offset, max_threads или log_comment. В зависимости от конфликтующей setting, запрос завершался ошибкой CANNOT_PARSE_QUOTED_STRING, значение молча нормализовалось (например, max_threads=0 превращалось в auto(N)), либо терялось имя алиаса setting. Такой parameter также ломал все последующие SET param_* в той же сессии. #110597 (Raúl Marín).
- Исправлено чтение подстолбцов столбца, который имеет выражение
DEFAULT и не materialized в part (например, после ALTER TABLE ADD COLUMN или во время ALTER TABLE MATERIALIZE COLUMN): подстолбец заполнялся значениями по умолчанию для type вместо вычисленного выражения DEFAULT, а transposed функции расстояния между векторами (cosineDistanceTransposed и другие) на таких столбцах QBit завершались ошибкой SIZES_OF_ARRAYS_DONT_MATCH. Это закрывает #110634. #110636 (Alexey Milovidov).
- Исправлена ошибка
LOGICAL_ERROR Invalid partition key size: 0, из-за которой могла завершиться неудачей операция INSERT в партиционированную table MergeTree с включённой non_replicated_deduplication_window, когда пакет async insert был дедуплицирован лишь частично (некоторые значения insert_deduplication_token были дубликатами, а некоторые — новыми). #110651 (Groene AI).
- Фоновый flush asynchronous insert теперь оперативно останавливается при завершении через
KILL QUERY; ранее flush большого буферизованного полезного содержимого продолжал разбор до конца и игнорировал отмену. #110652 (Shaohua Wang).
- Исправлены неверные результаты
GROUP BY с optimize_aggregation_in_order и DISTINCT с optimize_distinct_in_order, размещёнными поверх partial_merge JOIN. Оптимизация чтения в порядке распространялась через partial-merge JOIN, который повторно сортирует свой левый вход по ключу JOIN и поэтому не сохраняет исходный порядок левого потока, из-за чего строки группировались некорректно. #110671 (Groene AI).
- Исправлено переполнение знакового целого числа в
toStartOfInterval при экстремальном количестве interval MONTH, WEEK или DAY для значений Date/Date32/DateTime64. #110688 (Groene AI).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK для запросов с подзапросом в FROM, когда параллельные реплики работают в режиме custom_key_sampling / custom_key_range. Такие запросы (например, SELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k) ранее завершались ошибкой Not found column __table2.id in block .... #110690 (Groene AI).
- Исправлено поведение
readWKT, из-за которого функция отклоняла строки WKT с ведущими пробелами (например, readWKT(' POINT(1 2)')), хотя они допускаются типизированными функциями чтения readWKTPoint/readWKTPolygon/… и грамматикой WKT. #110706 (Groene AI).
- Исправлена logical error (
Column ... already added for reading, аварийное завершение сервера в debug/sanitizer builds), возникавшая, когда один и тот же предикат текстового индекса использовался и в PREWHERE, и в предложении WHERE в запросе к таблице Merge поверх таблицы Distributed. #110710 (Groene AI).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK для транспонированных функций расстояния над столбцами QBit (таких как cosineDistanceTransposed), вызываемых со скалярным подзапросом или константным reference vector при включённых параллельных репликах. Это закрывает #110719. #110729 (Alexey Milovidov).
- Исправлена редкая
LOGICAL_ERROR (Unexpected number of parts to remove from parts_queue; аварийное завершение сервера в debug/sanitizer builds) в ReplicatedMergeTree, возникавшая, когда две операции с партициями (например, два запроса MOVE PARTITION/REPLACE PARTITION или один такой запрос, выполняющийся одновременно с фоновым DROP_RANGE) одновременно отменяли фоновую проверку частей на перекрывающихся диапазонах. #110738 (Groene AI).
- Исправлена logical error
Hash is not set for serialization, которая могла возникать, когда столбец с кодеком Quantized(...) был обёрнут в другую сериализацию, например в таблице Merge поверх Sources, где одноимённый столбец имеет разные типы (объединяемые в Variant). #110776 (Groene AI).
- Исправлено зависание сервера при умножении состояния aggregate function
median/quantile на очень большую целочисленную константу (например, medianState(x) * 18446744073709551615). Запрос переставал реагировать на отмену и мог выполняться бесконечно. #110779 (Groene AI).
- Исправлено падение сервера (целочисленное деление на ноль), возникавшее при использовании квоты с интервалом нулевой длины (например,
CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000). Теперь неположительная длительность интервала квоты отклоняется при создании квоты. #110846 (Pedro Ferreira).
- Исправлено поведение
throwIf(notLike(col, pattern)) (и других throwIf, применённых к функции), при котором исключение генерировалось безусловно, если col имеет тип LowCardinality. Реализация LowCardinality по умолчанию запускала throwIf по всему словарю, который всегда содержит зарезервированное значение по умолчанию, даже если на него не ссылается ни одна строка, поэтому ненулевое значение в этом неиспользуемом слоте заставляло throwIf генерировать исключение для данных, не удовлетворяющих условию. #110864 (Groene AI).
- Исправлена передача активных ролей запроса (
SET ROLE или параметр role) на удалённые узлы при чтении через parallel-replica и Distributed в кластере, защищённом межсерверным секретом; ранее удалённые узлы переключались на роли пользователя по умолчанию, из-за чего политики на уровне строк применялись иначе, чем на узле-инициаторе. #110867 (Nikolay Degterinsky).
- Исправлена ошибка, из-за которой таблица Iceberg создавала дублирующиеся ID полей после
ALTER TABLE ... ADD COLUMN, если исходная схема содержала вложенные поля (Tuple/Array/Map). Теперь last-column-id сохраняет максимальный назначенный ID поля, включая вложенные дочерние элементы, поэтому добавленный позже столбец больше не использует повторно ID вложенного поля, а чтение больше не завершается ошибкой ICEBERG_SPECIFICATION_VIOLATION (Duplicate field id). #110884 (Groene AI).
- Исправлен сбой в FIPS-сборках при использовании SSH-ключа Ed25519 (
CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519' или такого ключа в users.xml). Ed25519 не одобрен для FIPS; теперь такие ключи отклоняются с понятной ошибкой LIBSSH_ERROR. #110891 (Konstantin Bogdanov).
- Исправлены результаты с пониженной точностью у транспонированных функций расстояния для столбцов
QBit (cosineDistanceTransposed, L2DistanceTransposed, dotProductTransposed). Значения, усечённые до precision битовых плоскостей, восстанавливались с заполнением отброшенных битов нулями, что смещало каждое восстановленное значение к нулю и давало вырожденный результат при низкой точности: для QBit(BFloat16) при precision 1 сохраняется только знаковый бит, поэтому каждое значение восстанавливалось в ±0.0, а расстояние становилось одной и той же константой для каждой строки, не неся информации для ранжирования. Теперь усечённые значения восстанавливаются в ограниченную середину оставшейся ячейки точности (сырые коды Int8 — в центр своей ячейки; точные нули и бесконечности сохраняются), так что меньшая precision означает обмен точности на скорость без сильного смещения результатов. Результаты с полной точностью не изменились. Это закрывает #110898. #110911 (Alexey Milovidov).
- Исправлен сбой сервера (use-after-free) во время корректного завершения работы после выполнения запросов к таблицам Iceberg из сеансов, в которых также использовались временные таблицы. #110914 (Miсhael Stetsyuk).
- Исправлена ошибка
LOGICAL_ERROR: Cannot sum Bools (аварийное завершение сервера в debug/sanitizer-сборках) при слиянии состояний агрегатной функции sumMap/sumMapWithOverflow/sumMapFiltered со значениями Bool, сериализованными в старом формате состояния (version 0). Это же исправление также устраняет два случая молчаливо неверного результата для состояний Bool версии 0: ключи map типа Bool не дедуплицировались между состояниями, а compaction нулевых значений удалял неправильные записи. #110922 (Groene AI).
- Исправлен сбой, возникавший, когда агрегатная функция с комбинатором
-Tuple использовалась с RESPECT NULLS и создавала промежуточное состояние (-State, распределённая агрегация, WITH ROLLUP/WITH CUBE). Комбинированная функция получала имя по неправильному варианту состояния, поэтому её сериализованный тип AggregateFunction при round-trip повторно разрешался в несовместимое представление в памяти. #110930 (Groene AI).
- Исправлена проблема, из-за которой
PREWHERE (и политики на уровне строк) для столбца Iceberg, переименованного через изменение схемы, молча возвращал 0 строк для старых data files. Теперь такие запросы возвращают правильные строки, как и WHERE. #110941 (Groene AI).
- Исправлен
LOGICAL_ERROR (LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M), который мог возникать в запросах векторного поиска с vector_search_with_rescoring = 1 в сочетании с отложенной материализацией, когда несколько расстояний совпадали. #111003 (Groene AI).
- Исправлено чтение данных
Arrow/ArrowStream с пустыми вложенными столбцами Array/Map, созданных в Apache Arrow Java < 19.0.0 (входит в состав Apache Spark), которые ранее отклонялись с ошибкой INCORRECT_DATA о слишком маленьком буфере offsets. #111101 (Raúl Marín).
- Исправлено чтение устаревших данных на дисках
plain_rewritable при включённом page cache. #111105 (Mikhail Artemenko).
- Исправлена ошибка
CANNOT_CONVERT_TYPE для констант типа Variant (включая Geometry) в распределённых запросах и запросах с параллельными репликами. #111136 (Nikita Fomichev).
- Исправлена ошибка, из-за которой чтение больших файлов из HDFS могло завершаться сбоем или давать некорректный результат, если один запрос на чтение превышал 32-битный предел размера
hdfsPread (INT_MAX). #98470 (Arup Chauhan).
- Исправлено некорректное использование text index для проверок на равенство с пустой строкой поиска. #108340 (Robert Schulze).
- Исправлено зависание в
SYSTEM SYNC MERGES с селектором слияния Manual, когда запланированное слияние не удавалось поместить в заполненный фоновый пул. #108770 (Alexey Milovidov).
- Исправлено поведение
ATTACH TABLE ... AS REPLICATED, при котором отбрасывались закоммиченные данные и восстанавливались строки до применения mutation, если в части данных оставался устаревший файл txn_version.txt.tmp. #108772 (Alexey Milovidov).
- Исправлена возможная race condition в
ALTER TABLE ... MOVE PARTITION TO TABLE с нереплицируемыми таблицами MergeTree, которая могла приводить к появлению пересекающихся частей данных, поскольку коммит перемещённых частей и выделение номеров блоков выполнялись не под одной и той же блокировкой. #108922 (Mikhail Artemenko).
- Исправлено чтение таблиц
Iceberg, записанных Databricks UniForm, который записывает в manifest files вырожденную placeholder-схему (с пустым списком полей). #108945 (Konstantin Vedernikov).
- Исправлена ошибка use-after-free при многопоточном чтении непартиционированной таблицы
Hive. #109164 (Alexey Milovidov).
- Исправлено поведение, при котором уровень логирования консоли не возвращался к исходному после запуска сервера, если задан
logger.startup_console_log_level: уровень считывался из неверного ключа конфигурации, поэтому консоль оставалась на повышенном startup level на протяжении всей работы сервера. Закрывает #103472. #109858 (Garrett Thomas).
- Исправлены аномалии snapshot isolation в транзакциях метаданных диска
plain_rewritable. Исправляет #92055. #110948 (Mikhail Artemenko).
- Исправлено аварийное завершение (
front() called on an empty vector) в clickhouse-client --login, когда хост не передавался явно через аргумент --host, например если он брался из --connection, файла конфигурации или переменной окружения CLICKHOUSE_HOST. Закрывает #103603. #110279 (Christoph Wurm).
- Исправлена логическая ошибка (
!part.empty()), возникавшая, когда аргумент лямбда-выражения — это идентификатор в обратных кавычках, имя которого содержит точку (например, __table1.). Ранее такой запрос приводил к обрабатываемому исключению в релизных сборках и аварийно завершал сервер в debug- и sanitizer-сборках при форматировании сообщения об ошибке. #108735 (Groene AI).
- Исправлена
LOGICAL_ERROR (No set is registered for key) в ALTER TABLE ... DROP COLUMN, мутациях ALTER TABLE ... DELETE/UPDATE и легковесном DELETE FROM для таблиц со столбцом ALIAS, выражение которого использует оператор IN (в том числе через другой столбец ALIAS). #111039 (Pedro Ferreira).
- Исправлена незаметная потеря данных при async inserts и дедупликации (
async_insert=1, async_insert_deduplicate=1). Когда несколько записей async-insert с разными значениями insert_deduplication_token объединялись в один flush, записывающий данные в непересекающиеся партиции, каждый токен регистрировался в журнале дедупликации всех партиций, которых касался flush, а не только той партиции, куда попадали соответствующие строки. В результате более поздняя вставка, повторно использующая один из этих токенов в партиции, в которую она никогда не писала, незаметно дедуплицировалась. Теперь токены регистрируются только для той партиции, куда их строки действительно были записаны. Закрывает #111031. #111049 (Groene AI).
- Исправлены исключение
LOGICAL_ERROR (ScatterExchangeStep should have one source shard, got 8) и дублирование строк при выполнении запроса к таблице Merge поверх таблиц или представлений Distributed с экспериментальной настройкой make_distributed_plan = 1. Закрывает #107946. #108401 (Groene AI).
- Столбец
Nullable(Tuple(...)) теперь сериализуется как одно поле CSV вместо развертывания в отдельные столбцы. Ранее значение, отличное от NULL, записывалось как несколько полей CSV, тогда как NULL записывался как один \N, из-за чего количество столбцов зависело от строки, что ломало заголовки CSVWithNames/CSVWithNamesAndTypes и round-trip. #108959 (Groene AI).
- Исправлена логическая ошибка (
KeyCondition uses PREWHERE output) в reader Parquet v3, когда условие по ключу на уровне формата ссылается на столбец, который не читается из файла Parquet. #109267 (Groene AI).
- Исправлены неверные результаты при чтении через table function с
FINAL или SAMPLE при serialize_query_plan = 1. Также исправлен ключ кэша статистики hash-таблицы aggregation для table functions, чтобы разные table functions больше не использовали одну и ту же запись предварительного выделения. #109847 (Azat Khuzhin).
- Исправлена очистка
BACKUP ... TO Memory(...), завершающегося ошибкой до финализации: неудавшийся backup оставался зарегистрированным, поэтому его имя нельзя было использовать повторно. #109947 (Julia Kartseva).
- Исправлена арифметика экстремальных interval в
WITH FILL STEP и функциях date/time interval add* / subtract*: дельты вне допустимого диапазона больше не полагаются на signed overflow, а WITH FILL с огромным шагом YEAR больше не зависает, прокручивая календарь назад. #110158 (Groene AI).
- Исправлены ошибки
411 Length Required от сервисов Azure: Azure HTTP transport на базе Poco теперь задаёт Content-Length на основе request body для SDK-клиентов, которые не устанавливают его самостоятельно, например Azure Key Vault. #110299 (Konstantin Bogdanov).
- Отложенная оптимизация
FINAL (query_plan_optimize_lazy_final, по умолчанию отключена) больше не применяется, если запрос читает данные в порядке ключа сортировки, поскольку её заменяющий plan не сохраняет этот порядок и может возвращать результаты в неверном порядке. Она также больше не применяется, когда LIMIT, меньший числа читаемых строк, применяется непосредственно на шаге чтения, где обязательный проход построения множества сводит на нет возможность раннего завершения. #110576 (Nikolai Kochetov).
- Исправлены
readWKT и readWKTPoint, которые для POINT EMPTY возвращали неинициализированные координаты (в scalar-режиме) или устаревшие координаты из предыдущей строки (в vectorized-режиме). Теперь POINT EMPTY отклоняется с ошибкой CANNOT_PARSE_TEXT, поскольку ClickHouse Point — это фиксированный Tuple(Float64, Float64) без представления пустого значения. #110692 (Groene AI).
- Исправлена некорректная обработка timezone при materializing столбцов правой стороны в hash joins. Закрывает #111033. #111074 (Yarik Briukhovetskyi).
- Исправлены неверные результаты
count() и пропуск строк, когда ключ String (или более узкий FixedString) либо индекс пропуска данных minmax фильтруется сравнением с более широкой константой FixedString, например toFixedString('abc', 257) = string_col. Primary key и minmax pruning строили диапазон по дополненной NUL-байтами константе и ошибочно пропускали подходящие granules. #111106 (Groene AI).
- Исправлены асинхронные inserts в формате
Native: теперь одна буферизованная запись, ставшая несовместимой после ALTER ... MODIFY COLUMN, больше не приводит к сбою всего пакета. Закрывает #111064. #111108 (Mikhail f. Shiryaev).
- Исправлен
CREATE OR REPLACE для словаря с объектом другого типа: операция завершалась ошибкой CANNOT_DETACH_DICTIONARY_AS_TABLE уже после того, как замена была committed, оставляя осиротевшую таблицу _tmp_replace_*. #111142 (Nikolay Degterinsky).
- Исправлен
INCOMPATIBLE_TYPE_OF_JOIN для ANY JOIN по таблице движка Join, когда фильтр в предложении WHERE по столбцу правой стороны позволял planner переписать JOIN в SEMI или ANTI. У таблицы движка Join фиксированная объявленная strictness, которую нельзя изменить, поэтому теперь для таких таблиц это преобразование не выполняется. #111362 (Groene AI).
- Исправлена table function
format, которая не возвращала столбцы, если входные данные разбирались в ноль строк (например, пустой JSON document или GeoJSON FeatureCollection без features). Теперь она возвращает пустой результат с корректными столбцами вместо NOT_FOUND_COLUMN_IN_BLOCK. Закрывает #111390. #111428 (Groene AI).
Улучшения сборки/тестирования/упаковки
- Сборки с sanitizer теперь сохраняют отчёт sanitizer в глобальный buffer
sanitizer_report, чтобы анализатор core dump мог прочитать его из core dump. #109333 (Miсhael Stetsyuk).
musl теперь собирается из исходного кода вместо использования вендорных бинарных файлов. #97452 (Konstantin Bogdanov).
- Используются SIMD-реализации
memcmp/memcpy/memmove/memset/bcmp/memmem из LLVM-libc. #107566 (Konstantin Bogdanov). Исправлено незаметное повреждение данных в memmove в отладочных сборках с -O0 (-DDEBUG_O_LEVEL=0) на машинах с AVX-512. #110904 (Konstantin Bogdanov).
- Удалено использование библиотеки
curl по всей кодовой базе и во включённых сторонних библиотеках. #108296 (Konstantin Bogdanov).
mariadb-connector-c обновлён до 3.4.9. #108328 (Konstantin Bogdanov).
libssh обновлён до 0.12.0. #108329 (Konstantin Bogdanov).
- Исправлено зависание при transaction
COMMIT на macOS. #108375 (Raúl Marín).
- Добавлена опция CMake
COMPRESS_DEBUG_SECTIONS, которая сжимает отладочные секции DWARF в object file (-gz); она автоматически включается там, где это поддерживает compiler, чтобы уменьшить размер каталогов Debug-сборок. При этом итоговые бинарные файлы остаются несжатыми, поэтому символизация stack trace во время выполнения не затрагивается. #109306 (Murphy). Входящий в комплект toolchain LLVM теперь собирается с zlib, поэтому его clang поддерживает -gz=zlib, а также была добавлена отсутствующая символическая ссылка clang++-21. #109596 (Murphy).
- Debug-сборки теперь компилируют вендорные Rust-крейты с сокращённой отладочной информацией (
debug = 1, уровень cargo limited) и без incremental cache (REDUCE_RUST_DEBUG_INFO, включено по умолчанию), что уменьшает размер Rust-артефактов сборки (~12 → ~7 GB при сборке с нуля) и предотвращает неограниченный рост cache cargo при повторных сборках. Установите -DREDUCE_RUST_DEBUG_INFO=OFF, чтобы вернуть полный DWARF и incremental compilation. #109471 (Murphy).
- Добавлена поддержка streaming distributed query exchange и чтений
STREAM на macOS. #109769 (Raúl Marín).
libarchive обновлён с 3.8.7 до 3.8.8. #109874 (Robert Schulze).
c-ares обновлён с 1.34.6 до 1.34.8. #109905 (Robert Schulze).
krb5 обновлён для исправления CVE-2026-40355 и CVE-2026-40356. #109910 (Robert Schulze).
- Удалена сторонняя зависимость
libpng. Вместо неё FORMAT PNG теперь использует небольшой встроенный PNG-кодировщик (на основе включённого в комплект zlib). #110051 (Alexey Milovidov).
- На macOS raw C-выделения памяти (не проходящие через
operator new) теперь отслеживаются в трекере памяти за счёт обёртки над malloc zone из jemalloc, поэтому для них применяются ограничения памяти. #110370 (Raúl Marín).
- Docker-образы
-distroless для clickhouse-server и clickhouse-keeper теперь собираются из не содержащей shell стадии продакшн; ранее они собирались из стадии отладки и включали /busybox/sh. Закрывает #105677. #105678 (ashishch432).
abseil-cpp обновлён до LTS 20260526.0. #108991 (Konstantin Bogdanov).
обратно несовместимое изменение
- Это изменение удаляет возможность
allow_experimental_query_deduplication. Эта возможность долгое время оставалась экспериментальной, не имеет тестов и поддерживаться не будет (изначальные тесты были нестабильными и были удалены в #49579). #99398 (Igor Nikonov).
- Возможность
SYSTEM INSTRUMENT на основе XRay теперь использует arguments вместо parameters: столбец system.instrumentation.parameters был переименован в arguments, а синтаксис SYSTEM INSTRUMENT ADD ... HANDLER PARAMETERS ... — в SYSTEM INSTRUMENT ADD ... HANDLER ARGUMENTS .... Запросы и автоматизация, использующие старый столбец или синтаксис, нужно обновить на новые имена; старые имена больше не поддерживаются. #103854 (Pablo Marcos).
- Настройка
show_data_lake_catalogs_in_system_tables была переименована в show_remote_databases_in_system_tables и получила более широкое действие: когда её значение равно 0 (по умолчанию), базы данных MySQL и PostgreSQL также скрываются из system.tables, system.columns и system.completions в дополнение к каталогам озер данных. Старое имя настройки сохранено как псевдоним. #104416 (Pablo Marcos).
- Сборка x86 по умолчанию теперь нацелена на x86-64-v3 (AVX2) вместо x86-64-v2 (SSE4.2). Для этого требуется CPU с поддержкой AVX2 (Intel Haswell или новее, AMD Excavator или новее). Если ваш CPU не поддерживает AVX2, используйте сборку
amd64compat, рассчитанную на обычный x86-64. #105019 (Raúl Marín).
- Вложенные
Dynamic/Variant в агрегатах min/max и индексах minmax теперь отклоняются. Ранее проверялись только Dynamic/Variant верхнего уровня. Закрывает #104747. #105468 (Pavel Kruglov).
icebergHash и icebergBucket теперь отклоняют аргументы Int128, UInt128, Int256, UInt256 и Decimal256, выдавая явную ошибку. Ранее они молча усекали значения большей разрядности и создавали коллизии хэшей. Спецификация Iceberg определяет хэширование только для 32-/64-битных целых чисел и decimal-значений с precision до 38; приведите значение к Int64 или Decimal128, чтобы сохранить прежнее поведение для подходящих значений. #105866 (Raúl Marín).
- В CLI добавлен более гибкий контроль вывода запросов. Опция
--echo теперь принимает необязательное булевое значение и работает как в интерактивном режиме, так и в batch mode. Новые опции --echo-formatted и --echo-query-id управляют тем, будут ли выводимые запросы форматироваться и будет ли печататься query_id соответственно. Опция --hilite/--highlight теперь также управляет подсветкой выводимых запросов. Как побочный эффект, --echo теперь является опцией с булевым значением, поэтому позиционный запрос сразу после --echo без указанного значения воспринимается как её значение; вместо этого используйте --echo --query "..." или --echo=false. #106191 (Alexey Milovidov).
- Удалены экспериментальные функции KQL (Kusto)
array_sort_asc и array_sort_desc, а также их SQL-backend’ы kql_array_sort_asc и kql_array_sort_desc. Эти функции были экспериментальными, были некачественно реализованы и служили источником ошибок корректности и парсера. Запросы, использующие эти имена, теперь возвращают UNKNOWN_FUNCTION. #108101 (Groene AI).
ALTER TABLE ... REPLACE PARTITION ... FROM ... больше не удаляет молча данные целевой партиции, если в исходной таблице нет частей в запрошенной партиции. Раньше такой запрос удалял целевую партицию и ничего не записывал взамен — опасное поведение, которое могло привести к потере данных. Теперь по умолчанию такой запрос отклоняется с ошибкой BAD_ARGUMENTS. Чтобы вернуть прежнее поведение с неявной очисткой, установите новую настройку allow_replace_partition_from_empty_source = 1 или задайте compatibility равным 26.5 или ниже; чтобы явно удалить данные в целевой партиции, используйте ALTER TABLE ... DROP PARTITION. #104939 (Groene AI).
- Значение по умолчанию для настройки сервера
insert_deduplication_version меняется с compatible_double_hashes на new_unified_hash. Дедупликация вставки теперь работает для всего вставляемого блока (на одну вставку), а не отдельно для каждой части/партиции: повтор той же вставки по-прежнему дедуплицируется, но две разные вставки, создающие идентичную часть, больше не дедуплицируются между собой, и вставки одних и тех же строк в разном порядке тоже больше не дедуплицируются. Установите insert_deduplication_version = compatible_double_hashes, чтобы вернуть прежнее поведение. Экземпляры, которые обновляются напрямую с релиза, где значением по умолчанию был old_separate_hashes, должны сначала работать с compatible_double_hashes, пока не истечёт максимально длительное релевантное окно дедупликации, и лишь после этого полагаться на new_unified_hash. #107886 (Sema Checherinda).
- Добавлена поддержка непрерывных запросов к таблицам
MergeTree, реализованная в виде серии операций чтения снимка. Это первый шаг к полноценной поддержке потоковых запросов. #105114 (Mikhail Artemenko).
- Добавлены гипотетические (what-if) индекс пропуска данных. Используйте
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ..., чтобы определить виртуальный индекс пропуска данных, действующий в рамках сессии, а затем EXPLAIN WHATIF SELECT ..., чтобы оценить его коэффициент пропуска и стоимость без материализации. Определённые индексы видны в новой таблице system.hypothetical_indexes. #104608 (Yarik Briukhovetskyi).
- Добавлен встроенный веб-интерфейс
/schema в clickhouse-server, визуализирующий граф зависимостей между таблицами, materialized view, refreshable materialized view, словарями, distributed таблицами и представлениями. #105276 (Nikita Mikhaylov).
- Добавлена поддержка output format
PNG, позволяющая напрямую выводить результаты запроса в виде PNG-изображений. #74691 (Maksim Dergousov).
- Добавлено определение ИИ-агента для написания кода (Claude Code, Cursor, Codex, Gemini CLI, Goose и т. д.), вызвавшего
clickhouse-client или clickhouse-local, на основе переменных окружения. Обнаруженный агент указывается в новом столбце client_agent таблиц system.query_log, system.query_thread_log и system.processes. #106619 (Alexey Milovidov).
- Добавлена новая system table
system.documentation, которая собирает встроенную справочную документацию по унифицированным компонентам системы (functions, table engines, data types, settings, formats и другим) в одну таблицу, при этом документация отображается в формате Markdown. #107463 (Alexey Milovidov).
- Добавлен input format
GeoJSON для чтения документов GeoJSON FeatureCollection, создающий по одной строке на каждый объект со столбцами id (String), geometry (Geometry) и properties (Nullable(JSON)). Геометрии Point, LineString, MultiLineString, Polygon и MultiPolygon считываются в нативный тип Geometry ClickHouse. GeometryCollection и MultiPoint, которые тип Geometry не может представить, по умолчанию генерируют исключение, либо могут сохраняться как NULL с помощью настройки input_format_geojson_unsupported_geometry_handling. Вклад в #91533. #98124 (Mark Needham).
- Добавлены функции для прямой выдачи векторных тайлов Mapbox из SQL:
MVTEncodeGeom проецирует геометрию в пиксельное пространство тайла slippy-map и обрезает её, MVTEncode агрегирует спроецированные геометрии группы в двоичное представление однослойного тайла, а MVTBoundingBox / MVTBoundingBoxMercator возвращают ограничивающий прямоугольник тайла для отбора строк в его пределах. Поддерживается геометрия точек, линий и полигонов. Также доступны псевдонимы PostGIS ST_AsMVTGeom и ST_AsMVT. #106107 (Saarthak Gupta).
clickhouse-local теперь поддерживает запросы SYSTEM START LISTEN и SYSTEM STOP LISTEN, что позволяет превратить его в сервер, принимающий TCP- и HTTP-соединения. #101143 (Alexey Milovidov).
- Добавлена интерактивная команда
help в clickhouse-client и clickhouse-local. При вводе help <name> (а также /help, man, /man) в терминале отображается документация по функции, движку таблицы, типу данных, формату, настройке или другому компоненту, отрендеренная из Markdown с подсветкой синтаксиса SQL. Если слово неоднозначно, показываются все совпадения, а если оно не найдено, предлагаются похожие названия. #108042 (Alexey Milovidov).
- Добавлена поддержка записи в Azure Data Lake Storage Gen2. #105406 (Konstantin Vedernikov).
- Добавлен формат
RowBinaryWithNamesAndTypesAndDefaults для более качественной поддержки изменения схемы. #105736 (Mark Zitnik).
- Добавлена поддержка
ADD ENUM VALUES в запросах ALTER TABLE, чтобы упростить добавление новых значений в существующий тип Enum без необходимости заново указывать все текущие значения Enum. #93830 (Ilya Golshtein).
- refreshable materialized view теперь поддерживает
REFRESH DEPENDS ON, что позволяет запускать обновление при обновлении другого RMV, а не по расписанию, привязанному ко времени. (REFRESH EVERY ... DEPENDS ON уже существовал, но его нельзя было надёжно использовать в этом сценарии.) См. документацию CREATE MATERIALIZED VIEW. #104440 (Michael Kolupaev).
- Добавлена поддержка выбора столбцов по шаблону имени с помощью
* LIKE '<pattern>' и * ILIKE '<pattern>', включая квалифицированные формы, такие как table.* LIKE '<pattern>' и table.* ILIKE '<pattern>'. LIKE сопоставляет имена столбцов с учётом регистра, ILIKE — без учёта регистра. #104569 (Yue Ni).
- Добавлен синтаксис
ESCAPE, позволяющий задать собственный символ экранирования в шаблоне LIKE, чтобы % и _ трактовались как обычные символы, а не как подстановочные. #99774 (Ilya Yatsishin).
- Добавлены настройки таблицы
MergeTree materialize_projections_on_insert и materialize_projections_on_merge. Когда materialize_projections_on_insert = 0, операции INSERT пропускают построение частей проекций, что повышает пропускную способность вставки для таблиц с большим количеством проекций. Когда materialize_projections_on_merge = 1, слияние перестраивает проекцию, отсутствующую во всех исходных частях, так что проекции можно строить во время слияний, а не при вставке. Слияния по-прежнему объединяют только части с одинаковым набором проекций. #100993 (Christoph Wurm).
- Добавлена новая неизменяемая настройка
MergeTree allow_tuple_element_aggregation, по умолчанию отключённая. Когда она включена, SummingMergeTree, AggregatingMergeTree и CoalescingMergeTree рекурсивно разворачивают столбцы Tuple и агрегируют каждый листовой элемент независимо во время слияний, точно так же, как если бы это был столбец верхнего уровня: SummingMergeTree суммирует его, AggregatingMergeTree объединяет его состояние агрегатной функции, а CoalescingMergeTree сохраняет его последнее значение, отличное от NULL. Эту настройку нужно задавать при создании таблицы, и движки, которые её не поддерживают, молча её игнорируют. #98039 (johnjing).
- Новые функции
quantizeBFloat16ToInt8 и dequantizeInt8ToBFloat16: скалярный кодек для сжатия компонентов эмбеддингов до 8 бит с помощью 256-уровневого гауссова квантователя Ллойда — Макса, из которого затем можно извлекать коды Int4/Int2/бинарные коды путём усечения битов. #108102 (Alexey Milovidov).
- Добавлены функции
arrayTopK и arrayBottomK: - arrayTopK(k, array) возвращает K наибольших элементов в порядке убывания - arrayBottomK(k, array) возвращает K наименьших элементов в порядке возрастания. #104563 (Vitaly Baranov).
- Добавлена новая системная таблица
system.iceberg_files, предоставляющая метаданные отдельных файлов для таблиц Iceberg, по одной строке на каждый файл данных или файл удаления в текущем снимке каждой таблицы. Это закрывает #98777. #104415 (Asya Shneerson).
- Добавлена таблица
system.constraints, которая предоставляет информацию обо всех ограничениях CHECK и ASSUME во всех таблицах, включая имя ограничения, тип и выражение. #105337 (Pedro Ferreira).
- Добавлена новая таблица
system.dictionary_layouts, в которой перечислены доступные структуры словарей вместе со встроенной документацией (description, syntax, examples, introduced_in, related). #106182 (Alexey Milovidov).
- Добавлена новая таблица
system.dictionary_sources, в которой перечислены доступные источники словарей вместе со встроенной документацией (description, syntax, examples, introduced_in, related). #106184 (Alexey Milovidov).
- Добавлена новая таблица
system.data_skipping_index_types, в которой перечислены доступные типы индексов с пропуском данных вместе со встроенной документацией (description, syntax, examples, introduced_in, related). #106186 (Alexey Milovidov).
- Добавлена новая таблица
system.disk_types, в которой перечислены доступные типы дисков вместе со встроенной документацией (description, syntax, examples, introduced_in, related). #106187 (Alexey Milovidov).
- Реализована команда
SYSTEM RESTART DISK <name>: теперь она заново загружает хранящиеся в памяти метаданные диска и повторно сканирует части данных таблиц с репликами только для чтения, расположенных на нём. Это позволяет реплике таблицы только для чтения на общем хранилище plain_rewritable по запросу увидеть данные, записанные другим сервером, не дожидаясь refresh_parts_interval и без перезапуска сервера. #106645 (Jordi Villar).
- Теперь поддерживается синтаксис в стиле PostgreSQL
expr OP SOME(array) / expr OP ALL(array) (с правой частью не в форме с подзапросом), который переписывается в has / NOT has для =/<> или в лямбда-выражения arrayExists / arrayAll для других операторов сравнения. ANY не принимается для формы с массивом, поскольку any также является агрегатной функцией; используйте вместо этого SOME. Форма с подзапросом для ANY/SOME/ALL по-прежнему сводится к IN / NOT IN. #105129 (Alexey Milovidov).
- Добавлены две новые стратегии
load_balancing, hostname_longest_common_prefix и hostname_longest_common_suffix, которые отдают предпочтение той реплике, чей хост имеет самый длинный общий префикс (соответственно, суффикс) с хостом инициатора. Они полезны, когда дата-центр закодирован как префикс или суффикс в именах хостов, числовые сегменты которых имеют переменную длину, и существующие стратегии nearest_hostname и hostname_levenshtein_distance выбирают неправильную реплику. #107360 (Denny [DBA at Innervate]).
- В таблицу
system.session_log добавлена информация о TLS-сертификате клиента (subjects, серийный номер, издатель и срок действия), чтобы улучшить обсервабилити аутентификации на основе сертификатов. #107679 (Alexey Milovidov).
- Добавлен необязательный учетный параметр
external_id для role-based access к S3. #106941 (Elian Gidoni).
- Добавлена новая настройка
S3Queue after_processing_move_preserve_path. Когда она включена вместе с after_processing='move' и after_processing_move_prefix, обработанные объекты перемещаются с сохранением полного исходного пути под префиксом пункта назначения, а не сводятся только к имени файла. #105354 (Asya Shneerson).
- Добавлена настройка сервера
message_queue_disable_insertion, чтобы отключить вставку из движков очередей сообщений (Kafka, RabbitMQ, NATS) в materialized view в состоянии attached. Полезно для сценариев с репликой только для чтения. #104911 (JIaQi Tang).
- Добавлены
LOCALTIME и LOCALTIMESTAMP (SQL-стандарт / синтаксис PostgreSQL). LOCALTIMESTAMP — это псевдоним для now() (возвращает DateTime); LOCALTIME возвращает текущее время суток как значение Time. #106139 (Thomas Cabral).
- Добавлен
date_part('unit', expr) как синтаксический сахар для EXTRACT(unit FROM expr). Поддерживаются все стандартные виды интервалов, а также дополнительные варианты PostgreSQL (epoch, dow, doy, isodow, isoyear, century, decade, millennium). #105127 (Alexey Milovidov).
- Добавлена PostgreSQL-совместимая поддержка
EXTRACT(TIMEZONE_HOUR FROM dt) и EXTRACT(TIMEZONE_MINUTE FROM dt) для получения часов и минут смещения часового пояса, а также EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>) для извлечения значения из интервала. #106227 (Vinayak Joshi).
- Добавлены агрегатные псевдонимы
min_by и max_by для argMin и argMax. #105712 (Joey Yu). Эти псевдонимы дурацкие, настоящие инженеры используют оригинальные имена ClickHouse.
- Добавлен
REGEXP_SUBSTR как регистронезависимый псевдоним regexpExtract для совместимости с Oracle/MySQL/Snowflake. #105122 (Alexey Milovidov).
- Добавлен
SESSION_USER как регистронезависимый псевдоним currentUser() для совместимости с PostgreSQL / SQL-стандартом. #106081 (Takumi Hara).
- Поддерживается завершающий модификатор
NULL / NOT NULL в ALTER TABLE ... ADD/MODIFY COLUMN, по аналогии с CREATE TABLE. #106150 (Takumi Hara).
- Теперь можно использовать функцию
h3PolygonToCellsWithContainment из h3, чтобы задействовать их новый алгоритм, поддерживающий режимы включения по центру, полного включения и перекрытия. #104455 (Youssef Kadry).
- Добавлены флаги
IPV4_PREFIX_BITS и IPV6_PREFIX_BITS, если формирование ключей выполняется по IP_ADDRESS или FORWARDED_IP_ADDRESS. #89270 (Aditya Chopra).
formatReadableTimeDelta теперь принимает на вход выражение INTERVAL типа, отличного от Month и Year. #64315 (Francisco J. Jurado Moreno).
- Теперь можно указать необязательный аргумент precision для функций
formatReadableSize, formatReadableDecimalSize и formatReadableQuantity, который задаёт количество цифр после десятичной точки. Значение по умолчанию — 2, что сохраняет прежнее поведение. #104648 (Antonio Filipovic).
- Добавлена настройка
output_format_float_precision, управляющая количеством десятичных цифр в текстовом выводе чисел с плавающей запятой. #99721 (phulv94).
- Добавлена настройка
output_format_always_write_decimal_point_in_float_and_decimal, которая всегда выводит десятичную точку для чисел с плавающей запятой и чисел Decimal в текстовых форматах, даже если значение является целым числом. Например, выводится 1. вместо 1. По умолчанию отключена. #62614 (Ilya Yatsishin).
- Добавлена поддержка новых элементов configuration HTTP-обработчика:
<url_prefix> и <full_url_prefix> (сопоставляют все path в пределах базового path, полезно, например, для обработчиков Prometheus), а также <url_regexp>, <full_url_regexp> и <headers_regexp>. Старая форма <url>regex:...</url> теперь Obsolete. #107492 (Vitaly Baranov).
- Добавлена поддержка статистики
basic — компактной статистики по каждому столбцу, которая хранит числовые min/max, среднюю длину строк и количество значений NULL там, где это применимо. #106048 (Han Fei).
- Добавлена поддержка TTL-узлов в ClickHouse Keeper; включается флагом возможности
create_ttl. #100397 (Konstantin Vedernikov).
- Представлена возможность резервирования памяти для рабочих нагрузок. См. документацию по планированию рабочих нагрузок. #82414 (Sergei Trifonov).
Экспериментальные возможности
- Многостадийное выполнение распределённого запроса: планировщик разбивает план запроса на стадии, соединённые обменами scatter / broadcast / gather / shuffle, и отправляет фрагменты плана на узлы-воркеры. Данные между стадиями передаются потоком по TCP или через временные файлы в общем объектном хранилище; этот механизм поддерживает distributed shuffle и broadcast hash JOIN, shuffle-агрегацию и распределённую сортировку. Эта возможность экспериментальная и по умолчанию отключена. #106020 (Alexander Gololobov). Экспериментальный движок планов распределённых запросов (
make_distributed_plan) теперь может использовать разные порты для диспетчеризации задач и streaming exchange для каждого воркера, настраиваемые для каждой реплики в <remote_servers> с помощью stateless_worker_port и streaming_exchange_port. Если они не заданы, используются прежние порты уровня сервера (stateless_worker_client.port и distributed_query.streaming_exchange_port). Это позволяет запускать несколько воркеров на одном хосте. #107885 (Alexander Gololobov).
- Добавлен экспериментальный алгоритм переупорядочивания JOIN
dphyp для inner JOIN в качестве опции настройки query_plan_optimize_join_order_algorithm, а также настройка query_plan_optimize_join_order_max_searched_plans, которая ограничивает поиск порядка JOIN и при превышении лимита переключается на следующий алгоритм в цепочке; установите 0, чтобы сохранить прежнее неограниченное поведение поиска. #98798 (Alexander Gololobov).
- Добавлена функция
aiEmbed для использования API LLM и генерации эмбеддингов прямо из ClickHouse. #102922 (George Larionov).
- Добавлена экспериментальная Linux OOM-канарейка: жертвенный дочерний процесс, который Linux OOM killer завершает раньше основного процесса сервера. При включении с помощью
oom_canary_enable она снижает нехватку памяти, очищая кэши аллокатора, отменяя запросы, отменяя слияния и записывая событие в system.crash_log. Реакция на OOM требует наличия свидетельства OOM-kill в memory.events cgroup v2. #101942 (Peng).
- Веб-интерфейс терминала по адресу
/webterminal теперь является production-функцией и включён по умолчанию. Он управляется новой серверной настройкой enable_webterminal; прежняя настройка allow_experimental_webterminal устарела, но по-прежнему поддерживается для обратной совместимости. Чтобы отключить конечную точку, установите enable_webterminal в false. #106255 (Alexey Milovidov).
- HTTP-конечные точки PromQL теперь поддерживают указание базы данных и таблицы через параметры запроса URL (
database=, table=, или table=db.table). Прежний неявный fallback на таблицу default.prometheus удалён: если ни config обработчика, ни URL не указывают таблицу, обработчик теперь возвращает The time series table name is not set. Чтобы сохранить прежнее поведение, настройте <table>default.prometheus</table> или передайте table=... в URL. #107553 (Vitaly Baranov).
- Добавлена поддержка функции PromQL
histogram_quantile в табличных функциях prometheusQuery и prometheusQueryRange. Это позволяет вычислять квантили по классическим бакетам гистограммы Prometheus, определяемым меткой le. #103477 (Joe Smith).
- Добавлен отложенный режим применения списка вхождений для текстового индекса. При включении через
SET allow_experimental_text_index_lazy_apply = 1 и SET text_index_posting_list_apply_mode = 'lazy' списки вхождений декодируются по требованию на уровне упакованных блоков с использованием подхода на основе курсора вместо полной материализации в Roaring Bitmaps, что снижает использование памяти и время CPU для выборочных запросов к текстовому индексу. #100035 (Peng).
- Добавлена поддержка ABI AssemblyScript для WebAssembly UDF. Попробовать ABI AssemblyScript можно без локальной установки toolchain — в браузерной песочнице, которая компилирует код AssemblyScript и загружает получившийся модуль WebAssembly в локальный ClickHouse. #104606 (Vladimir Cherkasov).
- Разрешено подключать обработчики Prometheus на основном HTTP-порту с необязательным префиксом. #104975 (James Cunningham).
- Добавлен экспериментальный параметр
MergeTree packed_skip_index_max_bytes, который объединяет небольшие подстримы skip-индексов в один архив skp_idx.packed для каждой части, снижая расход inode, когда для таблицы определено много skip-индексов. Решение принимается для каждого подстрима во время записи: подстримы, чей сериализованный размер остаётся ниже порога, попадают в архив, а всё, что больше, сохраняет автономную структуру skp_idx_<name>.idx2 / .mrk2. В одной части можно сочетать оба варианта структуры. Полнотекстовые индексы не поддерживаются и всегда хранятся в отдельных файлах. Значение по умолчанию — 0 (упаковка отключена). #105321 (Raúl Marín).
- Добавлена поддержка сериализации
Buffers для WebAssembly UDF с использованием ABI BUFFERED_V1, а также добавлен webassembly_udf_enable_fuel как сохраняемый параметр функции WASM UDF. #105574 (Antonio Andelic).
- Добавлен экспериментальный параметр
use_reader_executor (по умолчанию выключен), который направляет чтение через новый конвейерный ReaderExecutor вместо legacy-цепочки буферов чтения. #106570 (Sema Checherinda). Добавлены метрики обсервабилити для экспериментального пути чтения use_reader_executor, включая моделируемый KPI стоимости чтения (ReaderExecutorModeledCostMsPerRequestedMiB). #106968 (Sema Checherinda). Добавлен буфер ChainedBuffers для экспериментального пути чтения use_reader_executor с метрикой ReaderExecutorChainedBufferBytes. #107210 (Sema Checherinda).
- Нисходящий порядок сортировки в ключах сортировки
MergeTree (например, ORDER BY (time DESC, key)) теперь поддерживается всегда и больше не требует экспериментального параметра allow_experimental_reverse_key, который стал устаревшим. #106440 (Nikita Mikhaylov).
Nullable(Tuple(...)) теперь в статусе бета. По умолчанию отключено; чтобы использовать, установите enable_nullable_tuple_type = 1. #107754 (Nihal Z. Miaji).
- Различные изменения в Keeper, которые в целом ускоряют его примерно в 2 раза (улучшенная пакетная обработка, конвейерная отправка сообщений лидеру, конвейерное добавление записей в журнал). #101757 (Michael Kolupaev).
- Снижены накладные расходы на запрос для простых запросов
SELECT (разбор, анализ и планирование). Например, SELECT count() FROM hits через одно соединение теперь выполняется примерно на 50% быстрее. #104513 (Raúl Marín).
- Оптимизирован анализ индекса первичного ключа для длинных первичных ключей и первичных ключей с высокой кардинальностью. Для длинного первичного ключа время анализа индекса теперь в основном зависит от сложности фильтра запроса (то есть от столбцов ключа, которые он действительно использует), а не от длины самого первичного ключа — поэтому расширение ключа сортировки почти не добавляет накладных расходов на анализ индекса для запросов, которые фильтруют только по нескольким его столбцам. Для первичного ключа с высокой кардинальностью, где ClickHouse хранит в памяти только выборочный префикс столбцов ключа и не загружает последующие, анализ индекса теперь работает только с этим префиксом в памяти, а не со всем ключом. Оптимизация включена по умолчанию, а отключить ее можно с помощью новой настройки
use_lightweight_primary_key_index_analysis. Закрывает #65103. #91836 (Nihal Z. Miaji).
- Сборка x86 по умолчанию теперь ориентирована на x86-64-v3 (AVX2) вместо x86-64-v2 (SSE4.2). Для этого требуется CPU с поддержкой AVX2 (Intel Haswell или новее, AMD Excavator или новее). Если ваш CPU не поддерживает AVX2, используйте сборку
amd64compat, ориентированную на обычный x86-64. #105019 (Raúl Marín).
- Для сравнительных сортировок общего назначения теперь используются
ipnsort и driftsort (стабильная сортировка) — порты на C++ реализаций сортировки из стандартной библиотеки Rust. Это ускоряет ORDER BY для нечисловых столбцов и стабильных сортировок, а также устраняет худший сценарий для входных данных, отсортированных в обратном порядке. #106650 (Alexey Milovidov).
- Новая оптимизация
GROUP BY для равномерно распределенных ключей с высокой кардинальностью распределяет строки по потокам с помощью хеширования ключа группировки, так что каждый поток агрегирует непересекающееся подмножество ключей без этапа слияния. Чтобы включить ее, установите enable_sharding_aggregator = 1. #104233 (Nihal Z. Miaji).
- Включена предвыборка hash table для запросов
GROUP BY со строковыми ключами, что повышает производительность агрегации строк с высокой кардинальностью примерно на 8%. #101007 (Le Zhang).
- Снижено пиковое потребление памяти при слиянии частичных результатов двухуровневой агрегации с большими состояниями агрегатной функции (например,
groupArray) за счет поэтапного освобождения исходных состояний каждого бакета во время слияния, вместо того чтобы держать их все в памяти до завершения процесса. #102330 (Yuri Fedoseev).
- Оптимизировано представление
Enum DataType в памяти. Потребление памяти таблицами, содержащими тип Enum, для компонента Enum может снизиться до 10 раз. Время получения имени по значению (числу) осталось прежним или стало меньше. Поиск по имени стал немного медленнее, но такой вариант доступа используется реже. #95668 (Ilya Yatsishin).
- Добавлено кэширование разрешения идентификаторов, чтобы избежать повторного разрешения одних и тех же идентификаторов при анализе запроса. #88043 (Max Justus Spransy).
- Улучшена производительность анализа запросов к таблицам с большим числом столбцов: исключено вычисление хешей узлов столбцов (которые включают всё выражение исходной таблицы), когда в этом нет необходимости. Анализ вложенных подзапросов
SELECT * для таблицы с ~1200 столбцами теперь выполняется примерно в 50 раз быстрее. #106957 (Dmitry Novik).
- Ускорен анализ запросов с большим количеством вызовов функций или с глубоко вложенными вызовами за счёт удаления избыточного хеша дерева запроса из кэша разрешения функций. #107516 (Dmitry Novik).
- Исправлены длительные зависания при входе и запуске запросов в реплицируемом хранилище прав доступа, когда одновременно изменяется много сущностей доступа (политики строк, роли, квоты, профили настроек). Теперь каждый кэш отдельных сущностей пересчитывается один раз на батч уведомлений, а не по одному разу на каждую изменённую сущность, что устраняет квадратичную нагрузку, из-за которой блокировка доступа могла удерживаться минутами. #107672 (Azat Khuzhin).
FixedHashMap из hash JOIN теперь используется как JOIN runtime filter на стороне probe. Если hash table на стороне build является FixedHashMap (или может быть преобразована в него), она публикуется как runtime filter и заменяет Set/BloomFilter, который в противном случае устанавливал бы BuildRuntimeFilterStep. Это поведение управляется новой настройкой join_runtime_filter_from_fixed_hash_table (по умолчанию true). #105640 (Xiaozhe Yu).
- Отложенное применение selector и индексов репликации в случаях, когда после
JOIN идёт селективный LIMIT, TopN или другой JOIN. Чтобы управлять количеством столбцов полезной нагрузки для включения отложенных selector-индексов, используйте настройку query_plan_min_columns_for_join_lazy_indexing (0 означает, что оптимизация отключена). Чтобы управлять значением LIMIT, при котором применяется оптимизация, используйте настройку query_plan_max_limit_for_join_lazy_indexing. #106566 (Hechem Selmi).
- DP (dynamic programming) переупорядочивание JOIN теперь разрешено с параллельными репликами. #105889 (Nikita Taranov).
- Улучшен план запроса, когда JOIN использует runtime filters (при включённой по умолчанию настройке
enable_join_runtime_filters): модель стоимости переупорядочивания JOIN теперь учитывает WindowTransform (и другие шаги плана, сохраняющие строки) в правом поддереве и использует базовое количество строк и NDV по каждому столбцу вместо отката к отсутствию статистики. #107229 (UnamedRus).
- Де-виртуализован вывод несоединённых строк в RIGHT и FULL join за счёт их батчинга. #105679 (Hechem Selmi).
- Добавлена поддержка packed-методов
keys32 и keys64 в HashJoin. #107202 (Nikita Taranov).
- Добавлена поддержка packed-методов
keys32 и keys64 в Set. #107564 (Nikita Taranov).
- Оптимизирована обработка столбцов с типом Nullable в агрегации. #106015 (Nikita Taranov).
- Улучшена производительность запросов
LIMIT BY. #103349 (Nihal Z. Miaji).
- Ускорены запросы
ORDER BY ... LIMIT BY: LIMIT BY теперь выполняется внутри каждого параллельного отсортированного потока на этапе Sort, если столбцы LIMIT BY образуют префикс ORDER BY. Это уменьшает число строк, проходящих через финальное слияние сортировки и последующие этапы конвейера. Эта оптимизация управляется новой настройкой query_plan_push_limit_by_into_sort (включена по умолчанию). #104000 (Nihal Z. Miaji).
- Ускорены запросы
SELECT ... LIMIT N BY <cols>, когда <cols> являются префиксом ключа сортировки таблицы или становятся им после того, как WHERE col = const фиксирует начальные столбцы. При включенной опции MergeTree читает данные в порядке первичного ключа, а LIMIT BY сначала фильтрует их в стриминговом режиме с памятью O(1) на каждый отсортированный поток, отсекая большую часть данных; затем на уменьшенном наборе данных выполняется обычный LIMIT BY для получения итогового результата. Управляется новой настройкой optimize_limit_by_in_order (включена по умолчанию). #105135 (Nihal Z. Miaji).
- Ускорены запросы
LIMIT BY на партиционированных таблицах MergeTree за счет выполнения LIMIT BY внутри потока каждой партиции параллельно, вместо слияния всех потоков в один перед применением ограничения. Это применимо, когда выражение партиционирования является детерминированной функцией от столбцов LIMIT BY, так что ни одна группа LIMIT BY не может охватывать две партиции. Управляется новой настройкой allow_limit_by_partitions_independently (включена по умолчанию). #105126 (Nihal Z. Miaji).
- Ускорены запросы
LIMIT BY за счет удаления избыточных ключевых выражений: ключ, который является детерминированной функцией других ключей, отбрасывается (например, LIMIT 5 BY x, f(x) превращается в LIMIT 5 BY x), а инъективная функция от ключа заменяется ее аргументом (например, LIMIT 5 BY toString(x) превращается в LIMIT 5 BY x). Это уменьшает число вычисляемых выражений на строку и снижает их стоимость. Управляется новыми настройками optimize_limit_by_function_keys и optimize_injective_functions_in_limit_by, обе включены по умолчанию. #106818 (Nihal Z. Miaji).
- Ускорены агрегация по сегментам, распределение по бакетам в
grace_hash join и параллельное партиционирование окон за счет замены хеширования столбцов для каждого фрагмента на kernel, использующий аппаратный CRC32C. #106538 (Harikrishnan Prabakaran).
- Оптимизированы
L1Distance, L2Distance, L2SquaredDistance, LinfDistance и cosineDistance для аргументов типа Array с многоцелевой автовекторизацией на x86-64-v4/v3. Для неконстантных аргументов типа Array все они, кроме LpDistance, который использует std::pow с exponent времени выполнения, теперь могут использовать kernel, векторизованные компилятором. Существующие быстрые пути для константных аргументов на базе AVX-512 и Sapphire Rapids BFloat16 для L2Distance и cosineDistance сохранены. #101310 (Peng).
- Улучшена производительность функций
{Norm}Distance и dotProduct. #106007 (Nikita Taranov).
- Улучшена производительность функции
arrayNorm. #106211 (Nikita Taranov).
- В некоторых случаях улучшена производительность
dotProduct. #106210 (Nikita Taranov).
- Улучшена производительность AVX-512 const-left путей для
L2Distance и cosineDistance на Array(Float32), Array(Float64) и Array(BFloat16), когда длина массива делится на ширину векторизованной обработки без остатка. #104625 (Sergey Kuznetsov).
- Включена генерация кода AVX-512 для AMD и улучшена генерация кода для
arrayDistance. #106505 (Nikita Taranov).
- Улучшена производительность функций
L2DistanceTransposed и cosineDistanceTransposed для типа данных QBit. #106701 (Raufs Dunamalijevs).
- Производительность функций
encrypt, decrypt, tryDecrypt, aes_encrypt_mysql и aes_decrypt_mysql увеличена до порядка величины, что позволило восстановить производительность, потерянную при миграции с BoringSSL на OpenSSL 3.x (24.4). #107339 (Konstantin Bogdanov).
- Улучшена производительность функций
encrypt, decrypt и halfMD5 за счёт исключения неявных построчных обращений к provider OpenSSL в OpenSSL 3.x. #99105 (Konstantin Bogdanov).
- Добавлена SIMD-реализация
SHA1, которая хеширует несколько входных значений параллельно с использованием AVX-512, повышая пропускную способность. #105459 (Joanna Hulboj).
- Добавлен backend AArch64 ASIMD/NEON для многобуферной реализации
MD5. #105563 (Venkata Vineel ).
- Исходные blocks теперь укрупняются перед вычислением projection во время
MATERIALIZE PROJECTION, чтобы уменьшить число временных projection parts и накладные расходы на merge. Ускорение ~3.4x на таблице с 50M строк. #100047 (Amos Bird).
- Снижена latency
INSERT для таблиц MergeTree с skip-индексами на столбцах ORDER BY за счёт исключения избыточных перестановок столбцов при записи части (~17% на рабочих нагрузках, характерных для traces). #101101 (Amos Bird).
- Включены SIMD-пути кода Arrow’s (NEON на ARM, SSE4.2/AVX2/AVX512 на x86), которые использованы для ускорения декодирования столбцов Parquet
FLOAT/DOUBLE, закодированных с помощью BYTE_STREAM_SPLIT. #106376 (Raúl Marín).
- Улучшена производительность вставки для столбцов
LowCardinality с индексами bloom_filter. #106410 (Michael Jarrett).
- Копирование blob в
DiskObjectStorageTransaction::copyFile распараллелено с использованием отдельного пула потоков для каждого disk. #105089 (Asya Shneerson).
- Исключено чтение содержимого файла при использовании input format
One с file-подобными table functions, такими как file и s3. #105157 (Yue Ni).
- Запуск
clickhouse на macOS ускорен примерно в 3 раза за счёт отказа от экспорта динамических символов, которые в противном случае динамический компоновщик обрабатывал бы при каждом запуске. #107768 (Raúl Marín).
- Ускорена загрузка файлового кэша при запуске за счет устранения лишнего открытия каталога для каждого ключа кэша. #107414 (Alexey Milovidov).
- Ускорена загрузка файлового кэша при запуске: после завершения перечисления каталога потоки, выполнявшие его, теперь помогают загружать метаданные кэша, вместо того чтобы оставлять половину потоков бездействующими. #107416 (Alexey Milovidov).
- Снижены накладные расходы на запуск процесса
clickhouse за счет обновления встроенной библиотеки WasmEdge, которая больше не генерирует случайный hash-секрет в глобальном инициализаторе при каждом запуске. #107869 (Raúl Marín).
- Основной ключ
MergeTree и индекс пропуска данных теперь могут отсекать гранулы для фильтров, в которых ifNull или coalesce оборачивает условие, например ifNull(key = 0, 0) или coalesce(key = 0, 0). Такие предикаты — их генераторы запросов часто создают, чтобы преобразовать сравнение с возможным NULL в однозначное булево значение — ранее были непрозрачны для анализа индексов и не позволяли пропускать гранулы. Это расширяет действие существующей настройки allow_key_condition_coalesce_rewrite (включена по умолчанию). Закрывает #106264. #106272 (Andy Zhao).
- Вычисление индекса пропуска данных для типов
DateTime64 в 26.6 должно потреблять меньше CPU. #107707 (Shankar Iyer).
- Улучшена производительность анализа текстового индекса при поиске по нескольким токенам за счет оптимизации обработки редких токенов. #98226 (Anton Popov).
- Для сжатых сегментов posting list текстового индекса теперь используется кэш. #106299 (Anton Popov).
- Улучшена производительность универсального алгоритма поиска с исключением для запросов, выбирающих большие непрерывные диапазоны таблицы. #93813 (Michael Jarrett).
S3-клиенты с одинаковыми конечной точкой и bucket используют общий кэш, что позволяет избежать повторного определения региона. Закрывает #92482. #96802 (Andrey Zvonov).
- Если запрос содержит
has(<constant array>, <expr>), analyzer преобразует узел так, чтобы по возможности использовать более быструю реализацию in. #97341 (Shankar Iyer).
- Когда в
ThreadPool планируется новая задача, пробуждается рабочий поток, который последним перешел в бездействующее состояние (LIFO), а не произвольный. Это уменьшает фрагментацию памяти из-за кэшей allocator, привязанных к потокам. Порядок обработки задач не меняется. #100177 (Alexey Milovidov).
- Улучшена производительность приближенных Runtime Filters и индексов Bloom filter. #100201 (Christoph Viebig).
- Для
ASOF JOIN теперь можно использовать алгоритм JOIN parallel_hash, распараллеливая построение по различным значениям ключей равенства. Ранее ASOF всегда исключался из parallel_hash. #105375 (Greg Maher).
- Исключено чтение неограниченных входных данных для запросов
INTERSECT и EXCEPT, когда при пустом входе результат заведомо пуст. #105393 (Yue Ni).
- Для различных блокировщиков
MemoryTracker добавлен constinit. #105490 (Azat Khuzhin).
- Повышена производительность
bitmapContains для состояний groupBitmap с типами, отличными от UInt64, за счёт устранения повторных вызовов rb_max при проверке диапазона. #105960 (Yue Ni).
- Ускорены запросы с несмежным доступом для столбцов
LowCardinality, использующих один словарь. #103662 (Ivan Babrou).
- Для probe в
HashJoin добавлен быстрый путь, когда блок содержит одну строку. #106008 (Nikita Taranov).
- Предикаты из запросов вида
SELECT ... FROM view(SELECT ... FROM remote(...)) WHERE ... теперь проталкиваются в запрос, отправляемый на удалённый шард. В оптимизации allow_push_predicate_ast_for_distributed_subqueries не хватало обработки табличных функций. #105986 (Nikolai Kochetov).
enable_join_transitive_predicates теперь включён по умолчанию. #103724 (Alexander Gololobov).
- Добавлена поддержка функций
multiSearchAny, multiSearchAnyUTF8 и multiMatchAny в текстовых индексах. Также улучшен анализ текстовых индексов для функции match: теперь шаблоны с альтернативными группами позволяют пропускать больше гранул. #106279 (Anton Popov).
- Теперь фильтры, появляющиеся после первоначального отбора PREWHERE (predicate pushdown, runtime filters или явный PREWHERE плюс предложение WHERE, заданное планировщиком), можно объединять с существующим PREWHERE на втором проходе оптимизатора, а не оставлять отдельным шагом Filter над чтением
MergeTree. #105445 (Yarik Briukhovetskyi).
QueryConditionCache теперь отдельно фиксирует отфильтрованные гранулы даже внутри пакетов чтения, которые лишь частично проходят PREWHERE, что уменьшает число меток, повторно считываемых последующими запросами с тем же условием. #105335 (Han Fei).
- Добавлена настройка Keeper
nuraft_use_bg_thread_for_snapshot_io, включённая по умолчанию, чтобы NuRaft читал объекты снимков в фоновом потоке, а не в worker threads Raft. #106285 (Antonio Andelic).
- Снижено пиковое потребление памяти при применении полученных снимков в ClickHouse Keeper с
KeeperMemoryStorage. #105851 (Antonio Andelic).
- Выделения LLVM/JIT теперь направляются в выделенную arena jemalloc. Это уменьшает фрагментацию RSS, вызванную чередованием долгоживущих служебных структур JIT с краткоживущими выделениями запросов. Для обсервабилити добавлены новые асинхронные метрики
jemalloc.jit_arena.active_bytes, jemalloc.jit_arena.dirty_bytes, CompiledExpressionCacheBytesMax и CompiledExpressionCacheCountMax. SYSTEM DROP COMPILED EXPRESSION CACHE теперь также удаляет базовые экземпляры CHJIT и очищает JIT arena. #104113 (Raúl Marín).
- Исправлено избыточное резервирование памяти при чтении разрежённых словарно-кодированных столбцов
Nullable(String) из Parquet с помощью нативного V3-ридера. #102805 (Francisco).
- Исправлена работа
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) на дисках encrypted: данные копировались вместо создания жёстких ссылок. #106731 (Nikita Mikhaylov).
- Улучшена оценка мощности в оптимизаторе плана запроса: столбец, полученный детерминированной одноаргументной функцией (например,
toYear(date)), теперь наследует число различных значений своего аргумента как верхнюю границу, а не остаётся без статистики, что позволяет точнее переупорядочивать JOIN. #107757 (Alexander Gololobov).
- Снижены накладные расходы CPU на асинхронное логирование при высокой интенсивности логов: потребитель лога теперь уведомляется только при переходе queue из пустого состояния в непустое, а не для каждого сообщения. #107352 (Nikita Mikhaylov).
- В большем числе сценариев устранены дублирующиеся вычисления во время выполнения запроса. #106113 (Yarik Briukhovetskyi).
- Распараллелена обработка результата рекурсивного CTE:
GROUP BY и другие операции над большим результатом WITH RECURSIVE больше не ограничены одним thread. #107694 (Alexey Milovidov).
- Улучшена производительность регистронезависимого поиска подстроки (
positionCaseInsensitiveUTF8, ILIKE, multiSearchAnyCaseInsensitiveUTF8 и связанных функций) за счёт добавления NEON SIMD-пути на ARM и более широкого AVX2-ядра на x86. #107882 (Raúl Marín).
- Исправлена регрессия пропускной способности кодека
FPC для чисел с плавающей точкой на ARM примерно на 16%, возникшая после того, как его таблицы предсказателя начали использовать VectorWithMemoryTracking. #108182 (Groene AI).
- Фоновый
MemoryWorker теперь периодически обновляет жёсткий лимит памяти сервера на основе текущего использования памяти и объёма памяти, который ядро считает доступным, чтобы ClickHouse оставлял место для других процессов на том же хосте. Формула: (resident memory + system MemAvailable) * max_server_memory_usage_to_ram_ratio. Одна и та же настройка сервера max_server_memory_usage_to_ram_ratio управляет и ограничением при запуске, и динамической корректировкой; установите её в 0, чтобы отключить оба механизма. Чтобы сохранить только статическое ограничение при запуске/перезагрузке (как в предыдущих версиях), установите новую настройку сервера memory_worker_dynamic_hard_limit в 0. #104964 (Alexey Milovidov).
- Добавлена поддержка PostgreSQL client для C# в протоколе
PostgreSQL. Это закрывает #18611. #80785 (Konstantin Vedernikov).
- Мутации теперь используют analyzer. #98884 (Nikolai Kochetov).
- Добавлен более гибкий контроль вывода запросов в CLI. Опция
--echo теперь принимает необязательное булевое значение и работает как в интерактивном режиме, так и в пакетном режиме. Новые опции --echo-formatted и --echo-query-id управляют соответственно форматированием выводимых запросов и выводом query_id. Опция --hilite/--highlight теперь также управляет подсветкой выводимых запросов. Побочный эффект этого изменения: --echo теперь является опцией с булевым значением, поэтому позиционный запрос, указанный сразу после --echo без значения, трактуется как её значение; вместо этого используйте --echo --query "..." или --echo=false. #106191 (Alexey Milovidov).
- Поддерживается изменение схемы вместе с параллельными проверками согласованности для каталогов озёр данных. #106102 (Konstantin Vedernikov).
- Разрешено использовать cache disk для движков таблиц data lake. #102017 (RinChanNOW).
- Исправлено чтение данных таблиц в базах данных
DataLakeCatalog с catalog_type = 'onelake': теперь по умолчанию используется конечная точка OneLake Blob (.blob.fabric.microsoft.com). Установите onelake_use_blob_endpoint = false, чтобы сохранить прежнее поведение с DFS-конечной точкой (.dfs.fabric.microsoft.com). #106843 (Konstantin Vedernikov).
- Значение по умолчанию для настройки
persistent_processing_node_ttl_seconds в S3(Azure)Queue изменено с 1 hour на 6 hours (это время очистки после нештатного перезапуска сервиса и т. п.). Предыдущее значение по умолчанию подходило для TTL узлов обработки, но оно также используется для TTL блокировки бакета, которая может удерживаться дольше, поэтому 1 часа было недостаточно. #106838 (Kseniia Sumarokova).
- Размер metadata cache
Iceberg по умолчанию уменьшен с 1 GB до 128 MB. #106492 (Konstantin Vedernikov).
query_id стриминг-задачи S3Queue теперь передаётся в зависимые операции вставки в таблицы. #106494 (Christoph Wurm).
- Поле
used_storages в system.query_log теперь заполняется именем storage engine при выполнении запросов к таблицам через DataLakeCatalog. #100706 (Melvyn Peignon).
- Вы можете проверить, какие значения
operation и summary есть у снимков Iceberg. Полезно для тестирования и отладки. #106246 (Den Kalantaevskii).
- Финальный запрос multipart-загрузки в
S3 теперь выполняется асинхронно через task tracker, поэтому он может перекрываться с загрузкой последней части, а не выполняться последовательно на этапе finalize. #105487 (Asya Shneerson).
- Добавлены четыре новые настройки таблицы
MergeTree для управления параметрами текстовых индексов по умолчанию: text_index_dictionary_block_size, text_index_dictionary_block_frontcoding_compression, text_index_posting_list_block_size и text_index_posting_list_codec. Эти настройки позволяют настраивать поведение текстовых индексов на уровне таблицы без указания параметров в каждом определении индекса. Явно заданные аргументы отдельных индексов по-прежнему имеют приоритет. #100626 (Anton Popov).
- Проекциям разрешено переопределять дополнительные настройки
MergeTree (сжатие, формат частей, сериализацию), а не только index_granularity; для этого используются список разрешённых настроек и валидация. #101170 (Amos Bird).
- В
system.merges добавлены столбцы current_projection, current_projection_progress, projections_completed и projections_remaining, чтобы отображать прогресс слияния проекций. #102611 (Amos Bird).
- Исправлена ситуация, при которой
PREWHERE с подзапросом IN по столбцам первичного ключа не использовал индекс первичного ключа для отсечения гранул, что приводило к полному сканированию таблицы вместо чтения только нужных гранул. #102570 (Nikita Mikhaylov).
- Функция
h3PolygonToCells теперь применяет ограничение на максимальный размер массива ко всем полигонам MultiPolygon, проверяет коды возврата базовой библиотеки H3 и отклоняет аргументы MultiLineString вместо того, чтобы молча возвращать пустой результат. #106399 (Raúl Marín).
- Добавлена новая таблица
system.keeper_snapshots, доступная только в Keeper, с информацией о локальных снимках ClickHouse Keeper. #105571 (Miсhael Stetsyuk).
- Добавлена новая таблица
system.keeper_changelogs, доступная только в Keeper, с информацией о локальных файлах changelog ClickHouse Keeper (журналах Raft). #105617 (Miсhael Stetsyuk).
- Добавлена таблица
system.keeper_cluster, доступная только в Keeper. Она содержит по одной строке на каждого участника кластера Raft, как его видит текущий Keeper. #105646 (Miсhael Stetsyuk).
- Для watches добавлено больше событий профиля Keeper (server-side + client-side). Закрывает #97703. #105336 (Konstantin Vedernikov).
- Добавлены
coordination_settings Keeper для ограничения допуска неподтверждённых записей в журнал NuRaft и throttling обратного probe для append-entries. #106108 (Antonio Andelic).
- Добавлена настройка
enable_compression для табличной функции mysql, движка таблицы MySQL, движка базы данных MySQL, словаря SOURCE(MYSQL) и именованных коллекций. Когда она включена, ClickHouse согласовывает сжатие на уровне протокола MySQL для всех данных, передаваемых по соединению. #103229 (Bernard Lim).
- Снижена задержка отмены для запросов, выполняемых по протоколу PostgreSQL:
KILL QUERY теперь прерывает сериализацию вывода в пределах одного фрагмента, вместо того чтобы ждать отправки клиенту всего фрагмента. #106535 (Roman Vasin).
- Снижена задержка отмены для запросов, выполняемых по протоколу MySQL:
KILL QUERY теперь прерывает сериализацию вывода в пределах одного фрагмента, вместо того чтобы ждать отправки клиенту всего фрагмента. #107228 (Roman Vasin).
- Исправлено чтение длины
auth_response при рукопожатии MySQL: байт длины >= 128 интерпретировался как значение размером в несколько гигабайт, поскольку считывался как знаковый char. #107384 (uwezkhan).
MaterializedPostgreSQL теперь сопоставляет столбцы PostgreSQL numeric(p, 0) с precision больше 76 (например, numeric(78, 0), используемый для 256-битных целых чисел) с ClickHouse Int256 вместо завершения с ошибкой “Precision too big”. Значения, которые не помещаются в Int256, отклоняются с понятным сообщением об ошибке. #107431 (Alexey Milovidov).
- Клиенту теперь отправляется Исключение, если не удаётся установить TCP-соединение. #107317 (Nikolai Kochetov).
- Пользователи теперь могут вставлять поля
Avro Fixed для 8-/16-/32-/64-битных целочисленных вариантов. #98139 (Patrick Pichler).
- Формат
AvroConfluent теперь повторяет попытки через Confluent Schema Registry HTTP client при временных сбоях (тайм-аутах транспорта, отказе в соединении, ошибках DNS, HTTP 5xx/408/429) с экспоненциальной задержкой, вместо того чтобы прерывать INSERT при первом же сетевом сбое. Политику задают новые настройки format_avro_schema_registry_max_retries (по умолчанию 5) и format_avro_schema_registry_retry_initial_backoff_ms (по умолчанию 100). Ошибки валидации схемы (HTTP 409, некорректный Avro JSON) по-прежнему считаются фатальными. #106661 (Groene AI).
- В
system.query_log.used_privileges теперь записываются привилегии для всех проверок выданных прав доступа, включая проверки, проходящие через путь без генерации исключения isGranted (checkAccessWithFilter). Ранее записывались только привилегии, проверенные через точки входа с генерацией исключения (checkAccess / checkGrantOption), из-за чего READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL не отображались в журнале аудита для DESCRIBE, CREATE TABLE AS и подобных запросов, использующих табличные функции file / s3 / azure / url. Применение правил доступа не изменилось. #104693 (Alexey Bakharew).
- Добавлены асинхронные метрики
TotalUncompressedBytesOfMergeTreeTables и TotalUncompressedBytesOfMergeTreeTablesSystem, которые показывают общий несжатый размер данных, хранящихся в таблицах семейства MergeTree. #106364 (Alexey Milovidov).
- Добавлено событие профиля
GlobalMemoryLimitExceeded, чтобы операторы могли отслеживать моменты, когда достигается общий лимит памяти сервера. #106466 (Sacheendra Talluri).
- Счетчики
ExecutableUserDefinedFunction* в ProfileEvents теперь заполняются для UDF executable_pool. В system.query_log.ProfileEvents теперь отображаются количество вызовов, затраченное реальное время и время ожидания в пуле для каждого вызова, использование CPU дочерними процессами, пиковое потребление памяти, а также объем байтов stdin/stdout. #105010 (Xu Jia) #105618 (Ilya Andreev).
- Добавлены асинхронные метрики
ExecutableUserDefinedFunctionMemoryResidentBytes и ExecutableUserDefinedFunctionProcesses, которые показывают объем resident memory (VmRSS) и количество работающих процессов пользовательских функций executable и executable_pool, включая descendant processes и простаивающие воркеры пула. #107300 (Hanzi Jiang).
- Добавлены три асинхронные метрики только для Linux —
MemoryThreadStacksCount, MemoryThreadStacksVirtual и MemoryThreadStacksResident, — которые отдельно показывают память стеков pthread, не смешивая ее с остальной анонимной памятью. Включаются через asynchronous_metrics_enable_heavy_metrics. Требуются Linux 5.17+ (prctl(PR_SET_VMA_ANON_NAME)) и доступный для чтения /proc/self/smaps; в противном случае метрики отсутствуют, а ограничение фиксируется в system.warnings. #106230 (Raúl Marín).
- Асинхронные метрики
MemoryThreadStacks* (resident/virtual size и количество стеков потоков) теперь доступны в macOS. #107752 (Raúl Marín).
- Движки таблиц теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description, syntax, examples, introduced_in и related таблицы system.table_engines. #106177 (Alexey Milovidov).
- Движки баз данных теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description, syntax, examples, introduced_in и related таблицы system.database_engines. #106178 (Alexey Milovidov).
- Типы данных теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description, syntax, examples, introduced_in и related таблицы system.data_type_families. #106180 (Alexey Milovidov).
- Форматы ввода/вывода теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description, examples, introduced_in и related таблицы system.formats. #106181 (Alexey Milovidov).
- Комбинаторы aggregate function теперь содержат встроенную документацию, доступную для анализа через новые столбцы
description, syntax, examples, introduced_in и related таблицы system.aggregate_function_combinators. #106185 (Alexey Milovidov).
- В
клиент ClickHouse, clickhouse-local и встроенный клиент добавлена опция командной строки --chime. Когда запрос завершается (успешно или с ошибкой) после выполнения в течение как минимум N секунд, клиент записывает в stderr управляющий ASCII-символ BEL (\x07). Будет ли терминал издавать звук или показывать визуальную вспышку, зависит от настроек пользователя. По умолчанию опция включена с порогом 5 секунд; передайте --chime N, чтобы задать свой порог, или --chime 0, чтобы отключить ее. Закрывает #92718. #104545 (Groene AI).
- В
clickhouse-client, если терминал не поддерживает bracketed paste, переводы строк во вставленном многострочном запросе теперь сворачиваются в одном буфере редактирования, а не вызывают переход к prompt продолжения для каждой строки. Вставленный запрос остается под одним prompt, а клавиши со стрелками позволяют перемещаться между его строками. Это улучшение работает по мере возможности и опирается на типичное поведение вставки с буферизацией TTY. #104299 (Alexey Milovidov). Теперь это также работает при отключенной подсветке синтаксиса (--highlight 0). #106665 (Alexey Milovidov).
- Добавлено управление pager во время выполнения в стиле MySQL для
clickhouse-client/clickhouse-local. #105706 (Azat Khuzhin).
clickhouse-client теперь корректно работает с терминалами без UTF-8: если кодирование символов терминала не UTF-8 (например, при LANG=C), форматы Pretty переключаются на рамки ASCII вместо вывода Unicode-символов псевдографики, которые могли бы исказить отображение в терминале. #106213 (Alexey Milovidov).
- Очищены отображаемые строки, передаваемые сервером при обработке пакета
Hello в clickhouse-client (имя сервера, часовой пояс, отображаемое имя, шаблоны и сообщения правил пароля), чтобы враждебный сервер не мог внедрить байты, которые клиент отобразит как есть; также ограничен их размер для защиты от неограниченного выделения памяти. #105243 (Raúl Marín).
- Web UI теперь отображает результат как изображение, если запрос использует выходной формат изображения, например
FORMAT PNG, вместо показа raw bytes в виде таблицы. #107638 (Alexey Milovidov).
- Добавлена настройка
output_format_pretty_use_nbsp_for_padding, чтобы отображать дополнение в табличной раскладке табличных форматов Pretty как U+00A0 NO-BREAK SPACE, когда output_format_pretty_grid_charset равно UTF-8. Это помогает сохранять выравнивание таблицы при копировании вывода Pretty в инструменты, которые схлопывают обычные пробелы. По умолчанию настройка отключена, а вывод с кодировкой ASCII сохраняет обычные пробелы. #103559 (Ashrith Bandla).
- Универсальный скрипт установки теперь также устанавливает
clickhousectl в ~/.local/bin на Linux и macOS, создавая символьную ссылку chctl. Чтобы пропустить это, установите CLICKHOUSE_ONLY=1. #105399 (Alasdair Brown).
- Исправлена ложная ошибка
Syntax error: Unterminated quoted string, которая могла периодически возникать при установке ClickHouse через curl https://clickhouse.com/ | sh, если в текущем каталоге уже существовал бинарный файл clickhouse. #106417 (Alexey Milovidov).
- Исправлена высота левой панели на странице
play.html, когда открыт web terminal, чтобы кнопка переключения терминала внизу оставалась видимой. #105087 (Alexey Milovidov).
- Устранено автоматическое выделение единственного запроса в Web UI после его выполнения. #105711 (Joey Yu).
- Web SQL UI теперь расширяет редактор запросов, если запрос выше текущей высоты редактора не более чем на 30%. #105713 (Joey Yu).
- В веб-интерфейсе значки нижнего меню (веб-терминал и GitHub) теперь располагаются горизонтально, когда левая панель развернута, что дает списку баз данных и таблиц больше вертикального пространства. #106427 (Alexey Milovidov).
- В веб-интерфейсе (
play.html) нажатие Escape теперь снимает выделение с текущей ячейки таблицы результатов. #107777 (Alexey Milovidov).
- Улучшена панель баз данных в Web SQL UI (Play): добавлена всплывающая подсказка на значке базы данных, кнопка скрытия панели, кликабельные названия баз данных и таблиц во всю ширину, а также исправлено смещение ширины панели при появлении полосы прокрутки. #108013 (Alexey Milovidov).
- Добавлена настройка сервера (
min_allocation_size_to_throw_on_memory_limit), позволяющая любой операции выделения памяти сгенерировать исключение MEMORY_LIMIT_EXCEEDED; это должно помочь предотвратить OOM. #105265 (Azat Khuzhin).
- Разрешена аутентификация
NONE для SSH (это предотвращает запрос пароля для пользователей no_password). #105476 (Azat Khuzhin).
- В
clickhouse su перед сбросом привилегий теперь очищается список дополнительных групп, что соответствует поведению /bin/su и sudo. Ранее процесс после сброса привилегий наследовал дополнительные группы пользователя, вызвавшего команду. #105247 (Raúl Marín).
- Добавлена поддержка
BFloat16 для функций числовых предикатов (isFinite, isNaN). #105391 (Mohamed Hussain S).
- Снижено использование памяти полигональных словарей (
polygon_index_cell, polygon_index_each), а также исправлено отображение в system.dictionaries.bytes_allocated индекса поиска, который они строят. #105431 (Raúl Marín).
- Исправлена работа consumers движка таблицы Kafka, которые после назначения партиций продолжали использовать короткий интервал опроса: теперь они возвращаются к настроенному
kafka_poll_timeout_ms, что позволяет избежать избыточных пустых опросов, слишком мелких вставляемых частей и лишних накладных расходов на слияние после перебалансировок. #100431 (sugaf1204).
- При удалении неиспользуемых столбцов в плане запроса столбцы теперь идентифицируются по позиции, а не по имени. Это позволяет удалять неиспользуемые столбцы при наличии дублирующихся имен столбцов. #100586 (János Benjamin Antal).
- ClickHouse теперь выдает корректное исключение при попытке использовать
table_readonly для движков с репликацией, а также улучшена обработка исключений для DDL-запросов (и DatabaseReplicated), связанных с этой настройкой. #100950 (alesapin). OPTIMIZE TABLE ... ON CLUSTER и другие DDL больше не зависают, если у целевой таблицы задано table_readonly = 1. Эта настройка теперь генерирует новый отдельный код ошибки TABLE_IS_PERMANENTLY_READ_ONLY, который DDLWorker считает не подлежащим повторной попытке (в отличие от временного TABLE_IS_READ_ONLY, возникающего при временных отключениях ReplicatedMergeTree от ZooKeeper). Настройка table_readonly теперь также явно запрещена для ReplicatedMergeTree — как при создании, так и через ALTER MODIFY SETTING. В продолжение #97652. #105109 (Alexey Milovidov).
- Исправлены обновления refreshable materialized view, которые могли завершаться ошибкой
UNKNOWN_TABLE после замены целевой таблицы (например, через EXCHANGE TABLES или удаление с последующим повторным созданием): теперь при обновлении целевая таблица определяется по имени, а не по устаревшему UUID. #102724 (Seva Potapov).
- Добавлена настройка
wait_for_part_commit_in_dependent_materialized_views (по умолчанию false). Когда SELECT в materialized view читает данные из собственной исходной таблицы (например, через INNER JOIN с источником), каскад мог пропустить строку, вставляемую в данный момент, поскольку вставленный part коммитится только после выполнения зависимых представлений. При включении этой настройки коммит part выполняется до срабатывания зависимых представлений, поэтому они видят строку, находящуюся в процессе вставки, ценой снижения параллелизма вставки. #105943 (Elmi Ahmadov).
- Не подавлять фатальные ошибки (например,
MEMORY_LIMIT_EXCEEDED) в tryDeserialize. #106808 (Azat Khuzhin).
- Лениво проверять право
CREATE TEMPORARY TABLE в InverseDictionaryLookupPass. #107098 (Azat Khuzhin).
- Исправлена ошибка
ILLEGAL_TYPE_OF_ARGUMENT для distributed queries с serialize_query_plan = 1, содержащих лямбда-выражение с константным аргументом (например, arrayMap(t -> t.2, ...)). Константные столбцы узлов INPUT в ActionsDAG теперь сохраняются при сериализации плана запроса. #107124 (Alexey Milovidov).
- Десериализация состояний агрегатных функций
contingency, cramersV, cramersVBiasCorrected и theilsU теперь проверяет, что сохранённые счётчики образуют корректную таблицу сопряжённости, и в противном случае выбрасывает Исключение CORRUPTED_DATA. Закрывает #106899. #107185 (Nihal Z. Miaji).
- Сохраняются исходные коды ошибок для исключений, обёрнутых в
arrow::Status. #107267 (Azat Khuzhin).
- Добавлена поддержка
keyed_by_normalized_query_hash для квот, определённых в статической конфигурации сервера (users.xml), в соответствии с существующим синтаксисом DDL CREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (Alexey Milovidov).
- Настройка compatibility больше не применяет устаревшие настройки, поэтому не помечает их как изменённые и не выдаёт предупреждения об устаревших настройках. #107737 (Maxim Orlovsky).
- Async inserts больше не записывают в лог полный список
query_id на уровне trace/debug, что с версии 26.2 могло чрезмерно раздувать text_log в services с интенсивным трафиком async inserts. Подробные строки теперь выводятся на уровне test. #107852 (Sema Checherinda).
- Улучшение файлового кэша: невалидные записи приоритета больше не удерживают
KeyMetadata. Продолжение #106387. #107903 (Kseniia Sumarokova).
- Улучшение метрик
FileCache. #106116 (Kseniia Sumarokova).
- Не выводить преамбулу “Stack trace (when copying this message, always include the lines below):” в сообщениях об исключениях, если трассировка стека на самом деле пуста. #106524 (Alexey Milovidov).
- Исправлено потенциальное переполнение в
roundUpToMultiple при вычислении выравнивания границы файлового кэша для очень больших смещений. #92579 (Bharat Nallan).
EXPLAIN SYNTAX теперь единообразно форматирует операторы как вызовы функций в выводе explain (например, plus(1, 2) вместо 1 + 2). #94681 (Mohamed Abdelhalim ).
- Улучшены подсказки имён таблиц в сообщениях об ошибках: больше не предлагается то же самое имя, а в подсказку теперь включается и имя базы данных (например, “Maybe you meant
other_db.my_table?”). #95116 (Mathuranath Metivier).
- Улучшено сообщение об ошибке для неразрешённых идентификаторов в запросах без предложения
FROM: теперь оно предлагает добавить FROM. #101769 (Yash ).
- Добавлена опция
EXPLAIN PIPELINE для компактного отображения повторяющихся цепочек процессоров. #104662 (Yue Ni).
- Исправлено чтение за пределами буфера кучи при построении сообщения о синтаксической ошибке (
UTF8::computeWidthImpl через parseQuery.cpp), возникавшее, когда парсер откатывался назад за первую точку с запятой / токен конца потока; в release-сборках в отображаемую ошибку могли попадать байты из соседней памяти кучи, а сборки с ASan аварийно завершались. #105086 (Groene AI).
- Hive-стратегия партиционирования теперь используется по умолчанию в настройке compatibility
file_like_engine_default_partition_strategy. #86746 (Kseniia Sumarokova).
- На macOS теперь используется больший стек потока (8 MiB), чтобы соответствовать значению по умолчанию в Linux; это устраняет редкие сбои сервера из-за переполнения стека во время JIT-компиляции. #107033 (Raúl Marín).
- Ограничение размера временного хранилища для
clickhouse-local больше не жёстко задано на уровне 1 GiB. Значение по умолчанию увеличено до 1 TiB, и его можно настроить с помощью настройки сервера max_temporary_data_on_disk_size. #106689 (Alexey Milovidov).
- В
clickhouse-disks добавлена команда read-checksums. Она читает файл checksums.txt из MergeTreeDataPart и выводит его в виде удобочитаемой таблицы с полями, разделёнными табуляцией. #106901 (Asya Shneerson).
- В
clickhouse-disks добавлена команда read-bitmap. #107834 (murphy-4o).
- Chdig: включён TLS для защищённых соединений (раньше это приводило либо к “unknown setting
skip_verify”, либо к “connection reset by peer”). #105864 (Azat Khuzhin).
chdig v26.5.1. #105918 (Azat Khuzhin).
chdig v26.6.1 — {asynchronous_,}metric_log, шаблоны запросов, тепловые карты, журналы/трассировки, сохраняемые на диске (ранее на 1 час трассировок могло уходить >40GiB). #107678 (Azat Khuzhin).
- Конфигурация сервера (
programs/server/config.xml) теперь задает keep_alive_timeout равным 30 (ранее 10), что соответствует фактическому задокументированному и реализованному значению по умолчанию. #107779 (Dan Checkoway).
- Значение по умолчанию для настройки сервера
disk_connections_rcvbuf изменено с 0 (автотюнинг TCP ядра) на 204800 (200 КБ), что ограничивает TCP-буфер приема на сокет для подключений дисков объектного хранилища (S3/Azure/GCS). #107859 (Sema Checherinda).
- Оптимизатор
PREWHERE теперь перед оценкой селективности группирует конъюнкты, ссылающиеся на один и тот же набор столбцов, поэтому условия вида a > 2500 AND a < 2502 оцениваются совместно как единый диапазон, а не как два независимых предиката, что дает более точную оценку селективности. #106337 (Han Fei).
- Добавлены защищенная и обычная реализации сокетов с поддержкой silk fiber. #107680 (Miсhael Stetsyuk).
- Исправлены искаженное сообщение об ошибке (перепутанные аргументы) и опечатка в функции
nested. #108031 (Alexey Milovidov).
- В
clickhouse-disks добавлена команда sed, которая применяет sed-выражение к указанному пути с изменением файла на месте. #107131 (Asya Shneerson).
- Для движка базы данных
MaterializedPostgreSQL добавлена настройка materialized_postgresql_use_extended_date_and_time_types, задаваемая при создании. По умолчанию (если она включена) столбцы PostgreSQL date/timestamp определяются как Date32/DateTime64; если при CREATE DATABASE задать ей значение 0, будут определяться более узкие типы Date/DateTime. #107428 (Alexey Milovidov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Добавлена возможность удалять отсоединённые части с суффиксом
tryN. #58957 (János Benjamin Antal).
- Исправлено исключение
MULTIPLE_EXPRESSIONS_FOR_ALIAS для запросов с повторяющимися псевдонимами проекций (например, SELECT *, day + 365 AS day) во вложенных подзапросах при выполнении с параллельными репликами. #80310 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
splitMultipartQuery выдавал ошибку “Empty query” для запросов, заканчивающихся комментарием после точки с запятой. #85491 (Yarik Briukhovetskyi).
- Исправлено исключение в
ARRAY JOIN: Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшее при использовании числовых типов LowCardinality (issue #57243). #91784 (Jimmy Aguilar Mena).
- Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK при использовании LIMIT BY с константными столбцами вместе с DISTINCT и ORDER BY в новом analyzer. #93195 (Ashrith Bandla).
- Исправлена проблема, из-за которой столбцы
NOT NULL незаметно создавались как Nullable, когда data_type_default_nullable = 1, а таблица создавалась в базе данных Replicated или через предложение ON CLUSTER. #97572 (xiaohuanlin).
- Повышена стабильность соединения с HiveCatalog за счёт добавления механизма автоматических повторных попыток и логики переподключения для обработки ошибок TTransportException при взаимодействии с Hive Metastore. #98471 (Dmitriy Borisenko).
- Исправлена работа функции
nested (используемой внутри ARRAY JOIN), которая удаляла LowCardinality из типов столбцов, из-за чего Array(LowCardinality(String)) в выводе превращался в Array(String). Закрывает #95582. #98974 (Yash ).
- Исправлено исключение “Distributed task iterator is not initialized” при использовании
url, s3 или подобных табличных функций в запросах с включённой параллельной репликой. #100146 (Alexey Milovidov).
- Исправлено исключение logical error при чтении таблиц Iceberg, версия формата которых была повышена внешним инструментом (например, Spark). #100407 (Alexey Milovidov).
- Функции
like, ilike, notLike, notILike и match теперь поддерживают константный haystack с неконстантной needle (например, 'foo' LIKE pattern_column), тогда как раньше это приводило к ILLEGAL_COLUMN. #100479 (Yash ).
- Исправлено неверное количество строк, возвращаемых запросом
MaterializedView при query_plan_enable_optimizations = 0, когда представление сопоставляет целочисленный столбец со столбцом Bool. #100692 (Maksim Moisiuk).
- Исправлено исключение (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') при чтении таблиц Iceberg, содержащих файлы данных ORC, с включённой PREWHERE optimization. #101206 (Groene AI).
- Исправлено состояние гонки в RestCatalog. #101216 (Smita Kulkarni).
- Исправлена ошибка
NOT_FOUND_COLUMN_IN_BLOCK при выполнении SELECT из VIEW поверх таблицы с обычной проекцией. #101218 (Amos Bird).
- Исправлены устаревшие метаданные в FileLog в случае, когда файл удаляется и создается заново. #101408 (Azat Khuzhin).
- Исправлено переупорядочивание JOIN, которое без ошибок отбрасывало несовпавшие строки из
RIGHT/LEFT JOIN, когда он соединялся через запятую (cross) с другой таблицей, например t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Ранее запрос возвращал результат inner join вместо outer join. #101684 (Groene AI).
- Исправлено поведение, при котором предложение
FORMAT поглощалось INSERT вместо применения к выводу EXPLAIN в EXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Yash ).
- Исправлен некорректный выбор кодека сжатия для частей
MergeTree, когда на уровне таблицы явно задавалась настройка default_compression_codec. Части, записанные при вставке, во время слияний и для проекций, использовали общесерверный кодек по умолчанию вместо настройки уровня таблицы (теперь это также охватывает пустую часть, создаваемую полностью удаляющей мутацией). #101784 (Yash ).
- Теперь отрицательные значения
Float64 (например, -100.5) в настройках рабочей нагрузки, таких как max_bytes_per_second, max_cpus и т. д., отклоняются. Ранее проверялись только отрицательные целые числа, из-за чего отрицательные числа с плавающей точкой могли незаметно создавать некорректные узлы scheduler. Закрывает #101825. #101842 (Groene AI).
- Исправлена ошибка
LOGICAL_ERROR (“Port is not connected”, code 49), которая могла возникать при выполнении запросов с VIEW, содержащим aggregation внутри JOIN. #102574 (Jimmy Aguilar Mena).
- Исправлены несогласованные метаданные части после мутаций столбцов с нестандартными сериализациями. #102817 (Eduard Karacharov).
- Исправлено обновление метаданных перед выполнением мутации, что устраняет #96806. #102882 (Smita Kulkarni).
- Исправлено значительное замедление запросов SELECT при одновременном выполнении
INSERT. Ранее конвейер INSERT резервировал слоты CPU вплоть до max_threads в начале запроса, даже если большинство слотов так и не использовалось, из-за чего параллельные SELECT оставались без ресурсов. Теперь выделение слотов CPU происходит по требованию: конвейер запрашивает слоты только по мере фактической передачи распараллеливаемой работы. Это применяется как к управлению параллелизмом, так и к вытесняющему планировщику CPU для рабочих нагрузок. Новая настройка сервера concurrent_threads_lazy_allocation (по умолчанию true) служит механизмом отката. #102928 (Seva Potapov).
- Исправлено распространение
NULL при чтении подстолбцов, извлечённых из столбцов Nullable(Tuple(...)). Например, для tup Nullable(Tuple(s Nullable(String))) запрос SELECT tup.s теперь корректно возвращает NULL в строках, где внешний кортеж равен NULL, вместо мусорных значений. Это охватывает все типы элементов, которые могут представлять NULL: Nullable, Dynamic, Variant и LowCardinality(Nullable(...)). Закрывает #105356. #102942 (Nihal Z. Miaji).
- Теперь выбрасывается
INCORRECT_DATA вместо LOGICAL_ERROR, если данные, переданные клиентом в формате Native, обрезаны или имеют неверный формат. #102975 (János Benjamin Antal).
- В операцию чтения из ObjectStorage добавлена проверка отмены. Закрывает #98165. #103016 (Smita Kulkarni).
- Теперь при декодировании параметров aggregate function учитывается
input_format_binary_max_type_complexity. Закрывает #102903. #103026 (Pavel Kruglov).
- Исправлен вывод nullable для geo-столбцов в ридере Parquet на базе Arrow. Закрывает #101845. #103032 (Pavel Kruglov).
- Исправлено, что
recursiveRemoveLowCardinality стирал пользовательские имена geometry type (например, LineString вместо Ring, MultiLineString вместо Polygon), что приводило к неверной интерпретации geometry type. Закрывает #103207. #103041 (Joanna Hulboj).
- Исправлено, что
input_format_max_block_size_bytes молча игнорировался при разборе INSERT, когда max_insert_block_size_bytes равен 0 (значение по умолчанию). Теперь этот параметр корректно ограничивает размер блоков, формируемых построчными входными форматами. #103068 (Kirill Kopnev).
- Исправлено, что ClickHouse иногда создавал недопустимые токены GSSAPI из-за некорректного удаления завершающих null-байтов. #103114 (Michael Jarrett).
- Исправлено вычисление констант на этапе analyzer для функций с short-circuit (
if, multiIf, and, or и т. д.), чтобы статически недостижимые ветви больше не вызывали исключения на этапе анализа. Например, WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) теперь корректно возвращает 0 вместо ошибки деления на ноль. #103157 (Peng).
EXPLAIN SYNTAX раскрывает parameterized views. #103263 (Jordi Villar).
- Исправлено повреждение данных при записи в Parquet (и другие форматы с трейлером, такие как ORC и Arrow) в HDFS через
INSERT INTO FUNCTION hdfs(...). Начиная с версии 26.1, WriteBufferFromHDFS не сбрасывал свой рабочий buffer при finalize(), поэтому последние вплоть до DBMS_DEFAULT_BUFFER_SIZE байт каждого файла молча терялись, включая нижний колонтитул PAR1 файла Parquet. При чтении таких файлов возвращалась ошибка Not a Parquet file (wrong magic bytes at the end of file). #103268 (Groene AI).
- Исправлены неверные результаты и возможная logical error для correlated subqueries, когда ограничение на размер JOIN (
max_rows_in_join / max_bytes_in_join) задано вместе с join_overflow_mode = 'break'. JOIN, который внутренне создаётся для вычисления correlated subquery, теперь игнорирует эти пользовательские ограничения, поэтому больше не может преждевременно останавливаться и отбрасывать строки. #103322 (Groene AI).
- Исправлена bug, из-за которой
ALTER TABLE ... MODIFY SETTING для таблицы EmbeddedRocksDB мог сохранять недопустимое значение настройки в metadata file таблицы, даже если server отклонял запрос. При следующем перезапуске server таблицу не удавалось подключить из-за CANNOT_PARSE_BOOL (или похожей ошибки разбора), а в databases, где ошибки загрузки считаются фатальными, server отказывался запускаться. Недопустимые значения настроек теперь отклоняются до записи каких-либо metadata. #103417 (Groene AI).
- Исправлено аварийное завершение server при создании таблицы с движком object storage (
AzureBlobStorage, DeltaLakeAzure, S3, HDFS) с неподдерживаемым числом arguments. Теперь server возвращает корректную ошибку NUMBER_OF_ARGUMENTS_DOESNT_MATCH вместо аварийного завершения в debug/sanitizer-сборках. #103544 (Groene AI).
- Исправлено падение server при parsing параметров data type
JSON и Dynamic, когда abstract syntax tree (AST) был структурно некорректным (например, созданным AST-фаззером): у выражения параметра equals(name, value) могло оказаться меньше двух children, которые DataTypeObject и DataTypeDynamic затем разыменовывали без проверки границ. #103545 (Groene AI).
- Исправлены logical errors в analyzer при конфликте column names в lambda, используемой в prewhere. Закрывает #103584. #103627 (Pavel Kruglov).
- Исправлена спорадическая
Logical error: 'Database <name> not found' из DataLakeConfiguration::getCatalog, когда таблица с движком Iceberg загружалась в обычной database во время асинхронной загрузки metadata. #103775 (Groene AI).
- Исправлены ошибки
MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшие на удалённых replicas при выполнении queries, которые ссылаются на псевдонимы projection внутри PREWHERE / WHERE / HAVING / QUALIFY (например, SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) или SELECT * для self-join с пересекающимися column names, с параллельными replicas и parallel_replicas_local_plan = 0. Закрывает #74324. #103806 (Groene AI).
- Исправлено аварийное завершение server, когда запрос использует вложенные сравнения
coalesce/ifNull (например, WHERE coalesce(a, b, coalesce(c, d), e) = const) в таблице MergeTree с несколькими minmax индексами пропуска данных и use_skip_indexes_for_disjunctions = 1. Перезапись индексом пропуска данных для <op>(coalesce(...), const) теперь рекурсивно применяется к внутренним аргументам coalesce, так что RPN для KeyCondition каждого индекса соответствует RPN шаблона, как уже предполагает код отслеживания дизъюнкций. #103929 (Groene AI).
- Исправлено:
max_rows_to_transfer и max_bytes_to_transfer больше не игнорируются для запросов GLOBAL IN и GLOBAL JOIN в новом анализаторе. Теперь эти настройки вызывают SET_SIZE_LIMIT_EXCEEDED (или прерывают выполнение — в зависимости от transfer_overflow_mode), если материализованная external table превышает заданный лимит, как и в старом анализаторе. Закрывает #103333. #104119 (Groene AI).
- Исправлены избыточные чтения метаданных каталога/S3, когда
INSERT или DDL-оператор обращается к несуществующей таблице в database каталога DataLake при включенном show_data_lake_catalogs_in_system_tables. Ранее механизм подсказок при опечатках загружал полные метаданные Iceberg для каждой таблицы во всём каталоге, что на больших catalogs могло приводить к исчерпанию памяти. #104124 (DQ).
- Исправлены падение (
LOGICAL_ERROR “Columns are assumed to be of identical types, but they are different in Nullable” в debug-сборках, SIGSEGV из-за нулевого указателя в ColumnString::compareAt в release-сборках) и неверные результаты, которые могли возникать в запросах с direct join_algorithm и правой таблицей MergeTree, если plan lookup-поиска переставлял столбцы во время optimization. Столбцы правой стороны могли попадать в слоты с неверными именами, из-за чего filter или сравнение по join key выполнялись по столбцу неправильного типа. Проблема обнаружена AST-фаззером как STID 2139-5111 и зарегистрирована в #107272. #104174 (Groene AI).
- Теперь идентификатор партиции для
Date, выходящий за допустимый диапазон, отклоняется вместо молчаливого overflow или LOGICAL_ERROR при ALTER. #104250 (Azat Khuzhin).
- Отключены
additional_table_filters при использовании параллельных реплик и анализатора без serialization плана запроса. Ранее это могло приводить к некорректным результатам. #104296 (Azat Khuzhin).
- Исправлено:
dictGetOrNull больше не затирает другие столбцы в проекции SELECT значением NULL, если вызывается с ключевым столбцом Nullable, значения которого отсутствуют в словаре. Функция изменяла на месте null map, ссылающуюся на входные данные; теперь перед мутацией она делает глубокую копию результирующего столбца. Закрывает #73633. #104327 (Groene AI).
- Исправлена повреждённая patch part после
ALTER TABLE ... DROP PARTITION ID 'patch-...' с последующим DETACH/ATTACH TABLE. Ранее пустая покрывающая part записывалась без partition.dat и source_parts.dat, из-за чего после следующего attach или перезапуска сервера в system.detached_parts появлялась запись broken-on-start_patch-.... Закрывает #93132. Закрывает #102103. #104353 (Groene AI).
- Исправлена стриминговая
INSERT с input_format_max_block_wait_ms для интерфейса HTTP и для INSERT SELECT FROM input: теперь частичные входные block сбрасываются на диск до завершения request. #104534 (Alexey Milovidov).
- Исправлена ошибка, из-за которой запросы, сочетающие
arrayJoin с ORDER BY ... LIMIT после JOIN, могли без каких-либо сообщений возвращать ноль строк. Оптимизация плана запроса, поднимающая вычисление функции над SortingStep, больше не применяется, если поднимаемое выражение содержит arrayJoin, поскольку arrayJoin может изменять количество строк. Закрывает #82279. #104558 (Groene AI).
- Исправлено редкое аварийное завершение сервера при удалении таблицы семейства
MergeTree. Оно могло происходить, если shutdown выбрасывал исключение до полной остановки планировщика фоновых задач: фоновая задача, сработавшая в этот короткий промежуток, могла выполнить виртуальный вызов через частично разрушенный объект хранилища и попасть в __cxa_pure_virtual. #104561 (Groene AI).
- Исправлен некорректный результат в комбинированном подстолбце
JSON с подсказкой типа, содержащей NULL-значение. #104584 (Pavel Kruglov).
- Исправлены неверные результаты или пропуск projection, когда aggregate projection содержит несколько агрегатов
sumIf с разными условиями IN (...). #104765 (Jimmy Aguilar Mena).
- Исправлено неверное количество строк для
arrayJoin(), используемого внутри JOIN ON: результат лишний раз умножался на длину массива. #104785 (Shaohua Wang).
- Исправлено, что
deltaSumTimestamp возвращал неверные результаты для знаковых целочисленных типов при переходе через ноль. Решает #104750. #104830 (Konstantin Bogdanov).
- Исправлено несоответствие структуры блока в UnionStep после проталкивания фильтра с константами NULL. Закрывает #104821. #104853 (Pavel Kruglov).
- Исправлена ошибка
Logical error: 'Metadata is not initialized', возникавшая при DELETE FROM для только что подключённой таблицы Iceberg, DeltaLake или Hudi, если её metadata file повреждён или не может быть загружен. Теперь вместо этого возвращается обычное пользовательское исключение, а сервер продолжает работать. Закрывает #104891. #104917 (Groene AI).
- Исправлено, что
max_memory_usage_soft_limit не обновлялся на лету при изменении config. Soft memory limit вычислялся один раз при запуске и кэшировался, поэтому последующие Reloads config не давали эффекта. После этого исправления лимит пересчитывается и применяется сразу при каждом Reloads config; перезапуск Keeper не требуется. #104940 (Kai Zhu).
- Исправлено разрешение символов JIT на macOS, благодаря чему JIT-компиляция sort, expression и aggregate больше не завершается ошибкой
CANNOT_COMPILE_CODE: Could not find symbol _<name>. #104946 (Alexei Fedotov).
- Исправлено исключение (
Received signal 6 (abort) в vector hardening, наблюдаемое как Tuple::back() на пустом векторе) при выполнении запроса вида SELECT ... FROM <Distributed table> WHERE/HAVING/GROUP BY ... (sharding_key_column IN tuple()) с включённым optimize_skip_unused_shards_rewrite_in в новом analyzer. #104966 (Alexey Milovidov).
- Исправлено аварийное завершение сервера
Logical error: 'Inconsistent AST formatting' (STID 1941-1bfa) на запросах вида CREATE TABLE t (c0 Int CODEC(not((not(materialize(1), materialize(2)))), ZSTD)) ENGINE = Memory в debug-/sanitizer-сборках. Форматтер больше не добавляет лишние внешние скобки вокруг вызова функции tuple(...) с несколькими аргументами внутри списков аргументов CODEC / STATISTICS / BACKUP_NAME (где операторная форма (a, b) отключена), благодаря чему round-trip format-parse-format остаётся стабильным. #104991 (Groene AI).
- Исправлен
NOT_FOUND_COLUMN_IN_BLOCK, возникавший в ALTER TABLE ... MATERIALIZE INDEX на частях, созданных в 25.8 и содержащих индекс пропуска данных по столбцу, добавленному отдельной командой ALTER TABLE ... ADD COLUMN. Теперь во время принудительного пересчёта мутация корректно читает все столбцы, необходимые для всех уже существующих индексов пропуска данных и проекций в части. Закрывает #104872. #105039 (Groene AI).
- Исправлены два сценария
LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized, возникавшие в запросах с enable_materialized_cte: (1) повторно используемый materialized CTE, отфильтрованный через IN (subquery) по другому materialized CTE, и (2) materialized CTE, на который есть ссылка и напрямую, и внутри фильтра WHERE ... IN (...), попадающего в основной ключ MergeTree через вложенный IN-подзапрос. Те же запросы в EXPLAIN тоже были затронуты, поскольку ошибки проявлялись на этапе оптимизации плана. Закрывает #101940, закрывает #102320. #105041 (Dmitry Novik).
- Исправлена оценка selectivity статистики
countmin в PREWHERE для столбцов Float32. Из-за двух ошибок статистика countmin незаметно выдавала неверные оценки для столбцов Float32: ConditionSelectivityEstimator полностью пропускал статистику, когда тип столбца (Float32) был уже типа литерала (Float64), возвращаясь к selectivity по умолчанию и игнорируя sketch; а StatisticsCountMinSketch::estimateEqual хешировал первые N байт объекта Field, хотя Field хранит Float32 как Float64 (NearestFieldType<Float32> = Float64), поэтому байтовый шаблон, использовавшийся во время выполнения запроса, отличался от фактических байтов Float32, сохранённых при build. #105047 (Han Fei).
- Запросы
ATTACH TABLE name <clauses>;, в которых указаны секции хранения (ORDER BY, PARTITION BY, PRIMARY KEY, SAMPLE BY, TTL, UNIQUE KEY или SETTINGS движка) без ENGINE, теперь выдают BAD_ARGUMENTS вместо того, чтобы молча повторно подключать таблицу с сохранённым определением и отбрасывать секции, указанные пользователем. Сессионные SETTINGS на уровне запроса (например, log_comment) по-прежнему применяются. Используйте ATTACH TABLE t;, чтобы повторно подключить таблицу с сохранёнными метаданными, или ALTER TABLE t MODIFY SETTING ... после ATTACH, чтобы изменить настройки. #105068 (Groene AI).
- Исправлена ошибка use-after-free в
runningAccumulate, когда он вызывался для столбца, чья aggregate function возвращает собственное состояние (например, uniqStateOrDefaultState, sumStateOrDefaultState, uniqStateForEachState). #105085 (János Benjamin Antal).
- Исправлена ошибка в веб-интерфейсе (
play.html): при выполнении запроса, когда курсор находился после единственного завершающего ;, выводилось сообщение “empty query” вместо выполнения запроса. #105107 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR: 'No user in current context, it's a bug', возникавший, когда CREATE TABLE ... AS SELECT внутри базы данных Replicated читал данные из system.current_roles или system.enabled_roles. Теперь запрос успешно выполняется и в этом внутреннем контексте DDL worker возвращает пустой результирующий набор. #105150 (Groene AI).
- Исправлен
ILLEGAL_TYPE_OF_ARGUMENT при слиянии состояний агрегатной функции quantileExactWeightedInterpolated, quantileDD или quantilePrometheusHistogram с соответствующими вариантами во множественном числе quantilesXxxMerge (и наоборот). Варианты в единственном и множественном числе у этих трёх семейств quantile используют одно и то же внутреннее состояние агрегатной функции, но не были указаны во внутренней таблице сопоставления имён, поэтому межфункциональное слияние состояний — а также оптимизация слияния функций для этих семейств — отклонялись. #105189 (Groene AI).
- Исправлены некорректные результаты
toStartOfWeek, toLastDayOfWeek, toMonday, toStartOfMonth, toLastDayOfMonth, toStartOfQuarter и toStartOfYear для аргументов Date32 и DateTime64, если результат выходит за пределы диапазона Date: вместо переполнения в произвольные даты результаты до 1970-01-01 теперь ограничиваются значением 1970-01-01, а результаты после 2149-06-06 — значением 2149-06-06. Это также исправляет неверные результаты запросов (некорректно отсечённые части и гранулы), когда такие функции использовались в WHERE по ключу Date32 или DateTime64, содержащему значения вне диапазона. #105244 (Yarik Briukhovetskyi).
- Исправлена logical error в
arrayRemove, когда первый argument — массив Variant, все варианты которого несовместимы с типом второго argument, а variant_throw_on_type_mismatch отключён. Теперь функция трактует такое сравнение как “никогда не равны” и возвращает массив без изменений вместо server-side сбоя assertTypeEquality. #105248 (Groene AI).
- Запрос теперь может успешно выполняться, даже если
FileCache не смог создать какой-либо каталог на диске для кэширования. #105250 (Den Kalantaevskii).
- Исправлено аварийное завершение server с
Assertion 'px != 0' failed в ExtremesTransform, когда запрос с extremes = 1 сталкивался с исключением (например, MEMORY_LIMIT_EXCEEDED) в момент, когда transform строил свои столбцы extremes из первого chunk. Теперь клиент получает исходное исключение вместо падения сервера. #105264 (Groene AI).
LEFT ANTI JOIN теперь корректно возвращает столбец ключа JOIN с правой стороны со значениями по умолчанию для несовпавших строк, вместо того чтобы дублировать значение левого ключа. Ранее SELECT a.x AS l, b.x AS r FROM a LEFT ANTI JOIN b ON a.x = b.x мог возвращать r = a.x для несовпавших строк, хотя должен был возвращать значение по умолчанию (0 для Int32, '' для String, NULL для Nullable). Затронут был только столбец ключа JOIN; неключевые правые столбцы уже корректно заполнялись значениями по умолчанию. Та же ошибка возникала и в RIGHT ANTI JOIN, когда оптимизатор менял стороны местами. Закрывает #99959. #105278 (Groene AI).
- Исправлена потеря данных в
clickhouse-local при повторных запусках с --default_database, отличной от default (например, clickhouse-local --path X -- --default_database=mydb): поиск сохранённого UUID базы данных был жёстко привязан к metadata/default, поэтому при каждом перезапуске создавался новый UUID, а таблицы из предыдущего запуска становились невидимыми. Закрывает #101831. #105284 (Groene AI).
- Исправлена logical error
Mutation of Memory table produced incomplete output, возникавшая при выполнении ALTER TABLE <memory_table> APPLY PATCHES или ALTER TABLE <memory_table> APPLY DELETED MASK. Таблицы Memory не имеют собственных патч-частей или масок удаления, поэтому теперь обе команды корректно обрабатываются как операции без эффекта. #105286 (Groene AI).
- Исправлена проблема с долго выполняющимися запросами при работе с Unity Catalog за счёт передачи параметра
table_id в запросе. #105303 (Konstantin Vedernikov).
- Исправлен
CANNOT_CONVERT_TYPE для Merge поверх Merge поверх Distributed при distributed_group_by_no_merge=1. #105330 (Azat Khuzhin).
- Исправлено, что
clickhouse local и clickhouse client молча игнорировали --query/-q, если также был указан позиционный аргумент с файлом. Теперь в обоих случаях последовательно выдаётся BAD_ARGUMENTS. #105334 (Raúl Marín).
- Исправлено, что
REPLACE TEMPORARY TABLE молча создавал новую таблицу, если целевая таблица не существовала. Теперь выбрасывается UNKNOWN_TABLE, что соответствует семантике REPLACE TABLE. Используйте CREATE OR REPLACE TEMPORARY TABLE, чтобы сохранить поведение create-or-replace. #105373 (Groene AI).
- Исправлено падение долго выполняющихся чтений (например,
INSERT ... SELECT) из базы данных DataLakeCatalog с catalog_type = 'glue' с ошибкой ExpiredToken, когда учётные данные сеанса STS, полученные при загрузке метаданных таблицы, успевали истечь. Теперь учётные данные AWS STS обновляются прямо во время выполнения запроса, поэтому такие чтения продолжаются и после истечения срока действия токена. #105381 (Pratima Patel).
- Исправлена logical error в некоторых случаях с отрицательным
LIMIT BY при использовании ARRAY JOIN. #105403 (Nihal Z. Miaji).
- Исправлено завышенное значение
read_bytes (и производных байт/с, отображаемых в system.query_log, индикаторе прогресса и т. д.) при чтении файлов Parquet. В предыдущей реализации для каждого чанка сообщался общий compressed size всей группы строк, поэтому при чтении K из N столбцов происходил переучёт в N / K. Теперь значение суммируется только по выбранным столбцам. Также исправлено отслеживание прогресса на уровне файла для таблиц Iceberg: ранее размер файла данных вообще не учитывался. #105413 (Groene AI).
- Исправлен возможный segfault сервера в cluster table functions (
s3Cluster, urlCluster, fileCluster, …), когда планировщик формирует SELECT с установленным флагом recursive_with, но без выражения WITH. Закрывает #105370. #105433 (Groene AI).
- Исправлен неверный результат
countDistinct / uniqExact для столбцов Nullable, когда count_distinct_optimization = 1 (группа NULL подсчитывалась неправильно). #105439 (Raúl Marín).
- Исправлены heap-buffer-overflow при чтении файлов Arrow или ArrowStream с поврежденными промежуточными offsets в бинарном или строковом столбце, а также разыменование нулевого указателя при чтении георазмеченных Arrow-столбцов. #105449 (Raúl Marín).
- Добавлена проверка типов
Dynamic/Variant в оконном PARTITION BY; ранее она не выполнялась, если allow_suspicious_types_in_group_by отключен. Закрывает #105028. #105450 (Pavel Kruglov).
- Исправлена работа настройки
input_format_json_empty_as_default в форматах JSONStrings*. Закрывает #104913. #105453 (Pavel Kruglov).
- Исправлена вставка
NULL в столбец Variant через формат VALUES при разборе выражения. Закрывает #104909. #105455 (Pavel Kruglov).
- Исправлена ситуация, при которой
dictGetOrDefault генерировал CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN, если аргумент по умолчанию был выражением Nullable, а short_circuit_function_evaluation включен, при сочетании найденных и ненайденных ключей словаря. #105461 (Raúl Marín).
- Исправлено незаметное усечение значений в столбцах
Dynamic, когда текстовый reader Quoted (Values) переключался на String для неполных автоматически выведенных типов, таких как Map(Array(Nothing), ...). Ранее при fallback сырое поле оборачивалось простой конкатенацией '...', из-за чего внутренняя одинарная кавычка (в таких fallback-сценариях она присутствует всегда) преждевременно завершала строку в кавычках, и оставшаяся часть значения терялась. #105463 (Groene AI).
- Исправлен SIGSEGV при чтении подстолбцов
Dynamic из сжатой таблицы Memory после ALTER. Закрывает #104901. #105464 (Pavel Kruglov).
- Исправлено поведение
toFloat64/toUInt32/toString/etc. для Dynamic, при котором игнорировался cast_keep_nullable. Закрывает #104789. #105467 (Pavel Kruglov).
skip_first_lines теперь включен в ключ кэша схемы для форматов WithNames. Закрывает #104527. #105469 (Pavel Kruglov).
- Исправлен segfault сервера в
uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (и аналогичных chain-комбинаторах над uniq) при использовании с GROUP BY ... WITH ROLLUP, WITH CUBE или WITH TOTALS и аргументом Nullable. #105470 (Groene AI).
- Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK при сочетании ORDER BY ... WITH FILL INTERPOLATE и LIMIT N BY с включенным analyzer. Закрывает #103474. #105481 (Yakov Olkhovskiy).
- Исправлены
toStartOfMillisecond и toStartOfMicrosecond, которые для отрицательных значений DateTime64 (до эпохи Unix) возвращали результат со сдвигом почти на секунду; также исправлено signed-integer-overflow, выявляемое UndefinedBehaviorSanitizer, в toStartOfSecond, toStartOfMillisecond и toStartOfMicrosecond для входных значений DateTime64, близких к INT64_MIN. #105482 (Groene AI).
- Добавлена новая compatibility setting
analyzer_compatibility_prefer_alias_over_subcolumn (по умолчанию отключена). Когда она включена, новый analyzer для составных идентификаторов предпочитает интерпретацию с префиксом alias, а не совпадения с подстолбцами Tuple / столбцами с точечной нотацией, восстанавливая поведение предыдущего интерпретатора. Это позволяет избежать ошибок AMBIGUOUS_IDENTIFIER (и связанных с ними), когда запрос выполняет JOIN с таблицей, имя которой совпадает с внутренней таблицей CTE/подзапроса, использующего SELECT * поверх JOIN, и где переименованные через asterisk столбцы (например, b.id) иначе приводили бы к утечке идентификаторов внутренней таблицы во внешнюю область видимости. #105491 (Vladimir Cherkasov).
- Запрос векторного поиска, выполняемый с оптимизацией index only, теперь возвращает корректное значение
L2Distance(), если оно присутствует в списке SELECT. Ранее функция ошибочно возвращала значение расстояния L2-squared. Обратите внимание: сам запрос векторного поиска возвращал результаты с корректным ранжированием; квадрат расстояния могли увидеть только приложения, явно получавшие и интерпретировавшие значение L2Distance(). #105495 (Shankar Iyer).
- Исправлена редкая проблема в новом движке таблицы Kafka: во время переназначения партиций топика сообщения могли обрабатываться некорректно, что потенциально приводило к их пропуску после rollback смещения. #105500 (János Benjamin Antal).
- Исправлено Исключение (
Trying to execute PLACEHOLDER action logical error), возникавшее, когда MATERIALIZED CTE, тело которого представляет собой коррелированный подзапрос, использовался в правой части IN. Теперь такой CTE отклоняется на этапе анализа, что соответствует тому, как тот же шаблон уже отклоняется, когда на CTE ссылаются напрямую в FROM. #105518 (Groene AI).
- Исправлено, что сжатие для stdout/stdin не применялось, если format был указан явно. Закрывает #104441. #105528 (Pavel Kruglov).
- Исправлен SEGFAULT при десериализации
singleValueOrNull для типа JSON. Закрывает #103630. #105535 (Pavel Kruglov).
- Исправлено, что
clickhouse-format --backslash молча отбрасывал данные INSERT VALUES. Закрывает #103533. #105536 (Pavel Kruglov).
- Исправлено, что
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false не перехватывал исключения во время выполнения функции. Закрывает #103484. #105543 (Pavel Kruglov).
- Исправлено игнорирование
input_format_try_infer_datetimes при вставке в общие данные в JSON. Закрывает #103221. #105544 (Pavel Kruglov).
- Исправлена ошибка в
histogram, из-за которой на небольших неотсортированных входных данных возвращались неверные результаты. Закрывает #103109. #105548 (Pavel Kruglov).
- Исправлено циклическое переполнение
DateTime для значений вне допустимого диапазона в JSONExtract и при текстовой десериализации. Закрывает #103094. #105551 (Pavel Kruglov).
- Исправлено использование таблицы вставки в табличных функциях, когда включен
optimize_trivial_insert_select. Закрывает #103083. #105555 (Pavel Kruglov).
- Исправлено поведение
CASE expression, которое возвращало ветку ELSE вместо соответствующего THEN, когда и expression, и значение WHEN были NULL. #105556 (Raúl Marín).
- Исправлено падение
replxx, вызванное достижением ограничения FD_SETSIZE у select (теперь заменен на poll). Ранее при включенном SSH или веб-терминале это могло приводить к падению сервера. #105559 (Azat Khuzhin).
- Материализованы подстолбцы в
executePartitionByExpression перед выполнением expression. Закрывает #103057. #105573 (Pavel Kruglov).
- Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда выражение TTL ссылалось на подстолбец. #105578 (Pavel Kruglov).
- Исправлено падение сервера (SIGSEGV), которое мог вызвать любой пользователь с правами
CREATE TABLE, отправив по HTTP или через собственный протокол запрос CREATE TABLE ... TO INNER UUID '...' без clause ENGINE. Та же ошибка также приводила к падению клиента. Теперь parser сообщает корректную ошибку BAD_ARGUMENTS вместо разыменования нулевого указателя. #105579 (Groene AI).
- Исправлена ошибка, из-за которой window function
estimateCompressionRatio теряла накопленные данные между строками. Закрывает #101738. #105581 (Pavel Kruglov).
- Исправлено падение при вставке Tuple разного размера в одной clause
VALUES в столбец String. Закрывает #101727. #105582 (Pavel Kruglov).
- Извлечение значений Hive partition теперь учитывает настройку
cast_string_to_date_time_mode и по умолчанию принимает временные метки ISO 8601 с суффиксами часового пояса (например, +0000, +00:00, Z) в ключах партиционирования. #105584 (Alexey Milovidov).
- Исправлена ошибка
NOT_IMPLEMENTED при вызове toString для DateTime с Timezone, содержащим значение NULL. Закрывает #103712. #105587 (Yarik Briukhovetskyi).
- Исправлено чтение за пределами буфера при
Native-десериализации flattened столбца Dynamic. #105666 (Pavel Kruglov).
- Исправлен
LOGICAL_ERROR (Unexpected return type from if), возникавший при планировании запроса для выражений if, у которых тип результата — Variant, а вторая или третья ветка представляет собой if с константным условием над литералом UInt64, помещающимся в Int64. Закрывает #105649. #105680 (Groene AI).
- Исправлены неверные результаты при чтении Iceberg table с
iceberg_use_version_hint = 1, если перед этим другой writer (например, table function icebergLocal/icebergS3) без этой настройки продвигал таблицу. Теперь version-hint.text синхронизируется каждым writer, как только файл появляется, поэтому последующие readers, использующие hint, видят актуальный снимок. #105682 (Groene AI).
- Исправлен незаметный недосчёт в запросах
SELECT, когда use_query_condition_cache = 1 (по умолчанию). Запрос вида PREWHERE pk_prefix = X WHERE non_pk IN (...) к столбцу с bloom-filter индексом пропуска данных отравлял QueryConditionCache для предиката pk_prefix = X, из-за чего последующий безобидный SELECT count() ... WHERE pk_prefix = X возвращал некорректный заниженный результат. Затронуты все релизы 26.x. #104781. #105686 (Groene AI).
- Исправлено поведение
singleValueOrNullMerge, который возвращал конкретное значение вместо NULL при слиянии состояния, уже содержавшего несколько различных значений. #105734 (Minh Vu).
- Исправлено восстановление после ошибок во входном формате
Template после некорректных строк. #105735 (Yue Ni).
- Исправлен сбой в table function
mongodb, хранилище MongoDB и источнике словаря MongoDB, возникавший, когда имя collection пустое или содержит байты NUL. #105776 (Raúl Marín).
- Исправлена очистка снимков
Keeper после неудачных writes, чтобы частичные снимки безопасно удалялись, а неудачные writes можно было повторить без продвижения latest_snapshot_meta. #105779 (Antonio Andelic).
- Исправлено отклонение
ALTER TABLE ... CLEAR COLUMN для явных столбцов columns_to_sum в SummingMergeTree и CoalescingMergeTree. #105785 (Antonio Andelic).
- Исправлен assertion в
DatabaseCatalog::tryGetDatabase (и связанная с ним ошибка UNKNOWN_DATABASE в release-сборках) при создании parameterized view, у которого имя database передаётся через query parameter, например CREATE VIEW {db:Identifier}.v AS SELECT {p:UInt64}. Теперь параметры в DDL-частях оператора CREATE подставляются во время создания, а параметры в теле SELECT остаются доступными для подстановки во время вызова view. #105799 (Groene AI).
- Исправлена ошибка
Bad get: has Decimal32, requested Decimal128 в sumMap и sumMapWithOverflow для столбца Nested(... Nullable(Decimal(P, S))), когда агрегатное состояние сериализуется (например, параллельные реплики, sumMapState через binary-state formatter, внешняя агрегация). #105816 (Groene AI).
- Исправлены ошибки
Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality, возникавшие при использовании apply_mutations_on_fly = 1 на таблице, где в очереди уже были отложенные on-fly UPDATE/DELETE Мутации, добавленные до мутации ALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Raúl Marín).
- При записи в Iceberg теперь сохраняются значения NULL в столбцах партиции
Nullable(T). Ранее NULL, записанный ClickHouse, при чтении через Spark или другие reader Iceberg отображался как значение по умолчанию внутреннего типа (0 для int). Закрывает #105852. #105862 (Groene AI).
- Исправлен pushdown фильтров для
Parquet и ORC для predicates IN (subquery), благодаря чему pruning по row group/page/bloom filter теперь работает при чтении из file, url, s3 и object storage. #105863 (Arsen Muk).
- Исправлено чтение в порядке для таблиц
Merge (с новым analyzer). #105867 (Nikolai Kochetov).
- Исправлена ошибка в Iceberg v2 merge-on-read position deletes, из-за которой возвращались неверные строки, если один delete-файл ссылался на несколько data files, а к одному и тому же data file применялось несколько таких delete-файлов. Стриминг reader (
use_roaring_bitmap_iceberg_positional_deletes = 0) теперь фильтрует строки delete-файла по file_path в C++ вместо того, чтобы полагаться на pruning row group в Parquet, восстанавливая инвариант возрастания позиций. #105888 (Groene AI).
- Исправлена ошибка
Cannot find column для distributed queries с фильтром IN Array(...) в новом analyzer. #105894 (Nikolai Kochetov).
- Исправлен SIGSEGV в
ALTER TABLE ... MODIFY COLUMN ... Nullable(...) на таблицах MergeTree, когда другой ALTER одновременно удалял столбец со STATISTICS. Закрывает #105912. #105917 (Groene AI).
- Исправлен сбой сервера, который мог возникать, когда запрос, читающий из PostgreSQL — через table function postgresql, движок таблицы PostgreSQL или словарь с источником PostgreSQL — отменялся (например, с помощью KILL QUERY), а отменить удалённый запрос PostgreSQL не удавалось. #105949 (Rory Shanks).
- Исправлено formatting
SYSTEM INSTRUMENT ADD: теперь аргументы обработчика разделяются одним пробелом; кроме того, отклоняются некорректные списки argument для instrumentation SLEEP с более чем двумя значениями или диапазоном, где минимум больше максимума. #105984 (Pablo Marcos).
- Исправлены потенциально неверные результаты для queries, которые сочетают OUTER JOIN с последующим INNER JOIN, ссылающимся на сторону outer join, поставляющую NULL. Переупорядочивание JOIN могло выбрать план, в котором условия inner join переносились в предложение ON outer join. #105992 (Vladimir Cherkasov).
- Исправлен возможный crash из-за слишком большого строкового литерала, переданного в запросе. #105996 (Nikita Taranov).
- Исправлено исключение
INVALID_WITH_FILL_EXPRESSION при использовании пустого INTERPOLATE () с префиксом сортировки в ORDER BY и включенной настройкой use_with_fill_by_sorting_prefix. Столбцы префикса сортировки теперь корректно исключаются из неявного набора интерполяции, что соответствует поведению при явном указании INTERPOLATE (col). #106001 (Yakov Olkhovskiy).
- Исправлен случай, когда операции
ALTER TABLE с партициями для ключей партиционирования Bool молча завершались ошибкой. Закрывает #101722. #106004 (Pavel Kruglov).
- Исправлены
JSONExtractRaw и JSONHas для типизированных JSON-путей со значениями по умолчанию. Закрывает #101721. #106005 (Pavel Kruglov).
- Исправлено некорректное добавление префикса ’/’ для пустых базовых путей в конфигурациях озёр данных. Закрывает #105989. #106013 (thewisenerd).
- Исправлен случай, когда движок таблицы
IcebergLocal переходил в режим только для чтения после цикла DETACH + ATTACH или перезапуска сервера, из-за чего любой последующий INSERT завершался ошибкой Local object storage Local is readonly. (READONLY). #106016 (Groene AI).
- Исправлены сбои
Keeper во время дозагрузки follower, когда новая очередь ответов диспетчера запросов могла заполниться до запуска потока обработки ответов. #106049 (Antonio Andelic).
- Улучшена совместимость со старым анализатором. Если у таблицы есть столбцы вида
x.a Array, x.b Array, x String, для ARRAY JOIN x теперь предпочтение отдается массивам. #106069 (Nikolai Kochetov).
- Исправлен случай, когда файловый кэш молча отключался для Azure Blob Storage (например, для таблиц Delta Lake в Azure), потому что метаданные объекта не содержали blob ETag. #106091 (thewisenerd).
- Исправлен случай, когда
system.dictionaries возвращал 0 строк при частичном отзыве права SHOW DICTIONARIES. #106105 (Pavel Kruglov).
- Исправлено падение сервера при выполнении запросов к таблицам DeltaLake с включенной настройкой
allow_experimental_delta_kernel_rs, если учетные данные или параметр содержали недопустимые байты (паника Rust FFI происходила через границу extern "C"). #106109 (Raúl Marín).
- Исправлены некорректные результаты для запросов к таблицам, у которых
ORDER BY содержит монотонно убывающую функцию, такую как (c0 / -42) или intDiv(c0, -42). Предикаты по исходному столбцу (например, c0 < 0) могли ошибочно отсекать гранулы, содержащие подходящие строки, что приводило к отсутствию части результатов. Закрывает #106084. Закрывает #106124. Закрывает #106080. #106136 (Nihal Z. Miaji).
- Исправлена поддержка использования SQL UDF
WASM в определениях MATERIALIZED VIEW. #106161 (Yue Ni).
- Iceberg partition pruning теперь корректно обрабатывает фильтры
WHERE partition_col = (SELECT ... FROM ...), где analyzer оборачивает результат scalar subquery во внутренний _CAST(Const, 'TargetType') с совпадающими исходным и целевым типами. Ранее такие фильтры отключали отсечение партиций и приводили к полному сканированию таблицы. #106204 (Groene AI).
- Исправлен параметр
--query_id в clickhouse local: теперь с его помощью можно задавать пользовательский Query id. #106205 (Yue Ni).
- Исправлено игнорирование класса хранилища S3 (
s3_storage_class / s3_storage_class_name) для объектов, записываемых через multipart-загрузку на диски S3 и в объектное хранилище, из-за чего крупные объекты создавались с классом STANDARD по умолчанию. Имя опции теперь принимается как s3_storage_class, так и s3_storage_class_name для дисков, объектного хранилища и резервных копий. #106214 (Alexey Milovidov).
- Исправлена проблема, из-за которой Keeper иногда зависал при запуске, если настройка
nuraft_max_log_gap_in_stream была установлена в значение, отличное от значения по умолчанию (по умолчанию это 0, то есть конвейеризация запросов append_entries отключена). #106220 (Michael Kolupaev).
- Добавлена проверка повреждённого состояния агрегатной функции
DDSketch (ключей bin) при вставке вместо принятия некорректных данных. #106236 (Yarik Briukhovetskyi).
- Исправлено несоответствие режима coordinator, возникавшее, когда subqueries переопределяли настройки упорядоченного выполнения. #106243 (Nikita Taranov).
- Исправлена проблема, из-за которой
optimize_skip_unused_shards не применялся (а force_optimize_skip_unused_shards ошибочно завершался с ошибкой), когда к таблице Distributed обращались через таблицу Merge или табличную функцию merge, а predicate применялся уровнем выше. #106250 (Nikolai Kochetov).
- Исправлена ошибка, из-за которой
INTERPOLATE () выдавал INVALID_WITH_FILL_EXPRESSION, когда столбцам ORDER BY были назначены псевдонимы в списке SELECT при использовании старого analyzer. Закрывает #106248. #106252 (Yakov Olkhovskiy).
- Исправлено аварийное завершение при десериализации некорректного состояния
AggregateFunction(uniqTheta, ...) из входных данных RowBinary или query parameter. Теперь некорректный ввод отклоняется с ошибкой CORRUPTED_DATA вместо того, чтобы выходить наружу как std::exception и аварийно завершать процесс через abortOnFailedAssertion. #106260 (Groene AI).
- Байты
IntervalKind, выходящие за допустимый диапазон, теперь отклоняются при декодировании типов RowBinaryWithNamesAndTypes (input_format_binary_decode_types_in_binary_format = 1) с понятной ошибкой INCORRECT_DATA вместо создания DataTypeInterval с недопустимым kind, что впоследствии могло приводить к неопределённому поведению в путях хеширования. #106261 (Groene AI).
- Исправлена проблема с rollback при сбое понижения версии
SLRU в 26.1+. Исправлен приоритет разделения кэша System/Data для возможности keep_free_space_ratio. #106286 (Kseniia Sumarokova).
- Подстолбец
null в Nullable(JSON) теперь читается как путь JSON, а не как null-map. Закрывает #106085. #106295 (Pavel Kruglov).
- Исправлено поведение
RestCatalog::empty, который возвращал неверный результат, если Iceberg REST-каталог содержал таблицы. #106301 (Lefteris).
- Исправлено исключение для запросов
INNER JOIN с пустой левой таблицей MergeTree, когда включены enable_parallel_replicas, query_plan_use_new_logical_join_step и query_plan_optimize_join_order_algorithm = 'greedy'. #106338 (Nikolai Kochetov).
- Исправлено некорректное преобразование субнормальных значений
Float16 в Float32 (например, при чтении из файлов Numpy .npy), вызванное сдвигом мантиссы на один бит. #106343 (Joanna Hulboj).
- Исправлены сбой и возможная ошибка
NOT_FOUND_COLUMN_IN_BLOCK при использовании оптимизации на основе ограничений (optimize_using_constraints) с correlated subqueries. #106349 (Raúl Marín).
- Исправлено чтение за пределами допустимых границ в
sipHash64Keyed, sipHash128Keyed и sipHash128ReferenceKeyed при хешировании столбца, у которого все массивы пусты, а ключ не является константой. #106355 (Raúl Marín).
- Исправлено поведение
SYSTEM RELOAD CONFIG, который отбрасывал настройки Azure Blob Storage для отдельных endpoint’ов (например, use_native_copy), из-за чего настроенные параметры диска игнорировались для BACKUP/RESTORE до перезапуска сервера. #106357 (Julia Kartseva).
- Исправлено поведение
regexpExtract(haystack, pattern): теперь шаблоны регулярного выражения без capturing group возвращают всё совпадение вместо ошибки INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (Groene AI).
- Исправлено исключение
LOGICAL_ERROR при predownload кэша, если удалённый объект S3 был перезаписан более коротким содержимым между получением списка и чтением. #106375 (Nikita Fomichev).
- Исправлен рост использования памяти в файловом кэше. #106387 (Kseniia Sumarokova).
- Исправлены множественные чтения за пределами heap в средстве чтения формата Arrow IPC (
ArrowColumnToCHColumn). Некорректный файл Arrow мог объявлять больше строк, чем содержат его буферы, задавать длины дочерних элементов list/struct/map, не согласованные с родительским элементом, передавать немонотонные offsets list или обрезать дочерний битмап валидности, что приводило к чтению за пределами выделений в heap. Это затрагивает любого пользователя с привилегией SELECT, использующего file(), format(), табличные функции или входные данные ArrowFlight. Теперь все буферы data, offsets, view-struct и validity-bitmap проверяются перед любым доступом через raw pointer, а формы и offsets list/struct/map — на согласованность. #106395 (Raúl Marín).
- Исправлена ошибка, из-за которой backups завершались с
FILE_DOESNT_EXIST, когда цель REPLACE у refreshable materialized view собиралась в базе данных Replicated или Shared, а сама materialized view ещё не была создана на реплике, инициировавшей backup. #106411 (Julia Kartseva).
- Исправлена logical error
Column identifier ... is already registered, возникавшая, когда предикат мутации (DELETE/UPDATE) содержит подзапрос IN/EXISTS, читающий из выражения default table, вложенного в другой подзапрос. #106414 (Alexey Milovidov).
- Исправлена logical error (
Left and right columns have same names) в join order optimizer, которая могла возникать для JOIN, выполняемых с параллельными репликами, когда два отношения в графе JOIN имеют одинаковые имена столбцов. #106418 (Alexey Milovidov).
- Исправлена logical error при построении polygon dictionary из исходных данных, содержащих координаты точек
NaN или infinite. Такие координаты теперь отклоняются с понятной ошибкой. #106423 (Alexey Milovidov).
- Исправлена ошибка, из-за которой столбцы
used_privileges и missing_privileges в system.query_log могли содержать строки привилегий, утекшие из не связанных с ними более ранних запросов другого пользователя, database или session. #106425 (Alexey Milovidov).
- Functions
base58Encode, base58Decode и tryBase58Decode теперь учитывают max_execution_time и отмену запроса на больших входных данных, а также отклоняют входные данные размером более 10 КБ вместо того, чтобы выполняться очень долго. Ограничение настраивается через новую настройку function_base58_max_input_size (0 отключает его). #106428 (Alexey Milovidov).
- Исправлены редкие некорректные результаты для запросов
ORDER BY ... DESC при чтении частей Wide в обратном порядке с read_in_order_use_virtual_row_per_block = 1 и небольшим max_block_size. #106429 (Vladimir Cherkasov).
- Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK при выполнении запроса к таблице Iceberg или S3 table с составным предложением WHERE, содержащим IS NOT NULL для столбца, которого нет в списке SELECT, при использовании Parquet V3 native reader. #106443 (Shaohua Wang).
- Пользователь теперь может задавать заголовки для
HTTPDictionary с использованием named collections. #106459 (Jan Rada).
- Исправлен случай, когда worker thread мог оставаться attached к устаревшей thread group после того, как
CurrentThread::attachToGroup завершался сбоем на одном из этапов, из-за чего последующие задачи в этом же потоке завершались ошибкой Thread is already attached to a group. #106462 (Mikhail f. Shiryaev).
- Исправлено Исключение, возникавшее, когда запрос векторного поиска использует vector index и другой индекс пропуска данных, например
minmax, при use_skip_indexes_on_data_read = 1. #106473 (Shankar Iyer).
- Некорректно сформированные значения enum
Avro теперь проверяются и отклоняются с ошибкой, вместо того чтобы вызывать чтение за пределами допустимого диапазона и аварийное завершение при десериализации поврежденных данных Avro. #106476 (Miсhael Stetsyuk).
- Исправлено завышенное отображение прогресса при чтении из таблиц Iceberg с фильтрами
_file или _path. Ранее в показателе прогресса total_bytes_to_read учитывались все файлы из manifest независимо от фильтрации. #106491 (Pedro Ferreira).
- Исправлено исключение
Bad cast exception для словарей Redis, использующих STORAGE_TYPE 'simple' со структурой cache/direct и единственным строковым (составным) ключом; теперь такие словари работают, а для составных ключей поверх хранилища simple выводится понятная ошибка. #106501 (Vladimir Cherkasov).
- Исправлена ошибка, приводившая к неверным результатам:
WHERE c0 = const не возвращал ни одной строки для таблиц с ORDER BY f(c0), если f(const) вычислялось в NaN, например ORDER BY sqrt(c0) с отрицательной константой. Анализ первичного ключа ошибочно отсекал все гранулы и отравлял кэш условий запроса для последующих запросов. #106507 (Groene AI).
- Исправлено поведение
LIMIT WITH TIES и дробного LIMIT WITH TIES, которые не учитывали collation из ORDER BY ... COLLATE при определении совпадающих строк. Строки, равные согласно collation (например, '1' и '01' при числовой collation), сравнивались побайтно, из-за чего некоторые строки с совпадающими значениями ошибочно исключались из результата. #106539 (Nihal Z. Miaji).
- Исправлены оптимизации
DISTINCT in order и LIMIT BY in order (включая отрицательный LIMIT BY), которые возвращали неверные результаты, когда входные данные были отсортированы с collation (ORDER BY ... COLLATE). Строки, равные согласно collation (например, 'a' и 'A' при регистронезависимой collation), упорядочиваются по ключу collation и поэтому не оказываются соседними по значению, так что оптимизация in order теперь пропускается при использовании collator. #106564 (Nihal Z. Miaji).
- Исправлены неверные результаты для
SELECT c, count() FROM t WHERE c GROUP BY c в таблицах с неявной _minmax_count_projection, явной aggregate projection или обычной projection: раньше каждая группа схлопывалась в одну строку с константным ключом и общим числом строк. #106590 (Groene AI).
- Исправлена ошибка, из-за которой нельзя было использовать scalar subqueries в первом аргументе
IN, если второй аргумент — неконстантный кортеж. #106610 (Yarik Briukhovetskyi).
- Исправлено исключение
Mutation of Memory table produced incomplete output, возникавшее при выполнении команд ALTER TABLE <memory_table>, которые не влияют на данные отдельных строк в движке Memory, а именно APPLY PATCHES, APPLY DELETED MASK, MATERIALIZE STATISTICS, MATERIALIZE INDEX, MATERIALIZE PROJECTION и REWRITE PARTS. Таблицы Memory не содержат этих структур, поэтому такие команды теперь считаются no-op. #106621 (Groene AI).
- Исправлено игнорирование
session_timezone при сериализации столбцов LowCardinality(DateTime) в текстовые форматы (CSV, TSV, JSONEachRow и т. д.). Ранее после первой записи столбца LowCardinality(DateTime) на сервере каждый последующий запрос, записывавший такой столбец, выводил строковое представление локального времени в том часовом поясе, который встретился первым, независимо от session_timezone. #106634 (Groene AI).
- Исправлен
LOGICAL_ERROR “Trying to get name of not a column: ExpressionList”, возникавший в запросах, где asterisk передавался внутри multiIf в аргумент табличной функции, например numbers(multiIf(*, ...), 2). Теперь запрос отклоняет такой неразрешимый matcher с UNSUPPORTED_METHOD. #106647 (Groene AI).
- Исправлена ошибка, из-за которой server не запускался с сообщением
Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0), когда у таблицы MergeTree была часть skip-index с нулём гранул и непустым файлом marks на диске. #106675 (Groene AI).
- Отклоняются патологические glob patterns для
file, которые могли приводить к неограниченной рекурсии при перечислении каталогов. Теперь максимальная глубина рекурсии ограничена 1000; запросы, превышающие этот предел, вызывают TOO_DEEP_RECURSION вместо падения server из-за переполнения стека. #106676 (Groene AI).
- Исправлено аварийное завершение server с ошибкой
Bad cast from type DB::ColumnNothing to DB::ColumnVector<char8_t> в FunctionIf::executeForConstAndNullableCondition, когда условие if/multiIf сворачивается в константу Const(Nullable(Nothing)) (например, при выходящем за границы индексе пустого массива, как в arraySort(x -> x, [])[toNullable(1)]). #106678 (Groene AI).
- Исправлено Исключение
'Trying to read from input() twice.', возникавшее, когда table function input обёрнута в нематериализованный CTE, на который ссылаются из нескольких мест запроса. Теперь такой запрос отклоняется с корректной ошибкой INVALID_USAGE_OF_INPUT на этапе планирования. input — это одноразовый поток client, и он может быть использован только одним источником в плане запроса. #106682 (Groene AI).
- Сделано так, чтобы
FORMAT применялся и к выводу EXPLAIN в EXPLAIN ... INSERT ... SELECT ... FORMAT ..., в том числе когда SETTINGS предшествует FORMAT или output format — Values. Дополнение к #101772. #106686 (Alexey Milovidov).
- Исправлена редкая ложная ошибка
RESOURCE_ACCESS_DENIED (“Scheduler queue with resource request is about to be destructed”) для запроса, которому на самом деле был выдан доступ к ресурсу рабочей нагрузки; причиной было повторное использование thread-local объекта request, сохранявшего сбой предыдущего request. #106690 (Alexey Milovidov).
- Исправлена гонка между уничтожением объектов
INATSConsumer и вызовом для них INATSConsumer::onMsg через обратный вызов в библиотеке NATS. #106692 (Miсhael Stetsyuk).
- Исправлена ошибка, из-за которой
match, extract, extractAll и countMatches возвращали неверные результаты для регулярных выражений, содержащих шестнадцатеричные или восьмеричные escape-последовательности. #106709 (ofeliacode).
- Внутренний Raft TLS в Keeper теперь учитывает настройку
openSSL.client.verificationMode. Ранее проверка сертификатов peer-узлов всегда была включена для меж-Keeper-коммуникации Raft независимо от этой настройки, поэтому none молча игнорировалось. Теперь none явно отключает проверку сертификатов peer-узлов Raft, а отсутствие настройки сохраняет прежнее безопасное по умолчанию поведение. Конфигурации, в которых явно задано none, после upgrade перестанут проверять сертификаты peer-узлов Raft, что соответствует заданной конфигурации. #106726 (Antonio Andelic).
- Исправлена logical error в startup scripts в
SYSTEM RELOAD CONFIG. Кроме того, startup scripts теперь загружаются при SYSTEM RELOAD CONFIG (пока это functionality доступно только для private). #106727 (Miсhael Stetsyuk).
- Отменено изменение, из-за которого
sumMap / комбинатор -Map отклонял пользовательские числовые типы значений с нестандартными именами (например, SimpleAggregateFunction(sum, T) и Bool) с ошибкой ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, из-за чего ломались ранее работавшие агрегации. #106729 (Nikita Fomichev).
- Исправлено несколько проблем с безопасностью памяти и исчерпанием ресурсов в ридерах форматов, доступных через недоверенный ввод: чтение за пределами кучи при обработке длины уровней definition/repetition в
DataPageV2 нативного ридера Parquet, переполнение стека на файлах Parquet с глубоко вложенными схемами, а также выделения памяти, игнорировавшие max_memory_usage при парсинге WKB/WKT-геометрии GeoParquet и строк/байтов Avro. #106739 (Raúl Marín).
- Исправлено переполнение буфера кучи (сбой сервера) в
decodeHTMLComponent при декодировании строк, содержащих расширяющиеся HTML-сущности ≫⃒ или ≪⃒; проблема была достижима для любого пользователя с помощью одного SELECT. #106741 (Raúl Marín).
- Теперь
CREATE TABLE, ALTER TABLE ADD INDEX и CREATE INDEX со значением GRANULARITY 0 для индексов пропуска данных отклоняются с понятной ошибкой BAD_ARGUMENTS. Ранее это приводило к исключению Inconsistent AST formatting в debug-сборках. #106783 (Groene AI).
- Исправлено поведение, при котором Azure BACKUP/RESTORE игнорировал настройки конечной точки для дисков
azure_blob_storage старого формата. #106784 (Julia Kartseva).
- Исправлено исключение
Bad cast при отсечении частей по статистике MinMax, когда ключевой столбец имеет тип LowCardinality, а константа предиката — LowCardinality(Nullable(...)). #106793 (Groene AI).
- Исправлены несогласованные столбцы (которые позже приводят к
LOGICAL_ERROR) при возникновении исключения (например, MEMORY_LIMIT_EXCEEDED) во время парсинга. #106802 (Azat Khuzhin).
- Исправлено поведение, при котором после настройки
keeper_server.http_control.secure_port сервер возвращал HTTP-ответ на запросы HTTPS-клиентов. #106822 (linjiayu1025-collab).
- Исправлена logical error в
parseDateTime при обработке не-ASCII байтов во входных данных. #106856 (Pavel Kruglov).
- Исправлено поведение
SHOW CREATE ROW POLICY, выводившей restrictive/permissive в нижнем регистре вместо верхнего, что расходилось с остальными ключевыми словами. #106865 (Valery Petrov).
- Исправлен случай, когда параллельная реплика не применялась для представления с
UNION из-за пустой таблицы в UNION. #106900 (Igor Nikonov).
- Исправлен сбой сервера (SIGSEGV) при чтении усечённых данных
Protobuf с input_format_allow_errors_num > 0. #106905 (Andrey Tsarevskiy | Андрей Царевский ).
- Исправлено исключение
THERE_IS_NO_COLUMN для distributed queries с оптимизацией optimize_rewrite_aggregate_function_with_if, когда argument aggregate function требует приведения к типу Nullable. #106908 (Yakov Olkhovskiy).
- Исправлено Исключение (
LOGICAL_ERROR) в JOIN runtime filter, возникавшее, когда ключ JOIN содержит тип Variant или Dynamic, вложенный в Tuple, Array или Map, а в правой части JOIN имеется одно уникальное значение. #106931 (Groene AI).
- Исправлено переполнение знакового целого числа (неопределённое поведение) в
arrayLevenshteinDistanceWeighted и arraySimilarity, когда массивы весов содержат большие целочисленные значения. Теперь для целочисленных весов взвешенное расстояние накапливается в широком целочисленном типе, поэтому большие целочисленные веса больше не приводят к переполнению и сохраняют точность. #106934 (Groene AI).
- Исправлено падение server (разыменование нулевого указателя) при выполнении
TRUNCATE или DROP для таблицы EmbeddedRocksDB, у которой был освобождён дескриптор RocksDB, например для таблицы read_only, каталог данных которой был очищен предыдущим TRUNCATE. #106940 (Groene AI).
- Исправлено Исключение (
std::length_error, сообщавшееся как LOGICAL_ERROR) при чтении из table function *Cluster, такой как urlCluster, при очень большом значении настройки max_streams_for_files_processing_in_cluster_functions. Теперь число streams ограничивается разумным значением. #106946 (Groene AI).
- Исправлено падение server (разыменование нулевого указателя
DB::IConnections) в RemoteQueryExecutor, когда distributed query отменяется непосредственно перед отправкой на shard. #106950 (Groene AI).
- Исправлено, что
elapsed_us всегда был равен нулю, а read_rows/read_bytes занижались в system.processors_profile_log и system.query_log для запросов flush асинхронной вставки (AsyncInsertFlush). #106982 (Christoph Wurm).
- Исправлено падение (
Source column is not Map / SIGSEGV) при слиянии отсортированных blocks, содержащих столбец Variant с вариантом Map, у которого порядок в локальном хранилище отличается от глобального. #107011 (Groene AI).
- Исправлена logical error
conflicted_part_name.has_value(), возникавшая во время синхронной вставки в таблицу ReplicatedMergeTree, когда inserted block был полностью дедуплицирован, а узел дедупликации конфликтующей части уже был удалён (например, из-за конкурентной операции DROP PARTITION). #107026 (Groene AI).
- Исправлено Исключение (logical error
this->visited_views == right->visited_views) при INSERT, когда два materialized view для одной и той же исходной таблицы записывают в одну и ту же целевую таблицу, а зависимое представление читает эту целевую таблицу, при включённой настройке materialized_views_squash_parallel_inserts. #107027 (Groene AI).
- Исправлена logical error
Block structure mismatch in UnionStep stream (аварийное завершение server в debug/sanitizer builds, Code: 49 в release builds), возникавшая, когда одна ветка UNION/INTERSECT/EXCEPT читала столбец, сериализованный как Sparse, а соседняя ветка читала тот же столбец как обычный полный (например, при отправке в materialized view). #107041 (Groene AI).
- Исправлено исключение
LOGICAL_ERROR при вставке в таблицу DeltaLake со столбцами, не соответствующими её схеме записи (например, столбец Nested, разворачивающийся в подстолбцы, или table function с явным подмножеством столбцов). Теперь такие вставки завершаются пользовательской ошибкой INCOMPATIBLE_COLUMNS. Закрывает #87402. #107058 (Groene AI).
- Исправлена ошибка
TYPE_MISMATCH (“Cannot convert string … to type …”) в запросах ORDER BY <numeric column> ... LIMIT n, когда lazy materialization помещала другой столбец перед столбцом сортировки. Теперь порог top-K считывается из правильного столбца сортировки. #107060 (Groene AI).
- Исправлена синтаксическая ошибка, возникавшая, когда предложение
FORMAT, SETTINGS или INTO OUTFILE следует за SHOW ROW POLICIES или SHOW MASKING POLICIES (например, SHOW ROW POLICIES FORMAT TabSeparated). #107061 (Groene AI).
- Исправлен составной
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a, повторно использующий освобождённое имя столбца (то есть выполняющий “swap”) между столбцами разных типов. Materialized part записывала неверный тип столбца, из-за чего последующий SELECT завершался ошибкой Conversion between numeric types and IPv6 is not supported (или прерывался при загрузке part в debug builds). #107064 (Groene AI).
- Исправлены недетерминированные результаты функции
roundDown, когда массив границ содержит NaN. Одно и то же входное значение могло возвращать конечную границу или NaN в зависимости от соседних строк в пакете. Теперь границы NaN игнорируются, поэтому результат зависит только от конечных границ. #107065 (Groene AI).
- Исправлено поведение, при котором
quantileTDigest и quantileTDigestWeighted генерировали DECIMAL_OVERFLOW для аргументов Date и DateTime, если интерполированная quantile была дробной, но оставалась в допустимом диапазоне (например, quantileTDigestWeighted(date, weight) на значениях, которые все помещаются в тип). Теперь дробный результат усекается до типа результата, как в quantilesTDigestWeighted; значения, действительно выходящие за диапазон, по-прежнему вызывают ошибку. Закрывает: #106722. #107066 (Groene AI).
- Исправлено поведение, при котором
trimLeft, trimRight и trimBoth (а также псевдонимы ltrim, rtrim, trim) генерировали TOO_LARGE_STRING_SIZE, когда пользовательский набор символов обрезки был длиннее 16 символов. Теперь наборы символов обрезки любой длины снова поддерживаются. #107071 (Nikita Fomichev).
- Исправлено тихое усечение выходящих за диапазон целочисленных значений в определениях типов
Enum8/Enum16. Теперь Enum8('a' = 200) генерирует ARGUMENT_OUT_OF_BOUND вместо того, чтобы молча создавать Enum8('a' = -56). #107081 (Groene AI).
- Исправлен неправильный порядок строк (и
LOGICAL_ERROR “Rows are not sorted with permutation” в debug builds) для запросов ORDER BY ... LIMIT с несколькими столбцами сортировки по столбцам Nullable, когда несколько строк имеют одинаковые значения в ведущих столбцах. #107094 (Groene AI).
- Исправлен
LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y), возникавший при выполнении функции над столбцом Dynamic, полученным через JOIN по Dynamic (например, для неприсоединённых строк RIGHT/FULL JOIN или для коррелированного подзапроса EXISTS, преобразованного в JOIN). #107095 (Groene AI).
- Исправлено ложное пересоздание сессии ZooKeeper при перезагрузке конфигурации. #107096 (Azat Khuzhin).
- При обновлении access entities mutex больше не удерживается во время чтения из ZooKeeper. #107097 (Azat Khuzhin).
- Исправлено исключение
Logical error: Too large size passed to allocator при INSERT в таблицу MergeTree, когда adaptive_write_buffer_initial_size задан слишком большим значением. Начальный размер адаптивного буфера записи теперь ограничивается максимальным размером буфера. #107104 (Groene AI).
- Исправлен
LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality), возникавший, когда константа Variant, содержащая элемент LowCardinality, сравнивалась с ключевым столбцом, чьё ключевое выражение является немонотонной детерминированной функцией (например, индекс пропуска данных minmax по sipHash64(col)). #107111 (Groene AI).
- Исправлена логическая ошибка
Bad cast from type DB::IColumn const* to DB::ColumnNullable const*, возникавшая, когда квалифицированная звёздочка (t.*) по ключу JOIN ... USING передавалась в агрегатную функцию, а на другой стороне внешнего JOIN был ключ Nullable (при join_use_nulls = 0). #107129 (Groene AI).
- Исправлены пакеты
ALTER TABLE ... ON CLUSTER, в которых MODIFY SETTING/RESET SETTING смешивались с изменением комментария (например, MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) и из-за этого применялись только на ведущей реплике, оставляя остальные реплики в рассинхронизированном состоянии. Также исправлена ситуация, когда позиционный или задаваемый для отдельного столбца вариант MODIFY COLUMN ... COMMENT с SETTINGS ошибочно классифицировался как локальное изменение metadata, затрагивающее только комментарий, из-за чего перестановка столбцов не попадала в реплицируемые metadata и могла вызывать INCOMPATIBLE_COLUMNS при перезапуске реплики. #107142 (Groene AI).
- Исправлен
LOGICAL_ERROR (“Table expression … data must be initialized”), возникавший, когда сопоставитель квалифицированной звёздочки (например, x.*) ссылался по имени на рекурсивное CTE внутри собственного рекурсивного члена. Теперь такие сопоставители раскрывают столбцы рекурсивной таблицы так же, как это уже происходит в этой позиции для квалифицированного столбца (x.a) или неквалифицированного сопоставителя (*). #107144 (Groene AI).
- Исправлены неверные результаты запроса, вызванные кэшем условий запроса, когда on-fly мутации (
apply_mutations_on_fly) или патч-части отфильтровывали строки до PREWHERE. Запрос, выполнявшийся с apply_mutations_on_fly = 1, мог «отравить» кэш так, что последующий запрос с apply_mutations_on_fly = 0 и тем же предикатом пропускал метки, которые должен был прочитать, и возвращал слишком мало строк. Это же исправление также распространяется на политики безопасности на уровне строки, которые добавляются как фильтр перед PREWHERE: запрос, выполненный с ограничительной ROW POLICY, мог «отравить» кэш для последующего запроса, использующего тот же предикат, но без этой политики. #107145 (Groene AI).
- Исправлена работа
BACKUP с AzureBlobStorage: при копировании файла данных внутри резервной копии объект назначения записывался вне каталога резервной копии. Проверки существования объектов резервной копии в пунктах назначения S3 теперь используют точные запросы HeadObject вместо перечисления по префиксу, что предотвращает ложные совпадения для ключей с похожими префиксами. #107153 (Pablo Marcos).
- Исправлено переполнение знакового целого числа в
quantileExactExclusive, quantilesExactExclusive, quantileExactInclusive и quantilesExactInclusive, которое могло приводить к неверному результату для входных значений Int64, охватывающих большой диапазон. #107154 (Groene AI).
- Исправлен
LOGICAL_ERROR (“Unexpected exception in refresh scheduling”), который мог приводить сервер к циклу падений при перезапуске, если у refreshable materialized view есть зависимость REFRESH ... DEPENDS ON <name>, чьё неквалифицированное имя совпадает с именем временной таблицы или CTE. #107156 (Groene AI).
- Убрали запуск стартовых скриптов при перезагрузке config, так как это семантически неверно, неожиданно для пользователей и, как показала практика, чревато ошибками. #107187 (Miсhael Stetsyuk).
- Ограничено максимальное значение
queue_size для pre-reserve. #107205 (Elian Gidoni).
- Исправлена ошибка
Argument ... of GROUPING function is not a part of GROUP BY clause для запросов, использующих функцию grouping при включённой настройке group_by_use_nulls. #107206 (Nikolai Kochetov).
- Исправлен неверный порядок результатов для
ORDER BY над UNION ALL при включённом optimize_read_in_order, когда конвейер union сужался из-за настройки max_streams_for_union_step; теперь сужение пропускается, если план опирается на отсортированные выходные потоки UNION. Закрывает #106880. #107208 (Vladimir Cherkasov).
- Исправлено возможное разыменование нулевого указателя при разрешении конфигурации прокси на позднем этапе завершения работы сервера. #107231 (Pedro Ferreira).
- Исправлена работа запросов легковесного
UPDATE при включённых устаревших параллельных репликах для нереплицируемых таблиц MergeTree. #107246 (Groene AI).
- Исправлено аварийное завершение сервера (
std::out_of_range logical error) при вставке в таблицу Iceberg, у которой имена столбцов блока записи не совпадают с идентификаторами полей в последней версии схемы (например, если параллельный процесс записи переименовывает столбец в пределах окна iceberg_metadata_staleness_ms). Теперь вставка завершается корректной ошибкой запроса вместо падения сервера. #107279 (Groene AI).
- Исправлена ошибка зависания при завершении работы в server и local из-за того, что статические пулы потоков бесконечно удерживали неактивные потоки, если
max_*_thread_pool_free_size > 0. #107291 (Miсhael Stetsyuk).
- Исправлено молчаливое игнорирование табличной функцией
s3 строчного позиционного значения partition_strategy (например, hive). #107297 (Julia Kartseva).
- Исправлена обработка
low_cardinality_allow_in_native_format=0 при маршалинге параллельных блоков. #107319 (Azat Khuzhin).
- Исправлены неверные (часто пустые) результаты для
ORDER BY <col> LIMIT n, когда включена оптимизация use_skip_indexes_for_top_k и в части с индексом пропуска данных minmax по столбцу сортировки были удалены строки с помощью легковесного DELETE. Теперь оптимизация больше не ставит устаревший minmax для частей с легковесно удалёнными строками выше частей, содержащих актуальные верхние строки. #107320 (Groene AI).
- Исправлена ошибка в ClickHouse Keeper, из-за которой метаданные снимка, сообщаемые через
last_snapshot (и zk_latest_snapshot_size в mntr), могли откатываться назад после установки устаревшего или дублирующегося снимка. Это также могло приводить к тому, что локальный снимок с тем же индексом перезаписывал зарегистрированный файл снимка прямо на месте, пока тот ещё передавался другому узлу или загружался в S3. #107321 (Antonio Andelic).
- Исправлено возможное переполнение стека сервера (crash) при чтении глубоко вложенной схемы или значения в форматах
MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg и Paimon. Теперь такой глубоко вложенный вход отклоняется с исключением. #107341 (Raúl Marín).
- Исправлена возможная logical error в
SYSTEM SYNC DATABASE REPLICA ... STRICT, а также сделано так, чтобы модификатор STRICT действительно применялся к репликам базы данных. #107344 (Pedro Ferreira).
- Исправлено аварийное завершение сервера в debug/sanitizer-сборках при чтении таблицы
DeltaLake, у которой в схеме ClickHouse указан столбец, отсутствующий в сопоставлении столбцов Delta, например после переименования или удаления столбца в журнале Delta. Теперь вместо этого запрос завершается перехватываемой ошибкой INCORRECT_DATA. #107347 (Groene AI).
- Исправлена ситуация, когда
ORDER BY ... WITH FILL создавал лишние строки, если в столбце ORDER BY, расположенном перед столбцом заполнения, использовалась collation COLLATE. Теперь строки группируются по префиксу сортировки с использованием этой collation, в соответствии с порядком сортировки. #107365 (Groene AI).
- Исправлены crash (
LOGICAL_ERROR в debug-сборках) и тихая ошибка, приводившая к неверным результатам (в release-сборках), при чтении таблицы Iceberg, чьи метаданные повторно привязывают существующий schema-id к другой схеме в разных версиях метаданных. Теперь такие метаданные отклоняются с ошибкой ICEBERG_SPECIFICATION_VIOLATION. #107370 (Groene AI).
- Исправлен
LOGICAL_ERROR (Variant N (T) has size X, but expected Y), возникавший, когда функция вроде toString или concat применялась к столбцу Variant или Dynamic, содержащему один непустой вариант вместе с NULL, и при этом функция возвращала входной столбец без изменений. #107374 (Groene AI).
- Исправлен
Logical error: 'Duplicate announcement received for replica number N', который мог возникать при использовании параллельных реплик, когда скалярный подзапрос содержал вложенные подзапросы, читающие одну и ту же таблицу. #107381 (Groene AI).
- Исправлен
getServerSetting, чтобы он возвращал текущее фактически действующее значение для настроек сервера, изменяемых во время выполнения (таких как max_server_memory_usage, mark_cache_size, max_concurrent_queries, размеры пула потоков и т. д.), в соответствии с тем, что показывает system.server_settings. #107388 (Alexey Milovidov).
- Исправлена работа
arrayResize с аргументом размера типа Decimal: теперь размер интерпретируется по его фактическому значению (например, arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) возвращает один элемент), а не по необработанному немасштабированному представлению. #107389 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR (block.rows() == getRows()), возникавший при асинхронной INSERT в таблицу Alias, когда был включен use_strict_insert_block_limits. #107400 (Groene AI).
- Исправлена logical error (
Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8), возникавшая, когда оптимизация проталкивания дизъюнкции (частичного предиката) проталкивала условие через ключ USING, тип которого расширяется в результате JOIN. Также исправлен сбой server (segmentation fault) в анализаторе при разрешении идентификаторов в запросах JOIN ... USING, содержащих сворачиваемые в константы ветви if/multiIf, ссылающиеся на неизвестные идентификаторы. #107407 (Groene AI).
- Исправлено переполнение буфера кучи (сбой server) в
windowFunnel при финализации специально сформированного состояния агрегатной функции с типом события вне допустимого диапазона; проблема была достижима для любого пользователя с помощью одного SELECT. #107412 (uwezkhan).
- Исправлено неопределенное поведение, возникавшее, когда в качестве аргумента timestamp/duration табличных функций
prometheusQuery / prometheusQueryRange передавалось неконечное значение с плавающей точкой (например, nan или inf). Теперь такой аргумент вызывает BAD_ARGUMENTS вместо формирования некорректной временной метки. #107417 (Groene AI).
- Исправлена ситуация, когда
MaterializedPostgreSQL молча прекращал репликацию изменений, если имя базы данных или таблицы в PostgreSQL содержало прописные буквы (потребитель pgoutput запрашивал неэкранированное имя публикации в нижнем регистре, которое не совпадало с публикацией, сохраняющей регистр). #107423 (Alexey Milovidov).
- Исправлено Исключение (
Logical error: Not-ready Set is passed as the second argument for function 'in'), возникавшее, когда ключевое выражение (ORDER BY, PRIMARY KEY, PARTITION BY или пропускающий INDEX) содержало оператор IN с таблицей в правой части, например ORDER BY (x IN some_table). Теперь такие ключевые выражения отклоняются на этапе создания таблицы. #107424 (Groene AI).
- Исправлены некорректные результаты оптимизации
optimize_rewrite_aggregate_function_with_if для агрегатных функций, сохраняющих значения полезной нагрузки NULL (семейство *_respect_nulls: anyRespectNulls, first_value_respect_nulls, anyLast_respect_nulls, last_value_respect_nulls). Эта оптимизация больше не переписывает f(if(cond, x, NULL)) в форму -If для таких функций. #107430 (Groene AI).
- Исправлено ложное Исключение
filesystem error: in last_write_time: No such file or directory, возникавшее при перечислении каталога Объектное хранилище на локальном диске (например, Iceberg table на диске local), пока файлы параллельно заменялись. Теперь параллельно удаленная запись просто пропускается в списке вместо прерывания операции. #107432 (Groene AI).
- Исправлена ошибка
THERE_IS_NO_COLUMN, возникавшая при optimize_if_transform_strings_to_enum = 1, когда оптимизированное выражение if/transform над строковыми литералами является ключом GROUP BY или ORDER BY для distributed таблицы или параллельных реплик. #107455 (Groene AI).
- Исправлено редкое аварийное завершение сервера при обработке
DISTINCT, которое могло происходить, если во время инициализации множества уникальных ключей не удавалось выделить память (например, при достижении лимита памяти). #107467 (Groene AI).
- Исправлен
LOGICAL_ERROR: Unexpected return type from materialize (и аналогичные ошибки несоответствия типов), возникавший при использовании apply_mutations_on_fly = 1 на таблице с ожидающим on-fly UPDATE, у которого целевой столбец также считывается как входной аргумент функции более ранним on-fly UPDATE, перед мутацией ALTER MODIFY COLUMN ... LowCardinality(...). #107475 (Groene AI).
- Исправлено использование устаревших учетных данных AWS STS при чтении таблиц
DeltaLake через S3: теперь движок при обновлении snapshot сохраняет S3-клиент со свежими учетными данными, поэтому длительные операции чтения больше не завершаются ошибкой после истечения TTL токена STS. Провайдер учетных данных STS assume-role теперь также корректно обновляет учетные данные для любого доступа к S3 с использованием STS. #107480 (Elmi Ahmadov).
- Исправлена ситуация, при которой
SELECT ... FINAL и OPTIMIZE TABLE ... FINAL возвращали дубликаты строк после того, как CREATE TABLE ... CLONE AS, ATTACH PARTITION ... FROM или MOVE PARTITION ... TO TABLE переносили части из обычного MergeTree в ReplacingMergeTree, SummingMergeTree или AggregatingMergeTree. У перенесенной части теперь уровень слияния сбрасывается в 0, если движки источника и пункта назначения различаются, поэтому в пункте назначения для нее будет выполнена дедупликация при следующем слиянии. #107481 (Groene AI).
- Исправлен выход за нижнюю границу диапазона целого числа в парсере PostgreSQL wire protocol: сообщение с полем длины меньше 4 вызывало переполнение в
size - 4 и слишком большой resize/ignore. #107485 (uwezkhan).
- Улучшено отслеживание отмены запроса во время ожидания quorum в ReplicatedMergeTree. #107513 (Nikita Taranov).
- Исправлен
Not-ready Set is passed as the second argument for function 'in' (LOGICAL_ERROR), возникавший при запросе к таблице с ключом PARTITION BY и подзапросом IN/NOT IN, обернутым в более крупное выражение, например WHERE (c0 IN (SELECT ...)) != 0. #107515 (Groene AI).
- Исправлена ситуация, когда
currentUser(), user(), SESSION_USER и authenticatedUser() вычислялись в пустую строку на пути сброса asynchronous insert (при async_insert = 1). Это влияло на выражения столбцов DEFAULT/MATERIALIZED и materialized view, которые ссылаются на эти функции: они молча сохраняли пустую строку вместо пользователя, выполняющего вставку. #107541 (Groene AI).
- При
enable_analyzer = 1 (по умолчанию), если таблица существует только в другой базе данных, запрос к ней по одному имени теперь подсказывает нужную таблицу; например, SELECT * FROM functions выводит Maybe you meant system.functions?. Ранее новый анализатор выдавал ошибку Unknown table expression identifier без подсказки, тогда как старый анализатор уже предлагал полезный вариант. #107550 (Groene AI).
- Память, используемая библиотекой rapidjson (в
prettyPrintJSON, JSONMergePatch и JSON-парсере rapidjson), теперь учитывается трекером памяти, поэтому патологические входные данные отклоняются с MEMORY_LIMIT_EXCEEDED, а не приводят к неограниченному выделению памяти. #107555 (Raúl Marín).
- Исправлен
LOGICAL_ERROR (updateFormatPrewhereInfo called more than once), возникавший при запросе к источнику file(), url() или объектному хранилищу с явно заданными PREWHERE и предложением WHERE, когда был включен optimize_prewhere_after_pushdown. #107568 (Groene AI).
- Исправлен сбой (разыменование нулевого указателя), который мог происходить, когда распределенный plan запроса выполнялся локально (
make_distributed_plan + distributed_plan_execute_locally) при log_formatted_queries = 1. #107570 (Groene AI).
- Исправлено аварийное завершение сервера (
std::terminate, сигнал 6) во время завершения распределенного запроса (make_distributed_plan = 1), когда проверка статуса worker не могла заново запланировать следующую проверку (например, CANNOT_SCHEDULE_TASK при остановке или MEMORY_LIMIT_EXCEEDED). Теперь запрос завершается корректно, а сервер продолжает работать. #107575 (Groene AI).
- Добавлены недостающие проверки границ при разборе ELF и DWARF. #107579 (Michael Kolupaev).
- Добавлены недостающие проверки границ в ORC reader. #107580 (Michael Kolupaev).
- Исправлено Исключение (
Digest does not match logical error), которое могло возникать при RENAME TABLE, RENAME DATABASE или CREATE OR REPLACE TABLE, затрагивающих таблицу TimeSeries внутри базы данных Replicated. Переименование таблицы TimeSeries теперь поддерживается. #107583 (Groene AI).
- Исправлена возможность неаутентифицированного отказа в обслуживании из-за исчерпания памяти на порту протокола MySQL. #107599 (Shaohua Wang).
- Исправлен
DROP TABLE для таблицы TimeSeries в базе данных Replicated, который ранее приводил к утечке внутренних таблиц и оставлял фоновую задачу удаления бесконечно повторяться (DROP TABLE ... SYNC зависал). #107604 (Groene AI).
- Исправлены две уязвимости обхода пути в протоколе получения реплицируемых part, которые позволяли вредоносной реплике записывать файлы вне каталога part. #107606 (Antonio Andelic).
- Исправлена ошибка ‘Account must be specified error’ при чтении таблицы Delta Lake через Azure. #107620 (Smita Kulkarni).
- Исправлено поведение
ALTER TABLE ... REPLACE PARTITION для обычной таблицы MergeTree, при котором после перезапуска сервера восстановливались замененные part, из-за чего таблица возвращала и новые строки, и устаревшие замененные строки. #107623 (Groene AI).
- Исправлен сбой сервера при чтении materialized view, целевой таблицей которой является
Distributed, когда запрос выполняется с enable_analyzer = 0. #107653 (Groene AI).
- Если одному и тому же пользователю или роли назначено несколько quotas, теперь они применяются одновременно (запрос отклоняется, если превышена любая из них), вместо того чтобы применялась только одна quota, выбранная недетерминированно.
SHOW QUOTA и system.quota_usage теперь показывают все quotas, применяемые к current user. #107664 (Alexey Milovidov).
- Исправлено поведение
s3 и других табличных функций объектного хранилища, которые выдавали LOGICAL_ERROR вместо BAD_ARGUMENTS при дублировании аргумента в формате ключ-значение, например s3('http://...', format = 'CSV', format = 'TSV'). #107670 (Groene AI).
- Исправлена проблема, из-за которой интерфейс MySQL не работал с
MySQL Connector/J 8.2.0 и новее (включая 9.x). Поле info в пакете OK теперь кодируется с указанием длины, как на сервере MySQL, благодаря чему JDBC driver может подключаться. #107693 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR (“Input nodes size mismatch in dag”), возникавший, когда запрос с make_distributed_plan = 1 выполнял JOIN по ключу, обёрнутому в функцию, а у обеих сторон не было общего типа (например, ON intDiv(-1, t1.key) = t2.key при правом ключе UInt64). #107701 (Groene AI).
- Чтение данных Arrow/ArrowStream с пустыми столбцами
String/Binary, созданными Apache Arrow Java < 19.0.0 (включая Apache Spark), больше не приводит к INCORRECT_DATA. #107764 (Raúl Marín).
- Исправлено исключение
BAD_GET (“Bad get: has String, requested UInt64”) при оценке статистики столбцов countmin, возникавшее, когда запрос сравнивал столбец с литералом другого типа без предварительного приведения, например numeric_col IN (SELECT '5') или string_col IN (SELECT 5). #107793 (Groene AI).
- Исправлено зависание табличных функций
odbc и jdbc на несколько минут и игнорирование отмены запроса (KILL QUERY, max_execution_time), когда bridge переставал отвечать во время определения структуры удалённой таблицы. #107809 (Alexey Milovidov).
- Исправлено исключение (
Logical error: 'index >= result.start') при форматировании некорректного запроса, в котором смешивались позиционная и именованная формы secret-аргумента в табличных функциях s3/gcs, например s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (Groene AI).
- Исправлено поведение, при котором set-индекс пропуска данных не отбрасывал гранулы для столбцов
LowCardinality. #107868 (Konstantin Bogdanov).
- Исправлено, что механизм дедупликации вставки вычислял неверные хэши для столбцов
String и Array при настройке сервера insert_deduplication_version = new_unified_hash: идентичные вставки могли не дедуплицироваться, поскольку хэш дедупликации зависел от позиции строки во вставленном блоке. #107915 (Sema Checherinda).
- Исправлены некорректные результаты
ORDER BY по столбцам Nullable с несколькими ключами сортировки на macOS (Apple Silicon), вызванные отсутствующим знаковым расширением в JIT-компилированном компараторе сортировки. #107973 (Raúl Marín).
- Исправлена регрессия производительности при чтении столбцов
Dynamic в нескольких потоках. Вызвана #100730. Закрывает #107942. #107997 (Pavel Kruglov).
- Устаревший параметр озера данных
storage_catalog_url теперь корректно отклоняется защитным механизмом каталога (ранее проверялись только storage_catalog_type и storage_aws_access_key_id), а сообщение об ошибке перечисляет все устаревшие параметры. #108040 (Alexey Milovidov).
- Исправлена логическая ошибка
Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>, возникавшая, когда запрос LIKE читает из text-индекса через резервный путь direct-read fallback для столбца, хранящегося в разреженном виде. #108068 (Groene AI).
- Обработчики завершения батча в кэше доступа теперь запускаются всегда, даже для пустого батча. #108124 (Azat Khuzhin).
- Исправлен
LOGICAL_ERROR (Column identifier is already registered) для некоторых запросов с UNION ALL. #100770 (Shaohua Wang).
- Исправлена ошибка use-after-free мьютекса хранилища рабочей нагрузки во время остановки сервера. #101447 (Tuan Pham Anh).
- Исправлена взаимная блокировка в
ALTER DATABASE MODIFY COMMENT с каталогом Shared. #103683 (Nikolay Degterinsky).
- Пустой идентификатор в Unicode-кавычках теперь вызывает
SYNTAX_ERROR вместо CANNOT_PARSE_QUOTED_STRING. #104173 (leonard9893).
- Сохраняются исходные типы параметров агрегатных функций
timeSeries*, чтобы типы AggregateFunction корректно проходили round-trip при повторном ATTACH таблицы и с параллельными репликами. #104812 (Vitaly Baranov).
- Исправлен
LOGICAL_ERROR для materialized CTE при serialize_query_plan с параллельными репликами. #104896 (Igor Nikonov).
- Исправлено переполнение знакового целого в функциях
timeSeries*ToGrid, когда параметр staleness (window) близок к INT64_MAX. #105319 (Groene AI).
- Значение настройки
compatibility больше не сбрасывает apply_row_policy_after_final в false, поэтому политики строк всегда корректно применяются с FINAL. #105637 (Yarik Briukhovetskyi).
- Исправлен
clickhouse chdig client: теперь в заглушке posix_spawn корректно учитываются SETPGROUP/RESETIDS/SETSIGDEF. #105858 (Azat Khuzhin).
- Исправлено исключение во время проверок корректности MergeTree на проекциях, когда исполнитель merge/mutate не был инициализирован. #105919 (Mikhail Artemenko).
- При анализе индексов на проекциях индекс
minmax теперь загружается из самой проекции, а не из родительской части, что даёт корректные результаты. #105940 (Mikhail Artemenko).
- Исправлено исключение в
addMonotonicChain для materialize(monotonic_chain(...)). #106050 (Nikolai Kochetov).
- Исправлена ошибка, из-за которой
RESTORE завершался сбоем на резервных копиях, содержащих зависимые объекты MASKING POLICY. #106086 (Julia Kartseva).
- Исправлено возможное повреждение памяти при разворачивании SQL-пользовательских функций с включенной настройкой
prefer_column_name_to_alias. #106121 (Nikolai Kochetov).
- Словарь, использующий bridge connection, теперь после перезапуска сервера перезагружается и заново устанавливает соединение. Закрывает #106151. #106152 (Pedro Ferreira).
- Исправлен файловый кэш для
LocalObjectStorage. #106239 (Kseniia Sumarokova).
- Исправлен ленивый удаленный source для table functions с
use_delayed_remote_source. #106470 (Nikolay Degterinsky).
- Исправлен
timeSeriesLastToGrid для временных меток до начала сетки и временных меток вне окна. #106504 (Vitaly Baranov). #106577 (Vitaly Baranov).
- Исправлен
LOGICAL_ERROR (Inconsistent AST formatting) для имени функции, содержащего параметры запроса. #106635 (Vitaly Baranov).
- Исправлена logical error, возникавшая, если таблица удалялась до десериализации задачи distributed plan. #106944 (Alexander Gololobov).
- Для ключей
Nullable GROUP BY теперь используется точное сравнение. #107050 (Nikolai Kochetov).
- Исправлен
LOGICAL_ERROR (Trying to get name of not a column), возникавший, когда аргумент table function не был выражением столбца (например, неразрешенным сопоставителем * из multiIf/CASE). #107411 (Alexey Milovidov).
- Исправлен неограниченный рост кэша часовых поясов (
DateLUT) при обработке большого количества различных некорректных имен часовых поясов. #107464 (Alexey Milovidov).
- Запись в
part_log теперь выполняется до того, как обычная мутация MergeTree помечается как завершенная. #107741 (Azat Khuzhin).
arrayFold теперь проверяет корректность своего аргумента-массива на случай некорректного входа. #107932 (Michael Kolupaev).
- Исправлена редкая data race и возможное обращение к уже освобожденной памяти в кэшированном reader архива skip-index для части
MergeTree; это могло происходить, когда запрос читал skip indices в момент перемещения или переименования части. #107995 (Raúl Marín).
- Исправлена регрессия производительности для подстолбцов
Map с PREWHERE. #107988 (Pavel Kruglov).
- Исправлена
parseDateTimeBestEffort с часовым поясом, выбрасывавшая CANNOT_PARSE_DATETIME на NULL-строках в toString(Nullable(DateTime64)). #108310 (Yarik Briukhovetskyi).
- Исправлены table function и движок
ArrowFlight, которые отклоняли named collection без необязательного ключа dataset с ошибкой No such key 'dataset'. #108041 (Alexey Milovidov).
- Исправлена logical error
Inconsistent AST formatting для window function без аргументов внутри объявления CODEC или движка (например, CODEC(cume_dist() OVER (...))); теперь такая функция сохраняет скобки, и запрос корректно проходит форматирование и повторный разбор. #107806 (Alexey Milovidov).
- Исправлена
hasToken, которая при needle, содержащем разделитель, молча возвращала результаты через text index вместо того, чтобы выдавать BAD_ARGUMENTS. #108189 (Jimmy Aguilar Mena).
- Настройку
use_skip_indexes_on_data_read теперь можно вернуть к значению по умолчанию, использовавшемуся до 26.1 (false), через настройку compatibility, что позволяет обойти регрессию производительности, при которой путь on-data-read мешает отсечению диапазонов меток skip-index minmax/set/bloom_filter. #108330 (egor romanov).
- Исправлен возможный crash (разыменование нулевого указателя), когда переопределение
database/db в named collection, переданной в remote/remoteSecure, не является константным именем database, например remote(nc, database = (SELECT 1)). Теперь запрос завершается с понятной ошибкой вместо аварийного завершения. #108271 (Groene AI).
- Исправлено зависание refreshable materialized view, если connection к ZooKeeper теряется в неподходящий момент. #108234 (Michael Kolupaev).
- Исправлен
Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple при чтении столбца Array(Tuple(...)), значение которого заполнено значениями по умолчанию, например после ALTER TABLE ... ADD COLUMN или после незавершенной мутации ALTER TABLE ... CLEAR COLUMN, примененной на лету. #107232 (Groene AI).
- Исправлена logical error
Bad cast from type DB::ColumnDynamic to DB::ColumnNullable, возникавшая, когда явная ссылка на ключ JOIN ... USING, чей common supertype — Dynamic, передавалась в aggregate function, например count(t.key) IGNORE NULLS. #107289 (Groene AI).
- Исправлена незаметная потеря данных в обычном (non-replicated)
MergeTree, когда REPLACE PARTITION, MOVE PARTITION, DETACH PARTITION или DETACH PART выполняются над партицией, для которой еще есть непримененные патчи легковесного UPDATE. Теперь эти операции отклоняют команду, как это уже делает ReplicatedMergeTree. #107386 (Groene AI).
- Исправлен crash (SIGSEGV в release builds, assertion о несоответствии типов в debug builds) в
has для Map с ключом Dynamic, когда аргумент поиска имеет тип LowCardinality, например has(map('a'::Dynamic, ...), toLowCardinality('b')). #107956 (Groene AI).
- Исправлен
LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”) при вставке в materialized view, у которой в целевой таблице TO объявлен столбец с более широким Enum, чем выдаёт SELECT представления. Теперь допустимое расширение Enum применяется корректно. #107648 (Groene AI).
- Исправлена ошибка
NUMBER_OF_COLUMNS_DOESNT_MATCH при запросе к таблице Distributed (или при использовании параллельных реплик), если в ней есть несколько столбцов ALIAS, раскрывающихся в одно и то же выражение, и к ним обращаются вместе с ORDER BY/GROUP BY/HAVING. #107913 (Yakov Olkhovskiy).
- Исправлено неопределённое поведение (null pointer, переданный в
memcpy) в функциях detectCharset и detectLanguageUnknown, когда входная строка больше 32768 байт и кодировку определить не удаётся. #108250 (Groene AI).
- Исправлено
signed integer overflow (неопределённое поведение) в dateDiff с единицами hour и minute на экстремальных значениях DateTime64, близких к границам диапазона Int64. #108229 (Groene AI).
- Исправлена ошибка
Too many marks для текстового индекса на пустой слитой части. #106867 (Azat Khuzhin).
- Исправлен
LOGICAL_ERROR (“Unexpected return type from if”) при чтении столбца с apply_mutations_on_fly = 1 после ALTER UPDATE col = ... WHERE <cond> с неконстантным или ложным условием, за которым следует ALTER MODIFY COLUMN col <new type>. #108128 (Groene AI).
- Исправлено аварийное завершение сервера (
Logical error в IColumn::insertFrom) при приведении Array(Dynamic) или Array(Variant) к QBit с помощью accurateCastOrNull, например accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI).
- Исправлена синтаксическая ошибка, возникавшая, когда за подзапросом в
DESCRIBE TABLE (...) AS ... следует псевдоним. #100205 (Yarik Briukhovetskyi).
getClientHTTPHeader теперь корректно считается недетерминированной функцией, поэтому её результат больше не переиспользуется по ошибке в кэше результатов запросов. #108029 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- Собирайте
delta-kernel-rs с возможностью default-engine-native-tls, чтобы его собственный HTTP client (reqwest) мог повторно использовать OpenSSL, с которым уже слинкован ClickHouse. Это лишь частичное включение native-tls: object_store по-прежнему принудительно использует reqwest/rustls-tls-native-roots, поэтому в итоге reqwest получает оба backend’а — native-tls и rustls. delta-kernel-rs пока остается отключенным под MSan, поскольку ring все еще компилируется через object_store (как транзитивно через rustls, так и напрямую для HMAC-подписи AWS-запросов), а его написанный вручную ассемблерный код не генерирует символы, необходимые MSan (отслеживается в upstream в arrow-rs-object-store#585). #96856 (Austin Bonander).
- Добавлена постлинковочная optimization с использованием PGO (Profile-Guided Optimization) и BOLT (Binary Optimization and Layout Tool) для бинарного файла
clickhouse. Профили собираются на CI-нагрузках и применяются в релизных сборках в режиме best effort — обе стадии переключаются на неоптимизированный результат, если profile устарел или несовместим. На текущий момент PGO не дает выигрыша. #100938 (Alexey Milovidov).
- Добавлен режим
--storage в clickhouse keeper-bench, который запускает бенчмарк KeeperStorage in-process (без сети, без raft, без state machine), используя те же разделы config setup/generator, что и сетевой режим. #103081 (Michael Kolupaev).
- Исправлена сборка с
ENABLE_AWS_S3=OFF. #105390 (Yue Ni).
- Обновлен
mongo-cxx-driver до r4.3.0. #105522 (Konstantin Bogdanov).
- Исправлена сборка с RapidJSON. #105674 (Ilya Golshtein).
- Сборка ускорена за счет удаления транзитивных include из широко используемых заголовков base/ и удаления неиспользуемого кода из вендорного
Poco/Logger.h. #105702 (Raúl Marín).
- Обновлен
libxml2 с 2.15.1 до 2.15.3. #105985 (Konstantin Bogdanov).
- Внутри Poco используется
expat 2.8.1. #105988 (Konstantin Bogdanov).
- Обновлен
thrift до v0.23.0. #105993 (Konstantin Bogdanov).
- Используется тег
postgres REL_18_4. #105994 (Konstantin Bogdanov).
krb5 обновлен до 1.22.2. #106076 (Konstantin Bogdanov).
- Обновлен bundled
curl до 8.20.0. #106077 (Konstantin Bogdanov).
mariadb-connector-c обновлён до 3.1.29. Все относящиеся к ClickHouse патчи сохранены. #106287 (Nikita Mikhaylov).
- Обновлены дайджесты distroless base image для исправления CVE в libssl3t64. #106360 (Rahul Nair).
- Используется
wasmtime v45.0.1. #106836 (Konstantin Bogdanov).
openssl обновлён до 3.5.7. #106844 (Konstantin Bogdanov).
- Distroless Docker build теперь также обновляет плавающие теги
:X.Y-distroless и :X.Y.Z-distroless, а не только тег полной версии. #106932 (Rahul Nair).
- Отключены неиспользуемые возможности
curl, такие как аутентификация NTLM, cookies, alt-svc, HSTS, DNS-over-HTTPS, netrc, MIME и AWS SigV4. #107226 (Konstantin Bogdanov).
NuRaft обновлён с исправлением livelock при установке снимка, возникавшего, когда snapshot IO выполнялся в фоновом потоке. Параметр Keeper nuraft_use_bg_thread_for_snapshot_io по-прежнему отключён по умолчанию; теперь CI рандомизирует его, чтобы охватить оба режима. #107338 (Antonio Andelic).
- Исправлена сборка
abseil, если путь checkout ClickHouse содержит подстроку, совпадающую с расширением заголовка. #107349 (zhiqiang).
- Размер L2 cache на x86_64 теперь определяется через
CPUID, а не через специфичный для glibc sysconf(_SC_LEVEL2_CACHE_SIZE), который недоступен в musl libc. #107469 (Konstantin Bogdanov).
- Размер stack для сборок с musl увеличен до 8 MiB для поддержки глубоко вложенных запросов. #107470 (Konstantin Bogdanov).
- Набор символов C-библиотеки, локализуемых в статических библиотеках Rust, теперь определяется по фактическим библиотекам, на которые есть ссылки, а не по вручную поддерживаемому allowlist, благодаря чему охватываются все builtins из compiler-rt и платформенные функции libm. #107571 (Raúl Marín).
- Distroless-образы server и Keeper переведены на
gcr.io/distroless/base-nossl-debian13, чтобы они поставлялись только с теми библиотеками, с которыми ClickHouse действительно слинкован, и не подтягивали библиотеки, которые мы и так линкуем статически. #107837 (Rahul Nair).
- На macOS (
arm_darwin) повторно включены 50 тестов без сохранения состояния, которые ранее пропускались как устаревшие, а для синхронизации каталогов на macOS теперь используется fsync вместо F_FULLFSYNC. #107887 (Raúl Marín).
Обратно несовместимое изменение
- Значения по умолчанию для
date_time_input_format и cast_string_to_date_time_mode изменены с basic на best_effort. Запросы, в которых раньше не удавалось разобрать datetime-строки не в формате basic (например, 2024 April 4, Apr 15, 2020 10:30:00), теперь по умолчанию могут выполняться успешно. Чтобы сохранить прежнее строгое поведение разбора, установите для этих настроек значение basic (или используйте compatibility). #89334 (Alexey Milovidov).
- Имя элемента Tuple
null теперь запрещено, поскольку оно конфликтует с именем подстолбца, используемым для null map типа Nullable, что приводит к неоднозначному разрешению подстолбцов. #98377 (Alexey Milovidov).
- Добавлены настройки
dynamic_disk_allow_from_env, dynamic_disk_allow_from_zk, dynamic_disk_allow_include, запрещающие использование from_env, from_zk, include в динамических дисках. Это обратно несовместимое изменение, поскольку теперь по умолчанию запрещено поведение, которое раньше по умолчанию было разрешено. #99138 (Kseniia Sumarokova).
- Больше нельзя использовать устаревшие ридер и writer Parquet на основе Arrow. Вместо них будет использоваться native-реализация. #100949 (Alexey Milovidov).
SHOW CREATE TABLE t теперь отдает предпочтение временной таблице, если одновременно существуют постоянная и временная таблицы с именем t, а database не указана, что соответствует текущему поведению DESCRIBE TABLE. Кроме того, теперь поддерживается синтаксис DESCRIBE TEMPORARY TABLE. #100966 (Alexey Milovidov).
- Значение
http_max_fields по умолчанию уменьшено с 1,000,000 до 1,000, а http_max_field_name_size — со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до аутентификации. Добавлены настройки http_max_request_header_size и http_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda).
- В
system.metric_log добавлен вложенный столбец histograms, который сохраняет в каждой строке снимок каждой зарегистрированной метрики гистограммы, а новая настройка system_metric_log_show_zero_values_in_histograms управляет выводом нулевых значений. Таблица system.histogram_metric_log объявлена устаревшей. #103770 (Miсhael Stetsyuk).
CAST в DateTime или DateTime64 без явного часового пояса теперь сохраняет часовой пояс исходного аргумента (если источник — DateTime/DateTime64 с явным часовым поясом), что соответствует поведению функций toDateTime/toDateTime64. Закрывает #55072. #104433 (Alexey Milovidov).
- Удалена table function
kql. Используйте SET dialect = 'kusto', чтобы выполнять запросы в диалекте KQL. #105101 (Alexey Milovidov).
- Window functions
RANK и DENSE_RANK теперь отклоняют аргументы и генерируют NUMBER_OF_ARGUMENTS_DOESNT_MATCH в соответствии со стандартом SQL. Ранее запросы вида RANK(x) OVER (ORDER BY id) молча принимались, а аргумент игнорировался. Чтобы восстановить прежнее менее строгое поведение, установите allow_rank_dense_rank_arguments = 1. Закрывает #49526. #104324 (Groene AI).
- Добавлена новая настройка
max_bytes_ratio_before_external_join, аналогичная max_bytes_ratio_before_external_group_by и max_bytes_ratio_before_external_sort. Она задает порог spill-to-disk для hash JOIN как долю доступной памяти; вместе с абсолютным значением max_bytes_before_external_join применяется меньший из двух порогов. #103862 (Alexey Milovidov). Настройка max_bytes_ratio_before_external_join теперь включена по умолчанию со значением 0.5, аналогично max_bytes_ratio_before_external_group_by и max_bytes_ratio_before_external_sort. Hash JOIN автоматически переключаются на grace hash join со spill на диск, как только объем данных с правой стороны превышает половину доступной системной памяти (если настроены лимиты памяти). #104285 (Alexey Milovidov).
- Добавлена table function
filesystem. Она позволяет представлять структуру каталога в виде таблицы, а также выполнять SQL-запросы к метаданным и содержимому файлов. Изначально #42039 от @perst20. См. #42039. См. #50208. #53610 (Alexey Milovidov).
- Разрешена передача имен функций без обертки в функции высшего порядка, такие как
arrayMap, arrayFilter и т. д. Например, arrayMap(negate, [1, 2, 3]) теперь эквивалентен arrayMap(x -> negate(x), [1, 2, 3]). #101033 (Alexey Milovidov).
- Добавлены настройка
send_table_structure_on_insert_with_inline_data и опция клиента --inline-insert-data, чтобы server мог сам разбирать встроенные данные INSERT через собственный протокол, избегая дополнительного обмена данными для получения структуры таблицы и повышая производительность при множестве небольших вставок. #101034 (Alexey Milovidov).
- Добавлены функции
tokenizeQuery и highlightQuery для токенизации SQL-запросов и подсветки синтаксиса. tokenizeQuery возвращает токены лексера со смещениями в байтах и типами токенов; highlightQuery возвращает диапазоны подсветки синтаксиса на основе parser с категориями подсветки (keyword, identifier, function, number, string и т. д.). #101054 (Alexey Milovidov).
- Добавлена настройка
url_base для разрешения относительных URL в table function url и движке таблицы URL в соответствии с семантикой RFC 3986. #101113 (Alexey Milovidov).
- Добавлена поддержка отрицательных значений в clause
LIMIT BY, чтобы выбирать строки с конца каждой группы, а не с начала. Например, LIMIT -2 BY id возвращает последние две строки для каждого id. Также поддерживаются отрицательные смещения (LIMIT -1 OFFSET -1 BY id) и смешанные знаки (LIMIT -2 OFFSET 1 BY id). #103222 (Nihal Z. Miaji).
- Добавлена поддержка функции
json_value для вывода в tuple и array, что повышает производительность при выполнении нескольких JSON-запросов. #78362 (kevinyhzou). Добавлена поддержка многопутевого аргумента JSONPath Tuple/Array в JSON_VALUE, JSON_EXISTS и JSON_QUERY, от @KevinyhZou. #101102 (Alexey Milovidov).
- Введён новый параметр
kafka_autodetect_client_rack. Если он задан, зона доступности определяется средствами облачной платформы и передаётся в librdkafka как параметр client.rack, чтобы избежать межзонного обмена данными. #81323 (Ilya Golshtein).
- В
system.blob_storage_log добавлен тип события Read для отслеживания операций чтения из Объектного хранилища; он управляется новой настройкой enable_blob_storage_log_for_read_operations. #96867 (Alexey Milovidov).
- Теперь пользователи могут видеть наблюдения ZooKeeper, установленные
clickhouse-server, с помощью новой таблицы system.zookeeper_watches. #99277 (Den Kalantaevskii).
- Добавлено профильное событие
Shards, которое подсчитывает общее количество сегментов, участвующих в распределённых запросах, по всем таблицам. #99470 (Alexey Milovidov).
WASM UDF теперь можно объявлять как DETERMINISTIC, и к ним будет применяться константная свёртка. #100005 (Vasily Chekalkin).
- Добавлена настройка
parallel_replicas_prefer_local_replica: когда она отключена, параллельные реплики выбираются исключительно алгоритмом балансировки нагрузки, что позволяет направлять даже запросы с max_parallel_replicas = 1 на другой хост. #100139 (Alexey Milovidov).
- Добавлены настройки сервера
{disk,storage,http}_connections_rcvbuf и {disk,storage,http}_connections_sndbuf для управления размерами буферов TCP-сокетов в исходящих HTTP-соединениях, что позволяет операторам переопределять autotuning ядра и ограничивать использование памяти на одно соединение. #100478 (Sema Checherinda).
- Добавлена поддержка
CREATE OR REPLACE MATERIALIZED VIEW с той же семантикой атомарной подмены, что и у CREATE OR REPLACE TABLE. Работает с внутренними таблицами, таблицами TO, POPULATE, REFRESH и ON CLUSTER. #100539 (DQ).
- Добавлены метрика гистограммы
s3_read_request_duration_microseconds и s3_read_request_bytes для наблюдения за временем жизни соединения и объёмом прочитанных данных у S3 GET-запросов; они доступны в system.histogram_metrics и на конечной точке Prometheus. #102058 (Sema Checherinda).
- Добавлены Движки таблиц
Paimon, PaimonS3, PaimonAzure, PaimonHDFS и PaimonLocal с поддержкой инкрементального чтения на основе отслеживания прогресса снимков Keeper. Инкрементальный режим возвращает только новые строки с момента последнего зафиксированного снимка. Доступно целевое чтение дельты снимка через paimon_target_snapshot_id, а ограничение числа снимков на запрос — через max_consume_snapshots. Фоновое обновление метаданных настраивается параметром paimon_metadata_refresh_interval_sec. Возможность включается через allow_experimental_paimon_storage_engine. #102343 (XiaoBinMu).
- Добавлена новая настройка таблицы Kafka
kafka_map_virtual_columns_on_write. Если она включена, столбцы _key, _timestamp, _headers.name и _headers.value из схемы таблицы Kafka при INSERT записываются как соответствующие ключ сообщения Kafka, временная метка и заголовки и исключаются из полезной нагрузки сообщения. #103243 (Alexey Milovidov).
- Добавлены запросы
SYSTEM PAUSE VIEW [db.]name и SYSTEM PAUSE VIEWS для refreshable materialized views. В отличие от SYSTEM STOP VIEW, SYSTEM PAUSE VIEW не прерывает выполняющееся в данный момент обновление — текущему обновлению даётся завершиться, а предотвращаются только последующие обновления. Отменяется командами SYSTEM START VIEW или SYSTEM START VIEWS, которые теперь единообразно снимают как состояние остановки, так и состояние паузы. #103252 (Nikita Mikhaylov).
- Добавлена функция
regexpPosition (с совместимыми с PostgreSQL псевдонимами regexpInstr и regexp_instr), которая возвращает байтовую позицию N-го совпадения regex в строке. Поддерживаются начальное смещение, режим возврата позиции после совпадения, флаги regex и выбор группы захвата. #104172 (Abhinav Agarwal).
- Добавлены новые функции
isPrime и isProbablePrime для проверки чисел на простоту. isPrime возвращает точный результат для беззнаковых целых чисел вплоть до UInt64. isProbablePrime также поддерживает UInt128 и UInt256; для этих более широких типов 0 означает точно составное число, а 1 — вероятно простое. Необязательный второй аргумент функции isProbablePrime, rounds, управляет степенью достоверности (с ограничением до 256); значение по умолчанию — 25 раундов — ограничивает вероятность ложноположительного результата для случайного составного числа уровнем ниже 10^-15, а isProbablePrime можно отменить. #104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji).
clear и /clear теперь очищают терминал в инструментах командной строки clickhouse вместо того, чтобы ошибочно выполняться как запрос. #104318 (Tyler Hannan).
- Табличной функции
file теперь разрешено принимать Array(String) путей в запросах SELECT. #104442 (Yue).
- В таблицу
system.functions добавлены столбцы deterministic и higher_order. #104479 (Pedro Ferreira).
- В
bech32Encode добавлен необязательный параметр варианта кодирования (bech32 / bech32m), а в bech32Decode — режим raw-декодирования для кодирования не-SegWit-адресов (например, Cosmos SDK, Injective, Osmosis). #98986 (Yash ).
- Теперь можно записывать данные в формат
AvroConfluent, который ранее поддерживался только для ввода. Это позволяет создавать Avro-сообщения с обрамлением Confluent Schema Registry напрямую из ClickHouse, например при записи в Kafka. Схема автоматически регистрируется в registry. Используйте новую настройку output_format_avro_confluent_subject, чтобы указать имя subject. #101935 (János Benjamin Antal).
- Добавлена функция
prettyPrintJSON для форматирования строки JSON в удобочитаемый вид. Полезно для панелей мониторинга или отчётов, где для красивого форматирования раньше требовался дополнительный шаг на стороне клиента. Закрывает #62523. #102594 (Dmitry Prokofyev).
- Добавлен
STRING_AGG как регистронезависимый алиас groupConcat для совместимости с PostgreSQL / стандартным SQL. #105125 (Alexey Milovidov).
- Результаты отдельных подзапросов теперь можно кэшировать независимо, используя
SETTINGS use_query_cache = true для конкретных подзапросов, без кэширования всего внешнего запроса. Новая настройка query_cache_for_subqueries = true включает массовое применение use_query_cache ко всем подзапросам. Note: use_query_cache во внешнем запросе больше не распространяется на подзапросы автоматически. #99804 (Vincent Voyer).
- В редактор запросов веб-интерфейса (
play.html) добавлена подсветка синтаксиса на основе лексера, выполненная по образцу цветовой схемы clickhouse-client. #105105 (Alexey Milovidov).
Экспериментальные возможности
- Добавлен экспериментальный интерфейс веб-терминала по адресу
/webterminal, предоставляющий интерактивный сеанс clickhouse-client в браузере через WebSocket. По умолчанию отключён; включается с помощью настройки сервера allow_experimental_webterminal. Посмотреть можно здесь. #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov).
- Движок
Kafka2 (экспериментальный, с хранением смещений на основе Keeper) теперь поддерживает прямые запросы SELECT и настройку kafka_commit_on_select. #100276 (Alexey Milovidov).
WASM UDFs теперь могут приводить больше числовых типов: меньшие целочисленные типы к более широким (например, Int8 к UInt64), а любые целые — к типам с плавающей точкой (например, Int32 к Float32). #100435 (Vasily Chekalkin).
- Добавлена поддержка функции
LIKE в запросе DELETE FROM system.webassembly_modules. #104397 (Vladimir Cherkasov).
- Добавлена поддержка гео-типов для
Iceberg. #103113 (Konstantin Vedernikov).
- Добавлена поддержка подготовленных операторов на сервере ArrowFlight SQL. #103047 (Yakov Olkhovskiy).
- Повышена устойчивость парсера KQL (для поддержки языка Kusto): глубина парсера и счётчики возвратов теперь сохраняются между этапами парсинга KQL, благодаря чему ограничения парсера для сложных запросов KQL отслеживаются согласованно. #103528 (Yakov Olkhovskiy).
- Повторно использовать кэш метаданных нижнего колонтитула Parquet при чтении локальных файлов Parquet через табличную функцию
file или движок таблицы File. Ранее кэш использовался только для backend-соединений объектного хранилища. #104260 (Alexey Milovidov).
- Проталкивать
ORDER BY ... LIMIT n через LEFT/RIGHT JOIN, если ключ сортировки ссылается только на столбцы со стороны, сохраняемой JOIN, тем самым ограничивая число строк, которое входной поток с сохраняемой стороны должен сформировать до выполнения JOIN. Управляется новой настройкой query_plan_top_k_through_join (по умолчанию включена). #104268 (Alexey Milovidov).
- Включить настройки
use_top_k_dynamic_filtering и use_skip_indexes_for_top_k по умолчанию, чтобы повысить производительность запросов ORDER BY ... LIMIT N. #99537 (Alexey Milovidov). По умолчанию ограничить use_top_k_dynamic_filtering столбцами сортировки фиксированной длины, чтобы избежать регрессий в запросах ORDER BY <var-length-column> LIMIT N, где затраты на сравнение порога для каждой строки превышают выигрыш по I/O. Предыдущее поведение доступно через новую настройку use_top_k_dynamic_filtering_for_variable_length_types. #104216 (Alexey Milovidov).
- Использовать возможность oversize-arena в
jemalloc для уменьшения числа page fault. #103958 (Nikita Taranov).
- Ограничить число одновременно активных streams в
UNION ALL, чтобы снизить пиковое потребление памяти. #100176 (Alexey Milovidov).
- Слегка оптимизировать кэш страниц в пространстве пользователя. #100300 (Alexey Milovidov). Теперь кэш страниц в пространстве пользователя всегда лучше, чем кэш страниц ОС.
- Холодные чтения из объектного хранилища через кэш страниц в пространстве пользователя (
use_page_cache_for_object_storage = 1) теперь выполняются значительно быстрее, поскольку последовательные промахи кэша объединяются в один HTTP request вместо одного запроса на каждый блок page_cache_block_size. #104230 (Alexey Milovidov).
- Ускорить анализ индексов, включающий приведение типов и применение функций. Закрывает #55653. #100366 (Alexey Milovidov).
- Ускорить выполнение больших запросов к таблицам
Merge поверх очень большого числа базовых таблиц. Закрывает #32465. #100369 (Alexey Milovidov).
- Удалить vtable из типов полей настроек, уменьшив размер копии
Settings примерно в 28 раз и улучшив локальность кэша за счет структуры typed-array для всех типов настроек. #102269 (Raúl Marín).
- Добавить настройки
max_threads_min_free_memory_per_thread и max_insert_threads_min_free_memory_per_thread, чтобы автоматически снижать параллелизм запросов, когда на сервере мало свободной памяти. #100383 (Alexey Milovidov).
- Снизить использование памяти в системах с небольшим объемом памяти (< 4 GiB). #100389 (Alexey Milovidov).
- Добавлен
OptimizeTrivialGroupByLimitPass. Для простых запросов SELECT ... FROM t GROUP BY k LIMIT n (без HAVING, ORDER BY и оконных функций) analyzer теперь устанавливает max_rows_to_group_by = n + offset и group_by_overflow_mode = 'any', поэтому aggregation останавливается, как только будет получено n различных ключей, вместо группировки всего входного набора данных. Управляется новой настройкой optimize_trivial_group_by_limit_query (включена по умолчанию). #104473 (Amos Bird) (Alexey Milovidov).
- Неявный min-max индекс на уровне гранул для виртуальных столбцов
_part_offset и _block_number, включая проекции. Обеспечивает быстрое pruning гранул на основе predicates виртуальных столбцов. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko).
- Для семейства методов aggregation
prealloc_serialized хеши для каждой строки теперь вычисляются заранее во время прохода батч-сериализации и затем используются, чтобы (a) избежать повторного хеширования в emplaceKey/findKey и (b) выполнять программную предварительную выборку бакета следующей строки. Это ускоряет aggregation по нескольким строковым/сериализованным ключам за счет скрытия latency промахов кэша hash table. #104475 (Amos Bird) (Alexey Milovidov).
- Кэш условий запроса для таблиц
Iceberg. #102115 (Konstantin Vedernikov).
- Оптимизированы
cramersV, cramersVBiasCorrected, theilsU и contingency при использовании с оконными функциями. Закрывает #83521. #93384 (Nihal Z. Miaji).
- Добавлена оптимизация запроса, которая переписывает
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N) в dictGet('dict', 'a', key), чтобы избежать получения ненужных атрибутов словаря. Управляется настройкой optimize_dictget_tuple_element (включена по умолчанию). #100186 (Alexey Milovidov).
- Включена buffering для шагов сортировки на initiator в distributed queries с сортировкой. #100661 (Nikita Taranov).
- Повышение производительности для
partial_merge JOIN. #100945 (Artem Zuikov).
- Незначительно уменьшено избыточное выделение памяти в
partial_merge JOIN. #100963 (Artem Zuikov).
- Оптимизированы выделение и освобождение памяти за счет кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Снижены накладные расходы на выделение памяти во время S3 multipart-загрузок за счет предварительного выделения внутренних контейнеров отслеживания. #101799 (Gagan Dhakrey).
- Добавлена программная предварительная выборка на этапе probe hash join для снижения latency доступа к памяти при работе с большими hash table; управляется настройкой
enable_software_prefetch_in_join. #102444 (Xiaozhe Yu).
- Оптимизирована структура
MemoryTracker, что повышает его производительность примерно на 25%. #103464 (Azat Khuzhin).
- Выполняется Rewrite предикатов
coalesce(a, b, ...) <op> const и ifNull(a, b) <op> const перед анализом индексов, чтобы первичный ключ по отдельным столбцам и индекс пропуска данных для каждого аргумента могли отсеивать гранулы. Управляется новой настройкой allow_key_condition_coalesce_rewrite (включена по умолчанию). #103468 (Manuel).
- Значительно улучшена производительность запросов при чтении каталогов Iceberg с большими JSON-файлами метаданных за счёт оптимизации обработки экранированных слешей. #103998 (Mohaidoss).
- Устранены накладные расходы кэша несжатых данных индекса, когда кэш отключён (настройка сервера
index_uncompressed_cache_size = 0, это значение по умолчанию). #104063 (Michael Kolupaev).
- Исправлены запросы
ORDER BY ... LIMIT с небольшим limit, которые в сочетании с неселективным фильтром WHERE считывали слишком много гранул. Раньше любой фильтр поверх упорядоченного чтения отключал разбиение задач по диапазонам меток, из-за чего конвейер не мог прерывать выполнение между гранулами и считывал всю part для каждого потока. #104112 (Vladimir Cherkasov).
- Исправлено отсутствие повторного использования кэша размеров hash table после перестановки сторон JOIN. #104131 (Nikita Taranov).
- Когда
fsync_after_insert включён, fsync файлов part теперь выполняется параллельно с использованием пула потоков IO, что ускоряет завершение вставки в wide tables. Полная загрузка ClickBench hits теперь выполняется примерно на 22% быстрее. #104137 (Alexey Milovidov).
- Функции
find_first_symbols, find_first_not_symbols, find_last_symbols_or_null, find_last_not_symbols_or_null и splitInto векторизованы на AArch64 с использованием NEON. Ранее эти helpers имели SIMD-путь только на x86 (SSE2 / SSE4.2), а на ARM переходили к скалярному циклу. Это ускоряет parsing TSV примерно в 2 раза, URL-функции и splitByChar — примерно в 1,3 раза на наборе данных ClickBench hits; parsing очень плотного JSON (поля короче 16 байт с высокой частотой) немного замедляется, что соответствует существующему компромиссу SSE2. #104228 (Alexey Milovidov).
- Чтение данных через тривиальный столбец
ALIAS (например, some_alias['key'], где some_alias ALIAS m) теперь использует тот же путь чтения по подстолбцам, что и при прямом обращении к исходному столбцу, вновь обеспечивая значительную экономию I/O для столбцов Map, Array, Tuple и Nullable, определённых через alias. #104245 (Raúl Marín).
- Снижена конкуренция за блокировки на пути асинхронного чтения из удалённой FS за счёт перевода
AsyncReadCounters в lock-free режим на уровне отдельного запроса. #104374 (Nikita Mikhaylov).
- Немного улучшен план запроса для упорядоченного сканирования проекций. #103723 (Mikhail Artemenko).
optimizeUseNormalProjections расширен и теперь также обрабатывает частный случай, когда ничего не было отфильтровано, но ключ сортировки проекции позволяет убрать этап сортировки из плана запроса. #104680 (Mikhail Artemenko).
- Разрешена корректная работа синтаксического сахара
json.path[] и явных подсказок типа для типизированных путей JSON. #99179 (Pavel Kruglov).
- Оптимизировано выражение
json.path[N].nested.path (которое разворачивается в tupleElement(tupleElement(json.path[N], 'nested'), 'path')) в json.path[].nested.path[N], что позволяет читать значительно меньше данных. #99802 (Pavel Kruglov).
- Оптимизированы проверки доступа для
SHOW TABLES в system.parts: проверки grant на уровне database вынесены из цикла по отдельным table. #100860 (Shaohua Wang).
- Удалена избыточная проверка доступа
SHOW TABLES для каждой table в быстром пути SELECT name / SELECT database, name для system.tables. #100881 (Shaohua Wang).
- Включена JIT-компиляция на macOS. #100947 (Alexey Milovidov).
- Откладывание политики строк после
FINAL теперь пропускается, если она зависит только от столбцов ключа сортировки и является детерминированной; также в этом случае пропускается связанное откладывание PREWHERE, которое ранее вызывала политика строк. #102884 (Yarik Briukhovetskyi).
- Добавлена поддержка
hasAny и hasAll в качестве предикатов фильтра для текстовых индексов. #103266 (Anton Popov).
- Долгоживущее состояние кучи MergeTree (метаданные на уровне отдельных частей и таблиц) перенесено в выделенную arena jemalloc, доступную через асинхронные метрики
jemalloc.mergetree_arena.*. Это уменьшает фрагментацию arena по умолчанию в установившемся режиме и не позволяет долгоживущим объектам отдельных частей удерживать страницы, которые иначе могли бы быть освобождены. #104136 (Raúl Marín).
- Улучшена обработка тайм-аута клиента ZooKeeper под высокой нагрузкой, когда множество запросов передаются конвейером в одном сеансе. Теперь клиент ZooKeeper использует тайм-аут на основе прогресса: пока от server поступают какие-либо данные в пределах
session_timeout_ms, ожидание продлевается. При этом жесткое ограничение в 3 * session_timeout_ms на запрос по-прежнему ограничивает latency вызывающей стороны. Закрывает #100466. #104351 (Antonio Andelic).
- Флаги трассировки для отдельных событий перенесены в отдельный массив и теперь выделяются лениво, что снижает overhead трассировки
ProfileEvents. #105030 (Azat Khuzhin).
- Добавлен
compareTrackAt для ColumnDecimal, что повышает производительность сравнений для столбцов Decimal. #105110 (Artem Zuikov).
- Добавлена SIMD-реализация
MD5 (AVX2 / AVX512), которая хеширует несколько входных данных параллельно, повышая пропускную способность. #105161 (Joanna Hulboj).
- Улучшен вывод справки во всех приложениях ClickHouse:
--help теперь всегда возвращает код выхода 0, пишет в stdout, а clickhouse --help верхнего уровня выводит список всех подкоманд. Также добавлены опция --no-sudo для clickhouse start / restart (полезно в Docker) и подкоманда clickhouse help. Продолжение #58244 от @qoega. #98148 (Alexey Milovidov).
- Значение
input_format_column_name_matching_mode по умолчанию изменено с match_case на auto. Форматы ввода, сопоставляющие имена входных столбцов со схемой таблицы (JSONEachRow, CSVWithNames, JSONColumns, BSONEachRow, RowBinaryWithNames и т. д.), теперь сначала пытаются выполнить регистрозависимое сопоставление, а если совпадений нет — переходят к регистронезависимому. Прежнее строгое поведение сохраняется в режиме compatibility. #104320 (Alexey Milovidov).
- Добавлен
STDDEV как регистронезависимый псевдоним stddevSamp для совместимости с PostgreSQL/стандартом SQL. #105120 (Alexey Milovidov).
- Добавлен
array_to_string как регистронезависимый псевдоним arrayStringConcat для совместимости с PostgreSQL. #105121 (Alexey Milovidov).
- Добавлен
unnest как регистронезависимый псевдоним arrayJoin для совместимости с PostgreSQL (в форме вызова функции). #105124 (Alexey Milovidov).
- Индикатор выполнения в
clickhouse-client теперь рядом с оперативной памятью показывает объём временных данных на диске (например, при внешней сортировке, aggregation или JOIN), включая разбивку по хостам для распределённых запросов. #105190 (Alexey Milovidov).
- Добавлен
system.predicate_statistics_log — новый выборочный журнал селективности фильтров-предикатов и отсечения индексных гранул MergeTree для каждого запроса. По умолчанию отключён; включается через настройку сервера predicate_statistics_sample_rate. Нужен для автоматических рекомендаций по индексам и проекциям. #98727 (Yarik Briukhovetskyi).
- Разрешено пропускать локальный сегмент с отсутствующей таблицей, если включён
skip_unavailable_shards. #100141 (Alexey Milovidov).
- Добавлены предупреждения при запуске (видимые в
system.warnings), если массив Linux mdraid повторно синхронизируется или находится в деградированном состоянии, поскольку в обоих случаях это может влиять на производительность дискового IO или указывать на сбои дисков. #100941 (Alexey Milovidov).
- WASM UDF теперь отображаются в
system.functions с корректно заполненными столбцами origin (WasmUserDefined), syntax, arguments и returned_value на основе метаданных типов ClickHouse. Ранее они либо отсутствовали, либо отображались как дубликаты с неверным значением origin. #101053 (Vasily Chekalkin).
- Функция таблицы
generate_series теперь поддерживает отрицательные значения шага для генерации убывающих последовательностей, например SELECT * FROM generate_series(99, 0, -1). #101056 (Alexey Milovidov).
- Исправлены исключения
Context has expired, возникавшие в некоторых функциях (dotProduct, formatRow, structureToCapnProtoSchema/structureToProtobufSchema, пользовательские функции) при использовании в отложенных путях выполнения, таких как выражения DEFAULT/MATERIALIZED и настройки движка таблицы: теперь эти функции там, где это необходимо, удерживают сильную ссылку на контекст. #101109 (Alexey Milovidov).
- Исправлены ложные логические ошибки
Cache limits violated для приоритетов, созданных с нулевыми лимитами (например, для приоритета файлового кэша на уровне запроса, используемого при включённом enable_filesystem_query_cache_limit). #101428 (Alexey Milovidov).
- Добавлено автоматическое определение региона для конечных точек
s3express. #101520 (Pradeep Chhetri).
- Добавлена поддержка идентификаторов полей для файлов данных при записи в
Iceberg. Закрывает #102322. #102362 (Konstantin Vedernikov).
- Левая панель в веб-интерфейсе (
play.html) теперь прокручивается независимо, остаётся видимой при прокрутке страницы, а при нажатии на таблицу страница прокручивается к области запроса. #102498 (Alexey Milovidov).
- Теперь интерфейс Play можно открыть в новой вкладке через Ctrl/Cmd/Shift+click или средний клик по логотипу ClickHouse на левой панели. #102501 (Alexey Milovidov).
- Добавлены новые метрики для отслеживания памяти, используемой первичными ключами проекций и гранулярностью индекса проекций во всех таблицах. #102587 (Narasimha Pakeer).
max_network_bandwidth_for_user и max_network_bandwidth_for_all_users теперь применяются к операциям чтения/записи в удалённых файловых системах. #103080 (Azat Khuzhin).
- Повышена устойчивость резервных копий в случаях, когда Refreshable Materialized Views постоянно обновляются: решения теперь принимаются на основе состояния таблиц в снимке, а не глобального состояния. #103384 (Nikita Mikhaylov).
SELECT * FROM system.databases теперь всегда показывает базы данных каталога озера данных независимо от настройки show_data_lake_catalogs_in_system_tables. Раньше по умолчанию они были скрыты, что не соответствовало поведению SHOW DATABASES, которое всегда их показывало. #103444 (Alsu Giliazova).
- Значение по умолчанию для настройки сервера
concurrent_threads_soft_limit_ratio_to_cores в коде приведено в соответствие со значением из поставляемого config.xml (2), поэтому планировщик concurrent threads max_min_fair, используемый по умолчанию, ограничивает потоки обработки запросов уровнем 2x от числа ядер даже без использования поставляемого config.xml. #103446 (Alexey Milovidov).
- Повышена надёжность sanitizer в парсере и в пограничных случаях строковых функций: добавлена обработка пустого ввода в
getURLScheme, предотвращена арифметика с нулевым указателем в проверках max_query_size в Lexer::nextToken, а также добавлено раннее завершение вычисления UTF-8-подпоследовательности для пустой входной строки до декодирования. #103489 (Yakov Olkhovskiy).
- Повышена корректность определения монотонности для
divide(0, x) и intDiv(0, x): ранее эти функции безусловно считались монотонными, но 0 / x немонотонна на любом диапазоне, включающем 0, поскольку 0 / 0 не определено (NaN/Inf для divide, исключение деления на ноль для intDiv). Это ошибочное предположение приводило к тому, что KeyCondition::applyMonotonicFunctionsChainToRange формировал диапазоны с left > right, что вызывало LOGICAL_ERROR Invalid binary search result in MergeTreeSetIndex в отладочных сборках, если выражение IN / NOT IN по первичному ключу оборачивало ключ в divide(0, key) или intDiv(0, key). Релизные сборки не затронуты — эта проверка ограничена #ifndef NDEBUG. #103621 (Groene AI).
- Асинхронные метрики
HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95} заменены на гистограмму на основе бакетов http_pool_tcp_buf_bytes (метки group, direction) в system.histogram_metrics. Суммарные асинхронные метрики по группам сохранены. #103704 (Sema Checherinda).
- Настройки сервера
{disk,storage,http}_connections_{rcvbuf,sndbuf} теперь отображаются в system.server_settings как изменяемые без перезапуска. Их значения можно обновлять через SYSTEM RELOAD CONFIG; механизм применения во время выполнения уже был реализован в #100478. #103772 (Sema Checherinda).
- Добавлена поддержка разрешённых символов (
Array(String)) в flameGraph. #103816 (Azat Khuzhin).
- CLI-клиент теперь может указывать
<rainbow_parentheses>false</rainbow_parentheses> в своём конфиге в окружениях, где цвета терминала плохо сочетаются со скобками (аналогично, у clickhouse format теперь есть --no_rainbow_parentheses). #103851 (Larry Snizek).
- Исправлен регистронезависимый UTF-8-поиск в
MultiVolnitsky: при сбое частичные вставки putNGram теперь откатываются, а неудачные шаблоны поиска переключаются на fallback-поисковики, что позволяет избежать несогласованного состояния. #103864 (Yakov Olkhovskiy).
- Реализован
sched_getcpu через rseq TLS в glibc-совместимом musl. #104016 (Azat Khuzhin).
- Replicated refreshable materialized view в режиме APPEND больше не будет обновляться дважды, если во время обновления соединение с ZooKeeper кратковременно прерывалось. #104051 (Michael Kolupaev).
- Для таблиц Distributed без явного списка столбцов теперь разрешена проверка ключей сегментирования по выведенной структуре удалённой таблицы. #104111 (Yue).
- Исправлена работа REST-каталога с путём
Azure abfss. #104120 (Konstantin Vedernikov).
- Настройки аутентификации
role_arn и role_session_name теперь учитываются в S3-клиенте снимков Keeper, что позволяет использовать при загрузке снимков аутентификацию на основе STS AssumeRole. #104140 (Alexey Milovidov).
- Исправлена утечка памяти при выполнении запросов с
MATERIALIZED CTE. #104153 (Alexey Milovidov).
- Исправлено Исключение
lowerUTF8 / upperUTF8 при обработке больших наборов данных с не-ASCII-символами (например, при сборке текстовых индексов), когда накопленный выходной буфер мог превысить 2 GiB; чрезмерно длинные отдельные строки теперь отклоняются с понятной ошибкой. #104229 (Shaohua Wang).
- Повышена устойчивость загрузки статистики столбцов MergeTree к временным сбоям I/O, чтобы предотвратить постоянное отключение оптимизаций на основе статистики для затронутых частей. #104372 (zoomxi).
- Для
INSERT INTO ... SELECT FROM input(...) больше не требуется grant CREATE TEMPORARY TABLE. #104470 (Alexey Milovidov).
- Добавлена новая настройка MergeTree
concurrent_part_removal_threshold_for_remote_disk (по умолчанию 16), которая используется вместо concurrent_part_removal_threshold, когда хотя бы одна удаляемая часть хранится на удалённом диске. Прежнее пороговое значение 100 могло приводить к тому, что DROP TABLE и другие операции удаления частей в backend’ах Объектного хранилища зависали на десятки секунд, потому что удаления выполнялись последовательно, хотя каждое из них требует отдельного сетевого обмена. Новая настройка позволяет значительно раньше переходить к параллельному удалению на удалённом хранилище, не меняя поведение для локальных дисков. #104676 (Groene AI).
- Новая настройка
defer_partition_pruning_after_final (по умолчанию 1) делает введённое в 26.3 поведение, при котором при FINAL не выполняется отсечение партиций, отключаемым. Установите 0, чтобы вернуть отсечение партиций, как до 26.3, — это существенно быстрее для рабочих нагрузок журналов событий, где строки с одинаковым PK не могут находиться в разных партициях. compatibility = '26.2' автоматически переключает её в 0. #104705 (Nikita Fomichev).
- Исправлено
intExp2, возвращавшее неверные результаты для входных значений вне допустимого диапазона (сдвиги >= 64 при JIT и целые числа с модулем больше INT_MAX в обоих путях выполнения). #105054 (Raúl Marín).
- Добавлено заключение shell-аргументов, сформированных из CLI-опций и разобранного ввода, в кавычки в
clickhouse install и clickhouse git-import, чтобы пути, имена пользователей и групп, а также хеши коммитов, содержащие пробелы или shell-метасимволы, обрабатывались корректно. #105232 (Raúl Marín).
- Движок таблицы
Alias больше не является экспериментальным и доступен без настройки allow_experimental_alias_table_engine. #103488 (Alexey Milovidov).
- В
clickhouse-benchmark добавлена опция --queries-format, позволяющая выбирать между используемым по умолчанию форматом ввода tsv с экранированием табуляций и одним запросом на строку и разбором стандартного ввода как скрипта из нескольких запросов, разделённых ; (script). #99972 (Aleksandr Musorin).
- Поэлементные операторы Tuple
tuplePlus, tupleMinus, tupleMultiply, tupleDivide, tupleModulo, tupleIntDiv и tupleIntDivOrZero теперь являются вариадическими и принимают две или более Tuple одинакового размера, применяя операции поэлементно как левую свёртку. Ранее они принимали только ровно два аргумента. #104659 (Aruj Bansal).
- Добавлен новый встроенный web UI по адресу
/processors-profile, который визуализирует конвейер любого ранее выполненного SELECT-запроса в виде heatmap на основе данных из system.query_log и system.processors_profile_log. Каждый processor окрашивается в соответствии со значением elapsed_us, а при наведении показывает статистику по processor’у (строки, байты, время ожидания). #104614 (Nikita Mikhaylov).
- Настройка
query_plan_use_logical_join_step (и её alias query_plan_use_new_logical_join_step) теперь Obsolete и не имеет эффекта; логический шаг JOIN теперь используется всегда. #104017 (Vladimir Cherkasov).
- Поле ввода
user в play.html и на других встроенных веб-страницах (dashboard.html, jemalloc.html, merges.html, binary.html, webterminal.html) больше не заполняется заранее буквальным текстом default. Теперь оно показывает placeholder user и по умолчанию остаётся пустым. Если оставить его пустым, страница не отправляет URL-параметр user= (а auth JSON в WebTerminal не содержит поля user), поэтому сервер использует обычный fallback к пользователю default — и HTTP credentials, переданные по другим каналам (X-ClickHouse-User, HTTP Basic, конфигурация <handler><user> для конкретного handler), больше не overridden. #105254 (Alexey Milovidov).
- Reader
ORC: чтение по смещению (readBigAt) отделено от use_prefetch, чтобы данные с EC-кодированием в HDFS можно было корректно читать даже при use_prefetch = false (например, в Gluten). #103348 (zhanglistar).
- Файлы, загружаемые из
play.html в формате CSVWithNames, теперь используют расширение .csv. #103737 (JackFielding).
- Улучшена валидация входных данных для каталога BigLake. #105117 (Konstantin Vedernikov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено непоследовательное форматирование: теперь система запоминает, было ли выражение заключено в скобки. #92340 (Alexey Milovidov).
- Исправлено корректное сравнение типов Decimal и Float. #94293 (zoomxi).
- Разрешены позиционные аргументы в распределенных запросах. #94359 (simonmichal).
- Исправлен сбой проверки в
DatabaseCatalog::updateDependencies, возникавший при удалении и повторном создании materialized view с тем же именем; также исправлена проблема, из-за которой зависимости представлений могли незаметно теряться при RENAME TABLE или EXCHANGE TABLES, если ссылочные зависимости были пустыми. #98779 (Alexey Milovidov).
- Исправлено аварийное завершение сервера (сбой проверки в
DatabaseCatalog::getTableImpl), происходившее при создании таблицы через ON CLUSTER с UUID, совпадающим с UUID существующей базы данных. #98861 (xiaohuanlin).
- Исправлено использование индекса пропуска данных при чтении данных (при включенной настройке
use_skip_indexes_on_data_read) и существующих патч-частей, созданных легковесными обновлениями. #99543 (Alexey Milovidov).
- Исправлено исключение “Not-ready Set”, возникавшее, когда оптимизатор запросов переносил фильтр с
IN (subquery) в PREWHERE. #100375 (Alexey Milovidov).
- Исправлена ошибка “Cannot find column” при использовании
ADD COLUMN вместе с RENAME COLUMN в одном операторе ALTER TABLE. #100387 (Alexey Milovidov).
- Исправлены представления со смешанными операторами
UNION и INTERSECT/EXCEPT, которые возвращали неверные результаты после DETACH/ATTACH или перезапуска сервера. #100390 (Alexey Milovidov).
- Исправлено исключение “Trying to execute PLACEHOLDER action”, которое могло возникать при стресс-тестировании с AST-фаззером, когда в предложении IN появлялся коррелированный подзапрос. #100398 (Alexey Milovidov).
- Исправлено исключение logical error при вставке в таблицу Iceberg со столбцом
Date, разбитым на партиции с помощью преобразований year, month или day. #100404 (Alexey Milovidov).
- Исправлено использование индекса пропуска данных с несовместимыми данными после изменения типа столбца через
ALTER TABLE MODIFY COLUMN, что могло приводить к сбоям сервера в sanitizer-сборках или к неверным результатам запросов. #100526 (Alexey Milovidov).
- Исправлена утечка учетных данных в
query_log для табличных функций paimonCluster, paimonS3Cluster, paimonAzureCluster и deltaLakeS3. #100529 (JIaQi Tang).
- Исправлена ситуация, при которой
DROP TABLE для таблиц с Kafka engine мог зависать на неопределенное время из-за взаимной блокировки в rd_kafka_consumer_close. #100604 (Alexey Milovidov).
- Жестко заданный список
source_table_engines заменен на поиск во время выполнения через StorageFactory и DatabaseFactory. В DatabaseFactory::EngineFeatures добавлен source_access_type, чтобы CREATE DATABASE с исходными движками (PostgreSQL, MySQL, S3 и т. д.) требовал тех же привилегий на source, что и CREATE TABLE. Исправлена ошибка, из-за которой GRANT TABLE ENGINE ON * завершался неудачей при table_engines_require_grant=false. Закрывает #71544. #100746 (pufit).
- Исправлен сбой сервера при чтении из таблицы, где столбец
ALIAS содержал коррелированный подзапрос, вложенный в вызов функции (например, ALIAS toString(intDivOrZero(x, (SELECT ...)))). CREATE TABLE и ALTER TABLE теперь отклоняют любые подзапросы на любой глубине в выражениях столбцов DEFAULT / ALIAS / MATERIALIZED с ошибкой THERE_IS_NO_DEFAULT_VALUE. Ранее поверхностная проверка пропускала вложенные подзапросы, поэтому в коррелированном случае происходил сбой при чтении, а вложенный некоррелированный случай выглядел рабочим, но мог приводить к непредсказуемому поведению; теперь оба варианта отклоняются на этапе DDL. #100753 (Groene AI).
- Исправлен сбой сервера (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode), который мог возникать при использовании запросов с коррелированными подзапросами на таблицах с определениями CONSTRAINT ... ASSUME, если включены настройки optimize_substitute_columns и convert_query_to_cnf. #100756 (Groene AI).
- Исправлено исключение, которое могло возникать при вставке строки в JSON-столбец, если эта строка добавляла новое динамическое поле наряду с типизированным полем с несовместимым значением, а затем столбец использовался как ключ GROUP BY. #100758 (Jimmy Aguilar Mena).
- Исправлена ошибка, из-за которой планирование ввода-вывода для рабочей нагрузки незаметно обходилось при записи в S3/объектное хранилище через путь
DiskObjectStorageTransaction (используется дисками s3_with_keeper и явно при use_fake_transaction=false). Ранее INSERT-записи в таблицы семейства MergeTree на таких дисках игнорировали throttling CREATE RESOURCE / CREATE WORKLOAD, потому что ссылка на ресурс никогда не добавлялась в WriteSettings для транзакционного пути записи. #100777 (JIaQi Tang).
- Исправлена коллизия общего кэша схем между
Protobuf и ProtobufList: чтение сообщения сначала как FORMAT Protobuf, а затем как FORMAT ProtobufList могло завершаться ошибкой, потому что ProtobufList принудительно переводил кэшированную схему в формат оболочки. Теперь ProtobufList использует кэшированный тип сообщения, если схема оболочки недоступна. #100849 (Callum Cooper).
- Исправлено переполнение буфера кучи (heap-buffer-overflow) в мосте Rust CXX из-за несовпадения ABI
std::exception. #100931 (Azat Khuzhin).
FunctionVariantAdaptor теперь выбрасывает ILLEGAL_TYPE_OF_ARGUMENT, если все альтернативы Variant несовместимы с функцией, вместо того чтобы молча возвращать Nullable(Nothing). Ранее предикат WHERE function(variant_col), в котором ни один альтернативный тип не был совместим, возвращал 0 строк без ошибки, тогда как в эквивалентном контексте SELECT исключение уже выбрасывалось корректно. #100939 (Vasily Chekalkin).
TRUNCATE ALL TABLES больше не завершается ошибкой, если база данных содержит представления. #100943 (Alexey Milovidov).
- Исправлена оптимизация
optimize_rewrite_array_exists_to_has: теперь она корректно обрабатывает случаи с несовместимыми типами (например, Date и String) и снова включена по умолчанию. #100944 (Alexey Milovidov).
- Исправлен приоритет настроек S3: теперь настройки диска в
storage_configuration переопределяют глобальную секцию <s3>, а настройки на уровне пользователя/профиля/запроса переопределяют и те, и другие. #100975 (Alexey Milovidov).
- Исправлена разреженная сериализация, из-за которой для столбцов BFloat16, Float32 и Float64 терялся знак отрицательного нуля (-0.0). #100983 (Takumi Hara).
- Исправлены две ошибки в парсере геометрии WKT, используемом при чтении WKT-кодированных файлов GeoParquet и Arrow: геометрии
MULTILINESTRING ошибочно разбирались как Polygon (что вызывало исключение для типизированных столбцов и незаметное повреждение данных для смешанных столбцов Geometry), а некорректная строка WKT без ключевого слова типа приводила к неопределённому поведению вместо корректной ошибки. #100997 (Vasily Chekalkin).
- Исправлены запросы
grouping/GROUPING SETS к таблицам Distributed с одним сегментом, которые завершались ошибкой “Method executeImpl is not supported for ‘grouping’ function”. #101030 (Alexey Milovidov).
- Исправлена ошибка
LOGICAL_ERROR “Column identifier is already registered” в планировщике, которая могла возникать, когда одно и то же табличное выражение обрабатывалось несколько раз. #101048 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR “Column identifier is already registered” при использовании настройки
additional_result_filter с запросами UNION или EXCEPT. #101051 (Alexey Milovidov).
- Исправлен сбой сервера (Logical error: Bad cast from ColumnVector to ColumnNullable) при использовании
* APPLY с агрегатными функциями и group_by_use_nulls=1 вместе с GROUPING SETS, ROLLUP или CUBE. #101062 (Groene AI).
- Исправлен бесконечный цикл, возникавший, когда
input_format_csv_skip_first_lines или input_format_tsv_skip_first_lines превышали количество строк в файле. #101111 (Alexey Milovidov).
- Исправлен выход за границы в оптимизации lazy materialization, который мог вызывать исключение в debug-сборках. #101144 (Alexey Milovidov).
- Исправлен вывод типов в рекурсивных CTE: теперь типы столбцов итеративно расширяются через
getLeastSupertype между нерекурсивной и рекурсивной частями UNION ALL до сходимости, что предотвращает целочисленное переполнение в выражениях вида x + 1. #101155 (Alexey Milovidov).
- Настройки размера блоков сжатия в MergeTree (max_compress_block_size, min_compress_block_size, marks_compress_block_size, primary_key_compress_block_size) теперь ограничены значением 256 MiB, чтобы предотвратить сбой сервера при установке экстремальных значений через CREATE TABLE SETTINGS. #101159 (Groene AI).
- Исправлено аварийное завершение с LOGICAL_ERROR в
QueryAnalyzer::resolve(), когда ROW POLICY использует скалярный подзапрос в предложении USING (например, USING (SELECT 1)). Закрывает #100695. #101263 (Groene AI).
- Исправлено неопределённое поведение в
MergeTreeDataPartWriterCompact::cancel, если не удаётся выделить stream. #101292 (Alexey Milovidov).
- Исправлен случай, когда часовой пояс не учитывался при присваивании в операторе ALTER. Закрывает #101328. Связано с https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
- Исправлено аварийное завершение сервера (LOGICAL_ERROR) для запросов INSERT SELECT с ORDER BY ALL, когда конвейер SELECT создаёт несколько streams. #101443 (Groene AI).
- Исправлены некорректные результаты запроса, вызванные тем, что переупорядочивание JOIN проталкивало фильтр INNER JOIN (ссылающийся только на сохраняемую сторону OUTER JOIN) в предложение ON внешнего JOIN. #101504 (Vladimir Cherkasov).
- Отключено применение lazy materialization для планов с arrayJoin, так как это могло приводить к несоблюдению LIMIT. Закрывает #101608. #101644 (Vladimir Cherkasov).
- Исправлены некорректные результаты запросов JOIN, когда оптимизация
mergeFilterIntoJoinCondition молча отбрасывала условие равенства из WHERE при несовпадении типов. #101652 (Xiaozhe Yu).
- Исправлено, что тестовая подсказка
error не работала для ошибок синтаксиса/разбора — раньше -- { error SYNTAX_ERROR } на некорректном запросе завершалось с “Expected server error” вместо сопоставления с клиентской ошибкой разбора. #101675 (Groene AI).
- Исправлено, что
INTO OUTFILE ... TRUNCATE фактически не использовал atomic rename: запись шла напрямую в исходный файл, а не во временный, поэтому при сбое запроса исходное содержимое уничтожалось. Теперь данные записываются во временный файл и переименовываются только при успешном завершении. #101884 (Pablo Marcos).
- Исправлено исключение
Unsupported DeltaLake type: varchar(n) при чтении таблиц Delta Lake, чья схема содержит типы столбцов varchar(n) или char(n). Эти типы теперь сопоставляются с String, что соответствует тому, что протокол Delta Lake хранит их в Parquet как обычные массивы байтов. #101973 (Flavio Malavazi).
- Исправлена незаметная потеря данных при чтении tar-архивов из S3 с
schema_inference_mode=union и неоднородными схемами Parquet — parquet metadata cache ошибочно повторно использовал metadata первого файла для всех последующих файлов в архиве. #101990 (Ahaan Limaye).
- Исправлено аварийное завершение сервера (LOGICAL_ERROR) при выполнении ALTER TABLE UPDATE/DELETE на таблицах Iceberg, если ранее в течение текущего времени работы сервера для этой таблицы не выполнялся ни SELECT, ни INSERT. #102113 (Alexey Milovidov).
- Исправлен возможный сбой при выполнении запроса ALTER на таблицах из in-memory database (например, temporary tables). #102360 (Den Kalantaevskii).
- Исправлено поведение
formatQuery, из-за которого при форматировании обратно совместимых привилегий READ/WRITE для одного и того же source появлялись дублирующиеся grants вида GRANT FILE ON *.*, FILE ON *.* TO x вместо GRANT FILE ON *.* TO x. #102411 (Groene AI).
- Исправлена потеря parallelism для aggregation после запросов read-in-order, когда
max_streams_to_max_threads_ratio больше 1. #102467 (Alexey Milovidov).
- Исправлен сбой (
LOGICAL_ERROR: Unknown virtual column) при выборке subcolumns (например, .null для Nullable, .size0 для Array, элементов Tuple или ключей/значений Map) из таблицы с движком Buffer. #102470 (Groene AI).
- Исправлено Исключение “Cannot fold actions for projection” при оптимизации перестановки JOIN, когда LEFT/RIGHT JOIN с
join_use_nulls комбинируется с другими joins с участием более двух таблиц. #102516 (Alexey Milovidov).
- Исправлено тихое overflow в scalar покомпонентных операциях над numericIndexedVector (например,
numericIndexedVectorPointwiseAdd), когда scalar выходит за допустимый диапазон. Теперь такие входные данные приводят к INCORRECT_DATA вместо возврата поврежденных значений. #102546 (FriendLey).
- Исправлено неконсистентное форматирование AST для INSERT с SAMPLE и OFFSET на уровне запроса. Закрывает #102523. #102547 (zoomxi).
- Исправлено Исключение
LOGICAL_ERROR в groupConcat при десериализации некорректного состояния aggregate function. #102558 (Christoph Wurm).
- Значения Time64 в CSV больше не принимают мусор в конце при
input_format_csv_use_default_on_bad_values=0. Закрывает #102490. #102596 (Yarik Briukhovetskyi).
- Исправлено Исключение UNKNOWN_ELEMENT_OF_ENUM при вставке default value в JSON-столбец с paths типа Enum. Закрывает #102359. #102687 (Pavel Kruglov).
- Исправлено повреждение columns_substreams.txt в некоторых случаях при rename столбца. Закрывает #102259. #102689 (Pavel Kruglov).
- Исправлена вставка в тип данных Time при parsing JSON. Закрывает #102016. #102690 (Pavel Kruglov).
- Исправлено шестнадцатеричное кодирование content sample в именах файлов кэшированной схемы. Закрывает #101904. #102703 (Pavel Kruglov).
- Исправлено нарушение порядка сортировки (сбой в debug, тихая порча данных в релизной сборке) при merge в
SummingMergeTree, когда ключ ORDER BY представляет собой hash-выражение по столбцу Float32, содержащему signaling NaN-значения. #102791 (Groene AI).
- Операции
DETACH DATABASE ... SYNC и другие операции, вызывающие waitDetachedTableNotInUse, теперь можно отменить через KILL QUERY, и они корректно реагируют на остановку server, что предотвращает зависания на неопределённое время, когда параллельный запрос удерживает ссылку на table. #102804 (Antonio Andelic).
- Исправлен возможный некорректный результат
ANY RIGHT JOIN. #102893 (Nikita Taranov).
- Исправлена ошибка, из-за которой запросы к S3 завершались с
ios_base::clear: unspecified iostream_category error вместо повторной попытки; причиной было то, что Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda).
- Исправлена ошибка, из-за которой table function
input('auto') завершалась сбоем через HTTP interface в запросах INSERT SELECT. #102902 (Miсhael Stetsyuk).
- Отключена тривиальная оптимизация LIMIT с row policies/additional_table_filters (чтобы разрешить параллельный index analysis). #102921 (Azat Khuzhin).
- Скрыт secret key в SQL-функции
HMAC. Исправление #102927. #102997 (Mikhail f. Shiryaev).
- Исправлено исключение
MULTIPLE_EXPRESSIONS_FOR_ALIAS, возникавшее в distributed queries, которые несколько раз ссылаются на один и тот же вызов quantile (например, в SELECT, HAVING и ORDER BY) при включённом optimize_syntax_fuse_functions. #103014 (tanner-bruce).
- Исправлен случай, обнаруженный CI, когда передавался неготовый set, если filter зависел от столбца в левой части. Закрывает #102966. #103029 (Yarik Briukhovetskyi).
- Исправлена
castOrNull для JSON в некоторых случаях. Закрывает #101818. #103036 (Pavel Kruglov).
- Исправлен случай, когда
SELECT DISTINCT молча возвращал неполные результаты, если aggregate projection соответствовала запросу, но у некоторых частей table отсутствовали данные projection (например, projection была добавлена в table, которая уже содержала данные, и MATERIALIZE PROJECTION не был выполнен). Закрывает #102951. #103052 (Nihal Z. Miaji).
- Исправлено исключение
TOO_FEW_ARGUMENTS_FOR_FUNCTION, возникавшее, когда predicate в WHERE, такой как AND(OR(A, A), A), сворачивался в единственный аргумент верхнего уровня при извлечении common expression в analyzer. #103072 (Peng).
- Исправлена logical error
Function writeSlice expects same column types for GenericArraySlice and GenericArraySink, возникавшая при вычислении if/ifNull для кортежей, Map и массивов, содержащих элемент QBit. ColumnQBit::structureEquals некорректно сравнивал внутренний кортеж одного столбца QBit с внешней обёрткой другого, из-за чего структурно идентичные столбцы QBit считались разными. #103084 (Groene AI).
- Сделано так, чтобы
DETACH DATABASE с database_atomic_wait_for_drop_and_detach_synchronously учитывал KILL QUERY, а не зависал на неопределённое время, когда удерживается ссылка на таблицу. #103095 (Alexey Milovidov).
- Исправлен segfault при удалении модуля WASM с использованием предиката, не являющегося идентификатором (например,
WHERE 1=1). #103101 (Joe Redfern).
- Исправлено нарушение обратной совместимости, из-за которого старые клиенты завершались с
UNEXPECTED_PACKET_FROM_SERVER при вставке данных в более новый сервер через remote() или distributed таблицы; причиной был безусловный вызов sendProgress в конце processInsertQuery. #103148 (Sema Checherinda).
- Для
IN с неконстантным вторым аргументом-кортежем нельзя приводить элементы кортежа через CAST к типу левой части, так как это может вызвать overflow. Закрывает #103055. #103169 (Yarik Briukhovetskyi).
- Исправлено использование неинициализированного значения в функции протокола. #103187 (Pavel Kruglov).
- Исправлен
LOGICAL_ERROR (Bad cast … to ColumnLowCardinality) при анализе индекса MergeTree, когда предложение WHERE сравнивает ключевой столбец LowCardinality с константой, приведённой к типу, содержащему вложенный LowCardinality (например, Variant(LowCardinality(Date), String)). #103211 (Groene AI).
- Исправлена
Logical error: 'index < bucket_count' в семействе aggregate function timeSeries*ToGrid (например, timeSeriesResampleToGridWithStaleness, timeSeriesChangesToGrid, timeSeriesResetsToGrid, timeSeriesRateToGrid) при вызове с экстремальными параметрами временных меток, которые приводили к overflow в знаковой 64-битной арифметике при вычислении числа бакетов. Кроме того, общее число бакетов сетки теперь ограничено 16 миллионами, чтобы предотвратить случайное выделение большого объёма памяти из-за вредоносных входных данных. #103223 (Groene AI).
- Исправлено исключение
Logical error: 'Port is already connected', возникавшее при расширении конвейера в отложенном пути FINAL для ReplacingMergeTree. Ошибка затрагивала запросы с query_plan_optimize_lazy_final = 1, когда ReadFromMergeTree::initializePipeline вставлял внутренние преобразования (например, Resize), которые соединяли processors подконвейера между собой, из-за чего LazyUnorderedReadFromMergeTreeSource::expandPipeline пытался подключить выходные порты, уже подключённые ранее. #103230 (Groene AI).
- Исправлены неверные результаты
LIMIT BY и DISTINCT, когда входные данные представляют собой UNION ALL отсортированных подзапросов. Оптимизатор плана запроса ошибочно считал такое объединение глобально отсортированным, из-за чего возвращались лишние строки. #103231 (Nihal Z. Miaji).
- Исправлено возможное падение при вычислении статистики для типа Map с отложенной репликацией. Закрывает #102390. #103273 (Pavel Kruglov).
- Исправлена гонка данных для источников словарей ClickHouse, MySQL, PostgreSQL и XDBC, где
clone() const читает, а isModified() const записывает в одну и ту же строку invalidate_query_response. #103277 (Miсhael Stetsyuk).
- Исправлено некорректное определение монотонности для
Date32. Закрывает #101265. #103283 (Yarik Briukhovetskyi).
- Строки в предаутентификационном TCP-пакете Hello теперь ограничены 64 КБ; также добавлена настройка сервера
handshake_timeout_milliseconds, ограничивающая общее время рукопожатия и не позволяющая неаутентифицированным клиентам потреблять слишком много памяти или удерживать потоки неограниченно долго. #103284 (Sema Checherinda).
- Исправлена ошибка в статистике Parquet ColumnIndex, при которой
min_value > max_value для столбцов String. #103334 (Saurabh Kumar Ojha).
- Исправлена некорректная обработка строк с NULL для входных данных
Nullable(Tuple(...)) в flattenTuple и tupleToNameValuePairs. Теперь flattenTuple сохраняет внешнюю null-карту, поэтому строки с NULL остаются NULL. tupleToNameValuePairs теперь, когда это возможно, меняет тип значения результата на Nullable(T) для входных данных Nullable(Tuple(...)), поэтому строки с NULL дают [('a', NULL), ('b', NULL)] вместо [('a', 0), ('b', 0)]. Если тип элемента нельзя обернуть в Nullable (например, Array), вместо NULL используются значения по умолчанию. Закрывает #103312. #103383 (Nihal Z. Miaji).
- Добавлена проверка на некорректные уплощённые данные Dynamic в Native format. #103392 (Pavel Kruglov).
- Исправлен устаревший RPC, из-за которого репликация зависала после синхронизации снимка. #103406 (Seva Potapov).
- Исправлено аварийное завершение сервера из-за
LOGICAL_ERROR “Cannot pop N rows from X” (в debug- и sanitizer-сборках) при чтении некорректного BSON-документа, содержащего значение, тип BSON которого несовместим с типом целевого столбца внутри столбца Nullable(T) или Array(Nullable(T)). Теперь некорректная строка, как и ожидалось, приводит к корректному исключению ILLEGAL_COLUMN. #103418 (Groene AI).
- Исправлено аварийное завершение сервера в
arrayFill и arrayReverseFill при применении к столбцу Array(String), у которого первая строка пуста, вместе с лямбда-функцией, всегда возвращающей false. В цикле aggregate / sub-array индекс size_t уходил в SIZE_MAX из-за выхода за нижнюю границу диапазона, что затем вызывало чтение за пределами границ в ColumnString::doInsertManyFrom. Это то же семейство ошибок, что и #12263. #103424 (Groene AI).
- Исправлены ACCESS_DENIED / UNKNOWN_TABLE в нижестоящих APPEND RMV с SQL SECURITY DEFINER, когда EXCHANGE в вышестоящем REPLACE RMV переключает identity целевого хранилища в процессе разрешения. #103427 (Alexander Gololobov).
- Столбец
_time теперь заполняется из табличной функции url. #103437 (Nikita Taranov).
- Исправлено потенциальное чтение за пределами буфера в пути распаковки кодека
ALP при обработке некорректного входного потока с недопустимой битовой шириной. #103457 (Raufs Dunamalijevs).
- Исправлена ошибка, из-за которой
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ... мог терять имя кэша при форматировании запроса, из-за чего удалённые узлы синхронизировали все файловые кэши, а не только запрошенный. #103469 (Asish Kumar).
- Исправлена обработка URL-кодированного пути в
deltaLakeAzure. Закрывает #103509. #103525 (Smita Kulkarni).
- Исправлено обращение к уже освобождённой памяти в куче при умножении состояния
AggregateFunction на целое число (например, quantilesExactState(...) * N). В цикле возведения в степень методом двоичного разложения состояние сливалось само с собой, что не определено, если merge агрегатной функции перераспределяет своё внутреннее хранилище. Закрывает STID 0988-40af. #103536 (Groene AI).
- Исправлена редкая ошибка
LOGICAL_ERROR “Part X intersects previous part Y”, возникавшая при запуске таблицы ReplicatedMergeTree, когда две пустые неожиданные части на диске имели пересекающиеся, но не вложенные друг в друга диапазоны блоков. Исключение прерывало поток attach таблицы и не давало таблице запуститься. #103537 (Groene AI).
- Исправлена ошибка
Logical error: Incorrect mark rows for part ... (проверка только в отладочной сборке), которая срабатывала из-за мутаций в таблицах MergeTree с неадаптивной гранулярностью индекса (index_granularity_bytes = 0), у которых последняя метка данных была неполной (надёжнее всего воспроизводилось через DETACH/ATTACH с последующим легковесным DELETE). #103538 (Groene AI).
- Исправлена ситуация, когда
clickhouse-local молча возвращал 0 строк при чтении из псевдофайлов /proc и /sys через табличную функцию file() (например, SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')). #103548 (Ashrith Bandla).
- Исправлена обработка аргумента
max_string_length для движка таблицы GenerateRandom. #103550 (Alex Kuleshov).
- Исправлено маскирование вложенных учётных данных в журналах. #103552 (Vitaly Baranov).
- Исправлено определение SVE, использовавшее инструкции SVE, когда они недоступны. #103568 (Raúl Marín).
- Исправлен разбор аргументов хранилища
GenerateRandom. #103574 (Konstantin Bogdanov).
- Исправлен бесконечный цикл в
WITH FILL для данных, начинающихся с ±inf. #103580 (Konstantin Bogdanov).
- Исправлено молчаливое усечение дробных JSON-чисел при извлечении
JSONExtract в тип Variant. Ранее JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)') возвращал Int64=3, а JSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)') — Int64=3, отбрасывая дробную часть. Теперь дробное значение сохраняется без потерь: если присутствует член Float64/Decimal, значение попадает в него, в противном случае исходный JSON сохраняется в члене String. Типы Variant, содержащие только целочисленные члены (например, Variant(Int64, Int32)), а также прямое извлечение целых чисел (JSONExtract(json, 'Int64'), JSONExtractInt и т. д.) не изменились. #103620 (Groene AI).
- Исправлена ситуация, когда
SYSTEM INSTRUMENT REMOVE без аргументов выдавал std::bad_optional_access (код ошибки 1001) вместо SYNTAX_ERROR (код ошибки 62). #103622 (Pablo Marcos).
- Исправлены logical error и неопределенное поведение в
windowID и оконном представлении tumble при вызове со строкой часового пояса в качестве 3-го аргумента. #103641 (Alexey Milovidov).
- Логирование клиента S3 теперь рассматривает HTTP-ответы 400 с непустым заголовком
x-amz-bucket-region (неверный Region для подписи SigV4) как информативный случай неверного региона, с более понятной строкой в логе вместо общего пути обработки в стиле ошибки. Провайдер учетных данных STS web identity теперь добавляется в цепочку учетных данных S3 только при настроенной web identity, что уменьшает количество ложных предупреждений в развертываниях, где она не используется. Закрывает #99140. #103673 (MeltonSmith).
- Исправлено поведение
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS: теперь команда молча завершается успешно, если база данных не существует, в соответствии с уже существующим поведением для отсутствующей таблицы и прецедентом, заданным DROP TABLE IF EXISTS. Ранее запрос выдавал UNKNOWN_DATABASE, несмотря на IF EXISTS. Закрывает #103629. #103689 (Groene AI).
- Исправлена logical error
Arguments of 'plus' have incorrect data types, которую выбрасывал FunctionBinaryArithmetic::executeImpl2, когда у таблицы MergeTree в ключе сортировки был Array(LowCardinality(...)), а в предложении WHERE использовались plus / minus между этим столбцом и константой Array с другим типом элементов. KeyCondition::getMonotonicityForRange теперь рекурсивно удаляет LowCardinality перед вызовом внутреннего числового dispatch. #103701 (Groene AI).
- Исправлена race condition при динамическом изменении размера cache в 26.1+. #103702 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой skip-индексы
text и bloom_filter на столбцах ALIAS, чье выражение содержало lambda с захваченными константами (например, arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m))), молча игнорировались. #103708 (Anton Popov).
- Исправлено зависание или segmentation fault в
position и positionCaseInsensitive при start_pos, близком к UINT64_MAX, из-за переполнения арифметики указателей. #103766 (Raúl Marín).
- Исправлено неопределенное поведение при разборе
dateTime с двойной дробной частью. #103773 (Yarik Briukhovetskyi).
- Исправлена регрессия корректности данных в 26.x: JIT-скомпилированные
if и multiIf с типом результата Decimal и не-Decimal-литералом (целым числом или числом с плавающей точкой) в одной из ветвей могли молча возвращать значение в 10^scale раз меньше правильного. Медленный путь (без JIT) затронут не был. Обходное решение для затронутых версий: SET compile_expressions = 0. #103809 (Groene AI).
- Исправлена передача токенизатора из text index в поддерживаемые функции. #103826 (Elmi Ahmadov).
- Исправлены неверные результаты из
numbers, generate_series и аналогичных источников, учитывающих диапазон, когда в условии WHERE используется IN или NOT IN по кортежу, элементы которого дедуплицируются до одного ключевого столбца (например, WHERE tuple(number, number) NOT IN (tuple(1, 2))). Закрывает #103660. #103835 (Groene AI).
- Реальный пик потребления памяти у hash join с автоматическим spilling теперь удерживается ниже
max_bytes_before_external_join. Ранее предварительное выделение памяти на основе статистики, удвоение hash table на месте и неограниченные in-memory бакеты в GraceHashJoin по отдельности могли приводить к тому, что запрос превышал настроенный лимит и завершался с MEMORY_LIMIT_EXCEEDED. #103838 (Alexey Milovidov).
- Исправлено зависание при завершении работы
clickhouse-local, если настроены системные журналы (например, text_log или filesystem_cache_log). SystemLogs::flushImpl вызывал BaseDaemon::instance().flushTextLogs(), который генерирует std::bad_cast вне clickhouse-server, из-за чего потоки сохранения продолжали работать, пока pthread_cond_destroy не блокировал уничтожение очередей системных журналов. #103874 (Alexey Milovidov).
- Запросы
MATERIALIZED CTE, у которых body в разных ссылках разрешается в разные выведенные типы столбцов, теперь отклоняются с понятной ошибкой TYPE_MISMATCH вместо аварийного завершения сервера с Bad cast LOGICAL_ERROR. Ранее это происходило, когда body CTE ссылался на идентификаторы из внешней области видимости (например, на alias из проекции вызывающего подзапроса), которые подставлялись как разные константы для каждой ссылки. #103879 (Groene AI).
- Исправлено использование неинициализированного значения в оптимизаторах плана запроса, преобразующих JOIN (
tryConvertAnyOuterJoinToInnerJoin, tryConvertAnyJoinToSemiOrAntiJoin), когда filter над ANY OUTER JOIN содержит недетерминированную функцию, такую как rand, now или rowNumberInAllBlocks. Оптимизатор больше не пытается выполнять constant folding для таких filter и оставляет JOIN без изменений, что также предотвращает некорректные преобразования в INNER/SEMI/ANTI JOIN, которые могли незаметно отбрасывать строки. #103880 (Groene AI).
- Исправлена ошибка use-after-free в
StorageKafka2, которая могла приводить к сбою сервера, если сеанс Keeper заменялся, пока consumer удерживал эфемерные блокировки topic-partition. #103890 (Groene AI).
- Исправлена
LOGICAL_ERROR “Primary key type mismatch”, возникавшая при соединении таблицы EmbeddedRocksDB через JOIN ... USING (key) с подзапросом, у которого ключевой столбец имеет тип, отличный от primary key хранилища (например, Nullable(UInt64), Int64, Decimal). Теперь planner отклоняет DirectKeyValueJoin при несовпадении типов и переключается на HashJoin, который выполняет преобразование типов. #103928 (Groene AI).
SET max_threads = DEFAULT (и то же для max_final_threads и max_parsing_threads) больше не теряет состояние auto. Ранее после сброса одного из этих настроек system.settings показывал вычисленное число ядер (например, 32) вместо 'auto(32)', и server вёл себя так, как будто значение было явно зафиксировано. #103991 (Groene AI).
- Исправлена ошибка
SIZES_OF_ARRAYS_DONT_MATCH при чтении столбцов AggregateFunction(topK(N), String), у которых сохранённый alpha_size был увеличен циклом deserialize+serialize в версии до 25.12. #104002 (Raúl Marín).
- Исправлена уязвимость SQL injection в dictionary source PostgreSQL, Cassandra и XDBC: строковые ключи, содержащие одинарные кавычки, экранировались как
\' (обратный слеш), который эти backend-соединения трактуют как буквальный обратный слеш, а не как escape-последовательность, что позволяло внедрять произвольный SQL в запросы lookup словарей. ExternalQueryBuilder теперь использует для этих backend-соединений стандартное для SQL экранирование ''; dictionary source ClickHouse и MySQL по-прежнему используют экранирование обратным слешем. #104009 (Shaohua Wang).
- Исправлено возможное несоответствие типов при aggregation, когда тип столбца изменялся на LowCardinality или обратно, а min-max projection не была пересобрана. #104013 (Nikita Taranov).
- Исправлен бесконечный цикл query optimization, вызванный тем, что при слиянии выражений не распространялся запрет на удаление неиспользуемых столбцов. #104083 (János Benjamin Antal).
- Исправлена ошибка
LOGICAL_ERROR в StreamingStorageRegistry::renameTable при пакетном переименовании стриминговых table (S3Queue, Kafka, RabbitMQ) за счёт использования отслеживания identity на основе UUID вместо отслеживания по именам. #104101 (Nikita Taranov).
- Исправлены неверные результаты в случае, когда CTE, построенный с
UNION ALL, содержал ветку SELECT DISTINCT, а внешний запрос проецировал только подмножество столбцов CTE. RemoveUnusedProjectionColumnsPass в новом analyzer некорректно удалял неиспользуемый столбец из внутренней projection DISTINCT, из-за чего строки, которые должны были оставаться различными (одно и то же значение в проецируемом столбце, но разное значение в удалённом столбце), схлопывались в одну. #104114 (Groene AI).
- Исправлено несколько проблем корректности в пограничных случаях для настройки
optimize_inverse_dictionary_lookup, из-за которых оптимизация могла незаметно отбрасывать строки или подавлять исключения. Закрывает #103270. Закрывает #103085. #104133 (Nihal Z. Miaji).
- Исправлена запись за пределы буфера при десериализации состояния
quantileTiming. #104141 (Alexey Milovidov).
- Исправлено неопределённое поведение при преобразовании значения
Float64 вне допустимого диапазона в широкий целочисленный тип (UInt64, Int64, Int128, UInt128, Int256, UInt256). Ранее значения, равные Float64(numeric_limits<T>::max()) (которые округлялись вверх до значения, превышающего фактический максимум), обходили проверку границ и приводили к UB при последующем CAST. Это затрагивало parsing параметров агрегатных функций (topK, histogram, uniqUpTo, groupArrayInsertAt и т. д.) и настройки целочисленного типа через SET <setting> = <Float64>. Закрывает #103817. #104154 (Groene AI).
- Исправлено исключение
LOGICAL_ERROR “Unexpected return type from comparison. Expected UInt8. Got Const(Nullable(UInt8))” при сравнении вложенного Tuple(Tuple(Nullable(...))) (или с более глубокой вложенностью) со строковым литералом. Возвращаемый тип сравнения теперь корректно определяется как Nullable(UInt8), что соответствует поведению во время выполнения. #104171 (Groene AI).
- Исправлено аварийное завершение server (
UndefinedBehaviorSanitizer: reference binding to null pointer, segfault в release-сборках) на SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr> при query_plan_optimize_lazy_final = 1. На этапе lazy-FINAL-чтения без пересечений столбец is_deleted исчезал из выходного header, поскольку prewhere использовал его как входной и не добавлял обратно в выходные данные. В результате следующий этап addIsDeletedFilter разыменовывал нулевой указатель ActionsDAG::Node. #104177 (Groene AI).
- При обращении к таблице system.failpoints использовался failpoint, из-за чего он мог отключаться. #104237 (Pedro Ferreira).
- Исправлено
MemorySanitizer: use-of-uninitialized-value в функциях detectLanguage*, когда входные данные содержат символ UTF-8, заканчивающийся ровно на границе buffer. #104257 (Raúl Marín).
- Исправлена logical error (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage), из-за которой прерывался разбор аргументов table function и движков для data lake (icebergS3, deltaLakeS3 и т. д.) при вызове с SETTINGS disk = '...' для disk, чьё базовое Объектное хранилище обёрнуто декоратором, например файловым кэшем. Закрывает #89300. #104258 (Groene AI).
- Исправлен разбор индексных выражений в скобках для столбцов с именем
values, например (values['a']), чтобы они больше не интерпретировались как табличные выражения SQL VALUES. #104312 (Desel72).
- Исправлено аварийное завершение server/
LOGICAL_ERROR в фоновом потоке eviction файлового кэша (SLRUFileCachePriority::collectEvictionInfo), которое могло происходить, когда keep_free_space_size_ratio или keep_free_space_elements_ratio были достаточно высокими, чтобы запустить eviction, при том что все записи кэша уже были перемещены в защищённую очередь SLRU (а probationary была пуста). #104313 (Groene AI).
- Исправлены исключения (
NOT_FOUND_COLUMN_IN_BLOCK, LOGICAL_ERROR, AMBIGUOUS_COLUMN_NAME) при использовании проекций с представлениями UNION ALL, window functions или конфликтами имён между alias и столбцами. Регрессия из #88798. #104317 (Amos Bird).
- Исправлен возможный выход за нижнюю границу диапазона при разборе массивов Postgres. #104322 (Grant Holly).
- Функции, которые возвращают тип, отличный от
Nullable (например, Array, Tuple или Map), теперь принимают аргументы типа Nullable. К затронутым функциям относятся extractAll, extractAllGroups, extractAllGroupsHorizontal, extractAllGroupsVertical, extractGroups, splitByChar, splitByString, splitByRegexp, splitByWhitespace, splitByNonAlpha и alphaTokens. Входные строки со значением NULL теперь дают значение по умолчанию для результирующего типа (например, пустой массив) вместо генерации ошибки “Nested type is not allowed inside Nullable type”. #104326 (Alexey Milovidov).
- Исправлена статистика Iceberg для партиционированной таблицы. Это закрывает #104321. #104329 (Konstantin Vedernikov).
- Исправлена фатальная logical error при запуске server на macOS (и в аналогичных build jemalloc), из-за которой
Jemalloc::verifySetup ошибочно сообщал о несоответствии jemalloc_enable_background_threads, поскольку необязательные mallctl background_thread / max_background_threads отсутствуют; теперь проверка пропускается, если эти mallctl недоступны, а getValue больше не оставляет выходное значение неинициализированным при сбое. Закрывает #102183. #104330 (SAYON DEEP).
- Исправлена регрессия, из-за которой
SELECT запросы с max_rows_to_read_leaf и read_overflow_mode_leaf = 'throw' могли ошибочно выдавать TOO_MANY_ROWS, даже если индекс пропуска данных уменьшал объём чтения ниже leaf-лимита. Симметричные настройки не на уровне leaf (max_rows_to_read / read_overflow_mode) уже обрабатывались корректно. #104331 (Groene AI).
toUUID, toUUIDOrNull, toUUIDOrZero, toUUIDOrDefault, CAST к UUID и Nullable(UUID), accurateCastOrNull к UUID, а также входные форматы, которые разбирают UUID из текста (Avro, MsgPack, JSONExtract, …), теперь отклоняют строки правильной длины, но содержащие не шестнадцатеричные символы. Ранее такие входные данные молча превращались в поддельный UUID из-за выхода за пределы таблицы поиска шестнадцатеричных цифр; теперь toUUID генерирует CANNOT_PARSE_UUID, а варианты Or* возвращают NULL / нулевой UUID / переданное значение по умолчанию. #104370 (Groene AI).
- Исправлен
Bad cast LOGICAL_ERROR в caseWithExpression (и SQL CASE expr WHEN ... THEN ... ELSE ...), когда супертип только для THEN и супертип для (THEN + ELSE) оказываются в разных хранилищах ColumnDecimal — например, при значениях THEN (UInt16, Int8) и ELSE Decimal(9, 2). Закрывает #104335. #104378 (Groene AI).
- Внутренние сбои, о которых сообщается через
logExceptionBeforeStart (flushes асинхронных вставок, refreshes materialized-view, ошибки разбора, возникающие во внутренних запросах), теперь корректно увеличивают ProfileEvents FailedInternalQuery, FailedInternalSelectQuery и FailedInternalInsertQuery наряду с видимыми пользователю counters FailedQuery, FailedSelectQuery и FailedInsertQuery. Ранее эти внутренние counters оставались равными нулю для сбоев, происходивших до начала выполнения запроса, из-за чего занижался учёт важного класса внутренних сбоев. #104399 (Groene AI).
- Исправлена ошибка
Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}, возникавшая при использовании параметра запроса в настройке base_backup оператора BACKUP или RESTORE (например, BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)). Регрессия появилась в 26.1.5 из-за PR #99205. Закрывает #103324. #104413 (Groene AI).
- Исправлено аварийное завершение сервера при записи в
IcebergLocal/IcebergS3, если после ALTER TABLE ... DROP COLUMN выполняется INSERT с iceberg_metadata_staleness_ms больше нуля. Теперь ALTER инвалидирует локальный кеш файлов метаданных Iceberg, поэтому последующие чтения и записи видят новую схему. #104419 (Groene AI).
- Исправлены
DROP ROLE, DROP USER, DROP SETTINGS PROFILE, DROP ROW POLICY, DROP QUOTA и DROP MASKING POLICY: теперь они удаляют ссылки на удалённую сущность из любых других объектов управления доступом, которые на неё ссылались (например, из списка DEFAULT ROLE пользователя, списка TO профиля настроек или списка grantee у политики строк), и сохраняют очистку на диск. Ранее состояние в памяти выглядело корректным, поскольку SHOW CREATE отфильтровывает неизвестные UUID, но .sql-файлы на диске сохраняли висячие записи ID('<dropped-uuid>'), и ссылки восстанавливались при следующем перезапуске сервера, что приводило к ошибкам ACCESS_ENTITY_NOT_FOUND во время выполнения распределённого запроса. #104427 (Groene AI).
- Исправлено аварийное завершение сервера, вызванное
azureBlobStorage, движком AzureBlobStorage и DeltaLake-on-Azure при использовании строки подключения, в которой URL BlobEndpoint содержит пустой, нечисловой или выходящий за допустимые пределы порт (например, BlobEndpoint=http://host:abc/). Теперь сервер возвращает корректную ошибку BAD_ARGUMENTS вместо аварийного завершения в debug/sanitizer-сборках. #104460 (Groene AI).
- Теперь в качестве имени пользователя в табличных функциях
remote и remoteSecure можно использовать идентификатор без кавычек — так же, как для аргументов базы данных и таблицы. Ранее такой запрос завершался вводящей в заблуждение ошибкой authentication со ссылкой на пользователя default. #104465 (Alexey Milovidov).
- Исправлена
Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N), возникавшая, когда тело SQL user-defined function содержит заключённый в скобки внутренний UNION ALL (например, CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))). #104477 (Groene AI).
- Исправлено поведение
uniqThetaIntersect, при котором функция возвращала мощность первого аргумента вместо 0, когда второй аргумент представляет собой пустое состояние uniqTheta — например, результат uniqThetaMergeStateIf(s, predicate), если предикат исключает все строки. #104529 (Groene AI).
- Исправлено поведение
SHOW TABLES и system.tables, которые молча обрезали список для баз данных DataLakeCatalog, использующих Iceberg REST-каталоги (iceberg-rest, onelake, biglake). Когда сервер каталога разбивал на страницы ответ list-tables или list-namespaces (например, в Microsoft Fabric / OneLake при более чем ~50 таблицах на пространство имен), таблицы на последующих страницах оставались незаметно невидимыми для SHOW TABLES и system.tables, хотя к ним можно было обращаться через прямой SELECT. RestCatalog теперь обрабатывает токен продолжения next-page-token, определённый спецификацией Iceberg REST OpenAPI, как это уже делают PaimonRestCatalog и UnityCatalog. #104531 (Groene AI).
- Табличная функция
input теперь выводит свою структуру из окружающего предложения FORMAT запроса INSERT, когда этот формат имеет фиксированную схему (LineAsString, RawBLOB, JSONAsString и т. д.), поэтому пользователям больше не нужно повторно задавать структуру как input('line String') для этих форматов. #104532. #104533 (Groene AI).
- Обновлён тип данных полей в истории Iceberg с
Int32 на Int64. Закрывает #94176. #104579 (Smita Kulkarni).
- Исправлен
Inconsistent AST formatting LOGICAL_ERROR при разборе вызова функции, где после запятой следует лямбда, например SELECT substring(x, `x` -> `x`). Ранее парсер молча объединял предыдущие аргументы с левой частью лямбды, из-за чего получался вызов с одним аргументом, который уже нельзя было повторно разобрать в то же AST. Теперь сохраняется исходная арность функции. #104626 (Groene AI).
CHECK TABLE t теперь отдаёт предпочтение TEMPORARY таблице перед постоянной таблицей с тем же именем, если не указан квалификатор базы данных, что соответствует приоритету, уже используемому в SHOW CREATE TABLE, DESCRIBE TABLE, OPTIMIZE TABLE и ALTER TABLE. Ранее CHECK TABLE t полностью игнорировал временные таблицы, поэтому завершался с UNKNOWN_TABLE для временной таблицы Log или File, хотя эти движки поддерживают CHECK. Продолжение #100966. #104637 (Groene AI).
- Исправлены завершение работы Keeper и цикл перезапуска, возникавшие, когда
get /keeper/availability_zone отправляется с quorum_reads=true в Keeper без настроенного <placement>. #104663 (myeongjun).
- Исправлена TOCTOU data race в
FutureSetFromTuple::buildOrderedSetInplace, приводившая к logical error. #104673 (Miсhael Stetsyuk).
- Исправлено несколько функций, которые возвращали разные результаты для одного и того же входного значения в зависимости от того, передавались ли аргументы как столбцы или как константы:
bitRotateLeft / bitRotateRight (граничные значения сдвига), length(FixedString) / concatWithSeparator с входами LowCardinality(Nullable), roundDown для NaN и rightUTF8 для некорректного UTF-8. #104710 (Raúl Marín).
- Исправлено поведение
anyHeavy, которая возвращала не-heavy значение, когда наиболее частым значением было значение столбца по умолчанию, а данные находились в нескольких частях MergeTree (путь чтения разреженных столбцов). #104712 (Raúl Marín).
- Исправлено несколько дефектов в обработке ограничений настроек: ограничения
MergeTreeSettings, объявленные для канонического имени настройки, можно было обойти, записав значение через псевдоним этой настройки; проверка ограничения disallowed_values выбрасывала исключение на путях clamp (вторичные запросы, воркеры предложения ON CLUSTER, представления SQL SECURITY DEFINER) вместо того, чтобы молча отбрасывать изменение. #104737 (Raúl Marín).
- Исправлено исключение
LOGICAL_ERROR (Metadata is not initialized), возникавшее при OPTIMIZE TABLE, ALTER TABLE ... DELETE, ALTER TABLE ... ADD COLUMN и других вариантах ALTER для лениво attached-таблиц Iceberg / IcebergLocal / DeltaLake / Hudi, чьи metadata еще не были загружены (обычно после перезапуска сервера или после предыдущей неудачной записи metadata, оставившей на диске поврежденный файл metadata). Теперь операция либо выполняется нормально, если metadata успешно загружаются, либо показывает исходную ошибку загрузки как обычное пользовательское исключение вместо аварийного завершения сервера в отладочных сборках или сборках с sanitizer. #104738 (Groene AI).
- Исправлен segfault из-за use-after-free в
AvroConfluentRowInputFormat. #104751 (Miсhael Stetsyuk).
- Скалярные варианты
numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, numericIndexedVectorPointwiseEqual и numericIndexedVectorPointwiseNotEqual теперь выдают INCORRECT_DATA, если вызываются со скаляром UInt64, превышающим Int64::max. #104784 (FriendLey).
- Исправлена ошибка, из-за которой ручное переопределение настройки через имя её псевдонима (например,
SET enable_analyzer = 1 вместо SET allow_experimental_analyzer = 1) после применения настройки compatibility могло быть отменено последующим изменением настройки compatibility. #104829 (Raúl Marín).
- Исправлена проблема, из-за которой AWS logger отключался после https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d. #104837 (Konstantin Bogdanov).
- Исправлены ещё три функции, возвращавшие разные результаты для одного и того же входного значения в зависимости от того, передавались ли argument как столбцы или как константы:
transform (и caseWithExpression через неё) с константным значением по умолчанию Date/Date32/Enum/FixedString, операторы сравнения между String и константным FixedString, а также if/ifNull/nullIf с веткой FixedString при константном условии. #104858 (Raúl Marín).
- Исправлено аварийное завершение сервера
Bad cast from type DB::ColumnConst to DB::ColumnNullable во время partition pruning для таблиц MergeTree, когда выражение партиционирования содержит chain функций, сворачивающуюся в одно константное значение (например, floor(NULL, toRelativeYearNum(...))). #104861 (Groene AI).
- Исправлена data race, обнаруженная
ThreadSanitizer, в конструкторе копирования ContextData: table_function_results копировался из исходного объекта без захвата table_function_results_mutex, поэтому конкурентная запись в Context::executeTableFunction могла пересечься с несинхронизированным чтением в конструкторе копирования. #104879 (Groene AI).
- Исправлены проверки согласованности data part для типов с динамической структурой и добавлено обнаружение повреждённых columns_substreams.txt. Повторная отправка https://github.com/ClickHouse/ClickHouse/pull/103858 с дополнительными изменениями. #104888 (Pavel Kruglov).
- Исправлена гонка между DROP и UNDROP в DatabaseCatalog. #104915 (Azat Khuzhin).
- Исправлено динамическое изменение размера файлового кэша при наличии частично загруженных сегментов, включая восстановление учёта после неудачного вытеснения. #104921 (Antonio Andelic).
DETACH TABLE для временной таблицы (без ключевого слова TEMPORARY) теперь корректно вызывает SYNTAX_ERROR, что соответствует поведению DETACH TEMPORARY TABLE. Ранее команда молча устанавливала внутренний флаг is_detached и завершалась без ошибки. Чтобы удалить временную таблицу, используйте DROP TEMPORARY TABLE или DROP TABLE (последняя команда разрешает временную таблицу через Context::ResolveExternal). Закрывает #103475. #104943 (Groene AI).
- Исправлено поведение table function
filesystem: теперь она учитывает max_memory_usage / max_server_memory_usage при загрузке содержимого файла. Ранее крупные или многочисленные параллельные чтения содержимого могли превышать лимит без MEMORY_LIMIT_EXCEEDED и в итоге завершаться из-за OOM. #104956 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR, возникавший при фильтрации system.detached_tables по uuid (например, SELECT count() FROM system.detached_tables WHERE uuid = '...'). Теперь запрос возвращает ожидаемый результат вместо аварийного завершения сервера. #104979 (Groene AI).
flattenTuple больше не вызывает LOGICAL_ERROR, если его применить к кортежу, чья вложенная структура содержит только пустые листья Tuple() (например, Tuple(c0 Array(Tuple())) или Tuple(c0 Tuple())). Теперь такие входные данные приводят к пользовательскому исключению ILLEGAL_TYPE_OF_ARGUMENT, поясняющему, что результат разворачивания был бы пустым кортежем. #104989 (Groene AI).
- Исправлены аварийное завершение сервера и ошибка, из-за которой запрос мог молча возвращать неверный результат, при выполнении
loop(remote(...)) (или любого loop(), оборачивающего хранилище, которое может откладывать aggregation) с GROUP BY. Ранее внешний planner добавлял MergingAggregatedStep на основе этапа processing, сообщаемого внутренним хранилищем, но LoopSource всегда materialize свой внутренний select с QueryProcessingStage::Complete и выдаёт обычные фрагменты столбцов, поэтому MergingAggregatedTransform приводил к LOGICAL_ERROR (Chunk info was not set for chunk in MergingAggregatedTransform) при enable_parallel_replicas = 1, а в остальных случаях молча отбрасывал внешнюю агрегацию. #105001 (Groene AI).
clickhouse-benchmark --reconnect (без значения) был непреднамеренно сломан в 25.4 изменением, которое превратило --reconnect в целочисленную опцию, требующую значения. Теперь форма без значения снова работает и эквивалентна --reconnect=1 (переподключение для каждого запроса). #105006 (Groene AI).
- Исправлен некорректный JSON-вывод для имён столбцов, оканчивающихся неполными последовательностями UTF-8. #105012 (Pablo Marcos).
- Исправлена незаметная потеря данных после
EXCHANGE TABLES или CREATE OR REPLACE TABLE для исходной таблицы materialized view. Ребро зависимости между исходной таблицей и представлением для MV теперь сохраняется за исходным именем, поэтому оно продолжает срабатывать при вставках. Регрессия была внесена в #98779; восстановлено поведение, существовавшее до неё. #105029 (Sema Checherinda).
- Исправлена ошибка
CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti при JIT-компиляции выражений, преобразующих Float в UInt128, например toUInt128(<Float64 expression>). В резолвере символов JIT отсутствовали builtin-функции compiler-rt для преобразования беззнаковых 128-битных чисел с плавающей точкой в целые. Закрывает #105031. #105048 (Raúl Marín).
- Исправлено поведение, при котором
clickhouse-local не выводил сообщение лога из завершившегося ошибкой запроса, если задан send_logs_level. #105067 (Alexey Milovidov).
- Исправлены некорректные результаты, когда один и тот же parameterized view использовался в одном запросе более одного раза с разными значениями аргументов. Ранее анализатор схлопывал такие вызовы в один, молча отбрасывая все фильтры, кроме первого. #105170 (Alexey Milovidov).
- Исправлено поведение, при котором строка
TOTALS дважды отображалась внизу таблицы результатов в веб-интерфейсе play.html. #103803 (Alexey Milovidov).
- Теперь при векторном поиске отклоняются неконечные векторы (
NaN, ±Inf) — как искомые, так и опорные; ранее они приводили к неопределённому поведению в usearch. #104079 (Groene AI).
- PromQL: исправлен оператор агрегации для пустых векторов. #104425 (Vitaly Baranov).
- PromQL: исправлена обработка ошибок в API запросов Prometheus. #104741 (Vitaly Baranov).
- Исправлена race condition в
MergeTreeTransaction::afterCommit: после потери соединения между записью CSN коммита в ZooKeeper и завершением транзакции ответ COMMIT мог дойти до клиента раньше, чем новые creation_csn / removal_csn становились видимыми в system.parts. #104708 (Tuan Pham Anh).
- Исправлен экспоненциальный рост потребления оперативной памяти в парсере KQL при преобразовании вложенной индексации массивов (
arr[arr[arr[...]]]). #105142 (Alexey Milovidov).
- Исправлены некорректные результаты для
RIGHT ANY JOIN, когда в правой таблице одному ключу соответствовало несколько строк, а выходной block разбивался из-за ограничений по размеру. Закрывает #99431. #102064 (Vladimir Cherkasov).
- Добавлена проверка на переполнение стека в
Avro reader при десериализации вложенных типов. #102417 (Pavel Kruglov).
- Исправлены дублирующиеся строки в
system.completions для настроек MergeTree: каждое имя настройки появлялось дважды, потому что выгружались и getMergeTreeSettings, и getReplicatedMergeTreeSettings, хотя имена настроек у них совпадают. Закрывает #102013. #102015 (Groene AI).
- Исправлено блокирование завершения работы
StorageObjectStorageQueue (S3Queue, AzureQueue) до тех пор, пока частично обработанные файлы не будут полностью прочитаны из Объектного хранилища. Теперь источник немедленно прерывает чтение при завершении работы; дедупликация гарантирует, что строки, уже переданные в целевую таблицу до завершения, не будут дублироваться при повторной обработке файла при следующем запуске. #103126 (Tuan Pham Anh).
- Исправлена вставка нескольких блоков в движок таблицы
Alias с insert_deduplication_token, чтобы сохранялись все блоки. #103246 (Enric Calabuig).
- Исправлено поведение
JSONHas и JSONExtractBool для нативных столбцов JSON, которые возвращали извлечённое значение (приведённое к UInt8) вместо 0/1. #103313 (zxuhan7).
- Входной формат
CustomSeparated защищён от некорректных или злонамеренных данных, в которых отсутствует format_custom_row_after_delimiter. Обнаружение заголовка, вывод схемы и строки с переменным числом столбцов ранее без ограничений накапливали поля и могли выделить много гигабайт памяти до сбоя. Теперь чтение завершается с INCORRECT_DATA, если одна строка содержит более 1,000,000 полей. #103404 (Groene AI).
- Исправлен
RESTORE реплицируемых таблиц MergeTree, чтобы при Attach восстановленных частей использовался backup_restore_keeper_max_retries вместо обычного бюджета повторных попыток Keeper для вставки. #104610 (Pablo Marcos).
- Исправлены неверные результаты для
WHERE p AND <LowCardinality(Nullable(int)) constant> в таблицах MergeTree. Ранее такие запросы возвращали ноль строк, потому что оптимизация part pruning выводила значение NULL по умолчанию из типа LowCardinality(Nullable(...)) и синтезировала защитное условие notEquals(x, NULL), отсекая каждую часть. #104767 (Groene AI).
- Исправлен некорректный результат агрегации при группировке по неинъективной функции столбца, который также является ключом партиционирования (например,
PARTITION BY a с GROUP BY intDiv(a, 2) или a % 2). Значения из разных партиций, попадавшие в одну и ту же группу, не сливались, что приводило к дублирующимся строкам групп при allow_aggregate_partitions_independently = 1. #104869 (Nihal Z. Miaji).
- Исправлена гонка при передаче снимка
Keeper, из-за которой снимок мог быть удалён или перемещён в момент его отправки восстанавливающемуся follower. #104941 (Antonio Andelic).
- Исправлена скрытая ошибка с неверным результатом в
hilbertEncode и mortonEncode, при которой неконстантный первый аргумент Tuple (маска диапазона) использовал значения из строки 0’ для вычисления сдвига битов во всех строках. Теперь функции вычисляют значения маски для каждой строки, поэтому результат больше не зависит ни от того, является ли входное значение константным, ни от размера блока. #104992 (Groene AI).
- Исправлено, что
clickhouse-local молча игнорировал пользовательскую конфигурацию (profiles, users, quotas, настройки управления доступом), когда конфигурационный файл автоматически обнаруживался по путям ./clickhouse-local.xml, ~/.clickhouse-local/config.xml или /etc/clickhouse-local/config.xml. Ранее эти настройки применялись только при передаче --config-file или если ./config.xml существовал в текущем каталоге; теперь все пути обнаружения ведут себя согласованно. #105008 (Groene AI).
- Исправлена проблема, из-за которой столбцы
BFloat16 при сравнении со строковым литералом молча возвращали ноль совпадений (например, WHERE bf16_col = '49.9'). #105042 (Raúl Marín).
- Исправлена обработка
CLEAR COLUMN и TTL во время слияний в SummingMergeTree, AggregatingMergeTree и CoalescingMergeTree, когда столбцы, необходимые для слияния, отсутствуют или срок их TTL истёк. Закрывает #101953. #105203 (Antonio Andelic).
- Исправлена гонка между
DNSCacheUpdater::run и Context::reloadClusterConfig: перед разыменованием shared->clusters_config добавлена явная проверка на null. #105220 (Mikhail f. Shiryaev).
- Исправлен
best_effort-парсинг даты и времени для toDateTime64 с точностью ms и ns. #105233 (Kaviraj Kanagaraj).
- Исправлено поведение
OSIOWaitMicroseconds, который сообщал о времени ожидания I/O за весь срок жизни потока, а не в рамках отдельного запроса. #105246 (Mikhail f. Shiryaev).
- Движок таблицы
Hudi теперь выдаёт INCORRECT_DATA (обычное исключение уровня запроса) вместо LOGICAL_ERROR, если файл Parquet в каталоге таблицы не соответствует соглашению об именовании Hudi [FileId]_[FileWriteToken]_[Timestamp].[extension]. Раньше такие имена файлов вызывали исключение в debug-сборках. #105266 (Groene AI).
- Исправлена взаимная блокировка в
ParallelFormattingOutputFormat при сбое планирования: когда scheduleFormatterThreadForUnitWithNumber генерирует исключение (например, CANNOT_SCHEDULE_TASK), элемент оставался в состоянии READY_TO_FORMAT без потока-форматтера для его обработки, что приводило к зависанию. Теперь вызов планирования обёрнут в try/catch, а любой сбой передаётся через onBackgroundException, чтобы коллектор завершался корректно. #105275 (Azat Khuzhin).
- Исправлена незаметная потеря данных в
Distributed async inserts при восстановлении после аварийного завершения: если последний файл .bin в сохранённом батче был целым, а один из файлов в середине — повреждённым, DistributedAsyncInsertBatch::recoverBatch проверял только заголовок последнего файла, после чего sendBatch помечал весь батч — включая неповреждённые файлы — как повреждённый, из-за чего терялись их строки. Теперь заголовок каждого файла проверяется отдельно, поэтому в broken/ перемещается только действительно повреждённый файл, а уцелевшие строки доходят до удалённого сегмента. #105281 (Groene AI).
- Исправлена регрессия в
clickhouse extract-from-config --try: когда конфигурация использовала атрибуты from_env и не содержала элемента include_from (или содержала его, но он указывал на отсутствующий файл), все подстановки from_env молча отбрасывались и возвращались как пустые строки. Это ломало определение порта в Docker entrypoint в 26.2.5. Закрывает #101704. #105283 (Groene AI).
- Исправлена ошибка
INSERT INTO в таблицу SQLite, из-за которой при вставке значения типа Enum, JSON или AggregateFunction, чьё текстовое представление содержало одинарную кавычку, возникала синтаксическая ошибка SQLite. Настройка output_format_values_escape_quote_with_quote теперь учитывается соответствующими сериализациями (раньше это работало только для String и FixedString). #105285 (Groene AI).
- Исправлена ошибка
Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists, возникавшая в распределённых запросах с allow_push_predicate_ast_for_distributed_subqueries = 1 (по умолчанию), когда кортеж GLOBAL IN сопоставлялся с подзапросом, в проекции которого есть дублирующиеся имена столбцов, например (x, y) GLOBAL IN (SELECT number, number FROM numbers(5)). #105290 (Groene AI).
- Исправлено поведение
reinterpret для Array(LowCardinality(...)): раньше во время выполнения возвращалась вводящая в заблуждение ошибка NOT_IMPLEMENTED, а теперь при проверке типов возвращается ILLEGAL_TYPE_OF_ARGUMENT. #105301 (Raúl Marín).
minMap/maxMap (форма с массивом) и minMappedArrays/maxMappedArrays теперь обрабатывают NaN согласованно с ORDER BY: NaN считается последним (возвращается только если все значения — NaN). Раньше результаты зависели от позиции NaN в данных из-за семантики неупорядоченного сравнения IEEE 754 и расходились с формой Map-аргумента у minMap/maxMap, которая была исправлена в #100448. #105331 (Raúl Marín).
- Исправлена утечка памяти в кэше
ColumnsDescription на уровне таблицы для таблиц семейства MergeTree со столбцами Nested. Записи никогда не вытеснялись при циклах ALTER ADD COLUMN/DROP COLUMN, когда share_nested_offsets = 1 (по умолчанию). #105376 (Groene AI).
- Исправлено исключение
BAD_ARGUMENTS “It’s a bug! Only integer types are supported by __bitWrapperFunc”, возникавшее, когда в SELECT с индексом пропуска данных TYPE set(N) атом в WHERE имел тип результата Float, BFloat16 или любой другой нецелочисленный тип (например, WHERE c0 + 0.1 или WHERE log(c0)). В этом случае индекс пропуска данных теперь переключается на обычный путь фильтрации. #105384 (Groene AI).
Улучшения сборки/тестирования/упаковки
- Прекращено использование системных библиотек и заголовочных файлов
compiler-rt. Закрывает #91475. #102857 (Konstantin Bogdanov).
- Обновлён базовый distroless-образ Docker для устранения CVE OpenSSL в
libssl3t64. #103583 (Rahul Nair).
- Во время выпусков GPG-ключ теперь надёжно получается через цепочку из нескольких серверов ключей Ubuntu вместо ожидания тайм-аута на
keyserver.ubuntu.com. #103834 (Mikhail f. Shiryaev).
- Удалены и запрещены проверки
CMake на этапе сборки (check_*, try_compile, try_run). Компилятор и набор инструментов фиксированы, поэтому определение возможностей на этапе конфигурации не требуется и теперь заблокировано на уровне всего проекта; любое поведение, зависящее от версии, должно явно ограничиваться через CMAKE_CXX_COMPILER_VERSION. #103980 (Alexey Milovidov).
libarchive обновлён с 3.8.6 до 3.8.7. #104047 (Robert Schulze).
mongo-c-driver обновлён до 2.3.0. #104300 (Raúl Marín).
- Обновлены зависимости LLVM для 22.x. #104381 (Joshua Carp).
- Обеспечена сборка классов embedded-client и дескриптора PTY на macOS и FreeBSD за счёт использования переносимых POSIX-функций
posix_openpt / grantpt / unlockpt и удаления специфичных для Linux защитных конструкций #if. #104436 (Alexey Milovidov).
librdkafka обновлён до версии 2.14.1. #105222 (János Benjamin Antal).
Обратно несовместимое изменение
- Оператор
IN теперь использует семантику точного соответствия значений для типа Bool: значениям Bool соответствуют только 0 и 1 в наборе. Ранее числовые значения больше 255 в наборе IN при сравнении с Bool ошибочно приводились к true, поэтому SELECT CAST(1, 'Bool') IN (256) возвращал 1. Теперь он корректно возвращает 0. Закрывает #92980. #93115 (Ashrith Bandla).
- Библиотека H3 обновлена до v4, что повышает точность вычисления длины, площади и других метрик. Это обратно несовместимое изменение, поскольку новые результаты отличаются от прежних. #100348 (Alexey Milovidov).
- Теперь запрещено использовать
SELECT как некавыченный идентификатор в элементе списка выражений WITH. #101059 (Aruj Bansal).
- Этот патч меняет то, как таблица Merge обрабатывает виртуальные столбцы. Если базовая таблица содержит
_table или _database, эти столбцы будут считываться из хранилища; в противном случае они будут заполняться после этапа чтения на шаге expression. #101742 (Mikhail Artemenko).
- Оператор
IN теперь также отклоняет преобразования Decimal с потерей точности внутри составных типов (Tuple, Array, Map), что делает его поведение согласованным со скалярными сравнениями верхнего уровня. Ранее проверки точности применялись только к скалярным значениям верхнего уровня: например, CAST('33.3', 'Decimal64(1)') IN (33.33) корректно возвращал 0, но CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) ошибочно возвращал 1, поскольку преобразование с потерей точности происходило внутри Array. Теперь в обоих случаях корректно возвращается 0. #101812 (Nihal Z. Miaji).
- Значения по умолчанию для
http_max_fields уменьшены с 1,000,000 до 1,000, а для http_max_field_name_size — со 128 KB до 4 KB, чтобы ограничить использование памяти HTTP-соединениями до аутентификации. Добавлены настройки http_max_request_header_size и http_headers_read_timeout. Пользователи, которым нужны прежние более высокие лимиты, могут восстановить их через настройки. #103285 (Sema Checherinda).
- Добавлен автоматический сброс на диск для
hash JOIN и параллельного hash JOIN: при достижении лимита памяти они преобразуются в grace hash JOIN. Это поведение управляется параметром max_bytes_before_external_join. #97813 (János Benjamin Antal).
- Добавлена поддержка Arrow Flight SQL. #91170 (Yakov Olkhovskiy).
- Добавлена поддержка инкрементального чтения для движков таблиц
Paimon с отслеживанием прогресса снимков в Keeper, включая выборочное чтение дельты снимка через paimon_target_snapshot_id, а также расширено покрытие тестами для сопоставления типов, отсечения партиций и сценариев инкрементального чтения. #93655 (XiaoBinMu).
- Функция
stem теперь больше не экспериментальная (раньше нужно было включить настройку allow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). Теперь с помощью функции stem можно легко выполнять стемминг всех слов/токенов в столбцах типов String, FixedString, Array([Fixed]String), Nullable, LowCardinality и Const. #99137 (Jimmy Aguilar Mena).
- Реализовано новое поведение
max_insert_block_size_rows, max_insert_block_size_bytes, min_insert_block_size_rows, min_insert_block_size_bytes в процессе squashing в рамках настройки совместимости use_strict_insert_block_limits. #94207 (Kirill Kopnev).
- Добавлена функция
arrayAutocorrelation(arr [, max_lag]), вычисляющая нормализованную автокорреляцию числового массива для каждого лага. Поддерживаются массивы целочисленных типов, типов с плавающей точкой и Decimal. #94776 (Wenyu Chen).
- SQL-функция
obfuscateQuery. Закрывает #98010. #98305 (Xuewei Wang).
- Добавлена поддержка типов Map и JSON/Object в атрибутах словаря. Теперь словари могут хранить и возвращать сложные типы, включая Map(String, String), Map(String, Array(String)), JSON и Nullable(JSON), в структурах FLAT и HASHED. #98627 (yanglongwei).
- Добавлены две новые настройки MergeTree —
replicated_fetches_min_part_level и replicated_fetches_min_part_level_timeout_seconds, которые позволяют репликам пропускать загрузку недавно вставленных (не слитых) частей с других реплик, снижая накладные расходы на репликацию при интенсивной ингестии. #98625 (tanner-bruce).
- Добавлена поддержка индекса пропуска данных MergeTree для JSON-столбцов с использованием JSONAllPaths и типов индексов bloom_filter, tokenbf_v1, ngrambf_v1 и text (inverted), что позволяет пропускать гранулы на основе набора JSON-путей, присутствующих в каждой грануле. #98886 (Pavel Kruglov).
- Функция
printf теперь поддерживает неконстантные строки формата, что позволяет задавать разные шаблоны формата для каждой строки в зависимости от значений столбцов. #98991 (Yash ).
- Добавлен новый индекс-проекция
commit_order, переупорядочивающий данные в порядке вставки. #99004 (Mikhail Artemenko).
- Добавлена функция
highlight, которая оборачивает вхождения искомых терминов в текстовой строке в HTML-теги (по умолчанию <em>/</em>). Поддерживает ASCII-сопоставление без учёта регистра, автоматическое слияние перекрывающихся совпадений и пользовательские открывающие/закрывающие теги. #99131 (Peng).
- Реализованы квоты по хешу нормализованного запроса для защиты публичных сервисов ClickHouse от злоупотреблений. 1. Добавлена поддержка
NORMALIZED_QUERY_HASH в качестве типа ключа квоты — для каждого уникального нормализованного запроса создается отдельный бакет квоты, поэтому CREATE QUOTA q KEYED BY normalized_query_hash отслеживает каждый уникальный запрос независимо. 2. Добавлена поддержка QUERIES_PER_NORMALIZED_HASH в качестве типа ресурса квоты — ограничивает максимальное число выполнений любого отдельного нормализованного запроса в пределах интервала, поэтому MAX queries_per_normalized_hash = 100 не позволяет одному шаблону запроса выполняться более 100 раз. #99586 (Alexey Milovidov).
- Теперь пользователи могут писать JOIN-запросы с использованием синтаксиса
NATURAL JOIN, который автоматически выполняет сопоставление по всем столбцам с одинаковыми именами и устраняет дубликаты этих столбцов в результате. #99840 (Peter Nguyen).
- Добавлена поддержка
SET TIME ZONE 'tz' в качестве псевдонима для SET session_timezone. #99883 (phulv94).
- Добавлена поддержка параметризованных запросов в веб-интерфейсе (
play.html): параметры запроса вида {name:Type} распознаются, и для ввода их значений отображаются соответствующие поля. #100041 (Alexey Milovidov).
- Поддержка стандартного предложения SQL
VALUES как табличного выражения в FROM, например: SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72).
- В оператор
EXTRACT добавлены единицы, совместимые с PostgreSQL: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE, MILLENNIUM. Также исправлен EXTRACT(WEEK FROM date), который ранее выдавал ошибку. #100274 (Alexey Milovidov).
- Добавлена поддержка составных литералов Interval по стандарту SQL с квалификаторами диапазона
TO, например INTERVAL '1:30' HOUR TO MINUTE. Внутри они раскладываются в суммы интервалов. #100453 (Desel72).
- Добавлены асинхронные метрики памяти в буферах приёма и передачи TCP ядра (
sk_rmem_alloc, sk_wmem_alloc) для сокетов пула HTTP-соединений, представляемые в виде процентилей p50/p75/p90/p95 и суммарных значений по каждой группе соединений. #100575 (Sema Checherinda).
- Добавлен веб-интерфейс jemalloc для просмотра данных профилирования ClickHouse Keeper, доступный по адресу
/jemalloc на порту управления по HTTP. #100606 (murphy-4o).
- Добавлена команда
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x' для режимов ordered и unordered. #100709 (Bharat Nallan).
- Добавлена функция
JSONAllValues, которая возвращает все значения из столбца JSON как Array(String); значения сериализуются в текстовое представление и упорядочиваются по именам путей. Добавлена поддержка текстового индекса для выражения JSONAllValues в столбцах JSON. Когда текстовый индекс создаётся для JSONAllValues(json_column), он автоматически используется для фильтрации запросов по подстолбцам JSON (например, json_column.key1 = 'value'). #100730 (Anton Popov).
- Добавляет новую настройку
input_format_column_name_matching_mode, которая позволяет задавать разную чувствительность к регистру для форматов ввода. #99346 (manerone).
- Добавлена команда
watch в clickhouse-keeper-client, а в командах get, exists и ls — поддержка наблюдения. #100834 (Den Kalantaevskii).
- В ClickHouse Keeper добавлены запрос
getChildrenRecursive (ListRecursive) и команда lsr в clickhouse-keeper-client. Это закрывает #99916. #100998 (Konstantin Vedernikov).
- Добавлена новая функция
arrayTranspose, которая принимает двумерный массив (матрицу) и транспонирует его: SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]]). #101214 (Vitaly Baranov).
- У настройки
auto_statistics_types mergetree значение по умолчанию — 'minmax, uniq' — статистики minmax и uniq теперь автоматически создаются для всех подходящих столбцов в новых таблицах - у materialize_statistics_on_insert значение по умолчанию — false — статистика теперь строится во время слияний, а не при вставке, что снижает накладные расходы на вставку. Используйте SET materialize_statistics_on_insert = 1, чтобы восстановить прежнее поведение. #101275 (Han Fei).
- Добавлена настройка
prefer_dependency_replica для обновления цепочек зависимостей materialized view, чтобы сократить потери данных из-за задержки репликации между репликами. #101591 (Seva Potapov).
- Добавлена функция
hasPhrase (псевдоним matchPhrase) для поиска по фразам (непрерывным последовательностям токенов). Поиск выполняется методом полного перебора, то есть текстовый индекс его пока не поддерживает. #101997 (Elmi Ahmadov).
- Добавлены метрики-гистограммы
s3_read_request_duration_microseconds и s3_read_request_bytes, чтобы отслеживать время жизни соединений для запросов S3 GET и объём потребляемых байтов; они доступны в system.histogram_metrics и в конечной точке Prometheus. #102058 (Sema Checherinda).
- Значения
Date и Date32 теперь можно складывать со значениями Time и Time64 с помощью оператора +, получая результат типа DateTime или DateTime64. Например, SELECT toDate('2024-01-15') + toTime('14:30:25') возвращает 2024-01-15 14:30:25. Результат вычисляется с учетом часового пояса сеанса, а результаты, выходящие за допустимый диапазон, обрабатываются в соответствии с настройкой date_time_overflow_behavior. Закрывает #95914. #102421 (Nihal Z. Miaji).
- Текстовый индекс теперь имеет статус GA и остается включенным независимо от настройки
compatibility, что предотвращает его неожиданное отключение при восстановлении из резервных копий или работе в режиме совместимости. #101518 (Nikita Fomichev).
Экспериментальные возможности
- Добавлена команда
ALTER TABLE ... EXECUTE remove_orphan_files для таблиц Iceberg, позволяющая выявлять и удалять файлы без ссылок из Объектного хранилища. #99127 (murphy-4o).
- Добавлена настройка
query_plan_optimize_join_order_randomize, которая случайным образом изменяет статистику, используемую для переупорядочивания JOIN, что полезно для тестирования. #100643 (Vladimir Cherkasov).
- В ClickHouse добавлена поддержка функции ИИ, позволяющая пользователям вызывать конечные точки OpenAI и Anthropic с помощью SQL.
aiGenerate стала первой такой функцией. #100831 (George Larionov).
- Добавлены функции ИИ:
aiClassify, aiExtract и aiTranslate для использования API LLM в ClickHouse. #100832 (George Larionov).
- Добавлена
system.histogram_metric_log — новая системная таблица, которая периодически создает снимки всех гистограммных метрик (например, задержек S3/Azure и длительности этапов обработки запросов Keeper). Кроме того, столбец value таблицы system.histogram_metrics изменен на Float64, так как этот тип более гибок и лучше совместим с моделью данных Prometheus. #103046 (Miсhael Stetsyuk). Структура таблицы, вероятно, изменится в будущих релизах.
- ClickHouse теперь может исключать целые части данных в SELECT-запросах на основе статистики min/max. #94140 (zoomxi).
- Снижена конкуренция за блокировки при операциях только для чтения в таблицах ReplicatedMergeTree с завершёнными мутациями. #95771 (Eduard Karacharov).
- Параметр
optimize_read_in_order теперь учитывается при чтении проекций. Закрывает #89453. #95885 (Andrey Zvonov).
- Небольшие улучшения в Hash JOIN и параллельном хеш-соединении. #96663 (Yarik Briukhovetskyi).
- Оптимизировано преобразование
DISTINCT за счёт отключения оптимизации для столбцов LowCardinality, если входные данные почти полностью состоят из уникальных значений. #97113 (Nihal Z. Miaji).
- Оптимизация производительности запросов
LIKE из #97723. Теперь эти запросы могут использовать текстовые индексы. #98149 (Elmi Ahmadov).
- Векторизованные математические функции (
exp, log, sigmoid, tanh) теперь работают быстрее на AArch64 (с использованием NEON/SVE), а также на FreeBSD/Darwin, где раньше использовалась более медленная скалярная реализация. #98230 (Raúl Marín).
- В запросах, фильтрующих по столбцам первичного ключа
MergeTree с помощью regexp-альтернаций из строковых литералов, таких как ^(abc-1|abc-2), теперь можно использовать отсечение по первичному ключу, если альтернативы имеют общий префикс. #98988 (Yash ).
- Динамическая фильтрация top-k для
ORDER BY ... LIMIT обобщена и теперь поддерживает типы Nullable, String и COLLATE. #99033 (murphy-4o).
- Ускорен hash JOIN по ключам
Int32 и Int64 с небольшим диапазоном благодаря использованию хеш-таблицы с прямой индексацией. #99275 (Hechem Selmi).
- Более быстрые несмежные запросы к столбцам
LowCardinality с одним словарём. #99285 (Ivan Babrou).
- Ускорены функции
var*Stable и stddev*Stable для столбцов Float64 благодаря девиртуализации внутреннего цикла. Примечание: это позволяет задействовать оптимизации компилятора (FMA/регистры), которые изменяют результаты вычислений с плавающей запятой на уровне ULP. #99460 (Riyane El Qoqui).
- Используется оптимизированное кодирование Firedancer base58 для входных данных размером 32/64 байта (автоматически для
base58Encode). Также можно использовать оптимизированное декодирование base58, если результат декодирования имеет размер 32/64 байта (явно через base58Decode('...', 32) или аналогичным образом). #99461 (Joanna Hulboj).
- Включены оптимизации на основе секций компоновщика (
-ffunction-sections, -fdata-sections, --icf=all) для уменьшения размера бинарного файла и более эффективного использования кэша инструкций. #99474 (Alexey Milovidov).
- Исправлено ухудшение масштабируемости для коротких запросов с агрегацией на машинах с большим числом ядер. Когда запрос читает мало marks, конвейер после агрегации больше не разрастается до
max_threads, что позволяет избежать накладных расходов из-за почти пустых потоков. #99493 (Alexey Milovidov).
- Повышена производительность запросов с параллельными репликами за счёт правильного выбора размера задачи чтения. #99801 (Nikita Taranov).
- Разрешена предзагрузка при чтении удалённого файла через кэш страниц в пространстве пользователя. #99919 (Alexey Milovidov).
- Устранено лишнее вычисление подстолбца String
.size при перечислении подстолбцов. #99941 (Pavel Kruglov).
- Сделали индикатор прогресса в clickhouse-client более плавным при работе из отеля с кластерами с очень большим количеством реплик. #100145 (Alexey Milovidov).
- Запускается
MemoryWorker в clickhouse-local, когда включен кэш страниц, чтобы кэш страниц в пространстве пользователя действительно мог использоваться. #100306 (Alexey Milovidov).
- Оптимизировано выполнение запросов за счёт переноса условия
LIMIT внутрь UNION ALL. #100364 (Alexey Milovidov).
- Добавлена поддержка JIT-компиляции для сравнений столбцов
String и FixedString в ORDER BY, что повышает производительность сортировки на фазе merge на 6–17% для ключей сортировки, в которых преобладают строковые столбцы. В соавторстве с @lgbo-ustc. #100577 (Raúl Marín).
- Когда
read_in_order_use_virtual_row включен вместе с новой настройкой read_in_order_use_virtual_row_per_block, информация о границах виртуальных строк теперь выдается после чтения каждого блока из MergeTree, что позволяет механизму слияния на лету перераспределять приоритеты источников для частей, данные которых полностью отфильтровываются условиями WHERE/PREWHERE/JOIN. Закрывает #99945. #100603 (Vladimir Cherkasov).
- Ускорено преобразование Float в String для больших целочисленных значений за счёт расширения быстрого пути
itoa с помощью совместимого с dragonbox округления. #100649 (Raúl Marín).
- Заменили
dragonbox на zmij, что ускорило преобразование Float-to-String в 1,5–3 раза. #100650 (Raúl Marín).
- Ускорено преобразование
Int128/UInt128 в строку за счёт замены программного деления на редукцию Барретта и разворачивания цикла преобразования. #100671 (Raúl Marín).
- Предотвращено создание лишних потоков при параллельном
merge в uniqExact. #100686 (Jiebin Sun).
- Для
uniqExact добавлено параллельное слияние батчей. #100687 (Jiebin Sun).
- Улучшена распараллелизация запросов с простыми представлениями на базе таблицы
MergeTree, выполняемых в режиме параллельных реплик. #100815 (Igor Nikonov).
- Добавлена поддержка параллельных реплик для простых представлений (включая подходящие представления
UNION ALL над таблицами MergeTree) при parallel_replicas_allow_view_over_mergetree=1. Это позволяет распараллеливать внешний запрос представления вместо внутреннего, что повышает степень распараллеливания запросов между узлами. #100958 (Igor Nikonov).
- Оптимизировано чтение в порядке первичного ключа для
full_sorting_merge при наличии в плане запроса фильтров с IN. #101261 (Nikita Taranov).
- Оптимизация операций выделения/освобождения памяти за счёт кэширования настроек сэмплирования вместо обхода всей иерархии трекера памяти. #101267 (Azat Khuzhin).
- Исправлена значительная регрессия производительности INSERT при
deduplicate_insert = 'enable' (по умолчанию с версии 26.2): вычисление хеша данных перенесено с этапа squashing в sink, а для хеширования столбцов батча используется updateHashWithValueRange, что сокращает накладные расходы примерно с 2,5 с до 0,5 с для 5 млн строк и 22 столбцов. #101494 (Sema Checherinda).
- Снизили накладные расходы на профилирование блокировок, используя
try_lock, чтобы не замерять время захватов без конкуренции, и убрали измерение времени удержания. #101502 (Antonio Andelic).
- Реализована замена написанных вручную AVX-512 intrinsic-функций в
arrayDotProduct на платформонезависимые автоматически векторизуемые циклы, с добавлением поддержки AVX2 и ARM NEON. #101571 (Peng).
- Повышена производительность
INSERT VALUES для столбцов Map, Array и Tuple, когда значения передаются как экранированные строки (например, '{\'key\':1}'), что позволяет избежать ненужного переключения на парсер SQL-выражений. #102119 (Joanna Hulboj).
- Исправлено чрезмерное использование CPU движком таблицы
RabbitMQ. #102711 (Jaap Elst).
- Оптимизатор порядка JOIN теперь выводит транзитивные предикаты экви-соединения из существующих условий JOIN. Например, для
A.x = B.x AND B.x = C.x распознаётся эквивалентность A.x = C.x, что позволяет оптимизатору рассматривать Direct JOIN между таблицами, связанными транзитивно. Это может улучшить качество плана выполнения для схем «звезда» и «снежинка», где таблицы измерений соединяются через общую таблицу фактов. Эта возможность управляется новой настройкой enable_join_transitive_predicates (по умолчанию отключена). #98479 (Alexander Gololobov).
- Оптимизирован
TRUNCATE DATABASE TABLES LIKE благодаря предварительной параллельной отмене слияний. #98597 (Shaohua Wang).
- Добавлена поддержка монотонности для функции multiply, что позволяет выполнять отсечение данных по первичному ключу для выражений
key * constant. #98983 (Amos Bird).
- Словари cache больше не используют эксклюзивную блокировку в
hasKeys; это уменьшает конкуренцию за блокировки, так как для чтения из cache теперь используется разделяемая блокировка. #100796 (liuguangliang).
- Подзапрос VIEW встроен в дерево запроса, что позволяет применять к VIEW больше оптимизаций. #100830 (Dmitry Novik).
- Ускорена загрузка кэша при запуске сервера. #101500 (Kseniia Sumarokova).
- Реализована отложенная материализация столбцов для ReplacingMergeTree с FINAL при достаточно селективном предикате. #101647 (Nikolai Kochetov).
- Снова включена оптимизация
optimize_rewrite_array_exists_to_has (по умолчанию отключена с версии 23.10). Она преобразует arrayExists(x -> x = elem, arr) в гораздо более быстрый has(arr, elem) и теперь корректно пропускает такое преобразование, если тип элемента массива и elem несовместимы для has (например, Date и String), поэтому запросы, которые раньше ломались, продолжают работать. Закрывает #71431. #100944 (Alexey Milovidov).
- Улучшен вывод EXPLAIN PLAN pretty=1: теперь выводятся выходные столбцы запроса верхнего уровня, показываются метки/обозначения отношений JOIN с оценкой числа результирующих строк и локальности, а также выходные столбцы для каждого шага JOIN/источника. Изменения охватывают часть Information Deficit из #98117. #99462 (Kirill Kopnev).
- Добавлена настройка таблицы семейства MergeTree
share_nested_offsets (по умолчанию true). Если задать false, столбцы типа Array с именами через точку (например, n.a, n.b) будут рассматриваться как независимые столбцы, а не совместно использовать файлы смещений и проверять равенство размеров массивов в рамках устаревшей семантики Nested. #98416 (Amos Bird).
- Теперь в конфигурации users.xml/yaml можно указывать несколько методов аутентификации (в SQL это всегда было возможно). #91998 (Flip-Liquid).
- Автоматическая перезагрузка межузловых соединений Raft, использующих TLS. #93455 (Evgeny).
- Расширена поддержка
cast_keep_nullable для типов Dynamic/JSON. Если параметр включён, приведение NULL из типов, которые могут быть Nullable, вернёт NULL; в противном случае будет сгенерирована ошибка CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).
- Снижен объем памяти, занимаемой внутренними структурами данных (объектами
ISerialization), за счет введения пула объектов. #96563 (Nikita Mikhaylov).
- Добавлена поддержка полей
password и identity в XML-конфигурации клиента Keeper. #96800 (Grigorii Sokolik).
- Улучшена запись в
Iceberg для Unity Catalog. #98162 (Konstantin Vedernikov).
- Добавлена настройка
finalize_projection_parts_synchronously, которая позволяет синхронно финализировать части проекций при INSERT, снижая пиковое потребление памяти у таблиц с большим числом проекций и сохраняя при этом существующее асинхронное поведение по умолчанию. #98228 (Amos Bird).
- Добавлен столбец
projections_duration_ms в system.part_log, который фиксирует длительность слияния/перестроения для каждой проекции в миллисекундах. #98292 (Amos Bird).
- Улучшена отмена запросов, использующих ExpressionTransform и NumbersRangedSource, с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #98908 (Roman Vasin).
- Жестко заданный список
source_table_engines заменен на lookup во время выполнения через StorageFactory::getAllStorages(). Это добавляет проверки доступа для некоторых ранее отсутствовавших движков таблиц и закрывает #71544. #98984 (pufit).
- Добавлена настройка для управления поведением при несовпадении типов для Variant и Dynamic (
throw или возврат NULL). #99085 (Bharat Nallan).
- Улучшена совместимость
Iceberg и Spark: исправлена непоследовательная обработка путей, вызванная смешением путей хранилища и путей метаданных; обеспечено, чтобы таблицы Iceberg записывали расположение таблицы либо как URL, либо как абсолютный путь; добавлен резервный механизм для подсчета размеров файлов в Azure, поскольку некоторые средства чтения ClickHouse не поддерживают подсчет байтов после обхода; обработка version-hint.txt приведена в соответствие со Spark; введены абстракции на уровне типов, чтобы в будущем было сложнее перепутать типы путей; добавлены тесты для Azure и Local, проверяющие междвижковую совместимость без промежуточной выгрузки и загрузки; исправлено использование position deletes, которое ранее опиралось на эвристики определения путей там, где такой подход неприменим. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik).
- Исправлена возможная ситуация гонки в
IPartitionStrategy::cached_result, появившаяся в https://github.com/ClickHouse/ClickHouse/pull/92844. #99400 (Arthur Passos).
- Теперь типы данных ClickHouse Interval можно записывать в формате Arrow. #99519 (Peter Nguyen).
- Добавлена встроенная поддержка импорта и экспорта типов данных
UUID в форматах Arrow и Parquet. Теперь пользователи могут напрямую выполнять запросы к UUID-данным и передавать их между ClickHouse и другими инструментами работы с данными без ручного преобразования в строки и других обходных решений. Автоматическое логическое определение для UUID верхнего уровня, а также поддержка явного указания схемы для вложенных UUID. #99521 (Ivan).
- Поддержка архивов
7z в объектном хранилище. Закрывает #70968. #99600 (Alexey Milovidov).
- Добавлены события ProfileEvents
ObjectStorageListedObjects, ObjectStorageGlobFilteredObjects, ObjectStoragePredicateFilteredObjects и ObjectStorageReadObjects для интроспекции конвейера перечисления и чтения файлов в объектном хранилище (S3, Azure и т. д.). #99778 (Sema Checherinda).
- Исправлен сбой табличной функции
merge с ошибкой UNKNOWN_IDENTIFIER при запросе столбцов, присутствующих не во всех базовых распределённых/удалённых таблицах. #99833 (Alexey Milovidov).
- Теперь время коммита включается в общую метрику времени выполнения мутации для ReplicatedMergeTree. Оно перестало учитываться после #96376. #99936 (alesapin).
- Добавлен журнал предзаписи для blob-объектов, ожидающих удаления в
MetadataStorageFromDisk, что повышает надёжность и согласованность метаданных с удалённым объектным хранилищем при удалении объектов. #100019 (Maksim Kita).
- Отключена функция генерации SQL с помощью ИИ (
??) во встроенном клиенте (протоколы SSH и WebSocket), чтобы предотвратить доступ к переменным окружения сервера. #100290 (Alexey Milovidov).
- Изменён интерфейс вставки в Iceberg через каталог. Настройки
storage_catalog_type, storage_aws_access_key_id и т. д. объявлены устаревшими. #100334 (Konstantin Vedernikov).
- При вставке в
clickhouse-client заменять табуляцию на 4 пробела. Закрывает #100405. #100416 (Raúl Marín).
- Сканирование всего удалённого каталога озера данных в поисках подсказок к таблицам «Возможно, вы имели в виду …» больше не выполняется, если
show_data_lake_catalogs_in_system_tables отключён. #100452 (Alsu Giliazova).
- Применение
distributed_index_analysis_min_indexes_bytes_to_activate после отсечения партиций. #100477 (Azat Khuzhin).
- Исправлена ошибка assert при проталкивании bloom filter для Parquet при использовании пустых секций IN/NOT IN. #100543 (zoomxi).
- Статистика MinMax для столбцов теперь хранит минимальные и максимальные значения как типизированные Field, а не как Float64. Сериализованный формат включает имя типа столбца наряду со значениями. Версия файла статистики повышена до V2; файлы, записанные старыми версиями, требуют повторной материализации (ALTER TABLE … MATERIALIZE STATISTICS ALL). исправлено #53140. #100605 (Han Fei).
- Обновлён
cppkafka: добавлено исправление взаимной блокировки при закрытии Consumer. #100612 (Azat Khuzhin).
- Информация об объекте, используемая для разбора data files в Iceberg, теперь включает количество строк в файле и размер файла в байтах, извлечённые из manifest file. #100645 (Daniil Ivanik).
- Добавлен параметр конфигурации
use_separate_cache_arena, позволяющий управлять использованием отдельной арены памяти для кэша. #100664 (Seva Potapov).
- Добавлена нативная поддержка импорта типов данных Apache Arrow
StringView и BinaryView в столбцы String в ClickHouse, что повышает совместимость при ингестии на базе Arrow. #100762 (Ivan).
- Некоторые настройки Keeper server теперь перезагружаются без перезапуска при изменении файла конфигурации во время выполнения: max_requests_batch_size, max_requests_batch_bytes_size, max_request_size, quorum_reads. #100773 (Michael Kolupaev).
- Увеличены счётчики profile events
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes в релизной сборке. #100899 (Pavel Kruglov).
- Отслеживание памяти в Cgroupv2 теперь исключает
slab_reclaimable из памяти ядра, обеспечивая более точную оценку использования памяти, не подлежащей освобождению. #100901 (Antonio Andelic).
use_partition_pruning = 0 теперь также отключает отсечение по индексу MinMax и оптимизацию для count на столбцах ключа партиционирования, помимо отключения отсечения по ключам партиционирования. #100904 (Nihal Z. Miaji).
pretty=1 в EXPLAIN [PLAN] теперь выводит выражения в человекочитаемом формате. #100927 (Kirill Kopnev).
accurateCastOrNull и accurateCastOrDefault теперь поддерживают целевые типы Tuple, включая вложенные Tuple с элементами Nullable. Ранее эти функции не принимали Tuple в качестве целевого типа, поскольку Tuple не мог находиться внутри Nullable. Закрывает #100820. #100942 (Nihal Z. Miaji).
- Исправлено дублирование диаграмм в интерфейсе Play при переключении между светлой и тёмной темами. #101058 (Alexey Milovidov).
- Обновлён chdig до v26.3.1 (интерфейс Perfetto, спарклайны в сводке по CPU/памяти/слияниям/запросам, system.warnings, поиск по регулярным выражениям в журналах). #101092 (Azat Khuzhin). Обновлён chdig до v26.4.3 (улучшения в Perfetto, исправления, связанные с общим доступом через pastila.nl, сравнение флеймграфов, изменение настроек в реальном времени). #103145 (Azat Khuzhin).
- Теперь перед запросом
SELECT в секции WITH допускается завершающая запятая. #101093 (Aruj Bansal).
- Добавлена настройка MergeTree
compress_per_column_in_compact_parts, управляющая тем, как сжатые блоки организованы внутри компактных частей. Когда true (по умолчанию, с сохранением текущего поведения), каждый столбец начинает новый сжатый блок, что позволяет выполнять выборочную распаковку. Когда false, все столбцы в пределах гранулы упаковываются в один сжатый блок, что улучшает коэффициент сжатия и производительность чтения для рабочих нагрузок, в которых всегда читаются все столбцы. #101114 (Amos Bird).
- Показывать всплывающую подсказку с информацией о таблице в интерфейсе Play только при наведении курсора на название таблицы, а не на всю строку. #101118 (Alexey Milovidov).
- Добавлены значки для конкретных движков и улучшено взаимодействие со списком таблиц на боковой панели интерфейса Play. #101134 (Alexey Milovidov).
- Добавлена поддержка
Nullable(Tuple) в форматах Arrow, ArrowStream, ORC и устаревшем формате Parquet. #101272 (Nihal Z. Miaji).
- Строка TOTALS теперь отображается в нижнем колонтитуле таблицы в веб-интерфейсе (play.html). #101286 (Alexey Milovidov).
- Поддержка режима работы с несколькими запросами в веб-интерфейсе (
play.html): одновременный запуск нескольких запросов с параллельным выполнением запросов типа SELECT и отдельным отображением результатов для каждого запроса. #101290 (Alexey Milovidov).
- Исправлено изменение ширины столбца в веб-интерфейсе play.html после того, как таблицу результатов переработали в веб-компонент. #101295 (Alexey Milovidov).
- Добавлена возможность ограничивать количество сбросов профиля jemalloc при MEMORY_LIMIT_EXCEEDED в течение заданного интервала времени. #101396 (Azat Khuzhin).
- Добавлены настройки Keeper:
nuraft_streaming_mode (по умолчанию false), nuraft_max_log_gap_in_stream, nuraft_max_bytes_in_flight_in_stream. Закрывает issue #90743. #101427 (Kseniia Sumarokova).
- Добавлена асинхронная метрика
CGroupMemoryUsedWithoutPageCache, которая показывает использование памяти cgroup без учёта как кэша страниц ОС в ядре, так и кэша страниц в пространстве пользователя ClickHouse, по аналогии с MemoryResidentWithoutPageCache. Также уточнено описание метрики CGroupMemoryUsed. #101513 (Francesco Ciocchetti).
- Добавлен синтаксический сахар на уровне parser для синтаксиса стандартной SQL-функции
OVERLAY. Функция overlay уже существует; добавлена поддержка формы с ключевыми словами PLACING, FROM и FOR в качестве разделителей. #101681 (Desel72).
- В системную таблицу
information_schema.tables добавлен псевдоним столбца INDEX_LENGTH, аналогичный существующим в этой таблице псевдонимам в верхнем регистре. #101705 (Robert Schulze).
- Системная таблица
information_schema.tables теперь не учитывает неактивные части таблицы. Благодаря этому отображаемые значения размера таблиц стали более реалистичными. #101706 (Robert Schulze).
- Функция
ngrams теперь отклоняет недопустимые значения длины n-грамм. Пример: SELECT ngrams('abc', 0) теперь возвращает ошибку. #101922 (Robert Schulze).
- В продолжение #91820 и #90837: исключать неподдерживаемые алгоритмы из сообщений об ошибках; запускать тесты для FIPS в FIPS-сборках. #102067 (Mikhail f. Shiryaev).
- Высота ячеек в веб-интерфейсе (
play.html) ограничена тремя строками, с возможностью раскрытия по щелчку. #102154 (Alexey Milovidov).
- Добавлена новая опция для принудительного использования стиля (virtual/path) для конечных точек S3. Решает #82019; #76007 Продолжение https://github.com/ClickHouse/ClickHouse/pull/83168. #102378 (Konstantin Vedernikov).
- Параметр
restore_replace_external_engines_to_null теперь также не восстанавливает базы данных с внешними движками (например, DataLakeCatalog, MySQL, PostgreSQL, S3) вместо того, чтобы завершаться ошибкой или устанавливать внешние подключения. #102400 (Nikita Fomichev).
- Добавлена поддержка анализа текстового индекса для функции
hasPhrase в режиме HINT. #102438 (Elmi Ahmadov).
- Считать STATISTICS доступными только для чтения в ColumnDependency, чтобы исправить LOGICAL_ERROR при MATERIALIZE STATISTICS ALL. #102627 (Konstantin Bogdanov).
- В режиме keeper-as-server теперь создаётся и заполняется
system.asynchronous_metric_log. #102664 (Miсhael Stetsyuk).
- Добавлена опция config
default_system_log_flush_policy.skip_alias_columns, позволяющая исключать столбцы ALIAS из системных таблиц логов; это исправляет системные логи, использующие S3 в качестве хранилища и не принимающие столбцы ALIAS. #102669 (Miсhael Stetsyuk).
- Не включайте автоматическую статистику для системных таблиц. Она им редко нужна. #102862 (Han Fei).
- Добавлена поддержка токенизатора
array для оптимизации LIKE. #102880 (Elmi Ahmadov).
- Отправлять MemoryAllocatedWithoutCheck даже в релизных сборках. #103064 (Azat Khuzhin).
- Появилась возможность просматривать untracked_memory для каждого потока в system.stack_trace. #103065 (Azat Khuzhin).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка
Block structure mismatch in stream, вызванная возвратом лишних столбцов при отложенной материализации. Исправляет #95191. #96682 (Nikolai Kochetov).
- Исправлена логическая ошибка в запросе политики маскирования данных с
ON CLUSTER. #97594 (Bharat Nallan).
- Исправлена ошибка при использовании Unity Catalog с GCS. #98456 (Melvyn Peignon).
DataLakeCatalog теперь учитывает настройку сервера http_forbid_headers при проверке параметра auth_header. #98827 (Michael Anastasakis).
- Исправлены вызовы
HeadObject по схеме N+1 для S3 глоб-шаблонов с раскрытием фигурных скобок. #99219 (Konstantin Bogdanov).
- Проверка изменений настроек в запросах CREATE, если сам движок тоже поддерживает настройки. #99279 (János Benjamin Antal).
- Исправлена ошибка, из-за которой
ALTER TABLE UPDATE/DELETE завершался с ошибкой Missing columns, когда в таблице есть материализованный столбец, выражение которого зависит от эфемерного столбца. #99281 (Yash ).
- Учетные данные в строках подключения JDBC, ODBC и NATS теперь маскируются в журнале запросов и выводе
SHOW CREATE, что предотвращает случайное раскрытие конфиденциальной информации. В строках подключения в формате URI (например, {scheme}://{user}:{password}@{host}) маскируется только пароль, а остальная часть остается видимой для удобства отладки. Настройка nats_token теперь тоже маскируется. #99344 (János Benjamin Antal).
- Исправлена ошибка в
parseDateTimeBestEffort: функция неверно разбирала слова, начинающиеся с префиксов месяцев, в формате DD-month-YYYY. Закрывает #99345. #99350 (Pavel Kruglov).
- Исправлено игнорирование TABLE_UUID_MISMATCH в режиме без analyzer. #99380 (Azat Khuzhin).
- Исправлена ошибка, из-за которой явные настройки, переданные вместе с
compatibility в одном запросе, могли незаметно игнорироваться, если их значение совпадало со значением сервера по умолчанию. #99402 (Raufs Dunamalijevs).
- Исправлена проблема, из-за которой числа с ведущими нулями в пути партиционирования Hive вызывали ошибки. Исправление #98801. #99458 (Yarik Briukhovetskyi).
- Исправлена ошибка heap-use-after-free, возникавшая при одновременном удалении таблицы и выполнении запроса на чтение (19 случаев в CI за последние 90 дней). #99483 (Alexey Milovidov).
- Исправлена ошибка в Keeper: запрос на чтение мог зависнуть (что приводило к тайм-ауту сеанса), если в тот же сервер в крайне неудачный момент закрывался другой, не связанный с ним сеанс. #99484 (Michael Kolupaev).
- Проверка структуры столбца перед применением патчей. #99531 (Seva Potapov).
- Исправлен сбой проверки
rows_sources при вертикальном слиянии во время быстрого переключения SYSTEM STOP/START MERGES для таблицы со столбцами Dynamic. #99532 (Alexey Milovidov).
- Исправлено некорректное отсечение партиций для
toWeek(), из-за которого запросы с WHERE toWeek(date, mode) = N возвращали пустой результат для недель 49–52 в таблицах, разбитых на партиции по toYYYYMM(date). #99542 (Takumi Hara).
- Исправлено исключение в функциях, работающих с ColumnReplicated при наличии строк без ссылок, созданных JOIN. #99564 (Hechem Selmi).
- Исправлена проблема, из-за которой
CLEAR COLUMN не перестраивал проекции и не выполнял повторный расчёт материализованных столбцов, зависящих от очищаемого столбца, что могло приводить к исключениям или повреждению данных при последующих слияниях. #99565 (Desel72).
- Исправлено Исключение (
Bad get: has Tuple, actual type String) в ConditionSelectivityEstimator, возникавшее, когда в запросе используется IN с одним скалярным параметром запроса (например, WHERE col IN ({p:String})) для таблицы, у которой есть статистика по столбцам и включен use_statistics. #99614 (Ilya Yatsishin).
- Часть с неизвестными проекциями не должна считаться безвозвратно потерянной. #99623 (Sema Checherinda).
- Исправлено редкое исключение из-за логической ошибки при Вертикальном слиянии, когда
SYSTEM STOP MERGES и SYSTEM START MERGES выполняются одновременно. #99628 (Desel72).
- Исправлена висячая ссылка в injectRequiredColumns, приводившая к сбою при слиянии. #99679 (Tuan Pham Anh).
- Исправлено неопределённое поведение в модуле чтения Avro format при чтении числовых значений, вызывающих переполнение целевого типа столбца. Теперь запросы завершаются ошибкой при переполнении вместо того, чтобы незаметно возвращать некорректные значения. #99697 (asyablue22).
- Исправлен разбор кавычек в стиле shell в аргументах табличной функции
executable. #99794 (Nikita Semenov).
- Исправлено ложное срабатывание аварийного завершения в
NativeReader при десериализации потока в формате Native с несовпадением количества строк: код ошибки изменён с LOGICAL_ERROR на INCORRECT_DATA, чтобы ситуация обрабатывалась как ошибка данных, а не вызывала abort() в сборках sanitizer/debug. #99822 (Rahul Nair).
- Исправлено аварийное завершение процесса при десериализации столбца
Tuple, когда тип сериализации в бинарном потоке — DETACHED. #99823 (Rahul Nair).
- Исправлено ложное исключение
LOGICAL_ERROR, возникавшее при динамическом изменении размера файлового кэша из-за состояния гонки при повышении приоритета подочереди SLRU. #99850 (Alexey Milovidov).
- Исправлено некорректное отображение нулевых значений
written_rows, read_rows и result_rows для запросов async insert в query_log и выводе клиента. #99879 (Sema Checherinda).
- Исправлено исключение “Неверное приведение типа X к Y” в
KILL QUERY, когда внутренний запрос к системным таблицам возвращает столбцы, обёрнутые в ColumnConst. #99881 (Alexey Milovidov).
- Исправлена логическая ошибка, связанная с коррелированным подзапросом в аргументе untuple. #99917 (Vladimir Cherkasov).
- Исправлено Исключение при вызове
right, rightUTF8 или других функций извлечения подстроки с длиной INT64_MIN (-9223372036854775808), которое ранее приводило к неопределённому поведению из-за целочисленного переполнения. Теперь эти функции корректно возвращают ошибку ARGUMENT_OUT_OF_BOUND. #99934 (Jimmy Aguilar Mena).
- Теперь ClickHouse должен корректно обрабатывать таблицы в стиле Spark (где для каждого файла указан полный абсолютный путь или относительный путь к общему пути таблицы). Исправляет #92348. #99935 (alesapin).
- Исправлено Исключение “Inconsistent AST formatting” для
ALTER TABLE ... MODIFY QUERY со вложенными подзапросами, содержащими SETTINGS, когда у самого ALTER тоже есть SETTINGS. #99938 (Nikita Mikhaylov).
- Отменён #97114 “Перенести оценку числа строк на этапе JOIN перед проверкой на наличие 1 дочернего элемента” из-за подозрения на регрессию производительности. #99957 (Alexander Gololobov).
- Исправлена ошибка, из-за которой ClickHouse мог пропускать файлы, если в ответе на HEAD-запрос к ним отсутствовал заголовок
Content-Length (например, из-за декомпрессионного транскодирования в GCS). #99971 (Yarik Briukhovetskyi).
- Исправлен сбой assert (исключение в debug-сборках, некорректные результаты в release-сборках) при умножении состояний агрегатной функции
NumericIndexedVector на чётную целочисленную константу, вызванный self-XOR для алиасов битмапов Roaring в pointwiseAddInplace. #99976 (Desel72).
- Предотвращено исключение
Unexpected return type в устаревшем pushdown фильтров через цепочку JOIN USING, когда типы ключей меняются после преобразований JOIN. #99999 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR “Неожиданный тип узла для табличного выражения … фактически IDENTIFIER”, возникавшее при использовании скалярного подзапроса внутри неразрешённого аргумента табличной функции, например: SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1))). #100014 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
INSERT с VALUES завершался сбоем, если после данных на следующей строке шёл завершающий SQL-комментарий (-- или /* */). Теперь комментарий пропускается, а не разбирается как ещё одна строка. #100016 (Pratima Patel).
- Исправлено исключение в
arrayRemove при сравнении кортежей с компонентами, равными NULL. #100017 (Alexey Milovidov).
- Исправлена межпользовательская утечка данных в
system.asynchronous_inserts: любой пользователь с SELECT к таблице мог видеть ожидающие записи асинхронной вставки, принадлежащие другим пользователям. Теперь записи фильтруются по текущему пользователю, если только у него нет привилегии SHOW_USERS. #100024 (Shaohua Wang).
- Исправлен случай, когда приведение Time64 к UInt64 могло обрезать значения до 24 часов. #100025 (Yarik Briukhovetskyi).
- Исправлен сбой локального сервера, когда CREATE DICTIONARY содержит определение со списочным значением, содержащим несуществующую функцию. #100036 (Yakov Olkhovskiy).
- Исправлена ошибка, из-за которой форматы
CSV и MsgPack не могли корректно разбирать Nullable(Tuple). Закрывает #99753. #100038 (Nihal Z. Miaji).
- Исправлена ошибка
UNKNOWN_IDENTIFIER, из-за которой CREATE VIEW завершался сбоем при использовании в качестве правой части IN алиаса функционального выражения в WITH (например, tuple(...)). #100042 (Peng).
- Исправлена ошибка, из-за которой агрегатные функции временных рядов (например,
timeSeriesResampleToGridWithStaleness) завершались с ILLEGAL_TYPE_OF_ARGUMENT при использовании initializeAggregation или AggregatingMergeTree с параллельными репликами. #100053 (Alexey Milovidov).
- Исправлена обработка отрицательных значений в NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
- Исправлено: функции
accurateCastOrDefault и to*OrDefault не сохраняли тип Const столбца для константных входных данных. #100132 (Alexey Milovidov).
- У пропущенных параметров запроса с типом
LowCardinality(Nullable(T)) теперь значение по умолчанию корректно устанавливается в NULL, как и для Nullable(T). #100144 (Denys Melnyk).
- Исправлена ошибка использования неинициализированного значения в StringSearcher.h. #100225 (Konstantin Bogdanov).
- Добавлена возможность отменять скалярные подзапросы и другие конвейеры, запускаемые на этапе анализа, с помощью Ctrl+C. Ранее нажатие Ctrl+C во время выполнения длительного скалярного подзапроса не давало никакого эффекта, пока подзапрос не завершался. Также исправлены индикатор прогресса и статистика в JSON, чтобы они корректно сообщали о числе прочитанных строк во время выполнения скалярного подзапроса — как в
clickhouse-client, так и в clickhouse-local. В соавторстве с @YjyJeff. #100230 (Raúl Marín).
- Исправлено исключение
LOGICAL_ERROR в запросах с Dynamic-столбцами, CROSS JOIN и runtime-фильтрами, вызванное тем, что ColumnVariant::filter использовал общие указатели на Variant-столбцы вместо их клонирования в ветке оптимизации hasOnlyNulls. Закрывает https://github.com/ClickHouse/ClickHouse/pull/100147. #100234 (Pavel Kruglov).
- Исправлена ошибка в массивах с
Variant, из-за которой при вызове функций arrayFirst/arrayLast мог переинтерпретироваться тип данных. Например, ранее Array(Variant(Date, Bool)) преобразовывался в Bool, хотя фактический тип варианта — Date. #100255 (timothygk).
- Несколько небольших изменений в функциях: функции
h3 теперь лучше проверяют границы; readWKB теперь проверяет ограничения на размер (новая настройка max_wkb_geometry_elements); функции генерации случайных чисел ограничивают максимальное число итераций при вычислениях. Дополнение к #93543. #100270 (Alexey Milovidov).
- Исправлена проблема, из-за которой cutURLParameter мог некорректно пропускать параметры, если они были подстроками других параметров. #100280 (Nikita Semenov).
- Исправлено исключение, возникавшее, если в настройке пути к файлу метаданных Iceberg присутствовал null-байт. #100283 (Alexey Milovidov).
- Исправлена проблема с квадратичным ростом числа выполняемых запросов при использовании
distributed_index_analysis с предикатами, содержащими IN-подзапросы. #100287 (Anton Popov).
- Исправлено исключение “Несоответствие структуры блока” при использовании
GROUP BY ... WITH TOTALS HAVING вместе с UNION DISTINCT и Nullable-выражениями. #100293 (Alexey Milovidov).
- Исправлено Исключение LOGICAL_ERROR в
estimateCompressionRatio, возникавшее, когда параметр block_size_bytes был чрезвычайно большим. #100298 (Alexey Milovidov).
- Исправлено Исключение “Несогласованное форматирование AST” в отладочных сборках при использовании
GROUP BY CUBE(...) WITH ROLLUP и похожих комбинаций. #100376 (Alexey Milovidov).
- Исправлено Исключение при создании представления с псевдонимами столбцов и запросами
SELECT * или EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
- Исправлено зависание
DROP TABLE на неопределённое время для таблиц с движком Kafka, когда consumer’ы застревают в состоянии перебалансировки после ошибки heartbeat. #100388 (Alexey Milovidov).
- Исправлено Исключение
ReadBuffer is canceled. Can't read from it. при операциях резервного копирования и восстановления с использованием zip-архивов. #100400 (Alexey Milovidov).
- Исправлено Исключение
TOO_MANY_ROWS для запросов SELECT count() с max_rows_to_read / force_primary_key, когда данные распределены по нескольким частям с несовпадающими границами гранул. #100408 (Alexey Milovidov).
- Исправлен
system.completions: теперь он корректно фильтрует базы данных, таблицы и столбцы по правам доступа во всех сочетаниях grant — на уровне таблицы, базы данных и при отзыве прав на уровне столбца. #100432 (Shaohua Wang).
- Исправлен SEGFAULT в NuRaft, вызванный состоянием гонки. #100444 (Pablo Marcos).
min/max/argMin/argMax теперь обрабатывают NaN так же, как ORDER BY: NaN всегда пропускается (возвращается только если все значения — NaN). Ранее результаты зависели от положения NaN в данных из-за семантики неупорядоченного сравнения в IEEE 754. #100448 (Raúl Marín).
- Исправлена ошибка, вызванная копированием и вставкой: если
delta_lake_snapshot_end_version задавался без delta_lake_snapshot_start_version, он молча игнорировался вместо того, чтобы приводить к ошибке BAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar).
StorageRabbitMQ::shutdown не является идемпотентным (он безусловно обращается к слабым указателям, а затем уничтожает соответствующие указатели с общим владением), но теперь вызывается дважды: сначала в StreamingStorageRegistry, а затем в DatabaseCatalog. Это исправление делает метод идемпотентным и добавляет защитные проверки на null. #100455 (Miсhael Stetsyuk).
- Исправлено Исключение
LOGICAL_ERROR, возникавшее при использовании accurateCastOrNull с целевым типом QBit. #100470 (Raufs Dunamalijevs).
- Исправлено исключение LOGICAL_ERROR “Stream … not found”, возникавшее при вставке в таблицу с вложенными столбцами
Array(JSON) в частях типа Wide при optimize_on_insert=0. #100475 (Pavel Kruglov).
- Проверка путей записей файлов в метаданных резервной копии для отклонения обхода путей, абсолютных путей и пустых имён при
RESTORE. #100483 (Pablo Marcos).
- Исправлена ошибка, из-за которой не работал синтаксис
LIMIT m OFFSET n WITH TIES. Этот синтаксис эквивалентен LIMIT n, m WITH TIES, который уже работал. #100491 (Nihal Z. Miaji).
- Исправлено исключение “No set is registered for key” при использовании
IN со столбцами Nullable(Tuple), содержащими именованные поля и элементы LowCardinality. #100523 (Alexey Milovidov).
- Исправлен heap-buffer-overflow в usearch
sorted_buffer_gt::insert(), который мог вызывать сбой или незаметно повреждать память при поиске по векторному сходству. #100537 (Dustin Healy).
- Исправлена ошибка, из-за которой
EXECUTE AS игнорировал секции FORMAT и INTO OUTFILE, указанные в запросе. #100538 (pufit).
- Исправлено неконсистентное форматирование AST для SAMPLE с OFFSET на уровне запроса. Закрывает #100576. #100579 (Pavel Kruglov).
- Исправлена работа Polaris catalog с Azure. Начиная с версии 25.12 этот каталог для Azure начал добавлять бакет в начало пути. Например,
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path> вместо abfss://polaris-polaris@<some_url>.windows.net/<other-path>. Этот PR убирает бакет из пути. #100583 (Konstantin Vedernikov).
- Исправлено исключение из-за несоответствия типов в transform, когда столбец по умолчанию является const в некоторых блоках. Закрывает #100574. #100616 (Pavel Kruglov).
- Исправляет случаи NOT_FOUND_COLUMN_IN_BLOCK, когда в части SELECT проекции есть столбцы, которых нет в исходной части SELECT запроса. Закрывает #100194. #100623 (Yarik Briukhovetskyi).
- Проверка размерностей массива в формате Npy на соответствие размеру файла и ограничениям переполнения, чтобы предотвратить отказ в обслуживании из-за специально созданных файлов
.npy с чрезмерно большими размерностями. Также отклоняются пустые формы массивов, а объём памяти на строку ограничивается 2 GiB. #100625 (Raúl Marín).
- Исправлена ошибка, из-за которой
session_timezone игнорировался при разборе значений DateTime во время асинхронных вставок (TCP) и всех вставок по HTTP. #100647 (Sema Checherinda).
- Разрешена передача ключа сегментирования в табличные функции
cluster() и clusterAllReplicas(), когда в качестве источника используется табличная функция (например, cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy).
- Исправлен сбой сервера (срабатывание assert) при использовании параметрических агрегатных функций с комбинатором Array и аргументами NULL, таких как
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot).
- Исправлено исключение, возникавшее при вычислении общего супертипа для пустых и непустых кортежей при включенном
use_variant_as_common_type. #100699 (Antonio Andelic).
- Сервер больше не запускается с ошибкой, если настроен диск Azure Blob Storage, а конечная точка временно недоступна (например, из-за сбоя DNS). #100701 (Raúl Marín).
- Исправлено неопределённое поведение в
positiveModulo, когда беззнаковый делитель не помещается в знаковый тип результата. #100705 (Raúl Marín).
- Исправлен сбой сервера (логическая ошибка “Неожиданный тип, возвращаемый __topKFilter”), когда включен
use_top_k_dynamic_filtering, а столбец в ORDER BY имеет тип Dynamic или Variant. #100742 (Groene AI).
- Исправлен сбой сервера при использовании функции
has() в PREWHERE/WHERE для ключа Tuple, содержащего элементы LowCardinality. #100760 (Groene AI).
- Исправлено срабатывание проверки
file_offset_of_buffer_end <= getFileSize() (исключение в отладочных сборках) при чтении из таблиц Log или StripeLog в объектном хранилище S3 при одновременной записи. #100763 (Alexey Milovidov).
- Исправлено исключение в оценщике селективности статистики, возникавшее, когда предложение WHERE содержит функциональное выражение (например, toDecimal64(col, 3)) в таблице со включенной статистикой. Теперь оценщик пропускает такие предикаты вместо того, чтобы пытаться выполнить недопустимое приведение типов. #100764 (Han Fei).
- Исправлен редкий случай, когда JOIN с изменением порядка мог давать неверный результат. #100790 (Yarik Briukhovetskyi).
- Исправлены некорректные типы аргументов
AggregateFunction в оптимизированном тривиальном count, из-за которых при выполнении запросов с выражениями вроде count(v0 + v1) на distributed таблицах возникало Исключение NUMBER_OF_ARGUMENTS_DOESNT_MATCH. #100794 (YjyJeff).
- Некоторые каталоги могли отображать секреты в разделе
SETTINGS результата запроса select * from system.databases. Этот PR предотвращает такое поведение. #100800 (Konstantin Vedernikov).
- Исправлено неопределённое поведение (переполнение знакового целого числа) в
toStartOfInterval при использовании интервалов Week, Quarter или Year с аргументом origin и предельными значениями интервала. #100817 (Raúl Marín).
- Исправлена невозможность чтения более старых сериализованных состояний после появления
Nullable(Tuple) для комбинаторов агрегатных функций If, Distinct, DistinctIf, IfState с возвращаемым типом Tuple и одним или несколькими аргументами Nullable. Закрывает #98917. #100826 (Nihal Z. Miaji).
- Исправлен segfault в s3Cluster и распределённых запросах, вызванный use-after-free при работе с пулом соединений. #100837 (Konstantin Bogdanov).
- Исправлен segfault из-за разыменования нулевого указателя при загрузке словарей во время остановки сервера.
Context::getUserDefinedSQLObjectsStorage (разыменовывает user_defined_sql_objects_storage) вызывается потоками словарей одновременно с вызовом Context::shutdown в основном потоке (он устанавливает user_defined_sql_objects_storage в null). Нужно убедиться, что до запуска Context::shutdown в загрузчике словарей отключены дальнейшие обновления, завершены выполняющиеся запросы к словарям и потоки загрузки словарей дожидаются завершения. Аналогично тому, как это делается для обычных запросов. #100839 (Miсhael Stetsyuk).
- Исправлено переполнение буфера в
ULIDStringToDateTime, возникавшее, когда входные данные содержат не-ASCII-байты. #100843 (Konstantin Bogdanov).
- Исправлен сбой (
LOGICAL_ERROR) при выполнении запроса к таблице Merge (или табличной функции merge()), объединяющей несколько таблиц, включая таблицу Distributed, при включенном distributed_group_by_no_merge=1. #100859 (Groene AI).
- При включенном Cast_keep_nullable при приведении dynamic null к variant исключение не будет генерироваться. #100864 (Seva Potapov).
- Исправлено поведение команд
clickhouse-keeper-client get, exists и ls: они выводили дублирующиеся сообщения об ошибке watch_id в stdout вместо stderr. #100893 (Mohammad Lareb Zafar).
- Исправлено исключение в
intDiv/intDivOrZero при работе с массивами Nullable-кортежей, например SELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín).
- Аргументы движка для
StorageAlias теперь вычисляются перед сохранением определения, чтобы выражения вроде currentDatabase() преобразовывались в литералы до сохранения в базе данных. #100902 (Nikolay Degterinsky).
- Исправлена ошибка в
processAndOptimizeTextIndexFunctions при query_plan_merge_expressions = 0, когда ExpressionStep расположен непосредственно над ReadFromMergeTree. Исправление #100879. #100909 (Jimmy Aguilar Mena).
- Обновлён replxx: добавлено исправление выхода за границы массива в do_complete_line. #100925 (Azat Khuzhin).
- Исправлены неверные результаты, когда JOIN с оптимизацией сегментирования по PK использует кэш условий запроса, а некоторые части отфильтровываются на основе кэшированных условий. #100926 (Groene AI).
- Исправлена ошибка, из-за которой
divide и intDiv в некоторых случаях возвращали ILLEGAL_DIVISION при использовании в выражениях фильтра во время анализа индексов. #100928 (Nihal Z. Miaji).
- Исправлены ошибки “Целевая таблица не существует” для materialized view с внутренними таблицами при асинхронном запуске, вызванные неверным порядком инициализации зависимостей. #100946 (Nikolay Degterinsky).
- Исправлено неопределённое поведение (переполнение знакового целого числа) в parseDateTimeBestEffort при разборе строк даты и времени, содержащих более 18 цифр в дробной части секунды. #100948 (Vasily Chekalkin).
- Исправлен сбой при использовании индекса для текстового поиска с условием
IN, содержащим кортежный подзапрос, например WHERE (id, str) IN (SELECT (id, str) FROM ...), а также в случае, когда число столбцов в подзапросе не совпадает с кортежем в левой части IN. #100959 (Anton Popov).
- Исправлен сбой, возникавший при создании словаря Polygon из таблицы
MergeTree, использующей сериализацию разреженных столбцов. #100964 (Anton Popov).
- Исправлена логическая ошибка “Invalid action query tree node” при использовании
INTERSECT ALL / UNION ALL с выражениями, свёрнутыми в константы. #100977 (Alexey Milovidov).
- Исправлена агрегатная функция
sumCountOrDefault: при одном или нескольких аргументах типа Nullable она не могла читать ранее сериализованные состояния после введения Nullable(Tuple). Закрывает #100882. #101021 (Nihal Z. Miaji).
- Исправлен сбой (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) в алгоритмах слияния, когда отложенная репликация столбцов (enable_lazy_columns_replication) создает столбцы ColumnReplicated, которые попадают в конвейеры merge-sort при позднем поступлении входных данных. #101036 (Groene AI).
- Исправлена некорректная ошибка
UNKNOWN_IDENTIFIER, возникавшая, когда один и тот же псевдоним использовался для нескольких выражений в SELECT; теперь вместо неё корректно сообщается ошибка MULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov).
- Исправлена проблема со столбцами ALIAS типов
DateTime/DateTime64: преобразование часового пояса не применялось, если указанный часовой пояс отличался от часового пояса выражения. #101043 (Alexey Milovidov).
- Исправлена проблема, из-за которой политики строкового доступа не записывались в
query_log для представлений, подзапросов и INSERT ... SELECT. Хотя политики строкового доступа применялись при планировании запросов, они не передавались от вложенных планировщиков в родительский планировщик для записи в журнал. Теперь политики строкового доступа (только для журналирования) хранятся в QueryAccessInfo, чтобы их могли заполнять и планировщики, и вложенные планировщики. #101044 (Narasimha Pakeer).
- Исправлено Исключение в
DirectJoinMergeTreeEntity, когда блоки конвейера содержат столбцы ColumnConst, которые объединяются с обычными столбцами. #101046 (Alexey Milovidov).
- Исправлен лишний пробел в оформлении псевдонима столбца в CTE (
WITH t (a, b) → WITH t(a, b)). #101049 (Alexey Milovidov).
- Исправлена ошибка, из-за которой табличные функции
remote/cluster не работали с вложенными табличными функциями, такими как merge, при включенном анализаторе. #101055 (Alexey Milovidov).
- Исправлено двойное применение
OFFSET в распределённых запросах при prefer_localhost_replica=1, из-за чего возвращалось меньше строк, чем ожидалось. #101071 (Nihal Z. Miaji).
- Исправлен сбой, возникавший при использовании формата
Regexp с некорректным регулярным выражением в настройке format_regexp. #101074 (Nihal Z. Miaji).
- Исправлена ошибка “Недопустимый тип Decimal64 для параметра start” в агрегатных функциях временных рядов при использовании
serialize_query_plan=1 с параллельными репликами. #101083 (Groene AI).
- Исправлено исключение в
optimizeLazyMaterialization, возникавшее при использовании проекции с PREWHERE вместе с ORDER BY ... LIMIT. #101115 (Anton Popov).
- Исправлен сбой сервера (SIGABRT) при использовании агрегатных функций с внутренним комбинатором
Null (например, sumNull, avgNull) и включенной настройкой aggregate_functions_null_for_empty = 1. #101147 (Groene AI).
- Исправлена ошибка use-after-free при записи в файловый кэш, которая могла приводить к чтению из уже освобождённой памяти при логировании завершённых сегментов файла (обнаружена с помощью MemorySanitizer в BuzzHouse). #101161 (Groene AI).
- Исправлен сбой сервера с сообщением “Попытка подключить внешнюю таблицу к готовому Set без явных элементов”, который возникал, когда распределённый анализ индексов сталкивался с предикатом GLOBAL IN, чей Set был построен без явных элементов. #101178 (Groene AI).
- Исправлены агрегатные функции
MAX/MIN для столбцов Decimal, возвращавшие некорректные результаты при включенной JIT-компиляции (после достижения порога компиляции). #101203 (Raúl Marín).
- Исправлена проблема, из-за которой оптимизации
minmax_count_projection и тривиального COUNT(*) оставались навсегда отключёнными после легковесного удаления, даже когда все части с маской легковесного удаления уже были слиты. #101212 (Anton Popov).
- Исправлен сценарий, который мог приводить к логической ошибке
Having zero bytes, ... в кэше: удалённый объект мог быть перезаписан в промежутке между list и read, из-за чего ранее возникали устаревшие метаданные объекта. #101219 (Kseniia Sumarokova).
- Исправлен сбой сервера (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) при запросе к таблице семейства MergeTree с
ORDER BY CAST(lc_column, 'Type'), где lc_column имеет тип LowCardinality. #101220 (Groene AI).
- Исправлена очистка устаревших узлов обработки в
S3Queue. #101230 (Kseniia Sumarokova).
- Исправлено UB в mergeTreeAnalyzeIndexes() при недопустимом значении аргумента optimizations. #101253 (Azat Khuzhin).
- Исправлено Исключение
Logical error: 'partitions_count > 0', возникавшее при последовательном выполнении ALTER TABLE UPDATE для секционированной таблицы Iceberg. #101278 (Desel72).
- Исправлены неверные результаты запроса, когда большая целочисленная константа (например, 256, 2147483648) используется как булевый предикат в предложении WHERE с оператором AND в таблицах семейства MergeTree. Например,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648 ошибочно возвращал 0 вместо того, чтобы учитывать все строки. #101287 (Groene AI).
- Исправлен INSERT SELECT из кластера Delta Lake с ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
- Исправлен сбой с сообщением “Логическая ошибка: чтение из материализованного CTE до материализации”, возникавший, когда скалярный подзапрос ссылался на цепочку зависимых материализованных CTE. #101305 (Groene AI).
- Исправлена гонка данных с
storage_id в IStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky).
- Исправлены форматирование и клонирование AST для BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
- Исправлен сбой LOGICAL_ERROR “Текущий компонент пуст”, возникавший при запросе к
system.part_moves_between_shards, когда включен enforce_keeper_component_tracking. #101462 (Groene AI).
- Исправлено падение из-за segmentation fault в DataTypeDynamic::create(), когда фаззер генерирует некорректный AST типа Dynamic. #101464 (Groene AI).
- Выдавать ошибку, если настройки
delta_lake_snapshot_version или версии CDF используются без включенного DeltaKernel, вместо того чтобы незаметно возвращать некорректные данные. #101489 (Desel72).
- Исправлено Исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее при использовании ARRAY JOIN с JOIN USING и включенной настройке analyzer_compatibility_join_using_top_level_identifier. Закрывает #101240. #101507 (Vladimir Cherkasov).
- Исправлена ошибка в цикле повторных попыток Iceberg INSERT, возникавшая, когда таблица была создана с
iceberg_metadata_file_path, а целевая версия метаданных уже существовала. #101548 (Groene AI).
- Убрали Nullable из результирующего столбца в arrayIntersect и связанных функциях, чтобы избежать несоответствия при сериализации/десериализации. #101569 (George Larionov).
- Исправлен сбой сервера (LOGICAL_ERROR) при выполнении SELECT-запроса к materialized view, использующему движок таблицы IcebergLocal. #101577 (Groene AI).
- Исправлено некорректное сообщение об ошибке при вызове
intExp10 с аргументом NaN — в нём было указано intExp2 вместо intExp10. #101582 (Krishna Chaitanya).
- Исправлено:
allow_statistics=0 не блокировал выполнение ALTER TABLE ADD STATISTICS и ALTER TABLE DROP STATISTICS после рефакторинга в #100288. #101585 (Krishna Chaitanya).
- Исправлена ошибка
KeeperMap при выполнении CREATE TABLE с сообщением “Cannot create metadata for table”, возникавшая, когда в оставшихся узлах ZooKeeper после неполного удаления в версиях до 25.1 отсутствовал узел drop_lock_version. #101623 (Antonio Andelic).
- Устранена возможная логическая ошибка при чтении подстолбцов типа Map. Закрывает #100769. Закрывает #101336. #101641 (Pavel Kruglov).
- Исправлен приоритет точного совпадения подстолбца над совпадением по префиксу в
getSubcolumnData, чтобы избежать возможного падения. Закрывает #101271. #101645 (Pavel Kruglov).
- Исправлен сбой (LOGICAL_ERROR: “ColumnUnique не может содержать значения NULL”) при сравнении столбца
LowCardinality с NULL-константой Variant, когда use_variant_default_implementation_for_comparisons отключён. #101690 (Groene AI).
- Что: В Bzip2ReadBuffer добавлена проверка на пустой поток, благодаря которой он возвращает EOF вместо UNEXPECTED_END_OF_FILE, если внутренний поток пуст. #101691 (ClickGap AI Bot).
- Что: Исправлено перепутанное описание столбца
alterable в system.s3_queue_settings и system.azure_queue_settings — значения 0 и 1 поменяны местами в соответствии с фактическим поведением кода. #101703 (ClickGap AI Bot).
- Исправлена ошибка, из-за которой для
positiveModulo(tuple, number) ошибочно вызывалось деление вместо операции взятия по модулю. #101709 (ClickGap AI Bot).
- Исправляет сбой, возникавший при настройке
thread_pool_size на диске с кэшем. Ранее FileCacheSettings::loadFromConfig() отклонял thread_pool_size как неизвестную настройку, из-за чего сервер не мог запуститься. Эта настройка является допустимым параметром IDisk, который определяет количество потоков, используемых для операций копирования с диска на диск при фоновом перемещении частей. #101712 (Francisco).
- Исправлено поведение, при котором при создании словаря
RANGE_HASHED молча принимался несуществующий атрибут диапазона MAX, а также использовалась неверная конфигурация типов, если атрибуты минимального и максимального диапазона имели разные типы. Причиной ошибки была опечатка из-за копирования и вставки в buildRangeConfiguration: для максимального атрибута искался min_attr_name вместо max_attr_name. #101732 (Yakov Olkhovskiy).
- Исправлено аварийное завершение, вызванное use-after-free в планировщике аренды CPU, когда таймер ожидания живёт дольше, чем воркер-поток, на
ProfileEvents::Counters которого он ссылается. #101761 (Antonio Andelic).
- Исправлена ошибка в функциях arrayLevenshteinDistanceWeighted и arraySimilarity. Закрывает #101725. #101767 (Mikhail f. Shiryaev).
- Исправлена ошибка, из-за которой Prometheus Query API игнорировал тела POST-форм. #101794 (James Cunningham).
- Исправлен выход исключения из деструктора S3
Client::~Client, приводивший к аварийному завершению сервера. #101798 (Gagan Dhakrey).
- Исправлена ошибка use-after-scope при параллельной десериализации динамических путей типа
Object, которая могла приводить к сбоям при чтении таблиц с большим количеством таких путей. #101823 (Antonio Andelic).
- Исправлен некорректный вывод в функции
formatDateTime для форматтера %W при определённых (не используемых по умолчанию) настройках форматирования. #101847 (Robert Schulze).
- Исправлено ложное срабатывание
shouldPatchFunction в SYSTEM INSTRUMENT ADD, когда искомая строка впервые встречается внутри аргумента Template в деманглированном имени символа. #101885 (Pablo Marcos).
- Исправлена потеря реестра UDF при истечении сеанса ZooKeeper во время периодического обновления — все пользовательские функции могли становиться недоступными, пока не завершится успешное полное обновление. #101891 (Nikita Fomichev).
- Исправлено описание
system.codecs для AES_256_GCM_SIV: теперь указывается AES-256, а не AES-128. #101917 (Jimmy Aguilar Mena).
- Исправлено использование некорректных экстремумов в min-max индексе, созданном для JSON-столбца, что приводило к неверному результату запроса. Закрывает #101700. #101918 (Pavel Kruglov).
- Токенизатор
splitByString теперь не принимает пустые строки в качестве разделителя. #101928 (Robert Schulze).
- Исправлено поведение, при котором
materialize_skip_indexes_on_merge=false не подавлял текстовые (полнотекстовые) индексы при слиянии. Ранее подавлялись только нетекстовые индексы пропуска данных (minmax, set, bloom_filter); текстовые индексы продолжали строиться, что приводило к напрасному расходу CPU и I/O. #101932 (Groene AI).
- Токенизатор
sparseGrams генерировал токены, длина которых превышала заданный максимум (это было связано с жёстко прописанным +2 в реализации). #101934 (Elmi Ahmadov).
- Исправлен SIGSEGV в
MergeTreeDataPartWriterWide::cancel, возникавший, когда конструктор потока выбрасывает исключение во время addStreams, из-за чего в column_streams оставался null-элемент. #101936 (Antonio Andelic).
- Исправляет исключение при запросе к таблицам Merge или Distributed с полнотекстовым индексом и комбинированными условиями фильтрации, в которых
has*Tokens сочетается с LIKE, когда включен query_plan_direct_read_from_text_index. #101939 (Jimmy Aguilar Mena).
- Исправлено неопределённое поведение при разборе пакетов запроса собственного протокола с некорректными значениями
QueryProcessingStage. #101972 (Raúl Marín).
- Закрывать TCP-соединение при возникновении исключения на этапе начального разбора запроса, чтобы предотвратить чтение мусорных данных из рассинхронизированного потока. #101989 (Raúl Marín).
- Исправлена ошибка гонки в SLRU в файловом кэше 26.1+, которая может приводить к логической ошибке при резервировании места. В отладочной сборке это также может приводить к срабатыванию assert:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.. #101991 (Kseniia Sumarokova).
- Исправлено исключение при приведении строки с лишними данными в конце к пустому типу
Tuple(). #102011 (Alexey Milovidov).
- Исправляет неправильный порядок строк в запросах, использующих ORDER BY с алгоритмом JOIN grace_hash. Затронутые запросы могли возвращать результаты в неверном порядке, что незаметно приводило к некорректному выводу. #102036 (János Benjamin Antal).
- Исправлена ошибка LOGICAL ERROR (Unexpected size of index type), которая могла возникать в запросах RIGHT JOIN и FULL JOIN, когда был настроен параметр
max_bytes_in_join. #102042 (Jimmy Aguilar Mena).
- Исправляет случаи, когда
Time с отрицательными значениями возвращал неверный результат при сравнении с типом DateTime. Закрывает #101670. #102056 (Yarik Briukhovetskyi).
- Исправлен сбой при обновлении UDF, вызванный тем, что
ZooKeeperRetriesControl выполнял повторную попытку с устаревшим (истекшим) сеансом ZooKeeper, не обновляя его. #102059 (Nikita Fomichev).
- Исправлено отсутствие пробелов при форматировании unlock snapshot. Закрывает https://github.com/clickhouse/clickhouse/issues/101723. #102063 (Han Fei).
- Исправлен crash (SIGSEGV) при выполнении запроса к представлению с предложением WHERE, когда внутренний запрос возвращает столбцы с типами, отличающимися от метаданных представления (например, Nullable из LEFT JOIN с
join_use_nulls). #102085 (Miсhael Stetsyuk).
- Исправлена ошибка, из-за которой записи в
VectorSimilarityIndexCache не вытеснялись после удаления части из-за несоответствия ключей кэша. #102152 (Seva Potapov).
- При использовании хранилища RabbitMQ для повреждённых сообщений теперь отправляется NACK. #102157 (Seva Potapov).
- Исправлена логическая ошибка при разборе некорректной строки с пустым кортежем. #102289 (Nihal Z. Miaji).
- Исправлены некорректные результаты агрегации (дублирующиеся строки) при использовании
optimize_aggregation_in_order=1, если столбцы в GROUP BY упорядочены иначе, чем ключ сортировки таблицы. #102299 (Groene AI).
- Исправлен сбой в
IcebergLocal при выполнении ALTER TABLE ... UPDATE с использованием формата Avro: типы-обёртки LowCardinality/Nullable не разворачивались перед сериализацией. #102337 (Desel72).
- Исправлена ошибка сегментации в мутациях для материализованных столбцов без выражения. Закрывает #102185. #102342 (zoomxi).
- Исправление в Coalescing merge tree для типа Array. Это закрывает #89509. #102384 (Konstantin Vedernikov).
- Исправлен segfault (или LOGICAL_ERROR в отладочных сборках) при чтении файлов Parquet с включённым проталкиванием bloom filter и условиями равенства/неравенства в предложении WHERE. Сбой происходил из-за обращения к памяти за пределами допустимых границ при получении данных bloom filter в механизме предвыборки Parquet, а также мог приводить к непредсказуемо неверным результатам запроса. #102385 (Groene AI).
- Исправлено прерывание с
LOGICAL_ERROR при динамическом изменении размера SLRU файлового кэша, вызванное общей статистикой вытеснения для подочередей и некорректным путём восстановления для кандидатов, завершившихся ошибкой. #102396 (Antonio Andelic).
- Исправлен сбой инициализации на новой реплике таблиц-алиасов без целевой таблицы в базе данных Replicated. Закрывает #101320. #102397 (Nikolay Degterinsky).
- Исправлено чтение за пределами буфера в функциях поиска по строкам (
countSubstrings, position и т. д.) при поиске подстроки, состоящей целиком из null-байтов. #102401 (Raúl Marín).
- Настройки полнотекстового индекса (
enable_full_text_index, allow_experimental_full_text_index, use_skip_indexes_on_data_read) больше не отключаются, если настройка compatibility указывает на версию старее 26.1. Ранее из-за этого SharedDatabaseCatalog мог не создавать таблицы с текстовыми индексами. #102422 (Nikita Fomichev).
- Исправлено чтение за пределами буфера в
printf при завершающем %. #102472 (Raúl Marín).
- Исправлено исключение chassert
ReadBuffer is canceled в отладочных сборках AsynchronousMetrics, вызванное тем, что rewind не сбрасывал флаг отмены буфера. #102524 (Yuri Fedoseev).
- Исправлены
hasToken / hasTokenOrNull для искомых подстрок, состоящих только из разделителей (например, '()', '!!!'), в столбцах с текстовым индексом: ранее индекс молча пропускал все гранулы вместо того, чтобы сгенерировать BAD_ARGUMENTS (для hasToken) или вернуть NULL (для hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
- Исправлены OOM-ситуации на огромных
multi-запросах в Keeper. Для трассировки OpenTelemetry мы безусловно выделяли >1 KiB для OpenTelemetry spans в объектах ZooKeeperRequest — то есть для действительно огромных multi-запросов пытались дополнительно выделить >10 GiB памяти. Чтобы это исправить, теперь мы храним общие данные в статической памяти и используем std::unique_ptr вместо std::optional в ZooKeeperOpentelemetrySpans. #102586 (Miсhael Stetsyuk).
- Исправлено завышение CurrentMetric для
NamedCollection из-за CREATE NAMED COLLECTION IF NOT EXISTS на уже существующих коллекциях, а также отсутствие инициализации для коллекций, загружаемых из конфигурации или SQL-хранилища при запуске. Закрывает #102507. #102598 (Pablo Marcos).
- Исправлено Исключение в
getStructureOfRemoteTable, когда локальный сегмент возвращает пустой список столбцов из-за параллельного DDL. #102604 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда несколько параллельных запросов CREATE TABLE IF NOT EXISTS были направлены к одной и той же таблице S3Queue в базе данных Shared. #102610 (Nikita Taranov).
- Исправлен сбой LOGICAL_ERROR “Неожиданное количество строк в подфрагменте столбца” в нативном считывателе Parquet V3 при чтении столбцов с типом Nullable с фильтром WHERE. #102628 (Groene AI).
- Исправлено описание события профиля
AzureWriteMicroseconds: вместо “write” было указано “read”. #102639 (Miсhael Stetsyuk).
- Ошибка в политике строк, из-за которой в ряде особых случаев возникает исключение ‘Not found column in block’. #102648 (Yarik Briukhovetskyi).
- Исправлено серверное исключение в ClusterDiscovery, возникавшее, когда в статическом кластере (заданном в config) временно не оставалось доступных узлов. #102661 (Kseniia Sumarokova).
- Исправлен неверный вывод типа данных Date при переполнении после поправки на часовой пояс. Закрывает #102601. #102674 (Pavel Kruglov).
- Исправлено бесконечное зависание
SYSTEM WAIT VIEW, если refreshable materialized view удаляется в процессе ожидания. #102681 (Nikolay Degterinsky).
- Исправлена ошибка в
CASE с выражением Dynamic, из-за которой для всех строк возвращался ELSE. Закрывает #102511. #102684 (Pavel Kruglov).
- Исправлена сериализация уплощенного типа Dynamic для бинарно закодированных типов данных. Закрывает #101911. #102692 (Pavel Kruglov).
- Исправлена проблема, из-за которой format_schema_source=‘query’ молча игнорировал результаты, содержащие несколько строк. Закрывает #101905. #102698 (Pavel Kruglov).
- Передаётся фактический код выхода через SSH-клиент вместо того, чтобы сопоставлять все ошибки с
1. Закрывает #101741. #102700 (Konstantin Bogdanov).
- Исправлена потеря HTTP-заголовков в обработчиках динамических/предопределённых запросов. Закрывает #101846. #102706 (Konstantin Bogdanov).
- Добавлена поправка на пуассоновское сэмплирование для свёрнутых профилей кучи jemalloc, чтобы привести их в соответствие с выводом jeprof. Ранее свёрнутый формат занижал фактические объёмы выделения памяти, поскольку не учитывал вероятность сэмплирования. #102759 (Antonio Andelic).
- Исправлен сбой в функции
hasPhrase при аргументе NULL. #102802 (Nikita Taranov).
- Исправлен сбой сервера (SIGSEGV) при чтении файлов Avro с рекурсивными схемами, содержащими циклические символьные ссылки на типы. Теперь такие схемы выявляются и отклоняются с понятным сообщением об ошибке, а не приводят к аварийному завершению. #102853 (Groene AI).
- Исправлен сбой сервера (assertion
LOGICAL_ERROR), возникавший, когда функция, применяемая к столбцу Variant, достигала лимита памяти или вызывала другое исключение, не связанное с преобразованием типов, при приведении результата в FunctionVariantAdaptor. Теперь исключение корректно пробрасывается, а не ошибочно классифицируется как внутренняя ошибка. #102855 (Groene AI).
- Исправлен сбой сервера в отладочных сборках и сборках с sanitizer при возникновении
std::length_error во время автоматического определения схемы (например, из-за экстремальных значений input_format_msgpack_number_of_columns или некорректных входных данных). #102859 (Groene AI).
- Исправлено представление null при сериализации реплицируемых и разреженных столбцов: теперь оно учитывает настройки (например, format_tsv_null_representation). #102888 (Hechem Selmi).
- Бэкпортировано в #103499: исправлена проблема, из-за которой запросы к S3 завершались ошибкой
ios_base::clear: unspecified iostream_category error вместо повторной попытки; причина была в том, что Poco BufferedStreamBuf::flushBuffer не обрабатывал короткие записи на уровне socket. #102894 (Sema Checherinda).
- Исправлена ошибка, из-за которой оптимизации
minmax_count_projection и тривиального COUNT(*) навсегда отключались после легковесного удаления, даже если все части с маской легковесного удаления уже были слиты. #102900 (Anton Popov).
- Исправлены случайные падения jemalloc из-за LTO. #102913 (Azat Khuzhin).
- Оптимизировано преобразование OR-цепочек в IN в политиках доступа к строкам в новом анализаторе. #102915 (Azat Khuzhin).
- Исправлено повреждение метаданных jemalloc, вызванное освобождением кэша страниц с неправильным выравниванием, что могло приводить к аварийным завершениям. #102918 (Azat Khuzhin).
- Обычные INSERT без materialized view больше не запрашивают чрезмерное количество слотов ConcurrencyControl и потоков (
max_threads вместо max_insert_threads), что предотвращает дефицит слотов CC и лавинообразный рост числа потоков в кластерах с высокой пропускной способностью INSERT. #102961 (Sema Checherinda).
- Повторно введён ArrowMemoryPool, чтобы можно было сгенерировать MEMORY_LIMIT_EXCEEDED и избежать OOM ядра. #102999 (Azat Khuzhin).
- Исправлено игнорирование
cast_string_to_date_time_mode при CAST в Nullable(DateTime). Закрывает #101840. #103035 (Pavel Kruglov).
- Добавлена поддержка столбцов
ALIAS в оптимизации прямого чтения текстового индекса. #103037 (Anton Popov).
- Бэкпортировано в #103454: исправлена ошибка, из-за которой
SELECT DISTINCT незаметно возвращал неполные результаты, когда агрегатная проекция соответствовала запросу, а у некоторых частей таблицы отсутствовали данные проекции (например, если проекцию добавили в таблицу, в которой уже были данные, и MATERIALIZE PROJECTION не запускали). Закрывает #102951. #103052 (Nihal Z. Miaji).
- Исправлены неверные результаты, возвращаемые
WHERE x AND toNullable(N) в таблицах MergeTree, когда N — целое число шире UInt8 (например, 256, 65535, 2147483648 или любое отрицательное целое число). Фильтр ошибочно отбрасывал все строки, потому что splitFilterNodeForAllowedInputs использовал нулевой NULL при преобразовании Nullable-остатка сокращённого AND в булевый тип, из-за чего сравнение превращалось в NULL в рамках трёхзначной логики. #103077 (Groene AI).
- Исправлено некорректное указание типа аргумента в сообщениях об ошибках функций поиска в строках (например,
locate, position), когда аргументы передаются в обратном порядке (locate(needle, haystack) при function_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov).
- Исправлено зависание waitForPause на неопределённое время, когда disableFailPoint вызывается, а ни один поток не приостановлен в failpoint. #103119 (Shaohua Wang).
- Ограничен размер строк в TCP-пакете Hello до аутентификации до 64 КБ и добавлена настройка сервера
handshake_timeout_milliseconds, чтобы ограничить общее время рукопожатия и не позволить неаутентифицированным клиентам потреблять чрезмерный объём памяти или удерживать потоки сколь угодно долго. #103284 (Sema Checherinda).
- Исправлена ошибка в статистике min_value > max_value в Parquet ColumnIndex для столбцов String. #103334 (Saurabh Kumar Ojha).
- Проверка некорректно сформированных уплощённых данных Dynamic в формате Native. #103392 (Pavel Kruglov).
- Заполнение столбца
_time данными из табличной функции url. #103437 (Nikita Taranov).
- Исправлено определение SVE: инструкции SVE больше не используются, если они недоступны. #103568 (Raúl Marín).
Улучшения сборки/тестирования/упаковки
- Зависимость Libstemmer (Snowball) теперь использует более новую версию — v3.0.1. #99256 (Jimmy Aguilar Mena).
- Рандомизированы настройки в clickhouse-test:
use_skip_indexes_for_top_k, use_top_k_dynamic_filtering, query_plan_max_limit_for_top_k_optimization. #91782 (Nikita Fomichev).
- Реализован стресс-тест для функций, проверяющий корректность различных свойств функций. #93543 (Michael Kolupaev).
- Добавлена собственная конфигурация CMake для
llvm-project вместо импорта конфигурации из upstream. #97453 (Konstantin Bogdanov).
- В тестовой инфраструктуре сделали более случайными настройки
optimize_*, чтобы улучшить покрытие этапов оптимизации запросов. #97547 (Alexey Milovidov).
- Используйте тулчейн Rust nightly-2026-03-22. #98602 (Konstantin Bogdanov).
- Используется
wasmtime v42.0.1. #98603 (Konstantin Bogdanov).
- Использование
llvm-project 22.1.1. #98882 (Konstantin Bogdanov).
- Заменили
SANITIZE_COVERAGE (пользовательские обратные вызовы sanitizer, гранулярность на уровне символов) на покрытие на основе исходного кода LLVM (WITH_COVERAGE, -fprofile-instr-generate -fcoverage-mapping) для ночного конвейера покрытия по отдельным тестам. Теперь сервер при запуске считывает собственную карту покрытия из секций ELF и собирает кортежи (file, line_start, line_end) для каждого теста через новую команду SYSTEM SET COVERAGE TEST 'name'. Выбор тестов в таргетированных CI-проверках использует запросы по диапазонам строк к новой таблице CIDB checks_coverage_lines и ранжирует тесты-кандидаты по числу покрываемых ими изменённых строк в diff. #99513 (Nikita Fomichev).
- Исправлена ошибка линковки llvm-libc в сборке с -O0. #100023 (Zheguang Zhao).
- Исправлены два сообщения об ошибках при запуске контейнера, если в конфигурации отсутствовали параметры
logger.log и logger.errorlog (например, когда все сообщения лога должны выводиться в STDOUT/STDERR). #100239 (Simon).
- Предпочтительнее использовать
ld64.lld вместо ld от Apple (cctools-port ld64) для сборок macOS. Это должно значительно сократить время компоновки на Darwin, поскольку ld64 из cctools-port работает очень медленно с -ffunction-sections и -dead_strip. Если ld64.lld недоступен, используется ld. #100275 (Alexey Milovidov).
- Тесты, гарантирующие, что в каталогах не обнаруживаются никакие секретные данные (REST + Glue). #100307 (Konstantin Vedernikov).
- Повторное выполнение недавно изменённых тестов с разными случайными настройками. #100385 (Alexey Milovidov).
- Отслеживание зависимостей файлов
#embed в CMake и включение режима depend в ccache для корректной пересборки. #100411 (Alexey Milovidov).
- Добавлены тесты на корректность для запросов TPC-H. #100580 (Raufs Dunamalijevs).
- Используется
aws-sdk-cpp 1.11.771. #100582 (Konstantin Bogdanov).
- XML-файлы тестов производительности теперь могут ссылаться на внешние файлы SQL-запросов и настройки через атрибут file. #100747 (Raufs Dunamalijevs).
- Исправлена компиляция с
-march=x86-64-v4: в LowerUpperImpl.h добавлен отсутствующий include TargetSpecific.h. #100932 (Alexey Milovidov).
- Исправлена сборка на Gentoo за счёт добавления —no-default-config в cxxflags. #100973 (Isak Ellmer).
- Добавлен
utils/auto-bisect/ — shell-фреймворк для бисекции, который загружает готовые бинарные файлы CI и запускает пользовательский тестовый скрипт, чтобы найти первый коммит, в котором появилась регрессия, без необходимости локальной сборки. #100989 (Nikita Fomichev).
- ThinLTO в CMake теперь по умолчанию отключён, чтобы в локальных сборках разработчиков он больше не включался неявно. Это не влияет на релизные сборки CI, поскольку в них параметр
-DENABLE_THINLTO=1 передаётся явно. #101041 (Alexey Milovidov).
- В набор тестов производительности добавлен бенчмарк TPC-DS SF1. #101209 (Raufs Dunamalijevs).
- Добавлены тесты без сохранения состояния для легковесных удалений в MergeTree, охватывающие: жизненный цикл флага
has_lightweight_delete, корректность COUNT(*) с optimize_trivial_count_query, целостность столбцов MATERIALIZED/DEFAULT, восстановление флага в ReplicatedMergeTree, read_in_order с удалёнными строками, несколько циклов удаления и слияния, скрытие столбца _row_exists, различные предикаты и применение RBAC к ALTER DELETE. #101792 (Nikita Fomichev).
- Теперь для тегированных релизов публикуются distroless Docker-образы в вариантах ubuntu и alpine. #101941 (Rahul Nair).
- Трассировки стека теперь показывают чистые относительные пути (например,
src/Common/Exception.cpp) вместо путей, засорённых каталогом сборки (например, ./ci/tmp/fast_build/./src/Common/Exception.cpp). #102000 (Raúl Marín).
- Добавлена проверка стиля CI, отклоняющая файлы размером более 5 МБ, закоммиченные в репозиторий, со списком разрешённых исключений для существующих корректных тестовых данных. Удалён неиспользуемый файл
zookeeper_log.parquet размером 14 МБ. #102080 (Raúl Marín).
- Удалено ~400 неиспользуемых директив
#include из заголовочных файлов, что сокращает время компиляции. #102585 (Raúl Marín).
- Используется
wasmtime v43.0.1. #102603 (Konstantin Bogdanov).
- Используется
openssl 3.5.6. #102606 (Konstantin Bogdanov).
- Используйте
xz 5.8.3. #102607 (Konstantin Bogdanov).
- Базовый distroless Docker-образ обновлён с Debian 12 (glibc 2.36, OpenSSL 3.0) до Debian 13 (glibc 2.41, OpenSSL 3.5), что свело поверхность CVE к нулю достижимых уязвимостей. #101678 (Rahul Nair).
обратно несовместимое изменение
- Понижение версии после обновления может привести к потере данных. Версии сериализации типов данных теперь распространяются на вложенные типы данных. Например, раньше версия сериализации String
with_size_stream применялась только к столбцам String верхнего уровня и элементам Tuple. Теперь она применяется к любому типу String внутри любого вложенного типа, такого как Array/Map/Variant/JSON/и т. д. Это поведение управляется настройкой MergeTree propagate_types_serialization_versions_to_nested_types, которая теперь включена по умолчанию. После этого изменения вновь созданные части данных не могут читаться старыми версиями, но старые части без проблем читаются новой версией. Обновление безопасно, а вот понижение версии — нет: если вам потребуется откатиться после обновления до 26.3, данные, записанные версией 26.3 в столбцы с вложенными типами, будут нечитаемы! Подробности см. в #101429. #94859 (Pavel Kruglov).
- Удалён тип индекса пропуска данных
hypothesis. Это была малоизвестная экспериментальная возможность с ограниченной практической ценностью. При создании таблиц с INDEX ... TYPE hypothesis теперь будет возникать ошибка. #96874 (Alexey Milovidov).
- Удалена экспериментальная функция
detectProgrammingLanguage. #99567 (Alexey Milovidov).
- Исправлен приоритет оператора
NOT в соответствии со стандартом SQL: теперь NOT имеет более низкий приоритет, чем IS NULL, BETWEEN, LIKE и арифметические операторы. Например, NOT (x) IS NULL теперь разбирается как NOT (x IS NULL), а не как (NOT x) IS NULL. Это может изменить результат запросов, которые зависели от прежнего (нестандартного) поведения. #97680 (Alexey Milovidov).
- Исправляет метаданные обычных проекций, чтобы проекции с ключами сортировки по нескольким столбцам распознавались корректно. Основано на #90429. #91352 (Amos Bird).
- Исправлены файлы индекса пропуска данных, которые не учитывали настройку replace_long_file_name_to_hash, из-за чего возникали ошибки “Имя файла слишком длинное” и нарушалось чтение индексов с длинными именами. Теперь имена файлов индекса пропуска данных хешируются, если они превышают max_file_name_length, аналогично файлам столбцов. Изменение обратно совместимо (новые серверы читают старые части), но при откате версии (или если во время rolling-обновления используются старые серверы) индексы с длинными именами могут игнорироваться. #97128 (Raúl Marín).
- async insert теперь включён по умолчанию. Теперь ClickHouse по умолчанию будет объединять все небольшие вставки в батчи. Этот параметр задаётся через compatibility. Если установить
compatibility=<version less than 26.2>, то значением по умолчанию останется прежнее — false. Вы можете включать и отключать async inserts на нескольких уровнях: в конфигурации профилей пользователей, для сеанса, для запроса или для таблицы семейства MergeTree. #97590 (Sema Checherinda).
- Изменено значение
mysql_datatypes_support_level по умолчанию: вместо пустого теперь используется decimal,datetime64,date2Date32, что по умолчанию обеспечивает корректное сопоставление MySQL DATE с Date32, DECIMAL/NUMERIC — с Decimal, а DATETIME/TIMESTAMP с точностью — с DateTime64. Ранее столбцы MySQL DATE сопоставлялись с Date, который не может представлять даты до 1970-01-01, что приводило к повреждению данных. #97716 (Alexey Milovidov).
- Поддержка массива имён частей вместо regexp для
mergeTreeAnalyzeIndexes{,UUID}, поскольку regexp работает медленно (экспериментальная возможность). #98474 (Azat Khuzhin).
- Изменено значение
stderr_reaction по умолчанию с throw на log_last для исполняемых UDF. UDF, записывающие предупреждения в stderr, больше не завершаются с ошибкой, если код выхода равен 0. Исключения, связанные с кодом выхода, теперь включают содержимое stderr. #99232 (Xu Jia).
- Добавлена сериализация Map по бакетам для столбцов Map в MergeTree (
map_serialization_version = 'with_buckets'). Ключи распределяются по бакетам на основе хеша, так что при чтении одного ключа (m['key']) считывается только один бакет, а не весь столбец, что дает ускорение в 2–49 раз для lookup по одному ключу в зависимости от размера Map. Количество бакетов и стратегию бакетирования можно настраивать с помощью новых настроек MergeTree: map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient и map_buckets_min_avg_size. #99200 (Pavel Kruglov).
- Добавлена поддержка материализованных CTE. Это позволяет вычислять CTE только один раз во время выполнения запроса и сохранять их результаты во временных таблицах. Закрывает #53449. #94849 (Dmitry Novik).
- Разрешена поддержка некоторых стандартных SQL-функций без скобок для совместимости, например
NOW. Закрывает #52102. #95949 (Aly Kafoury).
- Теперь функцию natural sort key можно использовать как
naturalSortKey(s). #90322 (Nazarii Piontko).
- Теперь для функций JSONExtract можно использовать нативный ввод JSON/Object. Закрывает #88370. #96711 (Fisnik Kastrati).
- Если параметр запроса имеет тип
Nullable и не задан, мы будем считать, что его значение — NULL. #93869 (Vikash Kumar).
- Добавлена поддержка дополнительного ZooKeeper для базы данных
Replicated. #95590 (RinChanNOW).
- Поддержка функции
has для типа JSON, чтобы проверять существование пути, аналогично Map. #96927 (DQ).
- Добавлена табличная функция
mergeTreeTextIndex(database, table, index), которая позволяет читать данные напрямую из текстового индекса. Эту функцию можно использовать для интроспекции или выполнения агрегаций на основе данных текстового индекса. #97003 (Anton Popov).
- Добавлена настройка MergeTree
table_readonly, позволяющая помечать таблицы как только для чтения, чтобы предотвратить вставку и другие изменения. #97652 (Alexey Milovidov).
- Добавлена новая настройка
use_partition_pruning и алиас use_partition_key. Установите значение false, чтобы отключить отсечение партиций по ключу партиционирования. #97888 (Nihal Z. Miaji).
- Реализована поддержка
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') для таблиц Iceberg. #97904 (murphy-4o). #99130
- Для каждой записи
type=http в <protocols> теперь можно указать пользовательский ключ <handlers>, указывающий на отдельный раздел config <http_handlers_*>, что позволяет задавать разные правила HTTP-маршрутизации для разных портов. #98414 (Amos Bird).
- Добавлена опция
pretty=1 в EXPLAIN для вывода в виде дерева с отступами, а также compact=1 для сворачивания шагов Expression, что делает планы запросов более читаемыми. #98500 (Kirill Kopnev).
- Добавлена настройка сервера
restore_access_entities_with_current_grants. Когда она включена, у пользователей/ролей, восстанавливаемых из резервных копий, привилегии ограничиваются тем, какие привилегии пользователь, выполняющий восстановление, имеет право выдавать (та же семантика, что и у GRANT CURRENT GRANTS), вместо завершения с ошибкой ACCESS_DENIED. #98795 (pufit).
- Добавлены функции
caseFoldUTF8 и removeDiacriticsUTF8 для свёртки регистра Unicode и удаления диакритических знаков. #98973 (George Larionov).
- Добавлена строковая функция
normalizeUTF8NFKCCasefold для Unicode-нормализации NFKC_Casefold, которая сочетает нормализацию NFKC со свёрткой регистра. #99276 (George Larionov).
- Добавлен токенизатор
unicode_word для полнотекстовых индексов и функции tokens. Он разбивает текст по правилам границ слов Unicode: ASCII-слова могут включать символы-соединители (подчёркивание, двоеточие, точка, одинарная кавычка), а символы Unicode вне ASCII становятся односимвольными токенами. Примечание: в версии 26.3 этот токенизатор принимается только под именем unicode_word; в версии 26.4 он был переименован в asciiCJK. #99357 (Amos Bird).
- Добавлены настройки
max_skip_unavailable_shards_num и max_skip_unavailable_shards_ratio, чтобы ограничить число сегментов, которые можно незаметно пропустить, когда включен skip_unavailable_shards. Если число или доля недоступных сегментов превышает заданный порог, генерируется исключение вместо молчаливого возврата неполных результатов. #99369 (Alexey Milovidov).
- Теперь можно использовать ключевое слово
SOME в выражениях с подзапросами. Оно работает так же, как ANY. #99842 (Artem Kytkin).
- Добавлена настройка
output_format_trim_fixed_string, которая удаляет завершающие null-байты из значений FixedString в текстовых форматах вывода. #97558 (NeedmeFordev).
- Добавлена поддержка заключённых в скобки выражений JOIN таблиц в предложении FROM, например
SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
- Реализована функция
toDaysInMonth: она возвращает количество дней в месяце для указанной даты. #99227 (Vitaly Baranov).
Экспериментальные возможности
- Добавлена экспериментальная поддержка пользовательских функций (UDF) на базе WebAssembly, позволяющая реализовывать пользовательскую логику функций в WebAssembly и выполнять её внутри ClickHouse. Отдельная благодарность Alexey Smirnov за вклад в поддержку бэкенда Wasmtime. #88747 (Vladimir Cherkasov). Инкрементальные улучшения поддержки WASM UDF. #99373 (Vasily Chekalkin).
- Добавлена поддержка внешних SQL-диалектов с использованием библиотеки
polyglot. #99496 (Alexey Milovidov).
- Добавлен кодек сжатия чисел с плавающей точкой
ALP (без fallback-механизма ALP_rd для несжимаемых значений double). #91362 (Nazarii Piontko).
- Добавлены экспериментальные ленивые подсказки типов для столбцов
JSON. При включении через allow_experimental_json_lazy_type_hints команда ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName), которая только добавляет или изменяет подсказки типов, выполняется мгновенно как операция, затрагивающая только метаданные, без перезаписи исторических данных. Подсказки типов применяются во время выполнения запроса для старых частей и материализуются во время INSERT и фоновых слияний. #97412 (tanner-bruce).
- Включено параллельное чтение из движка таблицы YTsaurus. #97343 (MikhailBurdukov).
- Повышена производительность озер данных. В предыдущих версиях при чтении из объектного хранилища конвейер не масштабировался по числу потоков обработки. Это дает прирост производительности на порядки (~40x) на многоядерных машинах. #99548 (Alexey Milovidov).
- Теперь связь между
enable_parallel_replicas и automatic_parallel_replicas_mode такова. Запрос может использовать параллельные реплики, только если enable_parallel_replicas > 0. Кроме того, если automatic_parallel_replicas_mode=1, решение о том, использовать ли параллельные реплики, принимается на этапе планирования на основе ранее собранной статистики. Если automatic_parallel_replicas_mode=0, параллельные реплики будут использоваться для всех поддерживаемых запросов независимо от наличия статистики. Одно из заметных исключений — распределённый insert-select с параллельными репликами: в этом случае запросы всегда будут выполняться так, как если бы automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
- Разрешено отсечение партиций, если предикат содержит любой оператор сравнения (
=, <, >, !=), а ключ партиционирования обёрнут в детерминированную цепочку функций (например, при PARTITION BY x предикаты вида cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026 или toYYYYMM(x) != 2026 будут использовать ключ партиционирования для отсечения). Закрывает #28800. #98432 (Nihal Z. Miaji).
- Разрешена оптимизация чтения в порядке сортировки и отсечение по первичному ключу, если целевой тип
CAST — Nullable, а преобразование монотонно; например, при PRIMARY KEY x ClickHouse может использовать оптимизацию чтения в порядке сортировки для ORDER BY x::Nullable(UInt64) и отсечение по первичному ключу для таких предикатов, как WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
- Теперь поддерживаются отсечение по индексу и pushdown фильтров, когда целочисленный столбец сравнивается с литералом с плавающей запятой; например, предикаты вида
WHERE x < 10.5 теперь могут использовать первичный ключ для отсечения, а фильтры вроде prime < 1e9 или number < 1e5 теперь проталкиваются в табличные функции primes() и numbers() вместо того, чтобы приводить к неограниченному выполнению. Закрывает #85167. #98516 (Nihal Z. Miaji).
- Добавлен новый SLRU-кэш для метаданных Parquet, который повышает производительность чтения, устраняя необходимость повторно загружать файлы только для чтения метаданных. #98140 (Grant Holly).
- Добавлена возможность менять местами стороны ANTI-, SEMI- и FULL JOIN на основе статистики оптимизатора. #97498 (Hechem Selmi).
- Оптимизирован пропуск гранул для
pointInPolygon при работе с большими полигонами, а также исправлена ошибка, из-за которой анализ индекса pointInPolygon генерировал исключение при отсечении по первичному ключу. #91633 (Nihal Z. Miaji).
- Повышена производительность функции
levenshteinDistance. #94543 (Joanna Hulboj).
- Оптимизировано преобразование батчей типа Decimal за счёт отказа от вызовов функций для каждого элемента. #95923 (Konstantin Bogdanov).
- Таблицы Iceberg теперь поддерживают асинхронную предзагрузку metadata через настройку таблицы
iceberg_metadata_async_prefetch_period_ms, которая периодически заранее заполняет кэш metadata. Кроме того, настройка запроса iceberg_metadata_staleness_ms позволяет запросам SELECT использовать кэшированные metadata, если они не старше указанного порога устаревания, что исключает обращения к каталогу Iceberg при обработке запроса. #96191 (Arsen Muk).
S3Queue в режиме ordered использует S3 ListObjectsV2 StartAfter, чтобы не выполнять повторный вывод всей истории префикса, уменьшая число вызовов ListObjects. #96370 (Venkata Vineel ).
- Снижено использование памяти при дедупликации вставок. В общем случае для дедупликации нужен исходный блок, но для sync insert можно обойтись без него и тем самым заметно сократить расход памяти. #96661 (Sema Checherinda).
- Использовать зависящее от архитектуры значение размера строки кэша вместо жёстко заданного значения 64. #97357 (Nikita Taranov).
- Незначительно оптимизировано чтение из словаря текстового индекса, что повысило общую производительность анализа текстового индекса. #97519 (Anton Popov).
- Ускорена декомпрессия
LZ4 для 16-байтных блоков на ARM. #97774 (Raúl Marín).
- Переработана токенизация: добавлен новый высокопроизводительный интерфейс, заменяющий старый API в стиле итератора, с поддержкой SIMD и токенизаторов с сохранением состояния. Часть #90268. #97871 (Amos Bird).
- Повышена производительность анализа текстового индекса для запросов с составными условиями, включающими как индексированные, так и неиндексированные столбцы. Ранее в таких случаях оптимизация раннего выхода при анализе индекса была ошибочно отключена. #98096 (Anton Popov).
- Повышена производительность запросов с константными выражениями, генерирующими очень длинные массивы или значения типа Map. #98287 (Alexey Milovidov).
- Исправлен анализ условий ключа для
DateTime64 в первичных ключах при сравнении с целочисленными константами, из-за чего ранее не выполнялось отсечение гранул. #98410 (Amos Bird).
- Параметр
optimize_syntax_fuse_functions по умолчанию включён. #98424 (Alexey Milovidov).
- Оптимизирована агрегатная функция
avgWeighted: использование локальных аккумуляторов вместо построчной передачи через агрегатное состояние повышает производительность до 27% для входных данных типа Nullable. #98793 (Antonio Andelic).
- Повышает производительность и снижает использование памяти для параллельных оконных функций в некоторых сценариях, а также для рабочих нагрузок
arrayFold с большими массивами. Это также может уменьшить давление page fault и повысить стабильность затронутых запросов при жёстких ограничениях по памяти. #98892 (filimonov).
- Повышена производительность слияний с сортировкой. #99013 (Artem Zuikov).
- Оптимизация
INTERSECT ALL и EXCEPT ALL. #99097 (Raufs Dunamalijevs).
- Добавлена поддержка оптимизации
read_in_order_use_virtual_row для чтения в обратном порядке. #99198 (Vladimir Cherkasov).
- Снижена конкуренция за кэш в
RIGHT и FULL JOIN-ах за счёт проверки того, установлен ли JoinUsedFlags, перед записью. #99274 (Hechem Selmi).
- Оптимизирован
PrefetchingHelper::calcPrefetchLookAhead за счёт замены вычислений с плавающей запятой на чисто целочисленную арифметику, что улучшает размещение в кэше инструкций и снижает накладные расходы в циклах агрегации. #99327 (Riyane El Qoqui).
- Снижено потребление памяти в Keeper за счёт замены
absl::flat_hash_set на CompactChildrenSet для хранения дочерних узлов. Новый контейнер хранит 0–1 дочерний узел inline, без выделения памяти в куче, что характерно для большинства узлов Keeper. Это уменьшает размер KeeperMemNode со 144 до 128 байт. #99860 (Antonio Andelic).
- Агрегатные проекции теперь корректно поддерживаются в представлениях. Исправлено #32753. #88798 (Amos Bird).
- Реализована оптимизация преобразования OUTER JOIN в INNER JOIN при использовании
join_use_nulls. Закрывает #90978. #95968 (Vladimir Cherkasov).
- Улучшено чтение подстолбцов благодаря корректному вычислению размеров перед чтением. Это снижает использование памяти и ускоряет чтение подстолбцов. #96251 (Pavel Kruglov).
- Кэши меток, несжатых данных и страниц переведены на использование отдельной arena jemalloc, чтобы избежать фрагментации памяти, когда кратковременные выделения памяти, например для queries и HTTP-запросов, смешиваются с более долгоживущими выделениями для кэшей. #96812 (Seva Potapov). #98812. #99021
- Таблицы с правилами
DELETE TTL теперь могут использовать алгоритм Вертикального слияния. #97332 (murphy-4o).
- Индексы пропуска данных теперь применяются при распределённом анализе индексов. #97767 (Azat Khuzhin).
- Метки вторичных индексов теперь заранее прогреваются, если включена настройка
prewarm_mark_cache (они загружаются в кэш меток индекса во время получения частей данных и при запуске таблицы). #97772 (Anton Popov).
- Снижено число блокировок при управлении доступом. #97894 (Nikita Taranov).
- Если включен apply_row_policy_after_final или apply_prewhere_after_final, составные условия с AND в политиках строкового доступа и PREWHERE теперь раскладываются так, чтобы извлекать атомарные условия по ключу сортировки для анализа индекса первичного ключа. Ранее, если отложенный фильтр содержал смесь предикатов по ключу сортировки и не по ключу сортировки (например, x > 1 AND y != ‘foo’), всё выражение исключалось из анализа индекса. Теперь атомарные условия по ключу сортировки (например, x > 1) извлекаются и используются для отсечения гранул, в том числе из вложенных выражений с AND. #98513 (Yarik Briukhovetskyi).
- Уменьшена конкуренция за блокировку в MergeTreeBackgroundExecutor за счёт освобождения ресурсов задачи без захвата блокировки. Закрывает #93620. #98604 (Dmitry Novik).
- Исправлено чрезмерное использование памяти (~514 MiB) при автоопределении формата во время чтения данных не в формате Arrow (например, JSON из
url или file без явно указанного формата), вызванное тем, что средство чтения ArrowStream ошибочно интерпретировало первые байты как чрезмерно большую длину metadata. #98893 (Konstantin Bogdanov).
- Добавлена возможность разбирать файлы GeoParquet, содержащие разные типы Geo в одном и том же столбце. #97851 (Mark Needham).
- Добавлена SQL-функция
tokensForLikePattern, которая разбивает шаблоны LIKE на токены с учетом семантики подстановочных символов: % и _ трактуются как подстановочные символы, экранированные подстановочные символы (\%, \_) трактуются как литералы, а токены, примыкающие к неэкранированным подстановочным символам, отбрасываются. #97872 (Amos Bird).
- Добавлен заполнитель
{_schema_hash} для движка таблицы S3, добавляющий в путь S3 хеш определений столбцов таблицы. #98265 (Miсhael Stetsyuk).
SymbolIndex, addressToSymbol, system.symbols и buildId теперь работают в macOS благодаря разбору таблиц символов Mach-O. #99014 (Alexey Milovidov).
- Таблица
system.stack_trace теперь работает в macOS, позволяя просматривать трассировки стека всех потоков сервера. #98982 (Alexey Milovidov).
- Добавлена опция LDAP-конфигурации для каждого сервера
<follow_referrals> (по умолчанию false), позволяющая управлять тем, переходит ли LDAP-клиент по рефералам. Отключение перехода по рефералам позволяет избежать тайм-аутов и зависаний при поиске от base DN корня домена Active Directory. Сообщения лога, связанные с рефералами, перенесены из warn в trace. #96765 (paf91).
- Теперь в таблице query_log в новом столбце
skip_indices мы отслеживаем все индексы пропуска данных, которые использовались при выполнении запроса. Исправляет #78676. Исходный автор — @pheepa. #87862 (Grant Holly).
- Подсказки ACCESS_DENIED больше не раскрывают имена столбцов, если пользователь не может видеть все необходимые столбцы; имена базы данных/таблицы по-прежнему видны в подсказке. #91067 (filimonov).
- Добавлен отдельный поток очистки для MergeTree, чтобы избежать задержек очистки при высокой нагрузке на слияние. Это устраняет #86181. #91574 (Amos Bird).
- Перезагружать конфигурацию кластера, если изменились IP-адреса hostname локального сервера, а не какого-либо хоста. Исправляет #81215, #70156 и #65268. #93726 (Zhigao Hong).
- Обеспечена корректная оптимизация агрегатных функций в запросах GROUPING SETS с помощью optimize_aggregators_of_group_by_keys. #93935 (Xiaozhe Yu).
- Keeper-bench: отображать ошибки в метриках и генерировать JSON-файл с метриками для режима —input-request-log. #95748 (Mohammad Lareb Zafar).
- В CREATE USER добавлена новая клауза ROLE. #97074 (Vitaly Baranov).
- Теперь можно задавать настройки internal_replication для кластера, созданного с помощью базы данных Replicated. #97228 (Pervakov Grigorii).
- новая настройка
allow_nullable_tuple_in_extracted_subcolumns определяет, будут ли извлечённые подстолбцы Tuple(...) из Tuple, Variant, Dynamic и JSON возвращаться как Nullable(Tuple(...)) (NULL для отсутствующих строк) или как Tuple(...) (значения кортежа по умолчанию для отсутствующих строк). По умолчанию эта настройка отключена; изменить её можно только перезапуском сервера. #97299 (Nihal Z. Miaji).
- Добавлена информация об отложенных фильтрах в виде отдельного элемента в выводе запроса EXPLAIN (при использовании Row Policies/PREWHERE с FINAL). Связано: #91065. #97374 (Yarik Briukhovetskyi).
- Параметр
type_json_allow_duplicated_key_with_literal_and_nested_object теперь включён по умолчанию. Это позволяет избежать ошибок о дублирующихся ключах при разборе JSON, таких как {"a" : 42, "a" : {"b" : 42}}, которые ClickHouse может формировать из исходных JSON-данных {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
- Улучшения Keeper:
find_super_nodes — очень полезная команда для отладки неожиданного роста количества узлов в Keeper. К сожалению, если суперузлов несколько, найти больше одного почти невозможно, потому что команда навсегда зависает при обходе дочерних узлов первого найденного суперузла. Этот PR запрещает обход дочерних узлов суперузлов. #97819 (pufit).
- Базовая поддержка автодополнения для
clickhouse-keeper-client. #97828 (Konstantin Bogdanov).
- Сбрасывать буферы асинхронного логирования при аварийном завершении. #97836 (Azat Khuzhin).
- Возможность impersonate теперь включена по умолчанию (см. EXECUTE AS target_user). #97870 (Vitaly Baranov).
- Улучшено прерывание запросов для движка таблицы SQLite с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #97944 (Roman Vasin).
- Добавлена настройка сервера
jemalloc_profiler_sampling_rate для управления lg_prof_sample в jemalloc; она также доступна как асинхронная метрика jemalloc.prof.lg_sample. #97945 (Antonio Andelic).
- Добавлена поддержка весов в реализации ограниченной очереди с конкурентным доступом. #97962 (Daniil Ivanik).
- Добавлен
sslmode в список допустимых ключей для источников словарей PostgreSQL. Ранее sslmode отсутствовал в списке допустимых значений dictionary_allowed_keys в PostgreSQLDictionarySource.cpp, из-за чего было невозможно настроить режим SSL для подключений словарей к PostgreSQL. В результате словари не могли подключаться к серверам PostgreSQL, где требуется SSL (например, к AWS RDS, где SSL обязателен по умолчанию), поскольку подключение не проходило согласование TLS, а сервер отклонял незашифрованный резервный вариант. #98014 (mcalfin).
- Показывать понятную ошибку “no such file” при передаче несуществующего пути к файлу в
clickhouse или clickhouse-local вместо сбивающего с толку общего сообщения. #98048 (Raúl Marín).
- Текстовые индексы теперь можно создавать для столбцов
Nullable([Fixed]String) и Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
- Не удаляйте именованные коллекции, от которых зависят источники словарей. #98127 (Pablo Marcos).
- Включена поддержка алгоритма JOIN
grace_hash для запросов с итогами. #98144 (János Benjamin Antal).
- Раннее прекращение фоновых слияний при DROP DATABASE для обычного shared merge tree. #98161 (Shaohua Wang).
- Улучшена отмена запросов к MongoDB и MySQL с помощью KILL QUERY и сочетания Ctrl+C в clickhouse-client. #98187 (Roman Vasin).
- Удалён NetlinkMetricsProvider, и для сбора метрик taskstats по отдельным потокам теперь используется только procfs. Сбор через Netlink создаёт проблемы в контейнеризированных средах и сильнее ухудшает tail latency при конкуренции за ресурсы. #98229 (Amos Bird).
- Переработана обработка файлов манифеста в Iceberg, чтобы устранить проблемы с кэшированием файлов манифеста. #98231 (Daniil Ivanik).
- Теперь мы учитываем случаи, когда ключ сортировки таблицы может быть выражением вроде
toDate(time), и можем решать, не откладывать ли вычисление таких выражений, если они входят в фильтры. #98237 (Yarik Briukhovetskyi).
- Добавлена новая метрика
MaxAllocatedEphemeralLockSequentialNumber — максимальный последовательный номер, выделенный для эфемерных lock znode в ZooKeeper. #98243 (Miсhael Stetsyuk).
- ClickStack обновлён до версии 2.20.0. #98252 (Aaron Knudtson).
- Добавлено новое событие профиля
KeeperRequestTotalWithSubrequests, которое учитывает каждый подзапрос в составе мультизапроса отдельно, обеспечивая лучшую видимость фактической рабочей нагрузки Keeper. Существующее событие KeeperRequestTotal по-прежнему учитывает каждый мультизапрос как один запрос. #98348 (Antonio Andelic).
SYSTEM RELOAD DICTIONARIES теперь перезагружает словари в порядке топологической сортировки, поэтому словари, использующие другие словари в качестве источника, после перезагрузки получают актуальные данные. #98356 (Alexey Milovidov).
- Перезапускайте кеш статистики после изменения настройки MergeTree. #98520 (Han Fei).
- Только “живые” реплики (доступные для подключения) участвуют в распределённом анализе индексов. #98521 (Azat Khuzhin).
- Добавлена настройка
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (по умолчанию отключена/разрешена), которая запрещает использовать профили настроек, заданные в конфигурации (кроме профиля default), для пользователей, определённых через SQL. #98662 (Alexander Tokmakov).
- Число узлов, используемых в автоматической эвристике параллельных реплик, теперь ограничивается фактическим числом узлов в кластере (а не только настройкой
max_parallel_replicas). #98668 (Nikita Taranov).
- Реализованы хеджированные запросы и асинхронное чтение для распределённого анализа индексов. #98724 (Azat Khuzhin).
- Для десериализации бинарных состояний
AggregateFunction теперь необходимо полностью прочитать входные данные. Если в конце присутствуют лишние байты, ClickHouse генерирует исключение вместо того, чтобы принимать некорректные данные состояния. #98786 (Nihal Z. Miaji).
- Сделать так, чтобы TRUNCATE DATABASE поддерживал отмену запроса. #98828 (Shaohua Wang).
- Улучшен
keeper-bench: добавлены конвейерная обработка запросов, период прогрева, статистика по каждой операции, воспроизводимые seed и улучшенная обработка ошибок. #98906 (Antonio Andelic).
- Поддержка предложения SAMPLE при распределённом анализе индексов. #98931 (Azat Khuzhin).
- Показывать заголовок диаграммы на панели мониторинга, даже если запрос возвращает пустой результат или завершается ошибкой. #98975 (Yash ).
- Сообщения об ошибках анализатора больше не перечисляют все столбцы таблицы (что могло приводить к исключениям размером более 150 КБ). Теперь списки столбцов ограничиваются 10 элементами. #99002 (Yash ).
- Корректно возвращается статистика столбцов из подзапросов с JOIN, чтобы родительский запрос мог использовать её для изменения порядка JOIN. #99096 (Alexander Gololobov).
- Помечать сеанс ZooKeeper как истёкший сразу после начала финализации, а не ждать завершения потока отправки. Это позволяет другим потокам без задержки устанавливать новый сеанс. #99102 (Raúl Marín).
- Теперь используется больше математических функций из LLVM-libc:
exp, exp2, expm1, fabs, fabsl, floor, fmodl, log, log2, logf, pow, scalbn, scalbnl, copysignl, nan, nanf, nanl и общие константы explogxf. #99118 (Konstantin Bogdanov).
- Снизили использование памяти и устранили возможное дублирование вывода в collapsed-формате
system.jemalloc_profile_text. #99121 (Antonio Andelic).
- Добавлен столбец
is_subrequest в system.aggregated_zookeeper_log, чтобы отделить отдельные запросы от подзапросов внутри запросов Multi/MultiRead. Ранее подзапросы агрегировались в те же бакеты, что и отдельные запросы, и поскольку каждая подоперация записывалась с общей длительностью мультизапроса, средняя задержка получалась некорректной. Теперь у подзапросов нулевая задержка. #99169 (Miсhael Stetsyuk).
- Разрешена команда
ALTER TABLE MODIFY COLUMN x TTL ... без указания типа столбца. #99208 (Nikolay Degterinsky).
- Пропускаются устаревшие запросы Keeper для сеансов, которые уже отключились, что позволяет избежать лишних обменов с Raft. Число отслеживаемых завершённых сеансов ограничивается настройкой coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic).
- Добавлена поддержка текстового индекса, построенного на
mapValues(map), для оператора IN. #99286 (Anton Popov).
- Поддержка shell-подобного автодополнения в clickhouse keeper-client (автодополнение аргументов в кавычках, то есть
'foo ba', обработка экранированных аргументов, то есть foo\ ba, ls теперь выводит узлы в кавычках, если они содержат пробелы). #99312 (Azat Khuzhin).
- Предотвращено зависание команды Keeper
mntr из-за конфликтов блокировок. #99472 (Antonio Andelic).
- Снизить конкуренцию за блокировки в диспетчере Keeper, вызывая обратные вызовы и обрабатывая запросы на чтение вне области действия мьютекса, а также добавить профилированные lock guard’ы для обсервабилити. #99751 (Antonio Andelic).
- Допускается отсутствие заполнения в конце последнего блока файлов Parquet. #99857 (Seva Potapov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлено сохранение целевого объекта таблицы Alias как зависимости DDL, если он указан не полностью: теперь используется база данных таблицы Alias, а не база данных сеанса. #95175 (Enric Calabuig).
- Исправлены неверный результат или исключение при чтении подстолбцов у столбцов ALIAS. #95408 (Pavel Kruglov).
- Исправлено отсутствие столбца при использовании нестандартного алиаса идентификатора в JOIN со старым анализатором. Исправляет #25594, #47288 и #53263. #95679 (Zhigao Hong).
- Исправлен сбой в функциях диалекта Kusto
bin(), bin_at(), extract() и indexof(), возникавший при передаче пустых аргументов. #95736 (NeedmeFordev).
- Запрещает монтировать local_object_storage (которое используется для озёр данных поверх локальной файловой системы и, возможно, для LocalDisk) где-либо, кроме user_files_path, в clickhouse-client. #96201 (Daniil Ivanik).
- В движке таблицы
DeltaLake исправлена логическая гонка при смене версии снимка и устранены избыточные ресурсоёмкие перезагрузки снимка. #96226 (Kseniia Sumarokova).
- Исправлена логическая ошибка при присоединении части в MergeTree, если между её отсоединением и присоединением происходило несколько последовательных переименований. #96351 (Alexey Milovidov).
- Исправлена ошибка, из-за которой явные настройки, отправленные вместе с
compatibility в том же запросе, могли незаметно игнорироваться, если их значение совпадало со значением по умолчанию на сервере. #97078 (Raufs Dunamalijevs).
- Исправлено поведение клиента: при столкновении
INSERT с параллельным разбором с недопустимыми данными он сообщал об ошибке NETWORK_ERROR вместо фактической ошибки разбора (с правильным номером строки). #97339 (Alexey Milovidov).
- Исправлена ошибка, из-за которой агрегатная функция
sumCount не могла читать сериализованные состояния старого формата после введения Nullable(Tuple). Закрывает #97370. #97502 (Nihal Z. Miaji).
- Исправлено исключение при сравнении кортежей, содержащих элементы типа
Nothing (например, при сравнении с элементами кортежа NULL), при использовании GROUPING SETS и ORDER BY. #97509 (Alexey Milovidov).
- Исправлено недетерминированное вычисление
uncompressed_hash для частей Compact MergeTree при использовании нескольких кодеков сжатия, что могло приводить к некорректной дедупликации. #97522 (Alexey Milovidov).
- Исправлена логическая ошибка, связанная с отсутствием stream при INSERT SELECT с JSON и бакетами в общих данных. Закрывает #97331. #97523 (Pavel Kruglov).
- Исправлены случаи, когда исключения
MEMORY_LIMIT_EXCEEDED во время слияний SummingMergeTree и CoalescingMergeTree ошибочно регистрировались как CORRUPTED_DATA. #97537 (János Benjamin Antal).
- Исправлено исключение “Context has expired” для коррелированных подзапросов, содержащих табличные функции, например
url(). #97544 (Alexey Milovidov).
- Исправлены исключения и некорректное поведение в
optimize_syntax_fuse_functions при работе с агрегатными проекциями, типами Date и сохранением имён столбцов. #97545 (Alexey Milovidov).
- Убрано некорректное переписывание запроса с
replaceRegexpOne на extract, которое приводило к неверным результатам, если регулярное выражение не находило совпадений; также исправлено Исключение при использовании replaceRegexpOne с GROUP BY ... WITH CUBE и group_by_use_nulls=1. #97546 (Alexey Milovidov).
- Исправлено бесконечное зависание
DROP DATABASE при использовании database_atomic_wait_for_drop_and_detach_synchronously, если запрос был принудительно завершён. #97586 (Alexey Milovidov).
- Исправлено:
KILL QUERY не мог завершать запросы, зависшие при генерации WITH FILL, загрузке словаря через dictGet или выполнении ALTER DELETE с mutations_sync=1 на ReplicatedMergeTree. #97589 (Alexey Milovidov).
- Табличная функция
loop вызывала inner_storage->read() напрямую, в обход слоя интерпретатора, где применяются политики уровня строк, привилегии на уровне столбцов и другие проверки безопасности. Это позволяло пользователю, ограниченному политиками уровня строк, читать все строки через loop(table), даже если прямой SELECT не возвращал ни одной строки. #97682 (pufit).
- Исправлено некорректное отсечение партиций при использовании DateTime64 со значениями до эпохи Unix в функции
toDate(). #97746 (Yarik Briukhovetskyi).
- После этого патча
hasPartitionId будет возвращать false, если в наборе data part есть другая партиция с более высоким идентификатором партиции. #97748 (Mikhail Artemenko).
- Исправлены возможные сбои при чтении пустых гранул в расширенных общих данных в JSON. Закрывает #97563. #97778 (Pavel Kruglov).
- Исправлена ошибка
Cannot schedule a file LOGICAL_ERROR при INSERT в Distributed, возникавшая из-за состояния гонки между DROP и INSERT. #97822 (Azat Khuzhin).
- Исправлены аварийное завершение работы сервера ClickHouse и срабатывание assert при вызове
mapContainsKey/mapContainsKeyLike с индексом пропуска данных tokenbf_v1. #97826 (Shankar Iyer).
- Исправлены исключения LOGICAL_ERROR, возникавшие из-за
LowCardinality внутри составных типов (Variant, Dynamic, Tuple) в concatWithSeparator, format, IN-подзапросах, GLOBAL IN и JOIN с runtime-фильтрами. #97831 (Raúl Marín).
- Исправлено Исключение
LOGICAL_ERROR Chunk info was not set for chunk in MergingAggregatedTransform, возникавшее при использовании ARRAY JOIN с table function merge() для нескольких distributed таблиц в сочетании с GROUP BY. #97838 (Raúl Marín).
- Исправлен сбой сервера (
std::terminate), вызванный неперехваченным исключением в деструкторе пула HTTP-соединений, когда при высоком параллелизме достигался жёсткий лимит группы соединений. Исключение HTTP_CONNECTION_LIMIT_REACHED могло пробрасываться из ~PooledConnection при возврате соединения в пул, что приводило к SIGABRT. #97850 (Antonio Andelic).
- Исправлен некорректный результат при использовании алгоритма
grace_hash с неэквивалентными JOIN, когда левый блок не удаётся обработать полностью из-за ограничений на размер результата JOIN. #97866 (János Benjamin Antal).
- Исправлена проблема низкой производительности при сканировании metadata DeltaLake, возникшая после #96686. #97880 (Kseniia Sumarokova).
- Исправлена гонка данных в клиенте ZooKeeper между
sendThread и receiveThread. #97887 (Pablo Marcos).
- Исправлена ошибка, из-за которой было невозможно использовать CTE в распределённых INSERT SELECT. Продолжение https://github.com/ClickHouse/ClickHouse/pull/87789. Закрывает #95837. #97889 (Yarik Briukhovetskyi).
- Исправлено исключение в
CachedOnDiskReadBufferFromFile::readBigAt. Закрывает #97325. #97890 (Kseniia Sumarokova).
- Исправлено исключение
LOGICAL_ERROR в движке Alias при работе с материализованными столбцами, вызванное несоответствием столбцов. Закрывает #97907. #97921 (Kai Zhu).
- Исправлена потеря данных Keeper после перезапуска при использовании Azure Blob Storage с метаданными
s3_plain в качестве хранилища журнала. #97987 (Antonio Andelic).
- Исправлена ошибка JIT-компиляции функции
sign для целочисленных типов с разрядностью выше, чем у Int8 — для значений вне диапазона -128..127 знак мог определяться неверно. #98012 (Alexey Milovidov).
- Исправлены исключение
DUPLICATE_COLUMN и неявное появление NULL при чтении таблиц Delta Lake, использующих режим сопоставления столбцов “name”, с полями struct, имена которых содержат точки (например, STRUCT<`a.foo`: STRING, `b.foo`: STRING>). #98013 (Caio Ishizaka Costa).
- Исправлена мутация после легковесного обновления и при использовании вторичных индексов. #98044 (Raúl Marín).
- Исправлен некорректный результат FINAL-запросов при сочетании индексов пропуска данных по первичному и не по первичному ключу. #98097 (Raúl Marín).
- Обеспечено выполнение проверок прав READ ON FILE для скалярной функции file() и DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
- Исправлен сбой, из-за которого запрос к файлам с glob-шаблоном (например,
file('dir/**', 'LineAsString')) приводил к необрабатываемому исключению файловой системы (STD_EXCEPTION), если каталог содержал битую символическую ссылку. Теперь такие символические ссылки молча пропускаются, и запрос возвращает результаты по всем корректным файлам. #98143 (Mark Andreev).
- Исправлен сбой сегментации при оптимизации плана запроса во время преобразования OUTER JOIN в INNER JOIN с
arrayJoin в выражении фильтра. #98147 (Alexey Milovidov).
- Исправлена ошибка, из-за которой формат
ProtobufList не работал с движком Kafka, поскольку состояние чтения не сбрасывалось между сообщениями. #98151 (Alexey Milovidov).
- Исправлена логическая ошибка в analyzer_compatibility_join_using_top_level_identifier и ARRAY JOIN, закрыт #98164. #98179 (Vladimir Cherkasov).
- Для ответов наблюдения в
aggregated_zookeeper_log теперь задаётся компонент Watch вместо пустого значения. #98202 (Antonio Andelic).
- Если столбцы ключа партиционирования не входят в ключ сортировки, то отсечение партиций может ошибочно пропустить партиции, содержащие строки, которые должны были бы остаться после дедупликации FINAL. #98242 (Yarik Briukhovetskyi).
- Исправлена логическая ошибка “Bad cast from type DB::ColumnConst to DB::ColumnArray” в
kql_array_sort_asc/kql_array_sort_desc при вызове с аргументами в виде константных массивов. #98251 (Alexey Milovidov).
- Исправлен выход за границы при обращении к
ColumnConst::getExtremes, который мог вызывать сбой при включенном extremes = 1. #98263 (Alexey Milovidov).
- Исправлена потенциальная взаимная блокировка, возникавшая, когда две параллельные операции
MOVE PARTITION работают с одной и той же парой таблиц в противоположных направлениях. #98264 (Alexey Milovidov).
- HTTP-сервер теперь возвращает сообщение об ошибке в теле ответа на запросы с ответом 400 Bad Request, вызванные некорректными заголовками, вместо пустого тела. #98268 (Alexey Milovidov).
- Исправлены ошибки, приводившие к некорректным результатам при использовании распределённого анализа индексов (экспериментальная возможность) и кэша условий запроса. #98269 (Azat Khuzhin).
- Исправлено исключение LOGICAL_ERROR “Недопустимый результат двоичного поиска в
MergeTreeSetIndex”, вызванное преобразованием toDate для столбцов ключа, когда данные переходили через границу 65535. #98276 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда RIGHT JOIN, обёрнутый в CROSS JOIN, переставлялся оптимизацией query_plan_join_swap_table в устаревшем коде шага JOIN. #98279 (Alexey Milovidov).
- Добавлена проверка повреждённых данных при десериализации
DDSketch, чтобы предотвратить segfault’ы, исключения, бесконечные циклы и OOM при чтении повреждённых состояний агрегатной функции quantilesDD. #98284 (Alexey Milovidov).
- Исправлен LOGICAL_ERROR “Trying to execute PLACEHOLDER action”, возникавший при обращении к коррелированным столбцам из внешних запросов внутри лямбда-функций, таких как
arrayMap. #98285 (Alexey Milovidov).
- Исправлено исключение «Logical error» в
caseWithExpression, когда выражение CASE включает materialize(NULL) или другие аргументы Nullable(Nothing). #98290 (Alexey Milovidov).
- Исправлено ошибочное исключение преобразования типов при фильтрации по виртуальному столбцу
_table в табличной функции merge. #98291 (Alexey Milovidov).
- Исправлен редкий сбой дедупликации, из-за которого повторные вставки ошибочно дедуплицировались из-за несогласованного порядка очистки каталогов ZooKeeper
blocks/ и deduplication_hashes/. #98293 (Alexey Milovidov).
- Исправлено Исключение, возникавшее при одновременном использовании
ORDER BY ... WITH FILL и LIMIT BY. #98361 (Alexey Milovidov).
- Исправлено скрытое повреждение данных при вставке столбца Parquet/Arrow
Date в столбец Enum — теперь несовместимое преобразование типов корректно отклоняется, вместо того чтобы сохранять недопустимые значения enum. #98364 (Alexey Milovidov).
- Исправлено исключение при чтении файла Arrow со столбцом
Array в таблицу со столбцом Nested. #98365 (Alexey Milovidov).
- Исправлены мутации
MATERIALIZE INDEX и MATERIALIZE PROJECTION, которые застревали, если индекс или проекция удалялись до завершения мутации. #98369 (Alexey Milovidov).
- Исправлено исключение при чтении из
Nullable(Tuple(...)), когда имя элемента Tuple совпадает с подстолбцом null у Nullable. #98372 (Alexey Milovidov).
- Исправлено исключение “Столбец …: у узла дерева запроса нет корректного узла-источника” при выполнении JOIN между таблицей
Merge (оборачивающей таблицу Distributed) и другой таблицей. #98376 (Alexey Milovidov).
- Исправлено некорректное преобразование
Bool из Parquet в FixedString в нативном ридере V3, из-за которого возвращались raw bytes вместо строкового представления. #98378 (Alexey Milovidov).
- Исправлено:
tryGetColumnDescription теперь фильтрует подстолбцы по виду родительского столбца, аналогично другим методам поиска столбцов. #98391 (Alexey Milovidov).
- Принимать учетные данные Base64 без паддинга в HTTP Basic Auth. Некоторые HTTP-клиенты опускают завершающие символы паддинга
= в заголовке Authorization: Basic, что ранее приводило к ошибкам аутентификации. #98392 (Amos Bird).
- Исправлены некорректные результаты отсечения партиций после слияния частей со столбцами ключа партиционирования типа
Nullable, вызванные неверными границами индекса min-max. #98405 (Amos Bird).
- Исправлено редкое Исключение в исполнителе конвейера, которое могло проявляться сообщением
Received signal 6 (только в отладочных сборках), когда расширение конвейера происходило одновременно с отменой запроса. #98428 (Alexey Milovidov).
- Исправлено исключение “Column identifier is already registered” при использовании
count_distinct_optimization с предложением QUALIFY. #98433 (Alexey Milovidov).
- Исправлено исключение “cannot be inside Nullable type”, возникавшее при использовании
IN/NOT IN с аргументами-столбцами типа LowCardinality (например, a NOT IN (b), где a имеет тип LowCardinality(String)). #98443 (Alexey Milovidov).
- Исправлено исключение “Pipeline stuck” в JOIN-операциях
full_sorting_merge, вызванное взаимной блокировкой в PingPongProcessor, возникавшей, когда оптимизация FilterBySetOnTheFly создавала циклическую зависимость с MergeJoinTransform. #98454 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR “Проекция не может увеличить количество строк в блоке”, возникавшее при слиянии частей с TTL, удаляющим все строки, и агрегирующей проекцией с константным ключом GROUP BY. #98458 (Alexey Milovidov).
- Исправлено исключение с логической ошибкой при совместном использовании
CROSS JOIN и INNER JOIN USING. #98459 (Alexey Milovidov).
- Исправлено обращение к нулевому указателю в
dictGetOrDefault, когда аргумент ключа имеет тип Nullable. #98460 (Alexey Milovidov).
- Исправлено исключение в запросах
DISTINCT, возникавшее при использовании агрегатных проекций, если materialize приводил к различиям в типах LowCardinality между запросом и проекцией. #98462 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR, возникавшее при использовании
arrayJoin в выражении фильтра с OUTER JOIN и включенном join_use_nulls. #98464 (Alexey Milovidov).
- Исправлено Исключение из-за логической ошибки “Реплика решила читать в режиме WithOrder, а не в ReverseOrder” при использовании параллельных реплик с
optimize_aggregation_in_order. #98467 (Alexey Milovidov).
- Исправлено отключение Java-клиентов ZooKeeper от ClickHouse Keeper после запроса
addWatch. Java-клиент ожидает 4-байтовое тело ErrorResponse в ответе на addWatch, но Keeper отправлял пустое тело, из-за чего возникало EOFException и разрывался сеанс. Из-за этого переставали работать CuratorCache в Apache Curator и любые Java-приложения, использующие постоянные наблюдения. Исправляет #98079. #98499 (Antonio Andelic).
- Исправлено поведение, при котором метрики Keeper
zk_followers и zk_synced_followers не уменьшались при отказе follower. В четырёхбуквенную команду mntr добавлены новые метрики zk_learners и zk_synced_non_voting_followers. Исправляет #54173. #98504 (Antonio Andelic).
- Исправлено исключение
LOGICAL_ERROR в renameAndCommitEmptyParts, которое могло возникнуть при одновременном выполнении TRUNCATE TABLE и OPTIMIZE TABLE с использованием транзакций MergeTree. #98508 (Alexey Milovidov).
- Исправлено поведение, при котором защищённый raft-порт Keeper игнорировал параметры
cipherList и dhParamsFile из конфигурации openSSL и всегда использовал значения по умолчанию вместо заданных пользователем. Закрывает #51188. #98509 (Antonio Andelic).
- Исправлены вводящие в заблуждение сообщения лога Keeper, такие как “Receiving request for session X took 9963 ms”, где указанное время на самом деле уходило на ожидание в состоянии бездействия в
poll() между heartbeat-сообщениями, а не на выполнение самой операции. Исправление #79026. #98510 (Antonio Andelic).
- Исправлен неожиданный результат при использовании read_in_order_use_virtual_row и монотонных функций; закрыт #97837. #98514 (Vladimir Cherkasov).
- Исправлена ошибка
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' при использовании PREWHERE с подзапросом в IN в таблицах семейства MergeTree. #98522 (Alexey Milovidov).
- Исправлены TCP-соединения Keeper, из-за которых сервер не мог корректно завершить работу, поскольку они не реагировали на сигнал завершения. #98525 (Alexey Milovidov).
- Исправлено исключение “Столбец сортировки не найден среди выходов ActionsDAG” при включенном
query_plan_convert_join_to_in и query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
- Исправлена проблема, из-за которой источник словаря MongoDB не работал с именованными коллекциями. Закрывает #97840. #98528 (Pablo Marcos).
- Исправлен LOGICAL_ERROR, возникавший, если после подстановки параметров Identifier оказывался пустым. #98530 (Pervakov Grigorii).
- Исправлена взаимная блокировка конвейера при одновременном использовании
sort_overflow_mode = 'break' и оконных функций. #98543 (Alexey Milovidov).
- Исправлен откат столбца в движке Buffer при обработке исключения, возникающего при добавлении нового блока. Прежняя логика могла приводить к повреждению состояния столбцов в памяти. #98551 (Pavel Kruglov).
- Исправлено исключение
Bad cast from type ColumnConst to ColumnDynamic при null-safe сравнении (<=> / IS NOT DISTINCT FROM) с константными столбцами Dynamic или Variant и NULL. Также исправлена ошибка, из-за которой IS DISTINCT FROM для Dynamic/Variant при сравнении с NULL всегда ошибочно возвращал 0. #98553 (Alexey Milovidov).
- Исправлено использование текстового индекса вместе с другими индексами пропуска данных. Ранее при одновременном использовании фильтром запроса текстового индекса и других обычных индексов пропуска данных могли возникать логические ошибки, такие как “Trying to get non-existing mark”. #98555 (Anton Popov).
- Исправлена логическая ошибка “TABLE_FUNCTION is not allowed in expression context”, которая возникала, когда табличная функция с псевдонимом использовалась несколько раз в пределах одной и той же области видимости запроса (например, в секциях
PREWHERE и QUALIFY). #98557 (Alexey Milovidov).
- Исправлен распределённый анализ индексов для выражений (а не только для столбцов) в PK (из-за ошибки на удалённых репликах не отфильтровывались избыточные гранулы). #98561 (Azat Khuzhin).
- Запретить удаление столбца, если его подстолбцы используются в выражениях default/alias других столбцов, и использовать анализатор для выражений default при выполнении alter drop column. #98569 (Nikita Mikhaylov).
- Исправлены некорректные повторные попытки выполнения запросов S3 при ошибках, не допускающих повторной попытки (включая
HTTP_CONNECTION_LIMIT_REACHED), в HTTP-клиенте. #98598 (Sema Checherinda).
- Исправлено переполнение Decimal при отсечении партиций с DateTime64. #98628 (Yarik Briukhovetskyi).
- Исправлены две ошибки в JIT-компиляции выражений: ошибка copy-paste в проверке типов
nativeCast, из-за которой ветви приведения integer-to-integer и float-to-float были недостижимы, а также передача некорректного nullptr для TargetMachine в LLVM PassBuilder, из-за чего не регистрировались специфичные для целевой платформы этапы оптимизации. #98660 (Alexey Milovidov).
- Исправлен обход RBAC, который позволял пользователям выполнять DESCRIBE для любой таблицы через
remote(), remoteSecure(), cluster() или clusterAllReplicas(), указывая на localhost, без привилегии SHOW_COLUMNS. #98669 (pufit).
- Исправлено исключение
BAD_GET и некорректные результаты запроса, возникавшие, когда небулево выражение (например, sin(col)) использовалось одновременно в WHERE и SELECT с JOIN из-за того, что оптимизация проталкивания фильтра повреждала общие узлы DAG. #98681 (Alexey Milovidov).
- Исправлен LOGICAL_ERROR “Реплика решила читать в режиме Default, а не WithOrder” при использовании
read_in_order_through_join с параллельными репликами. #98685 (Alexey Milovidov).
- Исправлено Исключение “Неверное приведение типа
DB::TableFunctionNode к DB::QueryNode” при использовании табличной функции input в качестве аргумента функции remote. #98694 (Alexey Milovidov).
- Исправлено повторное появление устаревших частей данных, вызванное некорректной очисткой пустых перекрывающих частей. #98698 (Shaohua Wang).
- Исправлено исключение в
LogicalExpressionOptimizerPass, возникавшее, если булева функция в сравнении equals возвращала тип Variant. #98712 (Alexey Milovidov).
- Исправлен некорректный разбор функцией
parseDateTimeBestEffort слов, начинающихся с префиксов названий месяцев/дней недели. Закрывает #97965. #98742 (Pavel Kruglov).
- Исправлено исключение
UNKNOWN_IDENTIFIER, возникавшее при выполнении запросов к табличной функции merge() или движку Merge для таблиц с JSON-столбцами с разными параметрами (например, разными полями SKIP) и столбцами ALIAS, ссылающимися на подпути JSON, при включенном новом анализаторе. Закрывает #97812. #98753 (Pavel Kruglov).
- Исправлена работа оптимизации
optimize_skip_unused_shards с анализатором при использовании хранилища Distributed в View. #98754 (Nikolai Kochetov).
- Исправлен доступ по имени к подстолбцам кортежа (например,
SELECT x.a для Tuple(a UUID, b Int32)) во внешних таблицах, передаваемых через --external в clickhouse-client. Закрывает #96925. #98755 (Pavel Kruglov).
- Исправлено Исключение
reverseUTF8 при некорректном (усечённом) вводе UTF-8. #98770 (Alexey Milovidov).
- Исправлено определение применимости индекса пропуска данных типа set для предиката с OR и false (то есть
or(x, 0)). #98776 (Azat Khuzhin).
- Исправлено исключение
LOGICAL_ERROR (несоответствие структуры блока в removeUnusedColumns), которое могло возникать при FINAL + PREWHERE + константном выражении WHERE + не зависящих от столбцов агрегатах, таких как count(). #98778 (Alexey Milovidov).
- Записи
system.trace_log для автоперезагрузки словарей ClickHouse теперь имеют непустые идентификаторы запросов. #98784 (Miсhael Stetsyuk).
- Исправлен crash, при котором мог происходить доступ по нулевому указателю в system tables, созданных в промежутке между созданием снимка таблиц при вызове
IDatabaseTablesIterator::table() и изменением таблиц в другом потоке во время последующей итерации. #98792 (Grant Holly).
- Исправлена ошибка, из-за которой
SYSTEM START REPLICATED VIEW не активировала задачу обновления. #98797 (Pablo Marcos).
- Исправлено исключение “Inconsistent table names” при использовании табличной функции
view(), содержащей JOIN-операции внутри другого JOIN (только со старым анализатором). #98809 (Alexey Milovidov).
- Исправлена корректировка RLIMIT_SIGPENDING (через pending_signals). #98829 (Azat Khuzhin).
- Исправлено исключение при комбинировании
loop с табличными функциями кластера. #98860 (Konstantin Bogdanov).
- LEFT ANTI JOIN по нескольким столбцам ключа JOIN возвращал некорректные результаты, когда
enable_join_runtime_filters=1 (значение по умолчанию). #98871 (Alexander Gololobov).
- Исправлено поведение, из-за которого
WITH FILL STALENESS создавал лишние заполненные строки при чтении данных несколькими фрагментами (например, при небольшом index_granularity). #98895 (Alexey Milovidov).
- Исправлена ошибка LOGICAL_ERROR «RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B». #98900 (Azat Khuzhin).
- Исправлена рассинхронизация учёта памяти, вызванная тем, что при неудачных выделениях памяти не выполнялся откат, неопределённым поведением
nallocx(0) и ошибкой на единицу при отслеживании глобального пика. Отслеживание расширено и теперь охватывает кольцевые буферы io_uring. #98915 (Antonio Andelic).
- Запретить выполнение Attach для таблиц локального озера данных вне пользовательских путей, а не только их создание. #98936 (Daniil Ivanik).
- Исправлено состояние гонки, которое могло вызывать исключение “ReadBuffer is canceled” в запросах, использующих
urlCluster или аналогичные кластерные табличные функции. #98955 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR в финансовых функциях (financialNetPresentValue, financialInternalRateOfReturn и т. д.), возникавшее при передаче аргументов типа BFloat16. #98958 (Alexey Milovidov).
- Исправлена ошибка, из-за которой индексы пропуска данных (и условия по первичному ключу) не применялись к столбцам ALIAS, когда слияние выражений в плане запроса отключено (query_plan_merge_expressions = 0 или query_plan_enable_optimizations = 0). #98960 (Peng).
- Для асинхронных вставок теперь увеличивается ProfileEvent
InsertQuery. Закрывает #98626. #98962 (Narasimha Pakeer).
- Исправлено исключение “Inconsistent KeyCondition behavior” в отладочных сборках, когда первичный ключ содержит значения NaN с плавающей запятой:
accurateLess и accurateEquals теперь обрабатывают NaN согласованно с порядком сортировки ClickHouse. Закрывает #98075. #98964 (Alexey Milovidov).
- SummingMergeTree больше не суммирует столбцы типа Bool (и других доменных типов). Значения Bool теперь сохраняются как есть, а не суммируются арифметически. #98976 (Yash ).
- Исправлено исключение Scalar doesn’t exist, возникавшее при выполнении запроса к удалённому сегменту с включённым
optimize_const_name_size и enable_scalar_subquery_optimization = 0. Крупные константы, заменённые в удалённом запросе ссылками __getScalar, не отправлялись в сегмент, из-за чего запрос завершался ошибкой. #98979 (andriibeee).
- Исправлено
NOT_FOUND_COLUMN_IN_BLOCK для некоторых запросов с GROUP BY и выражениями, включающими обратный поиск в словаре, сравнения при преобразовании Date/DateTime и сравнения кортежей. Закрывает #98888. #98980 (Nihal Z. Miaji).
- Исправлено неопределённое поведение (разыменование нулевого указателя) при изменении столбца version/sign/is_deleted в
EPHEMERAL или ALIAS в движках MergeTree. Такие изменения теперь корректно отклоняются. #98985 (Alexey Milovidov).
- Исправлена проблема, из-за которой в
system.grants отсутствовали параметры регулярного выражения для привилегий URL и S3 в столбце access_object. #98987 (DQ).
- Исправлено чтение из Iceberg BigLake: учетные данные ADC теперь передаются S3-клиенту GCS (что устраняет ошибки 403), учетные данные OAuth2 перед отправкой теперь URL-кодируются (что устраняет сбои аутентификации для токенов со специальными символами), а обход пространства имен больше не прерывается при получении от BigLake ответов HTTP 400. #98998 (Nikita Fomichev).
- Исправлена ошибка, из-за которой
clickhouse-client не переключал часовой пояс, если переменная окружения TZ задавалась в виде пути к файлу POSIX (например, TZ=:/etc/localtime). #99000 (Yash ).
- Исправлено некорректное или недостаточное отсечение, когда
startsWith, LIKE, NOT LIKE используются со столбцом FixedString. Кроме того, функция приведения FixedString к String теперь может отсекать гранулы, если применяется к ключевому столбцу. Закрывает #98940. #99001 (Nihal Z. Miaji).
- Исправлена ошибка, из-за которой
windowFunnel с strict_deduplication возвращал неверный уровень при обнаружении дубликата события. #99003 (Yash ).
- Исправлена ошибка, из-за которой EXISTS игнорировал секции LIMIT и OFFSET в подзапросах, что приводило к некорректным результатам, если подзапрос не возвращал ни одной строки из-за OFFSET или LIMIT со значением 0. Закрывает #88722. #99005 (andriibeee).
- Исправлено исключение “Block structure mismatch”, возникавшее, когда при оптимизации проталкивания фильтра выражение AND сводилось к константе из-за короткого замыкания при использовании
GROUPING SETS. #99010 (Alexey Milovidov).
- Исправлено Исключение при чтении патч-частей (легковесные обновления), если в плане запроса отсутствует столбец
_part_offset. #99023 (Alexey Milovidov).
- Запрос вида
SELECT * FROM table WHERE pk_id = '', где pk_id — первичный ключ типа String, теперь будет корректно использовать индекс первичного ключа для фильтрации гранул. #99027 (Shankar Iyer).
- Исправлено исключение
DEPENDENCIES_NOT_FOUND в движке Kafka, возникавшее, когда materialized view было отсоединено, пока фоновый поток передавал данные. #99028 (Alexey Milovidov).
- Исправлено Исключение при создании таблицы со столбцом
EPHEMERAL, у которого то же имя, что и у виртуального столбца (например, _part_offset). #99031 (Alexey Milovidov).
- Исправлено вводящее в заблуждение сообщение “inflate failed: buffer error” при чтении несуществующих сжатых файлов через табличную функцию
url() с глоб-шаблонами. Теперь при включенном http_skip_not_found_url_for_globs, как и ожидается, возвращается пустой результат. #99034 (Alexey Milovidov).
- Исправлен сбой сервера (std::terminate) при выполнении
ALTER TABLE ... DROP PART для patch part после изменения схемы (например, ADD COLUMN). Сбой был вызван отсутствием системных столбцов (_part) в метаданных пустой coverage part, что приводило к неперехваченному исключению внутри NOEXCEPT_SCOPE. #99036 (Peng).
- Процесс сервера ClickHouse мог аварийно завершиться, если во время чтения с кэш-диска возникало исключение о превышении лимита памяти. Теперь это исправлено. #99042 (Shankar Iyer).
- Исправлен
LOGICAL_ERROR при запросе к таблице, в которой есть и ROW POLICY, и столбец ALIAS, с использованием dictGet. Проблема была вызвана преждевременным обращением к табличному выражению при разрешении столбца ALIAS в новом анализаторе. #99065 (Peng).
- Исправлена ошибка выхода за границы, возникавшая, когда пользователь пытался выполнить запрос только к виртуальным столбцам таблицы Iceberg с форматом данных Avro. Это крайне редкий сценарий, поэтому он не помечен как критический. Закрывает #88238. #99080 (alesapin).
- Исправлен segfault в рекурсивном CTE с
remote() + view(). #99081 (Konstantin Bogdanov).
- Пропускается лишний анализ индексов, если применяется оптимизация чтения в порядке сортировки. #99084 (Vladimir Cherkasov).
- Исправлен сбой, вызванный исключением по ограничению памяти при применении patch part. #99086 (Anton Popov).
- Исправлено срабатывание отладочного assert в
DDLWorker, вызванное неактуальным first_failed_task_name после удаления записи ZooKeeper в ходе восстановления после повторной инициализации. #99099 (Antonio Andelic).
- Исправлена проблема с перестроением текстовых индексов при слияниях с TTL. #99107 (Anton Popov).
- Исправлен сбой при выполнении запроса
ALTER TABLE ... REMOVE SETTINGS для движка таблицы Iceberg. Исправляет #86330. #99108 (alesapin).
- Исправлена ошибка в оптимизации
query_plan_convert_any_join_to_semi_or_anti_join, из-за которой для строк без совпадений возвращался некорректный результат. Связано: https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi).
- Исправлено Исключение LOGICAL_ERROR в
ASTColumnsExceptTransformer::transform. #99119 (Pablo Marcos).
- Исправлен обход RBAC, который позволял пользователям получать структуру таблицы через
DESCRIBE TABLE или CREATE TABLE AS для табличных функций (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc() и т. д.) без необходимых привилегий доступа к источнику. Для функций, которые автоматически определяют схему по удалённым серверам, это также позволяло без авторизации инициировать исходящие соединения (SSRF). #99122 (pufit).
- Исправлен сбой Keeper (segfault в NuRaft) во время динамической реконфигурации и передачи лидерства. #99133 (JIaQi Tang).
- Исправлен сбой при использовании таблицы Buffer с SAMPLE, если пункт назначения его не поддерживает. #99141 (Kseniia Sumarokova).
- Исправлена ошибка LOGICAL_ERROR, вызванная несоответствием порядка столбцов в патч-частях. #99164 (Pablo Marcos).
- Исправлено очень редкое аварийное завершение, возникавшее, когда таблица Iceberg содержит файлы смешанных форматов (ORC и Parquet). Исправление #88126. #99168 (alesapin).
- Исправлено неприменение max_execution_time при резервном копировании и восстановлении. #99205 (Kseniia Sumarokova).
- Исправлена проблема, из-за которой
insert_deduplication_token молча игнорировался в запросах INSERT SELECT без ORDER BY ALL. Ранее для несортированных INSERT SELECT дедупликация была полностью отключена, даже если был явно указан пользовательский токен. Теперь для включения дедупликации достаточно указать insert_deduplication_token независимо от ORDER BY ALL. #99206 (Desel72).
- Исправлены избыточные проверки доступа при оптимизации
InverseDictionaryLookupPass: теперь grant CREATE_TEMPORARY_TABLE проверяется один раз перед проходом, а не для каждого посещаемого узла. #99210 (Mikhail Artemenko).
- Исправлена проблема, из-за которой
clickhouse format --obfuscate выдавал некорректный SQL при обфускации типов индекса пропуска данных, имён кодеков сжатия, имён движков баз данных и определений структуры/источника словаря. #99260 (Raúl Marín).
- Исправлена ошибка, из-за которой в некоторых случаях сравнение типов Time[64] и DateTime[64] могло вызывать путаницу; теперь в таких случаях значения Time[64] приводятся к DateTime[64] с добавлением
1970-01-01 в качестве даты. #99267 (Yarik Briukhovetskyi).
- Ограничение значений настроек допустимыми пределами в DDL-воркере для распределённых DDL-запросов. #99317 (Pablo Marcos).
- Исправлены незначительные проблемы с аутентификацией TOTP: обработка пустого пароля в опции CLI
--one-time-password, проверка значений конфигурации <digits> и <period>. #99322 (Vladimir Cherkasov).
- Исправлена логическая ошибка
unordered_map::at: key not found в формате вывода Avro при сериализации столбцов Enum8/Enum16 со значениями, отсутствующими в определении enum. #99332 (Desel72).
- Исправлен
CHECK TABLE для разреженной сериализации в Tuple с Dynamic. Закрывает #96588. #99351 (Pavel Kruglov).
- Исправлена излишне строгая проверка предобработчика текстового индекса. #99359 (Anton Popov).
- Исправлена проблема совместимости при обновлении реплицированных таблиц с неявными индексами minmax с версии 25.10 на более новые версии. #99392 (Raúl Marín).
- Удалена поддержка функций с отрицанием (
notEquals, notLike, notIn) при анализе текстового индекса. Эти функции никогда не позволяли пропускать ни одной гранулы, поэтому их анализ в индексе лишь создавал дополнительную нагрузку, не принося никакой пользы. #99393 (Anton Popov).
- Исправлена работа
optimize_skip_unused_shards в новом анализаторе в случае, когда таблица Distributed использовалась внутри подзапроса с IN. #99436 (Nikolai Kochetov).
- Исправлена ошибка heap-use-after-free в
INTERSECT/EXCEPT, когда запрос возвращает повторяющиеся имена столбцов. #99471 (Alexey Milovidov).
- Исправлена логическая ошибка в
ALTER TABLE ... DROP PART, когда в качестве имени части используется типизированный параметр запроса. #99489 (Alexey Milovidov).
- Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда предикат текстового индекса (например, hasAllTokens) использовался в секциях SELECT и WHERE через псевдоним. #99504 (Anton Popov).
- Исправлены некорректные результаты при использовании
hasAllTokens с оператором OR между столбцами, для которых созданы отдельные текстовые индексы. #99505 (Anton Popov).
- В
clickhouse-local инициализирован кэш страниц, чтобы начала действовать настройка page_cache_max_size. #99510 (Alexey Milovidov).
- Исправлена редкая ошибка, из-за которой часть данных некорректно помечалась как повреждённая и отсоединялась после запроса
DETACH/ATTACH TABLE. #99529 (Anton Popov).
- Исправлено исключение
std::length_error, возникавшее при запросе пустых системных таблиц в формате Pretty через HTTP-интерфейс. #99541 (Alexey Milovidov).
- Исправлен
LOGICAL_ERROR при использовании ALTER TABLE ADD COLUMN для создания EPHEMERAL-столбца с тем же именем, что у виртуального столбца (например, _part_offset). #99549 (Alexey Milovidov).
- Исправлена ошибка, из-за которой записи
VectorSimilarityIndexCache никогда не вытеснялись после удаления части данных из-за несовпадения ключей кэша. #99575 (Seva Potapov).
- Запретить чтение учетных данных Google из локального файла. Эта настройка небезопасна, поскольку позволяет читать и другие учетные данные, если известен путь к файлу. #99584 (Konstantin Vedernikov).
- Устранена деградация производительности в анализаторе. Из ARRAY JOIN исключены неиспользуемые столбцы. #99587 (Dmitry Novik).
- Исправлено чтение текстового индекса в таблице при наличии легковесных удалений и политик доступа на уровне строк. #99661 (Anton Popov).
- Исправлено разыменование nullptr в ридере Parquet, когда в ветке filter-in-decoder встречаются отфильтрованные страницы. Закрывает #99676. #99677 (Alexey Milovidov).
- Исправлен некорректный переход seek в AsynchronousReadBufferFromFileDescriptor с O_DIRECT. Закрывает #99358. #99678 (Pavel Kruglov).
- Исправлены переполнение буфера в куче в
CompressionCodecT64 и аварийное завершение процесса в CompressionCodecMultiple при распаковке повреждённых сжатых данных. Обе проблемы были обнаружены новыми таргетами libFuzzer. Теперь кодеки генерируют исключение вместо сбоя. #99680 (Rahul).
- Откладывать обработку, пока сервер не завершит загрузку всех таблиц. #99700 (Seva Potapov).
- Исправлен обход
RemoteHostFilter источником словаря MySQL при использовании встроенных параметров DDL. #99720 (Shaohua Wang).
- Исправлена логическая ошибка при обходе таблиц озёр данных в
system.tables. #99739 (Konstantin Vedernikov).
- Исправлен анализ предикатов с функцией
IN для текстового индекса с предобработчиком. Исправлена коллизия искомых токенов в текстовом индексе, которая могла приводить к некорректным результатам. #99755 (Anton Popov).
- Исправлен бесконечный цикл при чтении файлов формата
Npy с отрицательными значениями размерностей в shape. #99812 (Desel72).
- Исправлен global-buffer-overflow в функции
CRC32 на аргументах FixedString, возникавший при вычислении с нулевым числом строк во время расчёта заголовка плана запроса. #99835 (Alexey Milovidov).
- Исправлен сбой (обращение по нулевому указателю) при выполнении
ALTER TABLE ... MODIFY COLUMN ... COMMENT для таблиц Iceberg. #99838 (Desel72).
- Исправлена настройка
aggregate_functions_null_for_empty: теперь она работает с агрегатными функциями, возвращающими типы, отличные от Nullable, такие как Array или Map (например, groupArray, sumMap). #99839 (Alexey Milovidov).
- Исправлено исключение LOGICAL_ERROR в функции
midpoint, которое возникало при вызове со смешанными знаковыми и беззнаковыми целочисленными типами. #99867 (Alexey Milovidov).
- Исправлено Исключение “Block structure mismatch” в запросах с предложением HAVING, где выражение фильтра содержит и агрегатную функцию, обёрнутую в функцию, возвращающую NULL, и
materialize(0). #99915 (Alexey Milovidov).
- Исправлена ошибка assertion failure в
sipHash128Keyed (и аналогичных хеш-функциях с ключом), когда аргумент data имеет тип Map с ключами-массивами или другими вложенными типами массивов. #99921 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR “Not-ready Set” в функции IN при оптимизации плана выполнения запроса с convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- Сокращено время компиляции за счёт удаления тяжёлых включений заголовочных файлов и переноса затратных инстанцирований шаблонов из заголовков. #97893 (Raúl Marín).
- Сокращено время компиляции арифметических функций и связанных с ними заголовочных файлов за счёт уменьшения матриц диспетчеризации шаблонов и удаления тяжёлых включений. #98204 (Raúl Marín).
- Используется
mongo-c-driver 2.2.2. #98304 (Konstantin Bogdanov).
- Используется
postgres REL_18_3. #98306 (Konstantin Bogdanov).
- Для сборок UBSan включён jemalloc allocator, чтобы избежать накопления RSS из-за неэффективного возврата памяти в glibc malloc. #98444 (Alexey Milovidov).
- Используется манглинг символов Rust v0, а из библиотеки PRQL удалены внутренние символы, чтобы сократить разрастание имён символов из библиотек combinator для parser. #98446 (Alexey Milovidov).
- В
tests/benchmarks добавлены набор бенчмарков TPC-H и README для TPC-DS. #98495 (Raufs Dunamalijevs).
- Добавлены тесты корректности для всех 99 запросов TPC-DS. #99204 (Raufs Dunamalijevs).
- Добавлен интеграционный тест, воспроизводящий баг с DDL CREATE TABLE + ALTER при офлайн-реплике (#44070); он помечен как ожидаемо завершающийся с ошибкой. #99259 (Raufs Dunamalijevs).
- Интегрирован jemalloc с префиксом
je_, удалено использование --wrap компоновщика. #99342 (Azat Khuzhin).
обратно несовместимое изменение
- Дедупликация по умолчанию включена для всех вставок. Раньше она была отключена для асинхронных вставок и MV, но включена для синхронных вставок. Цель — сделать одинаковые значения по умолчанию для обоих способов вставки. Если в вашем кластере дедупликация явно отключена, чтобы сохранить прежнее поведение, нужно явно установить
deduplicate_insert='backward_compatible_choice'. То же самое касается deduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda).
- Улучшен формат хранения статистики: теперь вся статистика хранится в одном файле. #93414 (Anton Popov). Если вы не включали статистику таблиц явно, этот пункт можно проигнорировать.
- Ограничен объём метаданных S3(Azure)Queue, хранимых в памяти. Системные таблицы переименованы:
azure_queue в azure_queue_metadata_cache, а system.s3queue — в s3queue_metadata_cache. #95809 (Kseniia Sumarokova).
- Ранее при применении функции к столбцу
Variant при несовместимости подтипа variant с функцией молча возвращались значения NULL; теперь генерируется исключение, что может нарушить работу запросов, которые опирались на такое поведение с молчаливым возвратом NULL. #95811 (Bharat Nallan).
- Столбцы
DATE из PostgreSQL теперь в ClickHouse автоматически определяются как Date32 (в предыдущих версиях они определялись как Date, что приводило к переполнению значений за пределами узкого диапазона). Разрешена вставка значений Date32 обратно в PostgreSQL. Закрывает #73084. #95999 (Alexey Milovidov).
- Семантика настройки
do_not_merge_across_partitions_select_final стала понятнее. Ранее эта возможность могла включаться автоматически, даже если настройка не была явно задана в конфигурации. Это неоднократно вызывало путаницу и, к сожалению, приводило к проблемам в продакшне. Теперь правила проще: do_not_merge_across_partitions_select_final=1 безусловно включает эту возможность. Если do_not_merge_across_partitions_select_final=0, автоматический режим используется только при enable_automatic_decision_for_merging_across_partitions_for_final=1, а в противном случае не используется. Чтобы максимально сохранить прежнее поведение, значения по умолчанию были установлены следующими: do_not_merge_across_partitions_select_final=0 и enable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov).
- При создании таблицы S3 с явно указанными столбцами ClickHouse теперь проверяет, что эти имена столбцов действительно присутствуют в схеме удалённого файла. Запросы, которые раньше работали при несовпадении имён столбцов, теперь будут завершаться ошибкой уже на этапе создания таблицы. Это закрывает #96089. #96194 (Konstantin Vedernikov).
- Запрещено использование подзапросов в ORDER BY и других ключевых выражениях таблицы. #96847 (Alexey Milovidov).
- По умолчанию включить
apply_row_policy_after_final. Изначально, когда optimize_move_to_prewhere_if_final=0, и ROW POLICY, и PREWHERE учитывали FINAL и применялись после FINAL. Это поведение было нарушено в #87303, где для фильтра ROW POLICY игнорировался параметр optimize_move_to_prewhere_if_final. Чтобы это исправить, в данном PR включается настройка apply_row_policy_after_final, добавленная в #91065. При включенном apply_row_policy_after_final ROW POLICY, как и раньше, по умолчанию продолжает учитывать FINAL. Этот PR вносит несовместимое изменение, поскольку меняет поведение для optimize_move_to_prewhere_if_final=1. Теперь, чтобы ROW POLICY применялся до FINAL, следует использовать apply_row_policy_after_final, а не optimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov).
- Тип
Date теперь сериализуется как встроенный тип Arrow date32 в форматах Arrow/ArrowStream вместо uint16. Инструменты вроде PyArrow теперь будут корректно распознавать столбец как тип даты. Прежнее поведение можно восстановить с помощью настройки output_format_arrow_date_as_uint16. Чтение старых файлов Arrow, в которых для столбцов Date использовался uint16, по-прежнему поддерживается. #96860 (Alexey Milovidov).
- Теперь пользователи могут напрямую использовать ClickStack (интерфейс обсервабилити) из ClickHouse, что удобно для отладки и локальной разработки. #96597 (Aaron Knudtson).
- Добавлена поддержка одноразовых паролей на основе времени (TOTP) в качестве метода аутентификации. #71273 (Vladimir Cherkasov).
- Добавлена настройка базы данных
lazy_load_tables. Когда она включена, таблицы не загружаются при запуске базы данных — вместо них создается легковесный StorageTableProxy, а настоящий движок таблицы материализуется при первом обращении. #96283 (xiaohuanlin).
- Добавлена настройка
input_format_max_block_wait_ms, позволяющая выдавать блоки данных по тайм-ауту, а также разрешена обработка оставшихся данных при неожиданном закрытии HTTP-соединения. #94509 (Mostafa Mohamed Salah).
- Интеграция с каталогом Google BigLake. Закрывает #95339. #97104 (Konstantin Vedernikov).
- Добавлена системная таблица
system.tokenizers, содержащая список всех доступных токенизаторов. #96753 (Robert Schulze).
- Добавлена новая системная таблица
system.user_defined_functions для мониторинга статуса загрузки UDF и настроек. #90340 (Xu Jia).
- Добавлена таблица
system.jemalloc_stats, показывающая статистику аллокатора памяти jemalloc (через malloc_stats_print) для диагностики использования памяти на серверах, собранных с jemalloc. Также в HTTP-интерфейс ClickHouse добавлена HTTP-конечная точка /jemalloc.html для интерактивной визуализации этой статистики. #97077 (Antonio Andelic).
- Добавлена таблица
system.jemalloc_profile_text для чтения и анализа профилей кучи jemalloc. Формат вывода задается настройкой jemalloc_profile_text_output_format (raw, symbolized или collapsed; по умолчанию — collapsed). Разрешение inline-фреймов задается jemalloc_profile_text_symbolize_with_inline (если параметр включен, inline-фреймы включаются ценой более медленной символизации; если отключен, они пропускаются для более быстрого вывода). Для формата collapsed параметр jemalloc_profile_text_collapsed_use_count определяет, взвешиваются ли стеки по числу активных аллокаций (true) или по объему активных байт (false, по умолчанию). Это упрощает профилирование памяти и визуализацию флеймграфов для профилей кучи jemalloc. Исправляет #93248. #97218 (Antonio Andelic).
- Добавлена настройка
default_dictionary_database, которая позволяет ClickHouse искать внешние словари, указанные без имени базы данных, в заданной базе данных по умолчанию. Это упрощает миграцию с глобальных словарей, определённых в XML, на словари отдельных баз данных, определённые в SQL, позволяя существующим запросам к словарям (например, dictGet(‘name’, …)) продолжать работать без изменений. #91412 (Dmitrii Plotnikov).
- Добавлена поддержка дополнительного ZooKeeper для
DatabaseReplicated. #91683 (RinChanNOW).
- Добавлены новая табличная функция
primes и новая системная таблица system.primes, содержащая простые числа в порядке возрастания. Закрывает #90839. #92776 (Nihal Z. Miaji).
- Асинхронные вставки поддерживают параллельный кворум. Вставленные данные реплицируются до достижения кворума. Если обнаруживаются дубликаты, запрос ожидает, пока ранее вставленные данные тоже не будут реплицированы. #93356 (Sema Checherinda).
- Добавлены функции
colorOKLABToSRGB и colorSRGBToOKLAB для преобразования значений из sRGB в OKLAB и обратно. #93361 (Pranav Tiwari).
- Новая настройка
deduplicate_insert, переопределяющая insert_deduplicate и async_insert_deduplicate. #94413 (Sema Checherinda).
- Настройка сервера
insert_deduplication_version позволяет выполнять переход на единый хеш дедупликации. #95409 (Sema Checherinda).
- Добавлена функция хеширования
xxh3_128. #96055 (Raúl Marín).
- Добавлен запрос
OPTIMIZE <table> DRY RUN PARTS <part names> для имитации слияний без коммита результирующей части. Это может быть полезно при тестировании: для проверки корректности слияний в новой версии, детерминированного воспроизведения ошибок, связанных со слияниями, и надёжного бенчмаркинга производительности слияний. #96122 (Anton Popov).
- Добавлена новая проверка, по умолчанию включенная настройкой
check_named_collection_dependencies, чтобы предотвратить удаление именованных коллекций, используемых таблицами. #96181 (Pablo Marcos).
- Добавлен
system.fail_points для просмотра существующих failpoint’ов в сервере и проверки, включены они или нет. Это поможет автоматизировать тестирование. #96762 (Pedro Ferreira).
- Добавлена поддержка ролевого доступа к каталогу Glue. Используйте настройки
aws_role_arn и, при необходимости, aws_role_session_name. #90825 (Antonio Andelic).
- Добавлен параметр
add_minmax_index_for_temporal_columns, который при включении автоматически создает индексы MinMax для всех столбцов Date, Date32, Time, Time64, DateTime и DateTime64. #93355 (Michael Jarrett).
- Поддержка расширенных псевдонимов таблиц в JOIN (запросы вида
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b). Закрывает #95131. #95331 (Yarik Briukhovetskyi).
- Добавлена поддержка
ALTER TABLE RENAME COLUMN для таблиц Iceberg. Ранее поддерживались только ADD COLUMN, DROP COLUMN и MODIFY COLUMN. #97455 (murphy-4o).
Экспериментальные возможности
- Текстовый индекс теперь доступен в статусе GA. #96794 (Robert Schulze).
- Тип данных
QBit для хранения векторов в квантованном битово-упакованном формате (используется для приближенного поиска ближайших соседей) теперь общедоступен и больше не требует включения экспериментальной настройки. #95358 (Raufs Dunamalijevs).
- Векторный поиск в ClickHouse теперь может использовать реплики в кластере, чтобы распределять нагрузку и поиск по частям векторного индекса. Это позволяет ClickHouse поддерживать крупные векторные индексы, которые превышают объем памяти одной VM. #95876 (Shankar Iyer).
- Добавлен AST-фаззер на стороне сервера, управляемый настройками
ast_fuzzer_runs и ast_fuzzer_any_query. Когда он включен, сервер после обычного выполнения каждого запроса запускает его случайные мутации, отбрасывая результаты. #97568 (Alexey Milovidov).
- В экспериментальный диалект KQL добавлена функция
iif. #94790 (happyso).
- Автоматическое определение схемы теперь учитывает
allow_experimental_nullable_tuple_type. Когда эта возможность включена, выведенные типы кортежей могут быть Nullable(Tuple(...)), поэтому отсутствующие вложенные объекты могут становиться NULL вместо кортежа из элементов NULL. #95525 (Nihal Z. Miaji).
- Настройка
use_statistics_cache теперь включена по умолчанию, поэтому статистика столбцов кэшируется в памяти для ускорения оптимизации запросов без необходимости заново загружать ее из каждой части. #95950 (Han Fei).
- Теперь для пропуска данных можно использовать любое детерминированное выражение в первичном ключе (например,
ORDER BY cityHash64(user_id)/ ORDER BY length(user_id)). Для детерминированных выражений ClickHouse может применить выражение к константам запроса и использовать результат в индексе первичного ключа для предикатов =, IN и has. Если выражение также инъективно (например, ORDER BY hex(p) или ORDER BY reverse(tuple(reverse(p), hex(p)))), индекс можно эффективно использовать и для отрицательных форм: !=, NOT IN и NOT has. Закрывает #10685. Закрывает #82161. #92952 (Nihal Z. Miaji).
- Улучшен формат хранения статистики. Теперь вся статистика сохраняется в одном файле. #93414 (Anton Popov).
- Разрешено параллельное чтение для удалённых движков таблиц/функций в файловом кэше. #71781 (Kseniia Sumarokova).
- Добавлена возможность использовать кэш страниц в пространстве пользователя с локальными файлами и табличными функциями объектного хранилища. #77874 (Michael Kolupaev).
- Исключены ненужные
memcpy в кэше страниц в пространстве пользователя. #77884 (Michael Kolupaev).
- Теперь для
concurrent_threads_scheduler по умолчанию используется max_min_fair вместо fair_round_robin. Это повышает справедливость при высокой нагрузке, отдавая приоритет запросам, которым выделено меньше слотов, поэтому короткие запросы не страдают из-за длинных. #95300 (Sergei Trifonov).
- Если запрос
FINAL использовал для фильтрации условие по первичному ключу, а затем индекс пропуска данных для других условий, то шаг обработки PrimaryKeyExpand теперь будет проверять на пересечение только изначально отобранные диапазоны первичного ключа. #94903 (Shankar Iyer).
- При использовании параллельных реплик с табличными функциями, такими как
s3(...), запросы, в которых табличная функция обёрнута в один подзапрос, теперь автоматически распараллеливаются по репликам, тогда как раньше распараллеливались только прямые обращения к табличным функциям. Закрывает #92264. #96332 (phulv94).
- Добавлена возможность разделять данные и системные файлы в кэше на отдельные сегменты. #87834 (MikhailBurdukov).
- Некоторые операции hash join ускорены за счёт реализации динамической диспетчеризации для
ColumnVector::replicate. #79573 (Raúl Marín).
- Повышение производительности параллельного hash JOIN в случаях со сложными предикатами. Ранее строки, не вошедшие в JOIN, обрабатывались в одном потоке, что неоптимально; суть этой оптимизации — распараллелить обработку таких строк между несколькими потоками. Можно включать и отключать с помощью настройки
parallel_non_joined_rows_processing. Включено по умолчанию. #92068 (Yarik Briukhovetskyi).
- Немного оптимизирован парсинг типа JSON. #93614 (Pavel Kruglov).
- Уменьшено потребление памяти AST. Оптимизация оправдана, поскольку поля не используются, если не используется подсветка и не выполняется парсинг VALUES. #93974 (Ilya Yatsishin).
- Оптимизировано потребление памяти объектами AST для именованных Tuple. Имена столбцов теперь хранятся в объекте Tuple как строки, а не в универсальных узлах литералов AST. #94704 (Ilya Yatsishin).
- Девиртуализация улучшена за счёт дополнительных параметров компоновщика. #94737 (Nikita Taranov).
- Повышена производительность клонирования реплики в таблицах ReplicatedMergeTree с большим числом частей благодаря пакетированию запросов ZooKeeper. #94847 (c-end).
- Когда на шаге чтения уже были фильтры PREWHERE, добавить новый фильтр было невозможно. Это изменение откладывает оптимизацию PREWHERE до оптимизации runtime filter для JOIN, чтобы runtime filters тоже можно было перенести в PREWHERE. #95838 (Alexander Gololobov).
- Ускорено сжатие кодеком
T64 благодаря использованию динамической диспетчеризации на x86. #95881 (Raúl Marín).
- Ускорен
uniq для числовых типов за счёт батчинга вставок, когда это возможно (без NULL, без -If, без GROUP BY, без IPv6 и String). #95904 (Raúl Marín).
- Низкоуровневые оптимизации для Keeper: было выявлено, что
ZooKeeper::observeOperations потребляет >20% CPU потока приёма ZooKeeper. Это изменение решает проблему следующим образом: 1. Для AggregatedZooKeeperLog::stats используется CityHash64 вместо SipHash, что более чем в 10 раз быстрее. 2. Для Coordination::ErrorCounter используется std::array<std::atomic<UInt32>, N> вместо std::unordered_map и std::mutex. #95962 (Miсhael Stetsyuk).
- Убрано 64-байтовое выравнивание для ProfileEvents::Counter, чтобы сэкономить память. #96097 (Azat Khuzhin).
- Оптимизация памяти: размер структуры
CachedOnDiskReadBufferFromFile сокращён в 50 раз. #96098 (Azat Khuzhin).
- Не копировать старые данные при изменении размера пустой хеш-таблицы. #96180 (Raúl Marín).
- Добавлена поддержка JOIN Runtime Filters для
RIGHT OUTER JOIN. #96183 (Hechem Selmi).
- Оптимизация
enable_join_runtime_filters теперь включена по умолчанию. #89314 (Alexey Milovidov).
- Ранее оптимизация прямого чтения для текстового индекса применялась только в том случае, если во всех частях был материализованный текстовый индекс. В этом PR добавлена частичная поддержка: если материализованный текстовый индекс есть только в некоторых частях, он будет использоваться для них, а для частей без материализованного текстового индекса будет выполняться исходное выражение фильтра. #96411 (Anton Popov).
- Добавлены вторичные индексы
minmax для временных столбцов и индексы bloom_filter для столбцов query_id/initial_query_id в системных таблицах логов, чтобы ускорить фильтрацию. #96712 (Alexey Milovidov).
- Оптимизация отложенной материализации теперь применяется ко всем ветвям запроса
UNION ALL, а не только к первой. Запросы, которые объединяют несколько отсортированных и ограниченных чтений из разных таблиц MergeTree через UNION ALL, теперь будут использовать отложенное чтение столбцов в каждой ветви, снижая I/O. #96832 (Federico Ginosa).
- Оптимизировано вычисление индекса пропуска данных minmax при INSERT: устранено лишнее копирование данных и добавлен векторизованный расчёт min/max для числовых столбцов. #97392 (Raúl Marín).
- Движок
DeltaLake теперь берет результат count() из метаданных delta lake и показывает корректную статистику таблицы в system.tables (общее число байт/строк). #96190 (Kseniia Sumarokova).
- Неиспользуемые столбцы также исключаются из этапа чтения при чтении из MergeTree. Это особенно полезно, когда фильтр переносится в
PREWHERE. #89982 (János Benjamin Antal).
- Улучшена обработка запроса
SHOW TABLES: теперь извлекаются только имена таблиц; также улучшен getLightweightTablesIterator, чтобы он возвращал структуру, содержащую только имена таблиц. Исправляет #93835. #94467 (Smita Kulkarni).
- Улучшены
assumeNotNull, coalesce и ifNull, чтобы задействовать отсечение по первичному ключу и индексу пропуска данных для диапазонных предикатов, когда столбцы ключа обёрнуты в эти функции. Закрывает #94689. #94754 (Nihal Z. Miaji).
- В запрос Keeper getChildren добавлены расширения with_data и with_stat. Это позволяет за одну операцию получать не только список дочерних узлов, но и их
stat и/или data. #94826 (Nikolay Degterinsky).
- Анализ индексов выполняется только один раз (в большинстве случаев), независимо от того, будет ли в итоге выполняться локальный план или план с параллельными репликами. #94854 (Nikita Taranov).
- Добавлена возможность включать распределённый анализ индексов в зависимости от количества частей (
distributed_index_analysis_min_parts_to_activate) и размера индексов (distributed_index_analysis_min_indexes_size_to_activate). #95216 (Azat Khuzhin).
- Включена PREWHERE optimization для таблиц Iceberg. #95476 (Konstantin Vedernikov).
- Уменьшено потребление памяти у некоторых классов AST. #95514 (Raúl Marín).
- Ограничено число потоков конвейера, создаваемых при включенной настройке
split_intersecting_parts_ranges_into_layers. Это помогает избежать чрезмерного потребления памяти. #96478 (Nikita Taranov).
- Реализована оптимизация эквивалентных наборов для нескольких JOIN. Запросы с несколькими последовательными операциями
INNER JOIN теперь выигрывают от улучшенной оптимизации pushdown фильтров. Когда таблицы объединяются по эквивалентным столбцам (например, t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), фильтры, применённые к любой таблице в цепочке, автоматически проталкиваются для всех таблиц. Закрывает #96550. #96596 (Vladimir Cherkasov).
- Оптимизировано сканирование метаданных Delta Lake. Использованы изменения из PR delta-kernel https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
- В базе данных Replicated больше не обновляется кэш кластера для каждого фиктивного запроса. #96897 (Tuan Pham Anh).
- Используйте индекс первичного ключа при использовании фильтра
startsWithUTF8, если префикс содержит только символы ASCII. #97055 (vkcku).
- Добавлена трассировка OpenTelemetry для запросов Keeper. #91332 (Miсhael Stetsyuk).
- Новые параметры конфигурации:
logger.startup_console_level и logger.shutdown_console_level, позволяющие переопределить уровень логирования в консоль во время запуска и завершения работы ClickHouse соответственно. #95919 (Garrett Thomas).
- Учитывать переопределения из командной строки при перезагрузке конфигурации. Закрывает #80294. #80295 (Alexey Milovidov).
- Разрешены переопределения параметров именованной коллекции в формате ключ-значение в табличной функции
mongodb. #89616 (vanchaklar).
- Оптимизация чтения в порядке сортировки для таблиц Iceberg теперь работает со сложными функциями сортировки, такими как
icebergBucket и icebergTruncate, а не только с простыми ссылками на столбцы. #90256 (Konstantin Vedernikov).
- Добавлен новый столбец parts_postpone_reasons в system.mutations для улучшения диагностики; в нем отображаются причины отложенной обработки частей. #92206 (Shaohua Wang).
- Отслеживание изменений числа строк для чтения (из-за вставок/удалений или использования кэша условий запроса) в
DataflowStatisticsCache. #93636 (Nikita Taranov).
- Добавлена поддержка запроса SYSTEM RESET DDL WORKER [ON CLUSTER]. Он сбрасывает состояние DDLWorker в основном потоке. Это полезно для обновления активной реплики при изменении идентификаторов хостов. #93780 (Tuan Pham Anh).
- Добавлена поддержка
mutation_ids в system.part_log для типов событий MUTATE_PART и MUTATE_PART_START. #93811 (Shaohua Wang).
- Фоновые операции (Mutate, Merge) теперь можно настраивать независимо через профиль ‘background’. Ранее для таких операций использовались те же настройки, что и для обычных запросов, через профиль ‘default’. #93905 (Arsen Muk).
- В
system.crash_log добавлено больше информации. #94112 #95857 (Miсhael Stetsyuk).
- Добавлена новая метрика
QueryNonInternal для отслеживания количества выполняющихся не внутренних запросов. Эта метрика публикуется как ClickHouseMetrics_QueryNonInternal и помогает операторам контролировать параллелизм запросов относительно ограничения max_concurrent_queries, которое применяется только к не внутренним запросам. #94284 (Ashwath Singh).
- Добавлена поддержка сбора статистики входных байтов для столбцов из компактных частей в
RuntimeDataflowStatisticsCacheUpdater. #94626 (Nikita Taranov).
- Добавлена проверка на некорректную конфигурацию Keeper, приводящую к сбоям при формировании кластера. Закрывает #60932. #94682 (Konstantin Bogdanov).
- Улучшена десериализация JSON-префиксов при загрузке части. #94848 (Pavel Kruglov).
- Переработана операция записи с использованием полного конвейера INSERT, который запускает materialized views для целевой таблицы. #94890 (Kai Zhu).
- Используйте оптимизации плана поиска по векторному сходству только при наличии индекса для столбца поиска. #94998 (Eduard Karacharov).
- Проверять общий лимит памяти перед аутентификацией пользователя и выдавать
(total) memory limit exceeded, если общий лимит превышает допустимое значение. #95003 (Nikolai Kochetov).
- Добавлен параметр конфигурации
throw_on_unmatched_row_policies, который во включенном состоянии генерирует исключение, если пользователь выполняет запрос к таблице, для которой заданы политики строк, но ни одна из них к нему не применяется, — это предотвращает неоднозначное поведение, при котором из-за неправильной настройки управления доступом возвращаются все строки. #95014 (Vitaly Baranov).
- Динамическое обновление токенов доступа S3 в длительных запросах при использовании Unity Catalog. Это закрывает #93981. #95069 (Konstantin Vedernikov).
- Отключается механизм decay для dirty page в jemalloc, если ClickHouse испытывает длительное давление по памяти в течение
memory_worker_decay_adjustment_period_ms миллисекунд. Механизм decay для dirty page в jemalloc снова включается, если ClickHouse работает в нормальных условиях в течение того же промежутка времени. #95145 (Antonio Andelic).
- Поддержка дополнительного Zookeeper в S3Queue при использовании настройки
keeper_path из s3Queue. #95203 (Diego Nieto).
- Учитывается
max_parts_to_merge_at_once при TTL-слияниях частей с drop. #95315 (Kseniia Sumarokova).
- Добавлены
connection_address и connection_port в query_log для отображения физического соединения (address и port подменяются при подключении через прокси и auth_use_forwarded_address=1). #95471 (Yakov Olkhovskiy).
- Исправлен некорректный учёт памяти для кэша условий запроса. Основная проблема заключалась в том, что не учитывался ключ кэша, состоящий из нескольких строк (например, part_name, идентификатора таблицы и всего SQL-условия). #95478 (Nikita Mikhaylov).
- Сервер, запущенный со встроенной конфигурацией, позволит управлять пользователями и привилегиями и сохранять их в каталоге
access, как и при обычной конфигурации. Это упрощает тестирование. Также во встроенной конфигурации и в clickhouse-local были включены все улучшения access_control. #95481 (Alexey Milovidov).
- Улучшены сообщения об ошибках аутентификации S3: теперь при отказе в доступе они содержат подсказку проверить учетные данные. #95648 (Gerald Latkovic).
- Включён кэш статистики, а период его обновления установлен на 300 с. #95841 (Han Fei).
- В
system.aggregated_zookeeper_log добавлено имя компонента. #95882 (Antonio Andelic).
- Не выполнять чтение из объектного хранилища при запросах к таблицам
DeltaLake через system.tables. #95899 (Antonio Andelic).
enable_max_bytes_limit_for_min_age_to_force_merge теперь включён по умолчанию, если значение настройки compatibility — 26.2 или выше. #95917 (Christoph Wurm).
- Delta Lake теперь доступен на macOS. Закрывает #95979. #95985 (Alexey Milovidov).
- В предыдущих версиях при объединении конфликтующих выражений ALTER с UPDATE и RENAME COLUMN вместо корректного исключения возникала логическая ошибка. Закрывает #70678. #96022 (Alexey Milovidov).
- Улучшен вывод справки для всех приложений ClickHouse, добавлена опция —no-sudo и внесено несколько исправлений. Это продолжение #58244 от Ilya Yatsishin. #96025 (Alexey Milovidov).
- Добавлен алиас
distanceCosine для cosineDistance, так как у всех остальных функций расстояния уже есть алиасы в таком формате. #96065 (Raufs Dunamalijevs).
- Добавлена поддержка расширения Keeper
with_data для улучшения получения таблиц в Database Replicated. #96090 (Nikolay Degterinsky).
- chdig обновлён до v26.2.1 (новые возможности и поддержка macOS). #96113 (Azat Khuzhin).
- Улучшен pushdown фильтра для
numbers и primes. Теперь ClickHouse может определять консервативные границы значений по условиям WHERE, когда точные границы определить невозможно, и соответственно ограничивать генерацию последовательности (например, для WHERE number % 5 < 2 AND number > 100 AND number < 300 ClickHouse будет генерировать только числа от 100 до 300, а затем применять предикат), избегая сканирования без ограничений. Закрывает #84853. Закрывает #93913. #96115 (Nihal Z. Miaji).
- Ранее форматтер заключал SELECT в круглые скобки при наличии секции
COMMENT, чтобы избежать неоднозначности при разборе. Вместо этого COMMENT теперь выводится перед AS SELECT, что устраняет неоднозначность без круглых скобок. #96293 (Alexey Milovidov).
- Параметр конфигурации
allow_impersonate_user теперь находится в разделе access_control_improvements, а не задается как отдельная настройка сервера. #96451 (Vitaly Baranov).
- Параметр конфигурации
core_dump.size_limit теперь поддерживает горячую перезагрузку, поэтому для применения изменений конфигурации больше не требуется перезапускать серверы. #96524 (Miсhael Stetsyuk).
- Улучшена совместимость профилировщиков CPU и реального времени с тайм-аутами сокетов. #96601 (Sergei Trifonov).
- Предотвращено повторное появление удалённых данных, если ADD COLUMN выполняется вскоре после мутации DROP COLUMN. #96713 (Alexey Milovidov).
- Изменён тип
function_id в system.instrumentation с LowCardinality(Int32) на Int32. #96726 (Copilot).
- При синхронном ожидании мутаций теперь учитываются отмена запроса и ограничения по времени. #96756 (Alexey Milovidov).
- Добавлена системная команда
SYSTEM RELOAD DELTA KERNEL TRACING <level> для изменения логирования delta-kernel, что может быть полезно при отладке. #96763 (Kseniia Sumarokova).
- Фильтрация по семейству IP-адресов, то есть настройки
dns_allow_resolve_names_to_ipv4/ipv6, применяется даже при отключённом DNS-кэше. #96810 (c-end).
- Улучшена диагностика jemalloc. #96840 (Azat Khuzhin).
- Исправлена ошибка
QUERY_CACHE_USED_WITH_SYSTEM_TABLE в веб-интерфейсе /play при выполнении запросов к системным таблицам. #96869 (Alexey Milovidov).
- Улучшен веб-интерфейс: favicon теперь меняется, показывая, что запрос выполняется; ошибки вспомогательных запросов (при загрузке баз данных и таблиц) теперь отображаются, а не молча игнорируются. Закрывает #85055. #96883 (Alexey Milovidov).
- Левую панель в интерфейсе
/play сделали кликабельной, чтобы показывать и скрывать список баз данных. #96884 (Alexey Milovidov).
DROP DATABASE теперь удаляет таблицы в порядке, обратном зависимостям, что повышает устойчивость к сбоям, если в базе данных есть таблицы с зависимостями при загрузке (например, таблицы Distributed, использующие joinGet). #97057 (Alexey Milovidov).
- Обновлён yaml-cpp, чтобы исключить пропуск некорректного YAML. #97333 (Azat Khuzhin).
- Показывать индикатор загрузки на боковой панели
play.html, пока таблицы подгружаются. #97531 (Alexey Milovidov).
- Добавлена кнопка копирования в буфер обмена для неформатированных результатов запроса во встроенном веб-интерфейсе (play.html). #97532 (Alexey Milovidov).
- Исправлен обфускатор запросов (
clickhouse-format --obfuscate), чтобы он в большем числе случаев генерировал SQL, который можно разобрать. #97584 (Alexey Milovidov).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- После
ALTER, изменяющих только метаданные, например при расширении списка значений Enum, оптимизация агрегации с проекцией может завершиться исключением. #84143 (Alexey Milovidov).
- Materialized views теперь используют базу данных, в которой они были созданы, в качестве контекста выполнения, то есть: - можно не указывать базу данных явно в именах, используемых в
select-запросе представления - если база данных явно не указана, подразумевается та же база данных, в которой было создано materialized view. #88193 (Dmitry Kovalev).
- Исправлена подстановка параметров запроса в методах аутентификации CREATE USER при использовании предложения ON CLUSTER. Параметры запроса в методах аутентификации (например, password) не подставлялись, что приводило к ошибкам UNKNOWN_QUERY_PARAMETER на удалённых узлах. #92777 (xiaohuanlin).
- Исправлены несоответствия при анализе текстового индекса для функций
has, mapContainsKey и mapContainsValue. Ранее запросы с этими функциями могли возвращать разные результаты в зависимости от того, вычислялось ли выражение с использованием текстового индекса или без него. #93578 (Anton Popov).
- Исправлен сбой при подключении таблицы к базе данных
MaterializedPostgreSQL, если dropReplicationSlot генерирует исключение при раскрутке стека. #96871 (Alexey Milovidov).
- Сервер мог аварийно завершаться, если одновременно запускалось много резервных копий, конфликтующих из-за одних и тех же файлов. #93659 (Alexey Milovidov).
- Исправлена работа запросов с параллельными репликами и JOIN с таблицей non-MT. Закрывает #92056. #93902 (Igor Nikonov).
- Исправлена проблема, из-за которой столбцы Iceberg с точками в именах возвращали NULL в качестве значений. #94335 (Mikhail Koviazin).
- Исправлена обработка строк в кодировке UTF8 в
stringJaccardIndexUTF8 и повышена производительность. #94613 (Joanna Hulboj).
- Исправлены возможные переполнения в
WITH FILL STALENESS (они приводили к UB и/или бесконечным циклам). Исправлен возможный бесконечный цикл из-за больших скачков. Добавлена поддержка старого анализатора (в основном для стресс-тестов). #94663 (Azat Khuzhin).
- Исправлено возможное зависание распределённых запросов, когда имена хостов разрешаются в несколько адресов, а удалённая реплика перестаёт отвечать. #94726 (c-end).
- Исправлен некорректный результат при выполнении JOIN нескольких табличных выражений, когда самое левое табличное выражение представляет собой табличную функцию
-Cluster. Устраняет проблему #89996. #94748 (Konstantin Bogdanov).
- Исправлено некорректное отсечение по первичному ключу и индексу пропуска данных для предикатов, включающих
toWeek, toYearWeek, toStartOfWeek, toLastDayOfWeek и toDayOfWeek, а также устранены исключения в некоторых из этих функций для корректных запросов с LowCardinality(String). #94816 (Nihal Z. Miaji).
- Удалена ненужная возможность пропуска проверки разрешений в запросах
ATTACH для представления с безопасностью SQL. Это предотвращает потенциальное повышение привилегий, когда пользователь подключает представление с definer без проверки необходимого доступа. #94865 (pufit).
- Исправлен сбой при запуске
ReplicatedMergeTree, вызванный одновременным удалением каталогов delete_tmp_*. #94892 (myeongjun).
- Исправлена проблема с
INSERT в таблицы Iceberg с materialized views, из-за которой терялась информация о дедупликации и возникало исключение. #94938 (Daniil Ivanik).
- Исправлена ошибка, из-за которой
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME> удалял весь кэш во всём кластере. #94978 (Rory Crispin).
- Сохраняется постоянная гранулярность индекса (use_const_adaptive_granularity) после вертикальных слияний (v2 с исправлением для Nested и в целом). #95013 (Azat Khuzhin).
- Исправлена состояние гонки в файловом кэше в версии 26.1 после [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764). #95042 (Kseniia Sumarokova).
- Исправлена отмена выполнения табличной функции postgresql() с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #95136 (Roman Vasin).
- Исправлен вывод типов для квалифицированных столбцов исходных таблиц при использовании нескольких JOIN с предложением
USING. Ранее последующие JOIN некорректно обновляли типы исходных столбцов до общего супертипа, даже если столбец не участвовал в этом JOIN (например, в SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a) столбец t2.a используется только в первом JOIN, поэтому его тип должен быть супертипом t1.a и t2.a, без учёта t3.a). Это могло приводить к логическим ошибкам или сбоям, когда функции ожидали одни типы столбцов, а в плане выполнения фактически оказывались другие. #95157 (Vladimir Cherkasov).
- Преобразование столбца теперь выполняется только один раз при получении содержимого списка manifest .avro и файлов. #95164 (Daniil Ivanik).
- Исправлен некорректный расчёт размеров JSON-столбцов, который мог приводить к избыточному использованию памяти или некорректной статистике столбцов. #95207 (Azat Khuzhin).
- Исправлен неточный учёт памяти при применении крупных патч-частей после легковесных обновлений. Ранее применение крупных патчей могло приводить к чрезмерному использованию памяти, из-за чего процесс сервера мог быть принудительно завершён OOM killer’ом. #95231 (Anton Popov).
- Исправлено неопределённое поведение, которое могло приводить к некорректным результатам или к исключению, если распределённый запрос с
max_parallel_replicas во время анализа индексов переключался на локальную реплику. #95263 (Azat Khuzhin).
- Исправлена агрегация разреженных столбцов для
sum и временных рядов при group_by_overflow_mode = any. #95301 (Mikhail Koviazin).
- Исправлена проблема с надёжностью в политике диска
plain_rewritable: сетевая ошибка в середине удаления файла метаданных могла привести к тому, что хранилище оставалось в несогласованном состоянии. #95302 (Mikhail Artemenko).
- Заменён Date на Date32 для Iceberg. #95322 (Konstantin Vedernikov).
- Значение аргумента password табличной функции
redis теперь будет маскироваться в журнале и системных таблицах (например, в query_log). #95325 (János Benjamin Antal).
- Исправлена ошибка, из-за которой таблицы можно было удалить или изменить, пока по ним ещё выполнялся распределённый запрос, что могло приводить к исключениям или некорректным результатам. #95356 (Azat Khuzhin).
- Исправлена логическая ошибка, возникавшая в некоторых случаях при использовании отрицательного
LIMIT/OFFSET в распределённых запросах. #95357 (Nihal Z. Miaji).
- Исправлена ошибка, из-за которой clickhouse-client при подключении по SSH дважды запрашивал пароль. #95372 (Isak Ellmer).
- Устранена гонка данных в S3(Azure)Queue. #95385 (Kseniia Sumarokova).
- Исправлена ошибка в фильтре prewhere, вызванная лямбда-выражениями в prewhere. #95395 (Xiaozhe Yu).
- Исправлено
optimize_syntax_fuse_functions: sum/count/avg больше не переписываются в sumCount(), если аргумент агрегатной функции имеет тип Nullable. Закрывает #95390. #95441 (Nihal Z. Miaji).
- Предотвращено возможное аварийное завершение при отмене распределённых запросов. #95466 (Aleksandr Musorin).
- Исправлена дедупликация при стриминге из движка S3(Azure)Queue. #95467 (Kseniia Sumarokova).
- Исправлено обновление политик строкового доступа, назначенных исходному пользователю, при распределённых запросах. #95469 (Vitaly Baranov).
- Исправлена проверка зашифрованных дисков поверх plain_rewritable (устраняет возможную ошибку
It is not possible to register multiple plain-rewritable disks with the same object storage prefix). #95470 (Azat Khuzhin).
- У табличной функции
mergeTreeProjection отсутствовала проверка прав доступа, из-за чего пользователи без разрешения SELECT для таблицы (но с правами на табличные функции) могли читать данные из её проекций. В этом исправлении добавлена та же проверка прав доступа, которая уже есть у mergeTreeIndex и mergeTreeAnalyzeIndexes. #95480 (Alexey Milovidov).
- Исправлена возможная логическая ошибка при чтении подстолбца size из динамических подстолбцов типов Dynamic/JSON. #95573 (Pavel Kruglov).
- Исправлена регрессия в (экспериментальной) zero‑copy-репликации, появившаяся после #94262, из‑за которой разделяемые части могли быть удалены до того, как другие реплики завершали их получение. #95597 (filimonov).
- Исправлен сбой при применении
tupleElement к массивам JSON. Закрывает #95581. #95647 (Pavel Kruglov).
- Исправлено исключение logical error, возникавшее при использовании сопоставителя (
*) внутри лямбда-функции в предложении VALUES в JOIN с USING. Закрывает #93675. #95661 (Vladimir Cherkasov).
- Исправлена логическая ошибка
There was an error: Cannot obtain error message, возникавшая при ожидании распределённой DDL-операции и одновременном удалении базы данных Replicated. Исправление #95539. #95664 (Alexander Tokmakov).
- Исправлена ошибка, из-за которой функция
IN возвращала некорректные результаты со значениями NULL при включенном transform_null_in. Закрывает #65776. #95674 (Nihal Z. Miaji).
- Корректно обрабатываются типы LowCardinality Nullable в
CAST при включенной настройке cast_keep_nullable. Закрывает #95670. #95747 (Alexey Milovidov).
- Исправлено укрупнение партиционированных данных Delta Lake. #95773 (Kseniia Sumarokova).
- Исправлено состояние гонки для JOIN-столбца типа Nullable в runtime-фильтрах. #95775 (Hechem Selmi).
- Исправлена возможная логическая ошибка в запросе с matcher (
*, table.*) и analyzer_compatibility_join_using_top_level_identifier, когда столбец USING имеет разные типы в таблицах и в списке SELECT. Закрывает #90477. #95808 (Vladimir Cherkasov).
- Исправлены ошибки, связанные с безопасностью памяти, в операциях, выполняемых в параллельном пуле потоков (резервное копирование, агрегация, распределённые запросы), которые могли приводить к исключениям при возникновении ошибки во время планирования задач. #95818 (Raúl Marín).
- Исправлен сбой при выполнении DROP WORKLOAD одновременно с выполнением запросов, использующих удаляемую рабочую нагрузку. #95856 (Alexey Milovidov).
- Исправлена медленная работа при выполнении запросов к системным таблицам от имени пользователя с ограниченными привилегиями во множестве баз данных. Закрывает #89371. #95874 (pufit).
- Исправлено выполнение функции tupleElement для JSON с вложенными путями: ранее это могло приводить к неверному результату запроса. #95907 (Pavel Kruglov).
- Исправлена ошибка
NOT_SUPPORTED, которая могла возникнуть при использовании алгоритма JOIN direct с пустой таблицей семейства MergeTree. #95935 (Vladimir Cherkasov).
- Исправлено: клиент не предлагал и не автодополнял имена алиасов для настроек, закрывает #92190. #95945 (phulv94).
- Исправлено поле event_date в system.asynchronous_metric_log. #95947 (Raúl Marín).
- Исправлена обработка skipping paths в типе данных JSON. Ранее при
JSON(SKIP path) пропускались все ключи JSON с префиксом path, включая ключи вроде "pathpath", что могло приводить к потере данных при вставке. Теперь это исправлено: пропускается только ключ "path". #95948 (Pavel Kruglov).
- Часть с неизвестными проекциями не должна считаться безвозвратно утерянной. #95952 (Mikhail Artemenko).
- Исправлена ошибка, из-за которой пустая строка превращалась в
NULL в таблице Join с ключом Nullable(String). Закрывает #71414. #96002 (Alexey Milovidov).
- Теперь движок PostgreSQL может корректно читать
BOOLEAN[]. Закрывает проблему #72754. #96006 (Alexey Milovidov).
- Исправлен формат
ProtobufList для чтения из пустого файла. Закрывает #70059. #96007 (Alexey Milovidov).
- Исправлена ошибка в формате
ProtobufList, из-за которой для пустых таблиц создавалась фантомная запись. Закрывает #72596. #96010 (Alexey Milovidov).
- Исправлено несоответствие типов
UInt64 и Int32 в функции if в редком случае распределённых запросов и PREWHERE при выводе типов. Закрывает #70017. #96012 (Alexey Milovidov).
- Исправлены
JIT-скомпилированные запросы, использующие тип Bool. #96013 (Alexey Milovidov).
- Исправлена логическая ошибка при чтении столбца UUID из текстового столбца SQLite TEXT. Закрывает #71263. #96016 (Alexey Milovidov).
- Исправлено преобразование типов в движке SQLite для
DateTime, Date, UUID и других типов. Закрывает #73481. #96017 (Alexey Milovidov).
- Значения
FixedString некорректно экранировались в запросах к внешним базам данных SQLite и PostgreSQL. Закрывает #73519. В соавторстве с @jh0x. #96019 (Alexey Milovidov).
- Исправлен сбой из-за ошибки assert в WindowTransform при большом смещении PRECEDING. Закрывает #75852. #96026 (Alexey Milovidov).
- Исправлена ошибка, из-за которой могло происходить повреждение данных, когда параллельные асинхронные вставки используют одинаковые имена параметров, но содержат разные значения. #96035 (Seva Potapov).
- Исправлен период для глобальных профилировщиков (задаётся параметрами
global_profiler_real_time_period_ns и global_profiler_cpu_time_period_ns). Вместо заданного значения использовалось усечённое, из-за чего профилировщик срабатывал чаще, чем предполагалось. #96048 (Antonio Andelic).
- Ранее, если в записи файла манифеста Iceberg для position delete присутствовала ссылка на файл данных, но имела значение NULL, мы не получали корректные границы для соответствующих файлов данных. Этот PR исправляет эту ошибку. #96061 (Daniil Ivanik).
- Исправлена проблема с отзывом ролей по умолчанию. #96103 (Vitaly Baranov).
- Исправлена ошибка use-after-free при анализе индекса в редком случае, когда
use_primary_key отключен и имеется очень большое количество дизъюнкций условий, использующих индекс. #96112 (Alexey Milovidov).
- Исправлена регрессия в кодеке
Gorilla, возникавшая, когда явно указанный размер не соответствовал размеру типа данных, а размер буфера был слишком мал. В предыдущих версиях это приводило к исключению при декомпрессии. Закрывает #78253. #96118 (Alexey Milovidov).
- Предотвращена взаимная блокировка при загрузке словарей, когда один словарь ссылается на таблицу Merge, которая рекурсивно ссылается на него. Закрывает #78360. #96120 (Alexey Milovidov).
- Исправлено использование неинициализированного значения в
formatDateTime при использовании форматтеров переменной ширины, таких как в стиле MySQL и JODA. #96133 (Alexey Milovidov).
- Сочетание настроек
use_const_adaptive_granularity и index_granularity_bytes (что означает “неадаптивную гранулярность”) приводило к неверному вычислению количества строк для чтения и возникновению исключения. #96143 (Alexey Milovidov).
- Выполнение некорректной мутации ALTER UPDATE на файлоподобных таблицах в объектном хранилище, таких как S3 и Azure, могло приводить к разыменованию nullptr. Закрывает #92994. #96162 (Alexey Milovidov).
- Исправлено некорректное поведение
AccessRights::contains, из-за которого при частичном отзыве привилегий возвращались неверные результаты. #96170 (pufit).
- Исправлена коллизия хэша в кэше условий запроса для свернутых констант CTE, которая могла приводить к ошибочному результату запроса. Закрывает #96060. #96172 (Alexey Milovidov).
- Исправлена возможная взаимная блокировка в ProcessList. Она может возникнуть из-за инверсии блокировок, если трекер оверкоммита памяти срабатывает в момент добавления задачи в механизм проверки отмены. #96182 (Antonio Andelic).
- Исправлена ошибка, из-за которой запросы с OUTER JOIN (LEFT, RIGHT или FULL) в сочетании с несколькими INNER JOIN могли возвращать некорректные результаты из-за недопустимого изменения порядка JOIN. Если условие ON в OUTER JOIN ссылалось на столбцы из нескольких ранее присоединённых таблиц, оптимизатор не учитывал все зависимости между таблицами и мог неправильно изменить порядок JOIN, из-за чего часть строк терялась. Закрывает #95972. #96193 (Vladimir Cherkasov).
- Если для таблицы не определена статистика, ClickHouse не должен пытаться её загружать. Это позволяет избежать дополнительных накладных расходов (100+ мс) на проверку наличия файлов статистики. (тикет #96068). #96233 (Han Fei).
- Исправлено
optimize_syntax_fuse_functions: теперь sum/count/avg не переписываются в sumCount(), если аргумент агрегатной функции имеет тип LowCardinality(Nullable). Закрывает #95390. #96239 (Nihal Z. Miaji).
- Исправлено некорректное отсечение партиций для
not IN и функции not has в некоторых случаях. #96241 (Nihal Z. Miaji).
- Исправлена ошибка
stack-use-after-scope в индексе векторного сходства. #96259 (Alexey Milovidov).
- Исправлено: средство запуска тестов не распознавало комментарии с подсказкой об ошибке, если запросу предшествовал SQL-комментарий. #96336 (Yakov Olkhovskiy).
- Исправлена логическая ошибка в KeyCondition, возникавшая, когда у таблицы primary key имеет тип Nullable, а в запросе используется функция
coalesce, у которой первый аргумент — константа. #96340 (Alexey Milovidov).
- Взаимодействие
GROUPING SETS, group_by_use_nulls и типа данных Tuple с LowCardinality внутри него могло приводить к неожиданной структуре блока в конвейере выполнения запроса, что вызывало логическую ошибку. Это стало проявляться после добавления Nullable Tuple-ов. #96358 (Alexey Milovidov).
- Можно было создать таблицу, использовав пустое выражение
() в качестве индекса, что приводило к некорректному обращению к памяти. #96363 (Alexey Milovidov).
- Исправлен сбой в старом анализаторе при JOIN и повторяющихся псевдонимах. #96405 (Ilya Golshtein).
- Исправлена ошибка
Nested columns sizes are inconsistent with local_discriminators, вызванная некорректной оптимизацией фильтрации на месте для столбцов Variant. #96410 (Alexey Milovidov).
- Исправлена ошибка, из-за которой
CREATE TABLE ... CLONE AS ... игнорировал полный квалификатор исходной таблицы. #96415 (Hasyimi Bahrudin).
- Исправлена отмена выполнения табличной функции
mysql с помощью KILL QUERY и отмены запроса (Ctrl+C) в clickhouse-client. #96437 (Roman Vasin).
- Исправлено состояние livelock в потоке проверки отмены для запросов с высокими значениями
max_execution_time. #96450 (Sergei Trifonov).
- Исправлена логическая ошибка, которая в некоторых случаях возникала при использовании дробного
LIMIT/OFFSET в распределённых запросах. #96475 (Nihal Z. Miaji).
- Исправлена ошибка разыменования нулевого указателя в некоторых выражениях с лямбда-функциями. #96479 (Alexey Milovidov).
- Исправлены некорректные результаты при преобразовании столбцов
LowCardinality в Nullable. #96483 (Nihal Z. Miaji).
- Исправлен сбой при создании таблицы Iceberg с секцией
ORDER BY, ссылающейся на несуществующий столбец или использующей позиционный аргумент. Закрывает #93280. #96484 (Konstantin Vedernikov).
- Исправлено исключение runtime filter для столбцов Tuple с Nullable-подполями. #96509 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR во встроенном считывателе Parquet V3, когда столбец фильтра PREWHERE содержит небулевы значения UInt8. #96594 (Alexey Milovidov).
- Исправлена неявная перестройка индекса в реплицируемых таблицах при изменении метаданных. #96600 (Raúl Marín).
- Исправлена гонка данных при DROP WORKLOAD. #96614 (Sergei Trifonov).
- Исправлена ошибка при записи в таблицы Iceberg, из-за которой при вставке в партиционированные таблицы данные могли некорректно распределяться по файлам партиций. #96620 (Konstantin Vedernikov).
- Исправлена ошибка
heap-use-after-free в CREATE TABLE с ограничениями constraints. #96669 (Nikita Taranov).
- Проверка witness version в bech32 во избежание переполнения буфера. #96671 (Raúl Marín).
- Исправлена проблема, из-за которой
system.tables возвращала ошибки, если REST-каталог озера данных создавался с недопустимым параметром auth_header. #96680 (Han Fei).
- Исправлено поведение, при котором
min(timestamp) возвращал значение эпохи (1970-01-01) в _minmax_count_projection после TTL-слияния, если все строки в блоке были отфильтрованы. #96703 (Raquel Barbadillo).
- Улучшена проверка параметра
iceberg_metadata_file_path, чтобы предотвратить обход каталогов и убедиться, что указанный файл метаданных находится в каталоге таблицы. #96754 (Daniil Ivanik).
- Исправлен сбой в
ifNull при использовании аргумента Variant в GROUP BY. #96790 (Alexey Milovidov).
- Исправлены коллизии ключей кэша между таблицами при настройке
table_disk=1. #96818 (Raufs Dunamalijevs).
- Исправлено зависание потока очистки MemoryWorker, вызванное состоянием гонки. #96819 (Antonio Andelic).
- Не записывать в журнал данные с учетными данными из каталогов Iceberg. #96831 (Konstantin Vedernikov).
- Исправлен код возврата
clickhouse-client после ошибки сервера. #96841 (Vitaly Baranov).
- Запросы с CROSS JOIN и включенными параллельными репликами могли возвращать неверный результат. Исправлено в #74337. #96848 (Igor Nikonov).
- Исправлена ошибка, из-за которой запросы
ALTER TABLE DROP COLUMN завершались сбоем, если ранее для того же столбца уже выполнялось легковесное обновление. #96861 (Anton Popov).
- Исправлено переполнение стека (аварийное завершение) при создании резервных копий в архивном формате (
.zip, .tzst) на диске объектного хранилища plain_rewritable. #96872 (Alexey Milovidov).
- Исправлено аварийное завершение сервера, возникавшее, когда резервное копирование завершалось с ошибкой из-за нехватки места на диске или других ошибок ввода-вывода в файловой системе пункта назначения. #96873 (Alexey Milovidov).
- Исправлены
EXCEPT ALL и INTERSECT ALL, которые игнорировали кратность строк и работали как их варианты DISTINCT. #96876 (Alexey Milovidov).
- Исправлено исключение
std::terminate в indexOfAssumeSorted, возникавшее при вызове с несовместимыми типами (например, для массива IPv4 и целочисленного искомого значения). #96877 (Alexey Milovidov).
- Исправлено Исключение
Bad cast from type DB::ColumnNullable to DB::ColumnString, возникавшее при использовании оконных функций с group_by_use_nulls = 1 и CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov).
- Исправлены некорректные результаты, возникавшие при преобразовании JIT-скомпилированными выражениями
DateTime в DateTime64 (например, в CASE/if/multiIf со смешанными типами DateTime). Значение переинтерпретировалось вместо корректного масштабирования, из-за чего после включения компиляции выражений получались неверные временные метки. #96879 (Alexey Milovidov).
- Исправлено исключение из-за логической ошибки в
CoalescingMergeTree, возникавшее, когда выражение индекса пропуска данных создаёт константный столбец (например, bloom_filter для ifNotFinite(1, c0) в случае целочисленного столбца). #96880 (Alexey Milovidov).
- Исправлен неверный номер порта в сообщении об ошибке при ошибочном подключении по HTTP к порту собственного протокола с включенным TLS. #96881 (Alexey Milovidov).
- Исправлено, что
SETTINGS, заданные для отдельных подзапросов, не применялись к табличным функциям, таким как file, в CTE и подзапросах. #96882 (Alexey Milovidov).
- Исправлена утечка памяти в объектах BIO при чтении сертификатов X509. #96885 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR в анализаторе запросов, возникавшее, если лямбда-выражение передавалось там, где ожидалось конкретное значение (например, в качестве аргумента аккумулятора для arrayFold). #96892 (Alexey Milovidov).
- Исправлено исключение
ColumnNullable is not compatible with original при приведении сложных вложенных типов (Array, состоящего из Nullable Tuple, содержащего Map со значениями типа Nullable Enum). #96924 (Alexey Milovidov).
- Устранено состояние гонки при параллельной загрузке сегментированного словаря
HASHED, которое иногда приводило к тому, что некоторые строки не загружались. #96953 (Alexey Milovidov).
- Исправлено состояние гонки между
REPLACE PARTITION и фоновыми мутациями, из-за которого после замены могли быть одновременно видны старые и новые данные. #96955 (Alexey Milovidov).
- Исправлена ошибка в функции
arrayJoin, из-за которой при использовании с INNER JOIN и предложением WHERE возникали дублирующиеся строки; причиной была оптимизация частичного проталкивания предикатов, которая ошибочно проталкивала фильтры с arrayJoin ниже JOIN. #96989 (Alexey Milovidov).
- Исправлен сбой (SEGFAULT) в
clearCaches, вызванный тем, что BlockIO::operator= не перемещал query_metadata_cache, что приводило к преждевременному уничтожению кэшированных снимков хранилища и обращению к хранилищу MergeTreeData после освобождения памяти. #96995 (Alexey Milovidov).
- Исправлена ошибка assertion в
IfTransformStringsToEnumPass, когда функция if или transform возвращает Nullable(String) (например, при GROUP BY ... WITH CUBE и group_by_use_nulls = true). #97002 (Alexey Milovidov).
- Исправлена ошибка, из-за которой при
INSERT ... SELECT с UNION ALL и JOIN в константные строковые столбцы после укрупнения блоков могли записываться неверные значения. #97019 (Hasyimi Bahrudin).
- Исправлено исключение
assert_cast (или скрытое повреждение данных в релизных сборках) при построении статистики столбцов после изменения типа столбца командой ALTER TABLE MODIFY COLUMN. #97027 (Alexey Milovidov).
- Исправлено чтение из неинициализированной памяти в Azure Blob Storage, протоколе SSH и интерфейсах Arrow Flight. #97053 (Alexey Milovidov).
- Исправлены случаи, когда индексы влияли на результат запросов с ROW POLICY/PREWHERE и FINAL. #97076 (Yarik Briukhovetskyi).
- Исправлено оставшееся условие гонки между
REPLACE PARTITION и фоновыми мутациями в таблицах MergeTree, из-за которого старые данные могли снова появляться. #97105 (Alexey Milovidov).
- Исправлена работа неявных индексов со столбцами-псевдонимами; теперь перед их созданием выполняется полная проверка. #97115 (Raúl Marín).
- Исправлена логическая ошибка в
FunctionVariantAdaptor для функций, которым требуются константные аргументы, таких как arrayROCAUC. #97116 (Bharat Nallan).
- Исправлены зависшие мутации в случае, когда
PartCheckThread повторно ставит в очередь GET_PART для части, уже обработанной мутацией, оставляя фантомные записи в parts_to_do. #97162 (Alexey Milovidov).
- Исправлена оценка числа строк в плане запроса для подзапросов с
ORDER BY ... LIMIT, из-за которой оптимизатор мог выбирать неоптимальный порядок JOIN. #97193 (Alexander Gololobov).
- Исправлено исключение
LOGICAL_ERROR в FunctionVariantAdaptor, возникавшее, когда функция, работающая со столбцами Variant, возвращает тип Nothing, что может происходить с пустыми массивами в запросах UNION ALL. #97213 (Alexey Milovidov).
- Исправлено состояние гонки при операциях многокомпонентного копирования в S3 (например, при
BACKUP/RESTORE в S3), которое могло вызывать исключения при одновременном доступе. #97227 (Azat Khuzhin).
- Исправлено исключение
LOGICAL_ERROR, возникавшее, когда arrayJoin в секции WHERE ссылался на столбцы с обеих сторон JOIN. #97239 (Alexey Milovidov).
- Исправлено Исключение
LOGICAL_ERROR при чтении подстолбца .size у разреженного Nullable(String) в Tuple с PREWHERE. #97264 (Alexey Milovidov).
- Исправлено исключение “Количество строк в отложенном фрагменте не совпадает с количеством смещений” в
LazyMaterializingTransform при чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) с использованием ORDER BY ... LIMIT. #97270 (Alexey Milovidov).
- Исправлена потеря таблицы из базы данных при
SYSTEM RESTART REPLICA, если повторное создание таблицы завершается исключением, не связанным с ZooKeeper (например, из-за лимита памяти), что приводило к несовпадению дайджестов metadata в DatabaseReplicated. #97276 (Alexey Milovidov).
- Поле
readonly в system.merge_tree_settings теперь корректно отражает, что некоторые настройки MergeTree (например, index_granularity) всегда доступны только для чтения. #97277 (Robert Schulze).
- Исправлен сбой при оптимизации
count() для таблиц MergeTree, когда снимок хранилища создавался без данных. #97281 (Pablo Marcos).
- Исправлено возможное аварийное завершение при определении имён функций по отладочной информации для трассировок стека. #97294 (Azat Khuzhin).
- Исправлена логическая ошибка, связанная с analyzer_compatibility_join_using_top_level_identifier и столбцами ALIAS. Закрывает #96228. #97297 (Vladimir Cherkasov).
- Исправлено исключение
LOGICAL_ERROR в applyOrder при использовании столбцов с текстовым индексом в предложении QUALIFY. #97313 (Alexey Milovidov).
- Системная таблица
system.functions теперь для внутренних функций отображает categories = 'Internal' вместо categories = ''. #97315 (Robert Schulze).
- Запрос с цепочкой RIGHT JOIN и включенными параллельными репликами может давать некорректный результат. Исправлено в #74341. #97316 (Igor Nikonov).
- Исправлены ложные ошибки
TABLE_UUID_MISMATCH, которые могли возникать в refreshable materialized view и других сценариях при переименовании таблиц. #97323 (Azat Khuzhin).
- Исправлен segfault при резервном копировании
StorageKeeperMap, вызванный use-after-free висячего указателя на хранилище в отложенном батче резервного копирования. #97336 (Alexey Milovidov).
- Исправлена функция
exists со скалярным подзапросом внутри ALTER UPDATE/DELETE, когда включен параметр mutations_execute_subqueries_on_initiator. Скалярный подзапрос вычислялся некорректно, что могло привести к ошибке или к повреждённой команде мутации, из-за которой таблица не загружалась при следующем перезапуске сервера. #97347 (Kirill Kopnev).
- Исправлено логическое исключение
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8))), возникавшее при сравнении NULL со столбцом Variant, содержащим типы LowCardinality. #97379 (Alexey Milovidov).
- Исправлена возможная гонка при выполнении
EXCHANGE TABLES параллельно с включенным сегментированным кэшем запросов. #97411 (Konstantin Vedernikov).
- Исправлено исключение
LOGICAL_ERROR при преобразовании из Array в QBit, когда nullable_source из внешней обёртки Tuple заменяет преобразуемый столбец типа Array на столбец несовместимого типа. Закрывает #97389. #97413 (Alexey Milovidov).
- Исправлена неконсистентность при повторном форматировании AST для литералов кортежей с алиасом в скобках: например,
(('a', 'b') AS x) ошибочно переформатировалось в tuple(('a', 'b') AS x). #97418 (Alexey Milovidov).
- Исправлено исключение при асинхронных вставках с дедупликацией, возникавшее, когда ошибка парсинга приводила к созданию пустого блока без строк. #97460 (Sema Checherinda).
- Исправлено исключение “Количество строк в отложенном фрагменте не соответствует количеству смещений” в
LazyMaterializingTransform при чтении из таблиц с неадаптивной гранулярностью индекса (index_granularity_bytes = 0) при использовании ORDER BY ... LIMIT. #97482 (Alexey Milovidov).
- Исправлены настройки вставки в Iceberg. Добавлен алиас для настройки
allow_experimental_insert_into_iceberg. #97483 (Konstantin Vedernikov).
- Исправлена ошибка
ACCESS_DENIED для пользователей без разрешения CREATE TEMPORARY TABLE, когда оптимизация optimize_inverse_dictionary_lookup преобразует предикаты dictGet(...). Теперь ClickHouse пропускает это преобразование и выполняет исходное выражение. Закрывает #97269. #97484 (Nihal Z. Miaji).
- Исправлен сбой assert (исключение в отладочных сборках и сборках с санитайзерами) в
Set и MergeTreeIndexSet при обработке столбцов с внутренними разреженными подстолбцами (например, столбцов Tuple из частей MergeTree с разными профилями разреженной сериализации). #97493 (Alexey Milovidov).
- Исправлено возможное обращение к памяти после её освобождения в StorageKafka2. #97520 (Bharat Nallan).
- Исправлена работа
INTO OUTFILE с TRUNCATE и настройкой into_outfile_create_parent_directories, когда путь вывода содержит каталоги. #97549 (Alexey Milovidov).
- Исправлена ошибка
BAD_ARGUMENTS при запросах к таблицам с лямбда-выражениями в столбцах ALIAS через табличную функцию merge() при включенном анализаторе. #97551 (Alexey Milovidov).
- Исправлено исключение
system.zookeeper_info, если zxid в Keeper равен 0. #97553 (Alexey Milovidov).
- Исправлена возможная логическая ошибка в словаре
ip_trie, если тип ключа отличается от String. #97555 (Bharat Nallan).
- Исправлена ошибка, из-за которой OAuth-аутентификация REST-каталога не работала для базового
RestCatalog (она работала только для производных каталогов, таких как OneLakeCatalog). Из-за этого REST-каталог по умолчанию перестал работать после добавления каталога BigLake. #97561 (Konstantin Vedernikov).
- Функции Geometry (
perimeterSpherical, areaSpherical и т. д.) теперь принимают отдельные подтипы геометрии (Polygon, Ring, Point и т. д.) помимо вариативного типа Geometry. #97571 (Alexey Milovidov).
- Исправлено исключение
LOGICAL_ERROR при использовании isNull/isNotNull для подстолбцов типов Nullable(Tuple(... Nullable(T) ...)). Закрывает #97224. #97582 (Alexey Milovidov).
- Исправлено разыменование нулевого указателя при применении патч-частей в ходе легковесных обновлений. #97583 (Alexey Milovidov).
BaseSettings::readBinary передаёт индекс из accessor.find в field_infos[] без проверки на специальное значение «не найдено» (то есть -1), что может привести к выходу за границы std::vector. Проблему удалось выявить благодаря механизмам защиты libcxx. Вероятно, это происходило при десериализации плана запроса, когда более новый сервер отправляет настройку, неизвестную более старому серверу. Метод чтения на основе строк уже обрабатывает этот случай корректно; в readBinary такой же проверки не было. #97585 (Miсhael Stetsyuk).
- Исправлены некорректные результаты запросов
UNION ALL, в которых одна ветвь содержала предикат, всегда равный false: такая ветвь ошибочно читала данные вместо того, чтобы ничего не возвращать. #97620 (Bharat Nallan).
- Исправлена ошибка
UNSUPPORTED_METHOD, возникавшая при IN (col) с единственной ссылкой на столбец. #97646 (Alexey Milovidov).
- Исправлено Исключение логической ошибки при
GROUP BY ... WITH ROLLUP/CUBE, когда ключи содержат LowCardinality(Nullable(...)) внутри Nullable(Tuple(...)). #97647 (Alexey Milovidov).
- Исправлена несогласованность в форматировании AST для
NOT (1, 1, 1), которая могла приводить к LOGICAL_ERROR в отладочных сборках. #97653 (Alexey Milovidov).
- Исправлено исключение
keeper-converter при обработке пустых файлов журнала транзакций ZooKeeper. #97673 (Alexey Milovidov).
Улучшения сборки/тестирования/упаковки
- ClickHouse теперь можно собирать с помощью clang-23 (master). #95578 (Alexey Milovidov).
- Исправлено принудительное выставление
is_local в false при настроенном bind_host; вместо этого добавлен интеграционный тест. Дополнение к #74741. #93109 #96018 (Zhigao Hong).
- Стресс-тесты: исправлены стресс-тесты и тесты обновления в CI. теги
no-{build} теперь игнорируются. добавлена рандомизация совместимости. #94693 (Nikita Fomichev).
- Опубликован бинарный файл parser_memory_profiler из сборки. Инструмент можно использовать для анализа потребления памяти деревом AST. #95826 (Ilya Yatsishin).
- Добавлен флаг
--symbolize для инструмента parser_memory_profiler, который создаёт файлы .heap.sym с разрешёнными именами символов в результатах. #96477 (Ilya Yatsishin).
- Зафиксированы версии сторонних Docker-образов в интеграционных тестах. #96500 (Alexey Milovidov).
- Восстановлена возможность динамической линковки
OpenSSL. Это не рекомендуется и не используется ни в каких продакшн-сборках, но такая возможность всё ещё остаётся для энтузиастов из интернета. #96506 (Govind R Nair).
- Диапазон
magic_enum уменьшен с [-100, 1000] до значения по умолчанию [-128, 127] с использованием специализации Coordination::OpNum для конкретного типа, что сокращает время сборки. #96632 (Alexey Milovidov).
- Удалены лишние шаблоны C++ из классов Function, чтобы сократить время сборки. #96646 (Alexey Milovidov).
- Перенесли генерацию
StorageSystemLicenses на этап конфигурации, чтобы повысить параллелизм сборки. #96697 (Alexey Milovidov).
- Распараллелено сканирование лицензий. #96727 (Raúl Marín).
- Добавлен функциональный тест без сохранения состояния для поддержки протокола SSH. #96996 (Alexey Milovidov).
- Kafka 3.9.0 добавлена в инфраструктуру функциональных тестов без сохранения состояния, что позволяет напрямую тестировать движки таблиц Kafka и Kafka2, где ClickHouse Keeper используется вместо ZooKeeper. Шесть новых тестов без сохранения состояния охватывают базовые сценарии записи и чтения, виртуальные столбцы, INSERT, несколько форматов, обработку повреждённых сообщений и хранение смещений через Keeper. #96997 (Alexey Milovidov).
- Добавлен CI-процесс для сборки оптимизированного тулчейна clang с PGO+BOLT. #96991 (Alexey Milovidov).
- В CI используется оптимизированная с помощью PGO сборка LLVM/Clang, что должно ускорить сборку на 20..30%. #97031 (Alexey Milovidov).
- Заменены математические функции glibc на реализации из llvm-libc. #90151 (Konstantin Bogdanov).
- Boost обновлён с 1.83 до 1.90, что исправляет сбой из-за срабатывания assert в
devector в отладочных сборках. #97037 (Alexey Milovidov).
- Обновлён
postgres до версии REL_18_1. #95189 (Konstantin Bogdanov).
- Используется
libexpat 2.7.3. #95218 (Konstantin Bogdanov).
- Используется
OpenSSL 3.5.5. #95345 (Konstantin Bogdanov).
- Используется
simdjson v4.2.4. #97129 (Konstantin Bogdanov).
- Используется
libarchive 3.8.5. #97131 (Konstantin Bogdanov).
- Используется
fast_float версии 8.2.3. #97133 (Konstantin Bogdanov).
- Использовать
abseil-cpp 20260107.1, s2geometry v0.13.1. #97134 (Konstantin Bogdanov).
- Обновили
libxml2 до версии 2.15.1. #95574 (Robert Schulze).
- Обновлены 7 Docker-образов для интеграционных тестов уровня 3: устаревшие (EOL) или удалённые базовые образы заменены на актуальные поддерживаемые версии. #97314 (Rahul).
- Добавлены запросы из бенчмарка TPC-DS. #97349 (Raufs Dunamalijevs).
- Отдельные cmake-опции для наборов инструкций x86 (
ENABLE_SSSE3, ENABLE_AVX2, NO_SSE3_OR_HIGHER, ARCH_NATIVE и т. д.) заменены одной числовой опцией X86_ARCH_LEVEL (1/2/3/4), соответствующей стандартным уровням микроархитектуры x86-64, которые уже используются системой диспетчеризации во время выполнения. #97354 (Raúl Marín).
- Устранено инстанцирование вариантов шаблона
division_by_nullable=true для операций, не связанных с делением, в FunctionBinaryArithmetic, что сокращает время компиляции и размер бинарного файла. #97496 (Raúl Marín).
- Уменьшена зависимость от
Exception.h: этот файл убран из часто используемых заголовков, таких как typeid_cast.h, assert_cast.h, Context_fwd.h, IDataType.h и различных заголовочных файлов Column. #97497 (Raúl Marín).
- Всегда используйте заголовочные файлы из комплекта
compiler-rt (интерфейсы sanitizer и XRay) вместо заголовков системного компилятора и по умолчанию собирайте библиотеки compiler-rt из исходников. #97499 (Raúl Marín).
- Исключено включение заголовков boost/multiprecision в
wide_integer_impl.h на платформах с достаточно точным long double, что ускоряет сборку. #96633 (Alexey Milovidov).
- Реализован джоб LLVM Code Coverage; на первом этапе он включён для ветки master. #90952 (Alexey Bakharew).
- В релизных сборках включён быстрый режим защиты libcxx. В основном это нужно для проверок выхода за границы. Судя по результатам тестов производительности, заметного влияния на производительность не ожидается. #94757 (Miсhael Stetsyuk).
обратно несовместимое изменение
- Исправлено несогласованное форматирование, вызванное некорректной подстановкой псевдонимов в форматтере. Это закрывает #82833. Это закрывает #82832. Это закрывает #68296. Это изменение потенциально нарушает обратную совместимость: когда анализатор отключен, некоторые запросы CREATE VIEW с IN, ссылающимся на псевдоним, не могут быть обработаны. Чтобы избежать этой несовместимости, включите анализатор (по умолчанию он включен начиная с версии 24.3). #82838 (Alexey Milovidov).
- Кодеки
DEFLATE_QPL и ZSTD_QAT были удалены. Пользователям рекомендуется до обновления перекодировать существующие данные, сжатые с помощью DEFLATE_QPL или ZSTD_QAT, в другой кодек. Обратите внимание: для использования этих кодеков должны были быть включены настройки enable_deflate_qpl_codec и enable_zstd_qat_codec. #92150 (Robert Schulze).
- Улучшена отладка UDF: включён захват stderr в
system.query_log.exception. Ранее stderr из UDF записывался только в файлы и не отображался в журнале запросов, из-за чего отладка была невозможна. Теперь stderr по умолчанию вызывает исключения и полностью накапливается (до 1 МБ) перед тем, как сгенерировать исключение, поэтому полные трассировки Python и сообщения об ошибках появляются в system.query_log.exception, что упрощает диагностику. #92209 (Xu Jia).
- Пустой список столбцов в условии
JOIN USING () теперь считается синтаксической ошибкой. Ранее предполагалось, что во время выполнения запроса это будет INVALID_JOIN_ON_EXPRESSION. В некоторых случаях, например при JOIN с хранилищем Join, это приводило к LOGICAL_ERROR; исправление закрывает #82502. #92371 (Vladimir Cherkasov).
- По умолчанию для SKIP REGEXP в типе JSON используется частичное совпадение. Закрывает #79250. #92847 (Pavel Kruglov).
- Отменено изменение “Allow INSERT into simple ALIAS columns” (отменяет ClickHouse/ClickHouse#84154). Оно не работает с пользовательскими форматами, и для него нет отдельной настройки. #92849 (Azat Khuzhin).
- Настройка, вызывающая ошибку, если каталог озера данных не имеет доступа к объектному хранилищу. #93606 (Konstantin Vedernikov).
- Движок базы данных
Lazy удалён и больше не доступен. Закрывает #91231. #93627 (Alexey Milovidov).
- Удалён режим
transposed_with_wide_view для metric_log — из-за ошибки он неработоспособен. Задать system.metric_log в этом режиме больше нельзя. Это частично отменяет #78412. #93867 (Alexey Milovidov).
- Теперь для рабочих нагрузок по умолчанию используется вытесняющее планирование CPU. См. настройку сервера
cpu_slot_preemption. #94060 (Sergei Trifonov).
- Экранировать имена файлов индексов, чтобы избежать повреждения частей. После этого изменения ClickHouse не сможет загружать индексы с не-ASCII-символами в имени, созданные в предыдущих версиях. Для этого можно использовать настройку MergeTree
escape_index_filenames. #94079 (Raúl Marín).
- Настройки формата
exact_rows_before_limit, rows_before_aggregation, cross_to_inner_join_rewrite, regexp_dict_allow_hyperscan, regexp_dict_flag_case_insensitive, regexp_dict_flag_dotall и dictionary_use_async_executor теперь переведены в разряд обычных настроек (не настроек формата). Это исключительно внутреннее изменение и не имеет заметных для пользователя побочных эффектов, кроме (маловероятного) случая, когда вы указали какие-либо из этих настроек в определениях движков таблиц Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog или NATS. В таких случаях эти настройки раньше игнорировались, а теперь при таких определениях генерируется ошибка. #94106 (Robert Schulze).
- Функции
joinGet/joinGetOrNull теперь требуют наличия привилегии SELECT для базовой таблицы Join. После этого изменения для выполнения joinGet('db.table', 'column', key) требуется, чтобы у пользователя была привилегия SELECT как для столбцов ключа, определённых в таблице Join, так и для извлекаемого столбца-атрибута. Запросы без этих привилегий будут завершаться ошибкой ACCESS_DENIED. Для перехода предоставьте необходимые разрешения с помощью GRANT SELECT ON db.join_table TO user для полного доступа к таблице или GRANT SELECT(key_col, attr_col) ON db.join_table TO user для доступа на уровне столбцов. Это изменение затрагивает всех пользователей и приложения, использующие joinGet/joinGetOrNull, если явные привилегии SELECT ранее не были настроены. #94307 (Vladimir Cherkasov).
- Для запросов
CREATE TABLE ... AS ... теперь проверяется SHOW COLUMNS. Ранее проверялся SHOW TABLES, но для такой проверки разрешений это некорректный grant. #94556 (pufit).
- Формат вывода
Hash теперь не зависит от размеров блоков. #94503 (Alexey Milovidov). Обратите внимание, что из-за этого хеш-значения в выводе будут отличаться от предыдущих версий.
- HTTP API и встроенный веб-интерфейс для ClickHouse Keeper. #78181 (pufit и speeedmaster).
- Дедупликация async insert теперь работает с зависимыми materialized views. При коллизии по block_id исходный блок фильтруется: из него удаляются строки, связанные с block_id, а оставшиеся строки преобразуются всеми соответствующими SELECT-запросами materialized views; в результате исходный блок пересобирается без конфликтующих строк. #89140 (Sema Checherinda). Теперь можно использовать дедупликацию с async inserts, когда задействованы materialized views. #93957 (Sema Checherinda).
- Добавлены новый синтаксис и новый механизм, упрощающие и расширяющие функциональность индексов-проекций. Это продолжение работы из https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
- Добавлена поддержка текстовых индексов для столбцов
Array. #89895 (Jimmy Aguilar Mena).
- Параметр
use_variant_as_common_type теперь включён по умолчанию, что позволяет использовать несовместимые типы внутри Array, в запросах UNION и в ветвях if/multiIf/case. #90677 (Alexey Milovidov).
- Добавлена новая системная таблица
zookeeper_info. Реализовано в #88014. #90809 (Smita Kulkarni).
- Добавлена поддержка типа
Variant во всех функциях. #90900 (Bharat Nallan).
- Добавляет метрику
ClickHouse_Info в конечную точку Prometheus /metrics, содержащую в основном информацию о версии, что позволяет строить графики и отслеживать подробные сведения о версии с течением времени. #91125 (Christoph Wurm).
- Добавлена новая четырёхбуквенная команда
rcfg для Keeper, позволяющая изменять конфигурацию кластера. Эта команда предоставляет более широкие возможности изменения конфигурации, чем стандартный запрос reconfigure. В качестве аргумента команда принимает строку json. Полный набор байтов, отправляемых в TCP-интерфейс, должен выглядеть так: rcfg{json_string_length_big_endian}{json_string}. Вот как могут выглядеть некоторые примеры команды: {"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin).
- Добавлена функция
reverseBySeparator, которая меняет порядок подстрок в строке, разделённой указанным разделителем, на обратный. Закрывает #91463. #91780 (Xuewei Wang).
- Добавляет новую настройку
max_insert_block_size_bytes, которая позволяет точнее управлять формированием вставляемых блоков. #92833 (Kirill Kopnev).
- DDL-запросы с предложением
ON CLUSTER можно выполнять для базы данных Replicated, если включена настройка ignore_on_cluster_for_replicated_database. В этом случае имя кластера будет проигнорировано. #92872 (Kirill).
- Добавлена функция
mergeTreeAnalyzeIndexes. #92954 (Azat Khuzhin).
- Добавлена новая настройка
use_primary_key. Установите её в false, чтобы отключить отсечение гранул по первичному ключу. #93319 (Nihal Z. Miaji).
- Добавлена табличная функция
icebergLocalCluster. #93323 (Anton Ivashkin).
- Добавлена функция
cosineDistanceTransposed, которая приблизительно вычисляет косинусное расстояние между двумя точками. #93621 (Raufs Dunamalijevs).
- Добавлен столбец
files в таблицу system.parts, показывающий количество файлов в каждой части данных. #94337 (Match).
- Добавлен max-min-справедливый планировщик для управления параллелизмом. Обеспечивает более справедливое распределение ресурсов при высокой переподписке, когда множество запросов конкурируют за ограниченные слоты CPU. Короткие запросы не страдают из-за длительных запросов, которые со временем накопили больше слотов. Включается значением
max_min_fair настройки сервера concurrent_threads_scheduler. #94732 (Sergei Trifonov).
- В клиенте ClickHouse появилась возможность переопределять TLS SNI при подключении к серверу. #89761 (Matt Klein).
- Добавлена поддержка временных таблиц в вызовах функции
joinGet. #92973 (Eduard Karacharov).
- Поддержка векторов удаления в движке таблицы
DeltaLake. #93852 (Kseniia Sumarokova).
- Добавлена поддержка deletion vectors в
deltaLakeCluster. #94365 (Kseniia Sumarokova).
- Поддержка Google Cloud Storage для озер данных. #93866 (Konstantin Vedernikov).
Экспериментальные возможности
- Параметр
use_skip_indexes_on_data_read теперь включен по умолчанию. Этот параметр позволяет выполнять фильтрацию в потоковом режиме одновременно с чтением, что улучшает производительность запросов и сокращает время запуска. #93407 (Shankar Iyer).
- Повышена производительность
DISTINCT для столбцов LowCardinality. Закрывает #5917. #91639 (Nihal Z. Miaji).
- Оптимизирована агрегатная функция
distinctJSONPaths: теперь она читает только JSON-пути из частей данных, а не весь JSON-столбец. #92196 (Pavel Kruglov).
- В JOIN теперь проталкивается больше фильтров. #85556 (Nikita Taranov).
- Поддержано больше случаев проталкивания из условия ON в JOIN, когда фильтр использует входные данные только с одной стороны. Поддерживаются JOIN
ANY, SEMI, ANTI. #92584 (Dmitry Novik).
- Разрешено использовать эквивалентные множества для проталкивания фильтров при
SEMI JOIN. Закрывает #85239. #92837 (Dmitry Novik).
- Пропускаем чтение левой стороны hash JOIN, если правая сторона пуста. Раньше левая сторона читалась до первого непустого блока, что могло приводить к большому объёму лишней работы при интенсивной фильтрации или агрегации. #94062 (Alexander Gololobov).
- Использование метода “fastrange” (Daniel Lemire) для партиционирования данных внутри конвейера выполнения запроса. Это может улучшить параллельную сортировку и JOIN-операции. #93080 (Alexey Milovidov).
- Повышена производительность оконных функций, когда PARTITION BY совпадает с ключом сортировки или является его префиксом. #87299 (Nikita Taranov).
- Внешний фильтр теперь проталкивается в представления, что позволяет применять PREWHERE на локальных и удалённых узлах. Устранена проблема #88189. #88316 (Igor Nikonov).
- Реализована JIT-компиляция для ещё большего числа функций. Закрывает #73509. #88770 (Alexey Milovidov совместно с Taiyang Li).
- Если индекс пропуска данных, используемый в запросе
FINAL, построен по столбцу, входящему в первичный ключ, дополнительный этап проверки пересечения по первичному ключу с другими частями не требуется и больше не выполняется. Устраняет #85897. #93899 (Shankar Iyer).
- Улучшены производительность и использование памяти при дробных
LIMIT и OFFSET. #91167 (Ahmed Gouda).
- Исправлено использование более быстрой логики произвольного чтения в префетчере ридера Parquet V3. Закрывает #90890. #91435 (Arsen Muk).
- Повышена производительность
icebergCluster. Закрывает #91462. #91537 (Yang Jiang).
- Не выполнять фильтрацию по виртуальным столбцам для константных фильтров. #91588 (c-end).
- Снижено использование памяти при INSERT и слияниях с частями Wide в очень широких таблицах за счёт включения адаптивных буферов записи. Добавлена поддержка адаптивных буферов записи для зашифрованных дисков. #92250 (Azat Khuzhin).
- Повышена производительность полнотекстового поиска с текстовым индексом и токенизатором
sparseGrams за счёт сокращения числа токенов, по которым выполняется поиск в индексе. #93078 (Anton Popov).
- Функция
isValidASCII была оптимизирована для случаев с положительным результатом, то есть для входных значений, полностью состоящих из ASCII. #93347 (Robert Schulze).
- Оптимизация read-in-order теперь распознаёт случаи, когда столбцы ORDER BY являются константами из-за условий WHERE, что позволяет эффективно читать данные в обратном порядке. Это полезно для многотенантных запросов, таких как
WHERE tenant='42' ORDER BY tenant, event_time DESC, которые теперь могут использовать InReverseOrder без необходимости полной сортировки.”. #94103 (matanper).
- Добавлен специализированный класс AST для Enum, который хранит значения параметров в виде пар (string, integer) вместо дочерних элементов ASTLiteral для оптимизации потребления памяти. #94178 (Ilya Yatsishin).
- Распределённый анализ индексов на нескольких репликах. Полезно при использовании совместно используемого хранилища и очень больших объёмов данных в кластере. Это применимо к SharedMergeTree (ClickHouse Cloud) и может быть применимо к другим типам таблиц MergeTree с совместно используемым хранилищем. #86786 (Azat Khuzhin).
- Снижены накладные расходы на JOIN Runtime Filters за счет их отключения в следующих случаях: - в фильтре Блума установлено слишком много битов - на этапе выполнения отфильтровывается слишком мало строк. #91578 (Alexander Gololobov).
- Используйте буфер в памяти для входных данных коррелированных подзапросов, чтобы не вычислять их многократно. Часть #79890. #91205 (Dmitry Novik).
- Разрешить всем репликам при чтении с использованием параллельных реплик параллельно перехватывать осиротевшие диапазоны. Это улучшает балансировку нагрузки и снижает задержки на длинном хвосте. #91374 (zoomxi).
- Внешняя агрегация/сортировка/JOIN теперь учитывают настройку запроса
temporary_files_codec во всех контекстах. Исправлена проблема с отсутствующими profile events для grace hash join. #92388 (Vladimir Cherkasov).
- Сделали более надёжным определение использования памяти запросом при сбросе на диск во время агрегации/сортировки. #92500 (Azat Khuzhin).
- Оценка общего числа строк и статистики NDV (числа различных значений) для столбцов ключа агрегации. #92812 (Alexander Gololobov).
- Оптимизировано сжатие списка postings с помощью simdcomp. #92871 (Peng Jian).
- Переработана обработка режима Ordered в S3Queue с использованием бакетов. Это также должно повысить производительность за счёт сокращения числа запросов к Keeper. #92889 (Kseniia Sumarokova).
- Функции
mapContainsKeyLike и mapContainsValueLike теперь могут использовать текстовый индекс для mapKeys() и mapValues() соответственно. #93049 (Michael Jarrett).
- Снижено использование памяти в не-Linux-системах (включена немедленная очистка «грязных» страниц jemalloc). #93360 (Eduard Karacharov).
- Реализована принудительная очистка арен jemalloc, если отношение объёма грязных страниц к
max_server_memory_usage превышает memory_worker_purge_dirty_pages_threshold_ratio. #93500 (Eduard Karacharov).
- Снижено использование памяти для AST. #93601 (Nikolai Kochetov).
- В некоторых случаях мы замечали, что ClickHouse не соблюдает лимит памяти при чтении из таблицы. Это исправлено. #93715 (Nikita Mikhaylov).
- Расширения Keeper
CHECK_STAT и TRY_REMOVE теперь включены по умолчанию. #93886 (Mikhail Artemenko).
- Разбор нижних и верхних границ имён файлов для позиционных удалений из записей manifest file в Iceberg для более точного выбора соответствующих файлов данных. #93980 (Daniil Ivanik).
- Добавлены ещё две настройки для управления максимальным количеством динамических подстолбцов в JSON-столбце. Первая — настройка MergeTree
merge_max_dynamic_subcolumns_in_compact_part (аналогично уже добавленной merge_max_dynamic_subcolumns_in_wide_part), которая ограничивает количество динамических подстолбцов, создаваемых при слиянии в Compact part. Вторая — настройка уровня запроса max_dynamic_subcolumns_in_json_type_parsing, которая ограничивает количество динамических подстолбцов, создаваемых при разборе JSON-данных; она позволяет задавать этот лимит при вставке. #94184 (Pavel Kruglov).
- В некоторых случаях немного оптимизировано укрупнение блоков для JSON-столбцов. #94247 (Pavel Kruglov).
- Уменьшен размер очередей пула потоков с учетом опыта эксплуатации в продакшне. Добавлена явная проверка потребления памяти перед чтением каких-либо данных из MergeTree. #94692 (Nikita Mikhaylov).
- Сделано так, чтобы при нехватке CPU планировщик отдавал предпочтение потоку MemoryWorker, поскольку это защищает процесс ClickHouse от критической угрозы. #94864 (Nikita Mikhaylov).
- Очистка грязных страниц jemalloc теперь выполняется в отдельном потоке, а не в основном потоке MemoryWorker. Если очистка выполняется медленно, это может задерживать обновление использования RSS, что может приводить к аварийному завершению процесса из-за нехватки памяти. Добавлен новый параметр конфигурации
memory_worker_purge_total_memory_threshold_ratio, чтобы запускать очистку грязных страниц в зависимости от доли общего использования памяти. #94902 (Antonio Andelic).
system.blob_storage_log теперь поддерживается для Azure Blob Storage. #93105 (Alexey Milovidov).
- Реализован
blob_storage_log для Local и HDFS. Исправлена ошибка, из-за которой S3Queue использовал для записи в blob_storage_log не имя диска. В blob_storage_log добавлен столбец error_code. Тестовый файл конфигурации разделён, чтобы упростить локальное тестирование. #93106 (Alexey Milovidov).
clickhouse-client и clickhouse-local будут подсвечивать группы цифр (тысячи, миллионы и т. д.) внутри числовых литералов во время ввода. Это закрывает #93100. #93108 (Alexey Milovidov).
- В
clickhouse-client добавлена поддержка аргументов командной строки с пробелами вокруг знака равенства. Закрывает #93077. #93174 (Cole Smith).
- С
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap> CLI-клиент теперь может, как и раньше, использовать Ctrl-R для обычного поиска, а Ctrl-T — для нечёткого поиска. #87785 (Larry Snizek).
- Оператор очистки кэша
SYSTEM DROP [...] CACHE создавал ложное впечатление, что этот оператор отключает кэш. ClickHouse теперь поддерживает оператор SYSTEM CLEAR [...] CACHE, который звучит понятнее. Старый синтаксис по-прежнему доступен. #93727 (Pranav Tiwari).
- Поддержка составного первичного ключа в
EmbeddedRocksDB. Закрывает #32819. #33917 (usurai).
- Теперь можно использовать неконстантный IN со скалярами (запросы вида
val1 NOT IN if(cond, val2, val3)). #93495 (Yarik Briukhovetskyi).
- Предотвращена передача заголовков
x-amz-server-side-encryption в S3-запросах HeadObject, UploadPart и CompleteMultipartUpload, поскольку они не поддерживаются. #64577 (Francisco J. Jurado Moreno).
- Отслеживание hive-партиционирования в режиме ordered в S3Queue. Закрывает #71161. #81040 (Anton Ivashkin).
- Оптимизировано резервирование места в файловом кэше.
FileCache::collectCandidatesForEviction теперь будет выполняться без уникальной блокировки. #82764 (Kseniia Sumarokova).
- Добавлена поддержка составной стратегии ротации (размер + время) для журнала сервера. #87620 (Jianmei Zhang).
- CLI-клиент теперь может использовать
<warnings>false</warnings> вместо параметра командной строки --no-warnings. #87783 (Larry Snizek).
- Добавлена поддержка агрегатной функции
avg, принимающей в качестве аргументов значения типов Date, DateTime и Time. Закрывает #82267. #87845 (Yarik Briukhovetskyi).
- Оптимизация
use_join_disjunctions_push_down по умолчанию включена. #89313 (Alexey Milovidov).
- Добавлена поддержка большего числа движков таблиц и типов источников данных в коррелированных подзапросах. Закрывает #80775. #90175 (Dmitry Novik).
- Если схема параметризованного представления явно задана, она отображается. Закрывает #88875, #81385. #90220 (Grigorii Sokolik).
- Корректная обработка пропуска в записях журнала Keeper, если они находятся до последнего зафиксированного индекса. #90403 (Antonio Andelic).
- Улучшена работа настройки
min_free_disk_bytes_to_perform_insert с томами JBOD. #90878 (Aleksandr Musorin).
- Добавлена возможность указывать настройку
storage_class_name в именованных коллекциях для движка таблицы S3 и табличной функции s3. #91926 (János Benjamin Antal).
- Добавлена поддержка вставки в auxiliary ZooKeeper через
system.zookeeper. #92092 (RinChanNOW).
- Добавлены новые метрики для Keeper: события профиля
KeeperChangelogWrittenBytes, KeeperChangelogFileSyncMicroseconds, KeeperSnapshotWrittenBytes и KeeperSnapshotFileSyncMicroseconds, а также гистограммные метрики KeeperBatchSizeElements и KeeperBatchSizeBytes. #92149 (Miсhael Stetsyuk).
- Добавлена новая настройка
trace_profile_events_list, которая ограничивает трассировку с помощью trace_profile_event указанным списком имён событий. Это позволяет точнее собирать данные при высоких рабочих нагрузках. #92298 (Alexey Milovidov).
- Добавлена поддержка SYSTEM NOTIFY FAILPOINT для приостанавливаемых failpoint. — Добавлена поддержка SYSTEM WAIT FAILPOINT fp PAUSE/RESUME. #92368 (Shaohua Wang).
- В
system.data_skipping_indices добавлен столбец creation (неявный/явный). #92378 (Raúl Marín).
- Разрешена передача описания столбцов dyn-таблиц YTsaurus в источник словаря. #92391 (MikhailBurdukov).
- В #63985 мы добавили возможность указывать все параметры, необходимые для настройки TLS, отдельно для каждого порта (см. composable protocols), так что теперь не нужно полагаться на глобальную конфигурацию TLS. Однако реализация по-прежнему неявно требует наличия глобального раздела конфигурации
openSSL.server, что конфликтует со сценариями, где для разных портов нужны разные настройки TLS. Например, в развертываниях keeper-in-server нам нужны отдельные конфигурации TLS для взаимодействия между узлами Keeper и для подключений клиента ClickHouse. #92457 (Miсhael Stetsyuk).
- Добавлена новая настройка
input_format_binary_max_type_complexity, которая ограничивает общее число узлов типов, декодируемых в бинарном формате, чтобы предотвратить передачу вредоносных полезных нагрузок. #92519 (Raufs Dunamalijevs).
- В
system.background_schedule_pool{,_log} теперь отражаются выполняющиеся задачи. Добавлена документация. #92587 (Azat Khuzhin).
- Выполнять текущий запрос при поиске по Ctrl+R в клиенте, если в истории не найдено совпадений. #92749 (Azat Khuzhin).
- Добавлена поддержка
EXPLAIN indices = 1 в качестве алиаса для EXPLAIN indexes = 1. Закрывает #92483. #92774 (Pranav Tiwari).
- Ридер Parquet теперь позволяет читать столбцы Tuple или Map в формате JSON:
select x from file(f.parquet, auto, 'x JSON') работает, даже если тип столбца x в f.parquet — Tuple или Map. #92864 (Michael Kolupaev).
- Поддержка пустых Tuple в ридере Parquet. #92868 (Michael Kolupaev).
- Переход к копированию с возможностью чтения и записи для Azure Blob Storage, если нативное копирование завершается ошибкой BadRequest (например, из-за недопустимого списка блоков). Ранее это выполнялось только для ошибки Unauthorized, которая наблюдалась при копировании blob между разными аккаунтами хранилища. Однако иногда также возникает ошибка “The specified block list is invalid”. Поэтому теперь условие обновлено так, чтобы переходить к чтению & записи при любых сбоях нативного копирования. #92888 (Smita Kulkarni).
- Исправлено ограничение частоты запросов к конечной точке метаданных EC2 при выполнении большого числа параллельных S3-запросов с учетными данными профиля экземпляра EC2. Ранее каждый запрос создавал собственный
AWSInstanceProfileCredentialsProvider, из-за чего к сервису метаданных EC2 отправлялись параллельные запросы, что могло приводить к тайм-аутам и ошибкам HTTP response code: 403. Теперь поставщик учетных данных кэшируется и используется всеми запросами совместно. #92891 (Sav).
- Переработана настройка
insert_select_deduplicate, чтобы сохранить обратную совместимость. #92951 (Sema Checherinda).
- Логировать фоновые задачи, которые выполняются медленнее среднего (
background_schedule_pool_log.duration_threshold_milliseconds=30), чтобы избежать избыточного логирования задач. #92965 (Azat Khuzhin).
- В предыдущих версиях некоторые имена функций C++ в
system.trace_log и system.symbols отображались некорректно («искажёнными»), а функция demangle плохо с ними справлялась. Закрывает #93074. #93075 (Alexey Milovidov).
- Добавлена настройка резервного копирования
backup_data_from_refreshable_materialized_view_targets, позволяющая не включать в резервную копию refreshable materialized view. RMV со стратегией обновления APPEND всегда резервируются. #93076 (Julia Kartseva). #93658 (Julia Kartseva)
- Использовать минимальную отладочную информацию вместо её полного отсутствия для тяжёлых единиц трансляции, таких как функции. #93079 (Alexey Milovidov).
- Добавлена поддержка совместимости MinIO в AWS S3 C++ SDK благодаря реализации сопоставления кодов ошибок для специфических ошибок MinIO. Это изменение позволяет ClickHouse корректно обрабатывать ошибки сервера MinIO и выполнять повторные попытки при использовании развертываний MinIO вместо AWS S3, повышая надежность для пользователей, использующих Объектное хранилище в самоуправляемых кластерах MinIO. #93082 (XiaoBinMu).
- Запись символизированных профилей jemalloc (без необходимости использовать бинарный файл при создании профиля кучи). #93099 (Azat Khuzhin).
- Восстановлена работа инструмента
clickhouse git-import — ранее он не работал с большими и некорректными коммитами. См. https://presentations.clickhouse.com/2020-matemarketing/. #93202 (Alexey Milovidov).
- Не показывать пароли из URL-хранилища в журнале запросов. #93245 (Konstantin Vedernikov).
- Добавлена поддержка типа
Geometry для flipCoordinates. #93303 (Bharat Nallan).
- Улучшен UX команды SYSTEM INSTRUMENT ADD/REMOVE: для имён функций теперь используются строковые литералы String, исправлены все соответствующие функции, а также разрешено использовать function_name в
REMOVE. #93345 (Pablo Marcos).
- Добавлена новая настройка
materialize_statistics_on_merge, которая включает или отключает материализацию статистики при слиянии. Значение по умолчанию — 1. #93379 (Han Fei).
- ClickHouse теперь может разбирать
SELECT в запросах DESCRIBE SELECT без круглых скобок. Закрывает #58382. #93429 (Yarik Briukhovetskyi).
- Добавлена рандомизация проверок корректности кэша с заданной вероятностью. #93439 (Kseniia Sumarokova).
- Добавлена настройка
type_json_allow_duplicated_key_with_literal_and_nested_object, позволяющая использовать дублирующиеся пути в JSON, где один является литералом, а другой — вложенным объектом, например {"a" : 42, "a" : {"b" : 42}}. Некоторые данные могли быть созданы до добавления этого ограничения на дублирующиеся пути в https://github.com/ClickHouse/ClickHouse/pull/79317, и дальнейшие манипуляции с такими данными теперь могут приводить к ошибкам. С этой настройкой такие старые данные по-прежнему можно использовать без ошибок. #93604 (Pavel Kruglov).
- Не выводить значения простых типов в Pretty JSON на отдельных строках. #93836 (Pavel Kruglov).
- При большом количестве операторов
alter table ... modify setting ... может не удаваться получить блокировку за 5 секунд. Лучше возвращать timeout, а не logical error. #93856 (Han Fei).
- Предотвращён избыточный вывод при синтаксической ошибке. До этого изменения выводился весь SQL-скрипт, который мог содержать множество запросов. #93876 (Alexey Milovidov).
- Реализован корректный расчёт размера в байтах для запроса
check со статистикой в Keeper. #93907 (Mikhail Artemenko).
- Добавлен параметр
use_hash_table_stats_for_join_reordering, который определяет, использовать ли статистику размера хеш-таблицы во время выполнения для изменения порядка JOIN. Этот параметр по умолчанию включен, что сохраняет существующее поведение collect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov).
- Теперь пользователи могут частично просматривать вложенные глобальные настройки сервера в таблице
system.server_settings (например, logger.level). Это применимо только к настройкам с фиксированной структурой (без списков, перечислений, повторяющихся элементов и т. д.). #94001 (Hechem Selmi).
QBit теперь можно проверять на равенство. #94078 (Raufs Dunamalijevs).
- Когда Keeper обнаруживает поврежденный снимок или несогласованные журналы изменений, он генерирует исключение вместо того, чтобы требовать ручного прерывания или автоматически очищать файлы. Это должно сделать поведение Keeper более безопасным, поскольку оно теперь опирается на ручное вмешательство. #94168 (Antonio Andelic).
- Исправлена ситуация, когда при сбое
CREATE TABLE могли оставаться артефакты. #94174 (Azat Khuzhin).
- Исправлена ошибка доступа к неинициализированной памяти (ошибка в OpenSSL) при использовании защищённого паролем TLS-ключа. #94182 (Konstantin Bogdanov).
- Обновлён chdig до v26.1.1. #94290 (Azat Khuzhin).
- Добавлена поддержка более общего партиционирования для режима ordered в S3Queue. #94321 (Bharat Nallan).
- Добавлен алиас
use_statistics для настройки allow_statistics_optimize. Это лучше соответствует существующим настройкам use_primary_key и use_skip_indexes. #94366 (Robert Schulze).
- Включена настройка
input_format_numbers_enum_on_conversion_error для проверки существования элемента при преобразовании чисел в Enum. #94384 (Elmi Ahmadov).
- В режиме
ordered для S3(Azure)Queue очистка сбойных узлов теперь выполняется с учётом лимитов отслеживания (раньше это делалось только в режиме unordered — и для сбойных, и для обработанных узлов; теперь это будет выполняться и для ordered, но только для сбойных узлов). #94412 (Kseniia Sumarokova).
- В
clickhouse-local для пользователя default включено управление доступом. У пользователя default в clickhouse-local отсутствовала привилегия access_management, из-за чего операции вроде DROP ROW POLICY IF EXISTS завершались ошибкой ACCESS_DENIED, хотя у этого пользователя не должно быть ограничений. #94501 (Alexey Milovidov).
- Добавлена поддержка named collection для словарей и таблиц YTsaurus. #94582 (MikhailBurdukov).
- Добавлена поддержка именованных коллекций, определяемых в SQL, в BACKUP/RESTORE для S3 и Azure Blob Storage. Закрывает #94604. #94605 (Pablo Marcos).
- Добавлена поддержка бакетизации на основе ключа партиционирования для S3Queue в режиме ordered. #94698 (Bharat Nallan).
- Добавлена асинхронная метрика, показывающая время выполнения самого долгого слияния. #94825 (Raúl Marín).
- Добавлена проверка принадлежности файла перед применением позиционного удаления с использованием IcebergBitmapPositionDeleteTransform. #94897 (Yang Jiang).
- Теперь
view_duration_ms показывает время, в течение которого группа была активна, а не суммарную длительность потоков в ней. #94966 (Sema Checherinda).
- Снято ограничение на максимальное количество поисковых токенов в функциях
hasAnyTokens и hasAllTokens, которое ранее составляло 64. Пример: SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); Этот запрос приводил бы к ошибке BAD_ARGUMENTS, поскольку содержит 65 поисковых токенов. В этом PR ограничение полностью снято, и тот же запрос будет выполняться без ошибки. #95152 (Elmi Ahmadov).
- Добавлена настройка
input_format_numbers_enum_on_conversion_error для преобразования чисел в Enum с проверкой наличия элемента. Закрывает: #56144. #56240 (Nikolay Degterinsky).
- Ресурсы парсера формата теперь совместно используются при чтении data file и position delete file в таблицах Iceberg, что позволяет сократить число выделений памяти. #94701 (Yang Jiang).
Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)
- Исправлена ошибка, из-за которой в обработчиках предопределённых запросов пробельные символы в конце интерпретировались как данные при вставке. #83604 (Fabian Ponce).
- Исправлена ошибка INCOMPATIBLE_TYPE_OF_JOIN в хранилище Join при применении оптимизации преобразования outer join в inner join. Исправляет #80794. #84292 (Vladimir Cherkasov).
- Исправлено исключение “Invalid number of rows in Chunk” при использовании hash JOIN с включенным
allow_experimental_join_right_table_sorting. #86440 (yanglongwei).
- Теперь в MergeTree имена файлов всегда заменяются хешами, если файловая система нечувствительна к регистру. Ранее в системах с нечувствительной к регистру файловой системой (например, macOS) это могло приводить к повреждению данных, если несколько имён столбцов/подстолбцов различались только регистром. #86559 (Pavel Kruglov).
- Добавлена полная проверка разрешений на этапе создания для запроса, лежащего в основе materialized view. #89180 (pufit).
- Исправлен сбой в функции
icebergHash при константном аргументе. #90335 (Michael Kolupaev).
- Исправлена логическая ошибка, из-за которой мутация вне транзакции изменяла части в активной транзакции, которая в итоге откатывалась. #90469 (Shaohua Wang).
system.warnings теперь корректно обновляется после преобразования обычной базы данных в базу данных atomic. #90473 (sdk2).
- Исправлено срабатывание assertion при чтении из файла Parquet, если часть выражения prewhere используется в другой части запроса. #90635 (Max Kainov).
- Исправлен сбой в одноузловом кластере при чтении из Iceberg в режиме split-by-buckets. Закрывает #90913. #91553 (Konstantin Vedernikov).
- Исправлена возможная логическая ошибка в движке Log при чтении подстолбцов. Закрывает #91710. #91711 (Pavel Kruglov).
- Исправлена логическая ошибка: ‘Хранилище не поддерживает транзакции’ при ATTACH AS REPLICATED. #91772 (Shaohua Wang).
- Исправлена некорректная работа runtime-фильтров, когда у LEFT ANTI JOIN есть дополнительное постусловие. #91824 (Alexander Gololobov).
- Исправляет ошибку в null-safe сравнении с типом Nothing. Закрывает #91834. Закрывает #84870. Закрывает #91821. #91884 (Yarik Briukhovetskyi).
- Исправлены ошибки декодирования DELTA_BYTE_ARRAY в нативном ридере Parquet, которые затрагивали строковые данные с высокой степенью повторяемости. #91929 (Daniel Muino).
- Кэшировать схему в глоб-шаблонах только для того файла, по которому она была определена, а не для всех файлов при определении схемы. Закрывает #91745. #92006 (Pavel Kruglov).
- Исправлена ошибка
Couldn't pack tar archive: Failed to write all bytes, вызванная некорректным заголовком с размером записи в архиве. Исправляет #89075. #92122 (Julia Kartseva).
- Поток запроса в insert select теперь освобождается, чтобы предотвратить закрытие HTTP-соединения. #92175 (Sema Checherinda).
- Исправлена логическая ошибка в запросах с несколькими JOIN, использующих предложение
USING и join_use_nulls. #92251 (Vladimir Cherkasov).
- Исправлена логическая ошибка при изменении порядка JOIN с join_use_nulls, закрыт https://github.com/clickhouse/clickhouse/issues/90795. #92289 (Vladimir Cherkasov).
- Исправлено неконсистентное форматирование AST для arrayElement с отрицательным литералом. Закрывает #92288 Закрывает #92212 Закрывает #91832 Закрывает #91789 Закрывает #91735 Закрывает #88495 Закрывает #92386. #92293 (Pavel Kruglov).
- Исправлен возможный сбой при использовании настройки
join_on_disk_max_files_to_merge. #92335 (Bharat Nallan).
- Связанный issue #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
- Исправлено отсутствие проверки прав доступа в
SYSTEM SYNC FILE CACHE. Закрывает #92101. #92372 (Kseniia Sumarokova).
- Исправлен проход
count_distinct_optimization для оконных функций и нескольких аргументов. #92376 (Raúl Marín).
- Исправлена ошибка “Невозможно записать в финализированный буфер”, возникавшая при использовании некоторых агрегатных функций с оконными функциями. Закрывает #91415. #92395 (Jimmy Aguilar Mena).
- Исправлена логическая ошибка в
CREATE TABLE ... AS urlCluster() и движке базы данных Replicated. Исправление закрывает #92216. #92418 (Kseniia Sumarokova).
- Наследовать настройки информации о сериализации исходной части во время мутации в MergeTree. Это исправляет возможный некорректный результат запроса к мутированной части после изменений в сериализации типов данных. #92419 (Pavel Kruglov).
- Исправлен возможный конфликт между столбцом и подстолбцом с одинаковым именем, приводивший к использованию некорректной сериализации и ошибкам запросов. Закрывает #90219. Закрывает #85161. #92453 (Pavel Kruglov).
- Исправлены
LOGICAL_ERROR, вызванные нежелательным изменением плана запроса при преобразовании OUTER JOIN в INNER JOIN. Также ослаблены требования к оптимизации, чтобы её можно было применять в случаях, когда к ключам агрегации в JOIN применяются инъективные функции. #92503 (János Benjamin Antal).
- Исправлена возможная ошибка
SIZES_OF_COLUMNS_DOESNT_MATCH при сортировке пустого столбца типа tuple. Закрывает #92422. #92520 (Pavel Kruglov).
- Добавлена проверка несовместимых типизированных путей в типе JSON. Закрывает #91577. #92539 (Pavel Kruglov).
- Исправлена взаимная блокировка в
SHOW CREATE DATABASE для базы данных Backup. #92541 (Azat Khuzhin).
- Использовать корректный код ошибки при проверке индекса hypothesis. #92559 (Raúl Marín).
- Исправлено разрешение подстолбцов типа Dynamic в псевдонимах столбцов в анализаторе. Ранее подстолбец типа Dynamic в псевдониме столбца оборачивался в
getSubcolumn и в некоторых случаях вообще не разрешался. Закрывает #91434. #92583 (Pavel Kruglov).
- Предотвращён сбой в
tokens() при NULL во втором аргументе. #92586 (Raúl Marín).
- Исправлено потенциальное падение, вызванное изменением на месте базовых константных столбцов PREWHERE. Это могло произойти при уменьшении размера столбца (
IColumn::shrinkToFit) или фильтрации (IColumn::filter), которые могли параллельно выполняться в нескольких потоках. #92588 (Arsen Muk).
- Создание и материализация текстовых индексов для таблиц, содержащих крупные части (более 4 294 967 295 строк), временно отключены. Это ограничение предотвращает некорректные результаты запросов, поскольку текущая реализация индексов пока не поддерживает части такого размера. #92644 (Anton Popov).
- Исправляет логическую ошибку
Too large size (A) passed to allocator при выполнении операций JOIN. Закрывает #92043. #92667 (Yarik Briukhovetskyi).
- Исправлена ошибка, из-за которой индексы
ngrambf_v1 с длиной n-граммы (1-й параметр) > 8 приводили к исключению. #92672 (Robert Schulze).
- Исправлено неперехваченное исключение при фоновой перезагрузке named collections при использовании хранилища ZooKeeper. Закрывает https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
- Исправляет некорректную логику проверки grant с подстановочными символами. Предыдущая попытка https://github.com/ClickHouse/ClickHouse/pull/90928 устраняла критическую уязвимость, но в итоге оказалась слишком строгой, из-за чего некоторые операторы
GRANT с подстановочными символами завершались ошибкой из-за несвязанных отзывов привилегий. #92725 (pufit).
- Исправлена ошибка в логике пропуска данных: при использовании
not match(...) в WHERE возвращались некорректные результаты. Закрывает #92492. #92726 (Nihal Z. Miaji).
- Не пытайтесь удалять временные каталоги при запуске, если таблица семейства MergeTree создана на диске в режиме только для чтения. #92748 (Alexey Milovidov).
- Исправлена ошибка “Невозможно добавить действие в пустую ExpressionActionsChain” для ALTER TABLE REWRITE PARTS (v2). #92754 (Azat Khuzhin).
- Предотвращён сбой при чтении из разорванного
Connection. #92807 (Raufs Dunamalijevs).
- Исправлена логическая ошибка
Failed to set file processing within 100 retries в хранилище S3Queue в режиме Ordered. Теперь вместо неё выводится предупреждение. Эта ошибка могла возникать в версиях до 25.10, если истекал сеанс Keeper, однако в версиях 25.10+ она по-прежнему будет возникать лишь как предупреждение, поскольку теоретически её всё ещё можно получить при высоком параллелизме обработки в режиме Ordered. #92814 (Kseniia Sumarokova).
- Ранее некоторые запросы, использовавшие сегментирование по PK при ложном условии, завершались с ошибкой. Теперь это исправлено. Необходимо для https://github.com/ClickHouse/ClickHouse/pull/89313. #92815 (Yarik Briukhovetskyi).
- Исправлен расчёт несжатых размеров текстовых индексов в таблице
system.parts. #92832 (Anton Popov).
- Исправлено использование первичного индекса в легковесных обновлениях с оператором
IN, содержащим подзапросы в предикате WHERE. #92838 (Anton Popov).
- Исправлено создание подсказки типа для path ‘skip’ в JSON. Исправление закрывает #92731. #92842 (Pavel Kruglov).
- В движке таблицы S3 не следует кэшировать ключ партиционирования, если используются недетерминированные функции. #92844 (Miсhael Stetsyuk).
- Исправлена возможная ошибка
FILE_DOESNT_EXIST после выполнения мутации разреженного столбца с ratio_of_defaults_for_sparse_serialization=0.0. Закрыт #92633. #92860 (Pavel Kruglov).
- Исправлено определение схемы Parquet в старом ридере Parquet (по умолчанию не используется), когда JSON-столбец идет после столбца Tuple. Исправлена ошибка в старом ридере Parquet (по умолчанию не используется), из-за которой он завершался с ошибкой на пустых Tuple. #92867 (Michael Kolupaev).
- Исправлена логическая ошибка при использовании нескольких JOIN с постоянным условием и
join_use_nulls, закрыт #92640. #92892 (Vladimir Cherkasov).
- Исправлена возможная ошибка
NOT_FOUND_COLUMN_IN_BLOCK при вставке в таблицу с подстолбцом в выражении партиционирования. Закрывает #93210. Закрывает #83406. #92905 (Pavel Kruglov).
- Исправлена ошибка
NO_SUCH_COLUMN_IN_TABLE в движке Merge при работе с таблицами, использующими псевдонимы. Закрывает #88665. #92910 (Pavel Kruglov).
- Исправлен случай, когда NULL != NULL, для full_sorting_join на столбце LowCardinality(Nullable(T)). #92924 (Vladimir Cherkasov).
- Исправлено несколько сбоев, возникавших при слиянии текстовых индексов в таблицах
MergeTree. #92925 (Anton Popov).
- При необходимости во время TTL-агрегации восстанавливаются обертки LowCardinality для результатов выражений SET, чтобы избежать исключений при оптимизации таблицы. #92971 (Seva Potapov).
- Исправлена логическая ошибка при анализе индекса, возникавшая при использовании пустого массива в функции
has. Закрывает #92906. #92995 (Nihal Z. Miaji).
- Исправлено возможное зависание при завершении работы фонового пула планировщика (может приводить к зависанию сервера при остановке). #93008 (Azat Khuzhin).
- Исправлена возможная ошибка FILE_DOESNT_EXIST после мутации разреженного столбца при изменении значения
ratio_of_defaults_for_sparse_serialization на 1.0 с помощью ALTER. #93016 (Pavel Kruglov).
- Исправлена ошибка в логике пропуска данных, из-за которой использование
not materialize(...) или not CAST(...) в WHERE приводило к некорректным результатам. Закрывает #88536. #93017 (Nihal Z. Miaji).
- Исправлено возможное использование устаревших частей из-за TOCTOU-гонки для общих частей. #93022 (Azat Khuzhin).
- Исправлен crash при десериализации некорректного aggregate state
groupConcat со смещениями, выходящими за допустимые границы. #93028 (Raufs Dunamalijevs).
- Исправлено состояние, при котором после предварительной отмены распределённых запросов соединение оставалось в неисправном состоянии. #93029 (Azat Khuzhin).
- Исправлен результат JOIN, когда ключ JOIN с правой стороны — разреженный столбец. Это закрывает #92920. Мне удалось воспроизвести ошибку только с
set compatibility='23.3'. Не уверен, нужно ли делать бэкпорт. #93038 (Amos Bird).
- Устранена возможная ошибка
Cannot finalize buffer after cancellation в estimateCompressionRatio(). Исправлено: #87380. #93068 (Azat Khuzhin).
- Исправлено слияние текстовых индексов, построенных на основе сложных выражений (таких как
concat(col1, col2)). #93073 (Anton Popov).
- Исправлено применение проекции, если фильтр содержит подстолбцы. Закрывает #92882. #93141 (Pavel Kruglov).
- Исправлена логическая ошибка, которая в некоторых случаях возникала при добавлении JOIN runtime-фильтров в план запроса. Причиной было некорректное возвращение дублированных константных столбцов с одной из сторон JOIN. #93144 (Alexander Gololobov).
- Специальная функция
__applyFilter, используемая JOIN Runtime Filters, в некоторых допустимых случаях возвращала ILLEGAL_TYPE_OF_ARGUMENT. #93187 (Alexander Gololobov).
- Предотвращено схлопывание разных интерполированных столбцов в один и тот же столбец блока, когда такие столбцы фактически являются псевдонимами одного и того же столбца. #93197 (Yakov Olkhovskiy).
- Не добавлять runtime filter при выполнении JOIN с уже заполненной правой таблицей. #93211 (Alexander Gololobov).
- Исправлена очистка постоянных наблюдений в Keeper после завершения неактивного сеанса. Закрывает #92480. #93213 (Konstantin Vedernikov).
- Исправлен ORDER BY для кортежа в Iceberg. Закрывает #92977. #93225 (Konstantin Vedernikov).
- Исправлена ошибка, связанная с настройкой S3Queue
s3queue_migrate_old_metadata_to_buckets. Закрывает #93392, #93196, #81739. #93232 (Kseniia Sumarokova).
- Удаляются неиспользуемые столбцы при перестроении проекции во время слияния. Это снижает использование памяти и уменьшает число временных частей. #93233 (Nikolai Kochetov).
- Исправлено удаление неиспользуемых столбцов из подзапросов при наличии скалярного коррелированного подзапроса. До этого исправления столбец мог быть удалён, если использовался только в коррелированном подзапросе, из-за чего запрос завершался ошибкой
NOT_FOUND_COLUMN_IN_BLOCK. #93273 (Dmitry Novik).
- Исправлено возможное отсутствие подстолбца в MV при изменении исходной таблицы. Закрывает #93231. #93276 (Pavel Kruglov).
- Исправлено планирование запросов для движка таблицы
Merge при использовании анализатора, из-за которого при слиянии локальных и удалённых/Distributed таблиц для hostName() могла возникать ошибка ILLEGAL_COLUMN. Закрывает #92059. #93286 (Jinlin).
- Исправлен случай, при котором
NOT IN с неконстантными аргументами в виде массивов возвращал неверное значение + добавлена поддержка неконстантных функций Array. Закрывает #14980. #93314 (Yarik Briukhovetskyi).
- Исправлена ошибка
Not found column в оптимизации use_top_k_dynamic_filtering. Исправление #93186. #93316 (Nikolai Kochetov).
- Исправлена проблема с пересборкой текстовых индексов, созданных поверх подстолбцов. #93326 (Anton Popov).
- Исправлена обработка пустого массива при передаче его вторым аргументом в функциях
hasAllTokens и hasAnyTokens. #93328 (Anton Popov).
- Исправлена логическая ошибка при использовании runtime filters в запросе с totals для таблицы в правой части. #93330 (Alexander Gololobov).
- Сервер больше не падает, если функция
tokens вызывается с неконстантными параметрами токенизатора (2-м, 3-м и 4-м параметрами), например, SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze).
- Исправлена уязвимость, связанная с переполнением целого числа при десериализации состояния
groupConcat, которая могла приводить к нарушениям безопасности памяти при использовании специально сформированных состояний агрегатной функции. #93426 (Raufs Dunamalijevs).
- Исправлен анализ текстового индекса для столбцов типа Array в случаях, когда индекс не содержит токенов (все массивы пусты или все токены пропускаются токенизатором). #93457 (Anton Popov).
- Позволяет избежать oauth-входа в клиенте ClickHouse, если имя пользователя и пароль указаны в строке подключения. #93459 (Krishna Mannem).
- Исправлена поддержка предоставляемых учетных данных Azure ADLS Gen2 в DataLakeCatalog: разбор ключей
adls.sas-token.* из REST-каталогов Iceberg и исправлен разбор URL ABFSS. #93477 (Karun Anantharaman).
- Исправлена поддержка GLOBAL IN в анализаторе (ранее множество заново создавалось на удалённом узле). #93507 (Azat Khuzhin).
- Исправлено извлечение подстолбца при десериализации непосредственно в разреженные столбцы. #93512 (Pavel Kruglov).
- Исправлена ошибка прямого чтения из текстового индекса при дублирующихся поисковых запросах. #93516 (Anton Popov).
- Исправление ошибки NOT_FOUND_COLUMN_IN_BLOCK при включенном runtime filter, если в таблицах, участвующих в JOIN, один и тот же столбец возвращается несколько раз (например, SELECT a, a, a FROM t). #93526 (Alexander Gololobov).
- Исправлена ошибка, из-за которой clickhouse-client при подключении по ssh дважды запрашивал пароль. #93547 (Isak Ellmer).
- Убедитесь, что ZooKeeper корректно завершается при остановке (исправлено возможное зависание при остановке в крайне редких случаях). #93602 (Azat Khuzhin).
- Исправлена LOGICAL_ERROR при восстановлении ReplicatedMergeTree из-за состояния гонки при дедупликации. #93612 (Pablo Marcos).
- Исправлена работа с разреженным столбцом при обновлении TTL во время прямой десериализации в разреженные столбцы в некоторых входных форматах. Это устраняет возможную логическую ошибку
Unexpected type of result TTL column. #93619 (Pavel Kruglov).
- Исправлены функции работы с индексом H3, которые иногда аварийно завершались или зависали при вызове с недопустимыми входными данными. #93657 (Michael Kolupaev).
- Использование индекса
ngram_bf для данных в кодировке не UTF-8 приводило к чтению неинициализированной памяти, значения из которой могли попасть в результирующую структуру индекса. Закрывает #92576. #93663 (Alexey Milovidov).
- Проверка соответствия размера распакованного буфера ожидаемому значению. #93690 (Raúl Marín).
- Предотвращена возможность получать список столбцов таблицы через движок таблицы
merge без проверки разрешения SHOW COLUMNS. #93695 (János Benjamin Antal).
- Исправлена материализация индексов пропуска данных, созданных на основе подстолбцов. #93708 (Anton Popov).
- Мы сохраняем shared pointers на хранилища в
QueryPipeline::resources::storage_holders, чтобы объекты IStorage не уничтожались, пока существует PipelineExecutor. #93746 (Miсhael Stetsyuk).
- Исправлено подключение существующих БД Replicated, если межсерверный хост менялся после перезапуска. #93779 (Tuan Pham Anh).
- Исправлен assert
!read_until_position в ReadBufferFromS3, возникавший при включенном кэше. #93809 (Kseniia Sumarokova).
- Исправлена логическая ошибка в редком случае, когда пустой кортеж используется со столбцом типа
Map. Закрывает #93784. #93814 (Nihal Z. Miaji).
- Исправлено повреждение
_part_offset, возникавшее при перестроении проекций во время слияний, а также оптимизирована обработка проекций за счёт устранения лишнего чтения столбца _part_offset и пропуска ненужных столбцов при вычислении проекций. Это продолжает оптимизации, начатые в #93233. #93827 (Amos Bird).
- Убрана обработка ‘Bad version’. #93843 (Anton Ivashkin).
- Исправлена проблема, из-за которой
optimize_inverse_dictionary_lookup не работал с распределённым запросом, когда ключ имеет знаковый целочисленный тип. Закрывает #93259. #93848 (Nihal Z. Miaji).
- Исправлена проблема, из-за которой
lag/lead не работали с распределённым запросом remote(). Закрывает #90014. #93858 (Nihal Z. Miaji).
- Исправлена ошибка диспетчеризации системного инструмента. #93937 (Pablo Marcos).
- В https://github.com/ClickHouse/ClickHouse/pull/89173 мы добавили дополнительное поле в структуру, которую
TraceSender отправляет через внутренний канал. Однако размер буфера не был обновлён (здесь), поэтому в буфер записывается больше данных, чем допускает buffer_size, что приводит к нескольким сбросам. А поскольку TraceSender::send вызывается из разных потоков, сбросы из разных потоков могут чередоваться, нарушая инвариант, на который полагается принимающая сторона (TraceCollector). #93966 (Miсhael Stetsyuk).
- Исправлено приведение типов к супертипу при выполнении операции JOIN для хранилища
Join с предложением USING. Исправляет #91672. Исправляет #78572. #94000 (Dmitry Novik).
- Исправлена ошибка, из-за которой FilterStep добавлялся некорректно при применении runtime filter для JOIN к таблице Merge. #94021 (Alexander Gololobov).
- Запрос
SELECT, содержащий предикат по нескольким столбцам с индексами пропуска данных bloom filter, при наличии условий OR и NOT мог возвращать некорректные результаты. Теперь это исправлено. #94026 (Shankar Iyer).
- Исправлена операция CLEAR для столбца с зависимыми индексами. #94057 (Raúl Marín).
- Исправлено использование неинициализированного значения в
ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov).
- Исправлена некорректная проверка типизированных путей в JSON. Эта проверка была добавлена в https://github.com/ClickHouse/ClickHouse/pull/92842 и может вызывать ошибку при запуске существующих таблиц. #94070 (Pavel Kruglov).
- Исправлен crash при анализе filter в присутствии OUTER JOIN. Исправляет #90979. #94080 (Dmitry Novik).
- Исправлена точность
uniqTheta при параллельном использовании ключей агрегации UInt8 (max_threads > 1 — по умолчанию). #94095 (Azat Khuzhin).
- Исправлен сбой, вызванный исключением, возникшим при вызове
socket.setBlocking(true) внутри SCOPE_EXIT. #94100 (Miсhael Stetsyuk).
- Устранена потеря данных, возникавшая, когда
DROP PARTITION удалял части, созданные более поздними записями журнала в ReplicatedMergeTree. #94123 (Tuan Pham Anh).
- Исправлена ошибка в ридере Parquet v3 при обработке массивов, пересекающих границы страниц. Это происходит, например, с файлами, записанными Arrow без включённой статистики страниц или индекса страниц. Затрагивает только столбцы типа Array. Вероятный симптом — примерно один массив на каждый ~1 МБ данных оказывается усечённым. До этого исправления в качестве обходного решения используйте следующую настройку:
input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev).
- Исправлено избыточное количество наблюдений в ReplicatedMergeTree при ожидании записи в журнале. #94133 (Azat Khuzhin).
- Функции
arrayShuffle, arrayPartialShuffle и arrayRandomSample теперь материализуют константные столбцы, чтобы разные строки получали разные результаты. #94134 (Joanna Hulboj).
- Исправлена гонка данных при вычислении табличных функций в materialized views. #94171 (Alexey Milovidov).
- Исправлено разыменование nullptr в движках баз данных
PostgreSQL (при некорректном запросе). Закрывает #92887. #94180 (Alexey Milovidov).
- Исправлена утечка памяти в refreshable materialized view при использовании запросов
SELECT с несколькими подзапросами. #94200 (Antonio Andelic).
- Исправлено состояние гонки данных между
DataPartStorageOnDiskBase::remove и system.parts. Закрывает #49076. #94262 (Alexey Milovidov).
- Удалён неверный спецификатор
noexcept у оператора присваивания копированием HashTable, который мог приводить к аварийному завершению (std::terminate) при исключениях из-за нехватки памяти. #94275 (Nikita Taranov).
- Ранее при создании проекции с дублирующимися столбцами в GROUP BY (например,
GROUP BY c0, c0) и вставке данных возникала ошибка std::length_error, если включен optimize_row_order. Закрывает #94065. #94277 (Alexey Milovidov).
- Исправлена трудноуловимая ошибка в клиенте ZooKeeper при подключении, которая приводила к зависаниям и аварийным завершениям. #94320 (Azat Khuzhin).
- Исправлена ошибка, из-за которой оптимизация преобразования функций в подстолбцы не применялась к подстолбцам. #94323 (Pavel Kruglov).
- Исправлен потенциально некорректный результат во вложенных RIGHT JOIN при включённом
enable_lazy_columns_replication. Из-за ошибки все строки в реплицируемых столбцах некорректно возвращали одно и то же значение вместо своих собственных значений. Закрыто #93891. #94339 (Vladimir Cherkasov).
- Исправлен pushdown фильтра для SEMI JOIN с использованием множеств эквивалентности. Pushdown фильтра не выполняется, если типы аргументов изменились. Исправляет #93264. #94340 (Dmitry Novik).
- Исправлено использование DeltaLake CDF с движком базы данных DataLake (интеграция каталогов Delta Lake). Закрывает #94122. #94342 (Kseniia Sumarokova).
- Исправлено некорректное значение метрики
FilesystemCacheSizeLimit при использовании политики кэша SLRU. #94363 (Kseniia Sumarokova).
- При создании движка базы данных Backup с менее чем двумя аргументами теперь возвращается более понятное сообщение об ошибке (
Wrong number of arguments вместо std::out_of_range: InlinedVector::at(size_type) const failed bounds check.). #94374 (Robert Schulze).
- Игнорирует невозможный отзыв глобальных привилегий на уровне базы данных для привилегий с grant option. #94386 (pufit).
- Исправлено чтение разреженных смещений в компактных частях. Закрывает #94385. #94399 (Pavel Kruglov).
- Не запрещать ALTER столбцов с неявными индексами, даже если используется режим
throw параметра alter_column_secondary_index_mode. #94425 (Raúl Marín).
- Исправлен сбой в
TCPHandler при чтении Protocol::Client::IgnoredPartUUIDs несколькими вызовами receivePacketsExpectQuery. #94434 (Miсhael Stetsyuk).
- Исправлено маскирование чувствительных данных в
system.functions. #94436 (Vitaly Baranov).
- Исправлено разыменование nullptr при отключённой опции
send_profile_events. Эта возможность была недавно добавлена в Python-драйвер ClickHouse. Закрывает #92488. #94466 (Alexey Milovidov).
- Исправлена несовместимость файлов .mrk текстового индекса при слиянии. #94494 (Peng Jian).
- Когда
read_in_order_use_virtual_row включён, код обращался к столбцам индекса, исходя из полного размера первичного ключа, не проверяя, был ли индекс усечён, что приводило к использованию освобождённой / неинициализированной памяти. Закрывает #85596. #94500 (Alexey Milovidov).
- Исправлена ошибка, возникавшая из-за несоответствия типов при отправке внешних таблиц в подзапросах с GLOBAL IN, если используются типы Nullable. Закрывает #94097. #94511 (Alexey Milovidov).
- В предыдущих версиях запросы с несколькими условиями индекса для одного и того же выражения могли ошибочно генерировать исключение
Not found column. Закрывает #60660. #94515 (Alexey Milovidov).
- Исправлена некорректная обработка столбца JOIN типа Nullable в runtime-фильтрах. #94555 (Alexander Gololobov).
- Создание рабочей нагрузки внутри другой рабочей нагрузки, которая в данный момент используется, больше не приводит к сбою. #94599 (Sergei Trifonov).
- Исправлен сбой при оптимизации ANY LEFT JOIN, когда
isNotNull вычисляется для отсутствующего столбца. #94600 (Molly).
- Исправлено вычисление выражения по умолчанию при обращении к другим столбцам с вычисляемыми значениями по умолчанию. #94615 (Alexey Milovidov).
- Исправлены проблемы с разрешениями при операциях BACKUP/RESTORE. #94617 (Pablo Marcos).
- Исправлен сбой из-за некорректного приведения типов, когда тип данных —
Nullable(DateTime64). #94627 (Miсhael Stetsyuk).
- Исправлена ошибка, из-за которой некоторые распределённые запросы с
ORDER BY могли возвращать столбцы ALIAS с переставленными значениями (то есть столбец a показывал данные столбца b, и наоборот). #94644 (filimonov).
- Исправлена запись результатов keeper-bench в файл. #94654 (Antonio Andelic).
- Исправлены некорректные оценки в статистике типа MinMax, когда столбец содержит отрицательные числа с плавающей точкой. #94665 (zoomxi).
- Исправлено чтение файлов Parquet, когда ключом в map является struct. #94670 (Konstantin Vedernikov).
- Исправлен потенциально некорректный результат RIGHT JOIN при использовании сложных условий ON. Закрыт #92913. #94680 (Vladimir Cherkasov).
- Сохранение постоянной гранулярности индекса (
use_const_adaptive_granularity) после вертикальных слияний. #94725 (Azat Khuzhin).
- Исправлена ошибка мутаций со скалярными подзапросами и зависимостями таблицы. Если у таблицы были зависимости (индекс или проекции), связанные со столбцом, скалярные подзапросы могли вычисляться и кэшироваться без данных, что приводило к некорректным изменениям. #94731 (Raúl Marín).
- Исправлено переключение AsynchronousMetrics cpu_pressure на резервный вариант при возникновении ошибки. #94827 (Raúl Marín).
- В функции
getURLHostRFC отсутствовали проверки выхода за границы перед разыменованием указателей. При передаче пустой строки в domainRFC происходило чтение неинициализированной памяти, что приводило к ошибкам MSan. #94851 (Alexey Milovidov).
- Исправлен режим «только для чтения» у зашифрованных дисков. #94852 (Azat Khuzhin).
- Исправлена логическая ошибка при дробных
LIMIT/OFFSET при использовании старого анализатора с distributed таблицами. Закрывает #94712. #94999 (Ahmed Gouda).
- Исправлено падение в некоторых случаях, когда JOIN Runtime Filters включены по умолчанию. #95000 (Alexander Gololobov).
- Улучшено маскирование паролей в URL-адресе, используемом в движке таблицы
URL() и табличной функции url(). #95006 (Vitaly Baranov).
- Функция
toStartOfInterval теперь работает так же, как toStartOfX, где X — это Day, Week, Month, Quarter, Year, если включён enable_extended_results_for_datetime_functions. #95011 (Kirill Kopnev).
- Исправлены сравнения с константными строками, которые не учитывали настройки
cast_string_to_date_time_mode, bool_true_representation, bool_false_representation и input_format_null_as_default. Закрывает #91681. #95040 (Nihal Z. Miaji).
- Исправлено состояние гонки в файловом кэше. #95064 (Alexey Milovidov).
- Исправлено редкое проявление состояния гонки в ридере Parquet. #95068 (Alexey Milovidov).
- Исправлено падение в оптимизации top K, когда
LIMIT равен нулю. Закрывает #93893. #95072 (Alexey Milovidov).
- При преобразовании из DateTime/целых чисел в Time64 с помощью
toTime извлекается компонент времени суток, но эта функция не является монотонной. Шаблон ToDateTimeMonotonicity ошибочно утверждал, что это преобразование монотонно, из-за чего в отладочных сборках возникало Исключение “Invalid binary search result in MergeTreeSetIndex”. #95125 (Alexey Milovidov).
- Список записей в файле манифеста пересоздавался только при необходимости (раньше это происходило на каждой итерации). #95162 (Daniil Ivanik).
Улучшения сборки/тестирования/упаковки
Последнее изменение 14 августа 2026 г.