Изменения, нарушающие обратную совместимость
Изменения в запросах и синтаксисе
- Оператор
INтеперь использует семантику точного совпадения значений для типаBool: значениямBoolсоответствуют только0и1в наборе. Ранее числовые значения больше255в набореINошибочно приводились к true, поэтомуSELECT CAST(1, 'Bool') IN (256)возвращал1. Теперь он корректно возвращает0. #93115 (Ashrith Bandla). - Исправлен приоритет оператора
NOTв соответствии со стандартом SQL: теперьNOTимеет более низкий приоритет, чемIS NULL,BETWEEN,LIKEи арифметические операторы. Например,NOT (x) IS NULLтеперь разбирается какNOT (x IS NULL), а не как(NOT x) IS NULL. Это может изменить результаты запросов, которые опирались на прежнее (нестандартное) поведение. #97680 (Alexey Milovidov). SELECTбольше нельзя использовать как неэкранированный идентификатор в элементе списка выраженийWITH. #101059 (Aruj Bansal).- Оператор
INтеперь отклоняет преобразованияDecimalс потерей точности внутри составных типов (Tuple,Array,Map), что делает его поведение согласованным со сравнениями скалярных значений верхнего уровня. Ранее проверки точности применялись только к скалярным значениям верхнего уровня: например,CAST('33.3', 'Decimal64(1)') IN (33.33)корректно возвращал0, аCAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])ошибочно возвращал1. Теперь оба случая корректно возвращают0. #101812 (Nihal Z. Miaji).
Изменения типов данных
- Версии сериализации типов данных теперь распространяются и на вложенные типы данных. Например, версия сериализации String
with_size_streamраньше применялась только к столбцам String верхнего уровня и элементам Tuple; теперь она применяется к любому типу String внутри любого вложенного типа, такого как Array, Map, Variant или JSON. Это поведение управляется настройкой MergeTreepropagate_types_serialization_versions_to_nested_types, которая теперь включена по умолчанию. После этого изменения вновь созданные части данных не смогут читаться старыми версиями, но старые части можно читать в новой версии. Обновления безопасны, а откат на более старую версию — нет. #94859 (Pavel Kruglov). - Исправлен порядок байтов в бинарной сериализации
QBit: теперь используется формат little-endian. #101378 (Raufs Dunamalijevs).
Изменения хранилища и индексов
- Исправлены метаданные обычных проекций, чтобы проекции с ключами сортировки из нескольких столбцов корректно распознавались. #91352 (Amos Bird).
- Исправлена проблема с файлами индекса пропуска данных: они не учитывали настройку
replace_long_file_name_to_hash, из-за чего возникали ошибки “File name too long” и нарушалось чтение индексов с длинными именами. Теперь имена файлов индекса пропуска данных хешируются, если превышаютmax_file_name_length, аналогично файлам столбцов. Это обратно совместимо (новые серверы читают старые части), но при откате на более раннюю версию (или при использовании старых серверов во время поэтапного обновления) индексы с длинными именами могут игнорироваться. #97128 (Raúl Marín).
Удалённые возможности
- Удалён тип индекса пропуска данных
hypothesis. Это была малоизвестная экспериментальная возможность, практически не имевшая применения. Создание таблиц сINDEX ... TYPE hypothesisтеперь приводит к ошибке. #96874 (Alexey Milovidov). - Удалена экспериментальная функция
detectProgrammingLanguage. #99567 (Alexey Milovidov).
Изменения настроек и конфигурации
- Значение
mysql_datatypes_support_levelпо умолчанию изменено с пустого наdecimal,datetime64,date2Date32, что включает корректное сопоставление MySQLDATEсDate32,DECIMAL/NUMERICсDecimal, аDATETIME/TIMESTAMPс указанной точностью — сDateTime64. Ранее столбцы MySQLDATEсопоставлялись сDate, который не может представлять даты до 1970-01-01, что приводило к повреждению данных. #97716 (Alexey Milovidov).
Изменения во вставке и дедупликации
- Async insert теперь включен по умолчанию — ClickHouse по умолчанию объединяет все небольшие вставки в батчи. Это поведение регулируется настройкой
compatibility: если установитьcompatibilityна версию ниже 26.2, будет восстановлено прежнее значение по умолчанию —false. Async inserts можно включать и отключать на нескольких уровнях: в профилях пользователей в config, для сеанса, для запроса или для таблицы семейства MergeTree. #97590 (Sema Checherinda).
Изменения в системных таблицах
- В
system.query_logвозвращён столбецskip_indexes. #101018 (Alexey Milovidov).
Другие изменения, нарушающие обратную совместимость
mergeTreeAnalyzeIndexes{,UUID}теперь принимает массив имён частей вместо regexp, поскольку регулярные выражения работают медленно (экспериментальная возможность). #98474 (Azat Khuzhin).- Библиотека H3 была обновлена до v4, что повышает точность вычисления длины, площади и других метрик. Это изменение нарушает обратную совместимость, поскольку новые результаты отличаются от прежних. #100348 (Alexey Milovidov).
- Изменён способ обработки виртуальных столбцов таблицей
Merge. Если базовая таблица содержит_tableили_database, эти столбцы читаются из хранилища; в противном случае они заполняются после этапа чтения на шаге expression. #101742 (Mikhail Artemenko).
Новые возможности
Функции
- Добавлена функция
naturalSortKey(s)для ключей естественной сортировки. #90322 (Nazarii Piontko). - Добавлена функция
arrayAutocorrelation(arr [, max_lag]), которая вычисляет нормализованную автокорреляцию числового массива для каждого лага. Поддерживаются массивы целых чисел, чисел с плавающей запятой и Decimal. #94776 (Wenyu Chen). - Для JSON type теперь поддерживается функция
has()для проверки существования path, аналогичноMap. #96927 (DQ). - Добавлена табличная функция
mergeTreeTextIndex(database, table, index), которая читает данные напрямую из текстового индекса. Её можно использовать для интроспекции или для выполнения агрегаций по данным текстового индекса. #97003 (Anton Popov). - Добавлена SQL-функция
obfuscateQuery. #98305 (Xuewei Wang). - Добавлены функции
caseFoldUTF8иremoveDiacriticsUTF8для преобразования Unicode к единому регистру и удаления диакритических знаков. #98973 (George Larionov). - Функция
printfтеперь поддерживает неконстантные строки формата, что позволяет задавать разный шаблон форматирования для каждой строки на основе значений столбцов. #98991 (Yash). - Добавлена функция
highlight(), которая оборачивает вхождения поисковых терминов в текстовой строке HTML-тегами (по умолчанию<em>/</em>). Поддерживаются ASCII-регистронезависимое сопоставление, автоматическое слияние перекрывающихся совпадений и пользовательские открывающие/закрывающие теги. #99131 (Peng). - Добавлена строковая функция
normalizeUTF8NFKCCasefoldдля Unicode-нормализации NFKC_Casefold, которая объединяет нормализацию NFKC с приведением к единому регистру. #99276 (George Larionov). - Для полнотекстовых индексов и функции
tokensдобавлен токенизаторunicode_word. Он разбивает текст по правилам границ слов Unicode: ASCII-слова формируются с использованием символов-соединителей (подчёркивание, двоеточие, точка, одиночная кавычка), а не-ASCII-символы Unicode становятся односимвольными токенами. Настраиваемые стоп-слова по умолчанию соответствуют распространённым знакам пунктуации CJK. #99357 (Amos Bird). - Добавлена функция
arrayTranspose, которая принимает двумерный массив (матрицу) и транспонирует его. #101214 (Vitaly Baranov). - Добавлена функция
hasPhrase(псевдонимmatchPhrase) для поиска по фразам (непрерывным последовательностям токенов). Поиск выполняется методом полного перебора и пока не поддерживается текстовым индексом. #101997 (Elmi Ahmadov). dotProductдобавлена как поддерживаемая функция расстояния для индексов векторного сходства. Направление сортировки теперь проверяется для всех функций расстояния, чтобы предотвратить незаметное появление некорректных результатов. #102254 (Renzo).- Функция
stemтеперь может выполнять стемминг всех слов/токенов в столбцахString,FixedString,Array([Fixed]String),Nullable,LowCardinalityиConst. #99137 (Jimmy Aguilar Mena). - Функция
stemбольше не является экспериментальной (раньше для этого нужно было включитьallow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). - Добавлена функция
JSONAllValues, которая возвращает все значения из столбцаJSONв видеArray(String); значения сериализуются в текстовое представление и упорядочиваются по именам путей. Также добавлена поддержка текстового индекса для выраженияJSONAllValuesна столбцахJSON: если создать текстовый индекс дляJSONAllValues(json_column), он будет автоматически использоваться для фильтрации запросов по подстолбцамJSON(например,json_column.key1 = 'value'). #100730 (Anton Popov). - В оператор
EXTRACTдобавлены единицы, совместимые с PostgreSQL:EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADEиMILLENNIUM. Также исправленEXTRACT(WEEK FROM date), который ранее вызывал ошибку. #100274 (Alexey Milovidov). - Добавлена поддержка функции
toDaysInMonth()через синтаксический сахар парсера для стандартного SQL-синтаксиса функцииOVERLAY. Функцияoverlayуже существует; это добавляет поддержку формы с ключевыми словамиPLACING,FROMиFORв качестве разделителей. #101681 (Desel72). - Значения
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. #102421 (Nihal Z. Miaji).
SQL и возможности запросов
- Если параметр имеет тип
Nullableи не указан, теперь считается, что его значение равноNULL. #93869 (Vikash Kumar). - ClickHouse теперь может отсекать целые части данных в запросах
SELECTна основе статистики min/max. #94140 (zoomxi). - Добавлена поддержка Materialized CTEs, которые вычисляются только один раз во время выполнения запроса, а их результаты сохраняются во временных таблицах. #94849 (Dmitry Novik).
- Некоторые функции теперь можно использовать в SQL без скобок. #95949 (Aly Kafoury).
- Для типа
JSONдобавлен комбинированный синтаксис подстолбцовjson.@path. Он возвращает скалярное значение какDynamic, если по пути находится скаляр, вложенный объект какDynamic, если по пути находится вложенный объект, илиNULL, если путь отсутствует. #98788 (Pavel Kruglov). - Для выражений с подзапросами добавлено ключевое слово
SOME. Оно работает так же, какANY. #99842 (Artem Kytkin). - Добавлена поддержка
SET TIME ZONE 'tz'как псевдонима дляSET session_timezone. #99883 (phulv94). - Добавлена поддержка стандартной для SQL конструкции
VALUESкак табличного выражения вFROM, например:SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). - Добавлена поддержка составных литералов interval по стандарту SQL с квалификаторами диапазона
TO, напримерINTERVAL '1:30' HOUR TO MINUTE; внутри они раскладываются в суммы интервалов. #100453 (Desel72). - Добавлена команда
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'для режимов ordered и unordered. #100709 (Bharat Nallan).
Движки таблиц и хранилище
- Добавлена поддержка инкрементального чтения для движка таблицы
Paimonс отслеживанием прогресса снимков через Keeper, включая целевое чтение дельт снимков с помощьюpaimon_target_snapshot_id. #93655 (XiaoBinMu). - Добавлена поддержка дополнительного ZooKeeper в
DatabaseReplicated. #95590 (RinChanNOW). - Добавлена поддержка чтения типов временных меток Iceberg v3 с наносекундной точностью (
timestamp_nsиtimestamptz_ns), сопоставляемых сDateTime64(9)иDateTime64(9, 'UTC'). Это позволяет ClickHouse читать данные Iceberg с такими типами в схеме; однако это не означает полной поддержки Iceberg v3 и не включает запись в Iceberg v3 с этими типами. #97132 (Dmitry Kovalev). - Добавлен
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')для таблиц Iceberg. #97904 (murphy-4o). - Добавлен новый SLRU-кэш для метаданных Parquet, чтобы повысить производительность чтения и убрать необходимость повторно загружать файлы только ради чтения метаданных. #98140 (Grant Holly).
- Добавлена поддержка индекса пропуска данных MergeTree для JSON-столбцов с использованием
JSONAllPathsи типов индексовbloom_filter,tokenbf_v1,ngrambf_v1иtext(инвертированный), что позволяет пропускать гранулы на основе набора JSON-путей, присутствующих в каждой грануле. #98886 (Pavel Kruglov). - Добавлен индекс проекции
commit_order, который переупорядочивает данные в порядке вставки. #99004 (Mikhail Artemenko). - Добавлена сериализация Map по бакетам для столбцов
Mapв MergeTree (map_serialization_version = 'with_buckets'). Ключи разбиваются на бакеты на основе хеша, так что при чтении одного ключа (m['key']) считывается только один бакет, а не весь столбец, что даёт ускорение в 2–49 раз для выборки по одному ключу в зависимости от размера map. Количеством бакетов и стратегией бакетизации можно управлять с помощью новых настроек MergeTreemap_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficientиmap_buckets_min_avg_size. Настройкаmap_serialization_version_for_zero_level_partsсохраняет базовую сериализацию для вставок, чтобы избежать дополнительных накладных расходов при записи, тогда как для слитых частей используются бакеты. Индексы пропуска данных дляmapKeys/mapValuesподдерживаются при сериализации Map по бакетам, аoptimize_functions_to_subcolumnsпереписываетm['key']в чтение подстолбца для конкретного ключа, когда бакеты доступны. #99200 (Pavel Kruglov).
Вставка и дедупликация
- Реализовано новое поведение
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).
Настройки и конфигурация
- Добавлена настройка MergeTree
table_readonly, чтобы помечать таблицы как только для чтения и предотвращать вставки и изменения. #97652 (Alexey Milovidov). - Добавлена настройка
use_partition_pruning(псевдонимuse_partition_key). Установите её вfalse, чтобы отключить отсечение партиций по ключу партиционирования. #97888 (Nihal Z. Miaji). - Теперь каждая запись
type=httpв<protocols>может указывать пользовательский ключ<handlers>, ссылающийся на отдельный раздел конфигурации<http_handlers_*>, что позволяет задавать разные правила маршрутизации HTTP для разных портов. #98414 (Amos Bird). - Добавлены две настройки MergeTree —
replicated_fetches_min_part_levelиreplicated_fetches_min_part_level_timeout_seconds— которые позволяют репликам пропускать загрузку только что вставленных (не слитых) частей с других реплик, снижая накладные расходы на репликацию при интенсивной ингестии. #98625 (tanner-bruce). - Добавлена настройка сервера
restore_access_entities_with_current_grants. Когда она включена, восстановленные пользователи и роли получают только те привилегии, которые пользователь, выполняющий восстановление, имеет право выдавать (та же семантика, что и уGRANT CURRENT GRANTS), вместо ошибкиACCESS_DENIED. #98795 (pufit). - Добавлены настройки
max_skip_unavailable_shards_numиmax_skip_unavailable_shards_ratio, чтобы ограничить, сколько сегментов можно молча пропустить, когда включёнskip_unavailable_shards. Если число или доля недоступных сегментов превышает заданный порог, генерируется исключение вместо молчаливого возврата неполных результатов. #99369 (Alexey Milovidov). - Реализованы квоты по хешу нормализованного запроса для защиты публичных сервисов ClickHouse от злоупотреблений.
NORMALIZED_QUERY_HASHподдерживается как тип quota key — для каждого уникального нормализованного запроса создаётся отдельный бакет квоты, поэтомуCREATE QUOTA q KEYED BY normalized_query_hashотслеживает каждый такой запрос отдельно.QUERIES_PER_NORMALIZED_HASHподдерживается как тип ресурса квоты — он ограничивает максимальное число выполнений любого отдельного нормализованного запроса в пределах интервала, поэтомуMAX queries_per_normalized_hash = 100не позволяет одному и тому же шаблону запроса выполняться более 100 раз. #99586 (Alexey Milovidov). - Для настройки MergeTree
auto_statistics_typesзначением по умолчанию теперь являетсяminmax, uniq, поэтому статистика minmax и uniq автоматически создаётся для всех подходящих столбцов в новых таблицах. Дляmaterialize_statistics_on_insertзначением по умолчанию теперь являетсяfalse, поэтому статистика строится во время слияний, а не в момент вставки, что снижает накладные расходы на вставку. Установитеmaterialize_statistics_on_insert = 1, чтобы вернуть прежнее поведение. #101275 (Han Fei). - Добавлена настройка обновления
prefer_dependency_replicaдля цепочек зависимостей materialized view, чтобы уменьшить потери данных из-за задержки репликации между репликами. #101591 (Seva Potapov).
Аутентификация
- Добавлена опция конфигурации LDAP
<follow_referrals>для каждого сервера (по умолчаниюfalse), позволяющая управлять тем, следует ли LDAP-клиент перенаправлениям. Отключение следования перенаправлениям позволяет избежать тайм-аутов и зависаний при поиске с base DN на уровне корня домена Active Directory, а также уменьшает шум в логах. #96765 (paf91).
Системные таблицы
- Добавлена
system.histogram_metric_log— новая системная таблица, которая периодически сохраняет снимки всех метрик-гистограмм (например, задержек S3/Azure и длительности этапов обработки запросов в Keeper). Столбецvalueтаблицыsystem.histogram_metricsтеперь имеет типFloat64для большей гибкости и совместимости с моделью данных Prometheus. #103046 (Miсhael Stetsyuk).
Экспериментальные возможности
- Добавлен кодек сжатия 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). - Добавлена поддержка внешних SQL-диалектов с использованием библиотеки
polyglot. #99496 (Alexey Milovidov). - Добавлена настройка
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). - Добавлена поддержка озер данных в Azure на базе Delta Kernel. #102202 (Smita Kulkarni).
Повышение производительности
Производительность JOIN
- Небольшие улучшения в
HashJoinиConcurrentHashJoin. #96663 (Yarik Briukhovetskyi). - Добавлена поддержка перестановки сторон
ANTI,SEMIиFULLJOIN на основе статистики оптимизатора. #97498 (Hechem Selmi). - Снижены конфликты доступа к кэшу в
RIGHTиFULLJOIN за счёт проверки, установлен лиJoinUsedFlags, перед записью. #99274 (Hechem Selmi). - Ускорены hash JOIN для ключей
Int32иInt64из небольшого диапазона за счёт использования хеш-таблицы с прямой индексацией. #99275 (Hechem Selmi).
Оптимизация запросов
- Оптимизировано skipping гранул для
pointInPolygonдля больших полигонов, а также исправлено исключение, возникавшее во время анализа индексаpointInPolygonпри отсечении по первичному ключу. #91633 (Nihal Z. Miaji). optimize_read_in_orderтеперь учитывается при чтении проекций. #95885 (Andrey Zvonov).- Слегка оптимизировано чтение из словаря текстового индекса, что улучшило общую производительность анализа текстового индекса. #97519 (Anton Popov).
- Улучшена производительность анализа текстового индекса для запросов с составными условиями, затрагивающими как индексированные, так и неиндексированные столбцы. Ранее в таких случаях оптимизация раннего выхода при анализе индекса была ошибочно отключена. #98096 (Anton Popov).
- Улучшена производительность запросов с константными выражениями, которые создают очень длинные массивы или значения Map. #98287 (Alexey Milovidov).
- Исправлен анализ условий по ключу для первичных ключей
DateTime64, сравниваемых с целочисленными константами, что ранее приводило к отсутствию отсечения гранул. #98410 (Amos Bird). - Настройка
optimize_syntax_fuse_functionsтеперь включена по умолчанию. #98424 (Alexey Milovidov). - Отсечение партиций теперь допускается, если предикат содержит любой оператор сравнения (
=,<,>,!=), а ключ партиционирования обёрнут в цепочку детерминированных функций (например, приPARTITION BY xпредикаты вродеcityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026илиtoYYYYMM(x) != 2026будут использовать ключ партиционирования для отсечения). #98432 (Nihal Z. Miaji). - Оптимизация чтения по порядку и отсечение по первичному ключу теперь допускаются, когда целевой тип
CAST—Nullable, а преобразование монотонно; например, приPRIMARY KEY xClickHouse может использовать оптимизацию чтения по порядку дляORDER BY x::Nullable(UInt64)и отсечение по первичному ключу для предикатов вродеWHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji). - Отсечение по индексу и pushdown фильтров теперь допускаются, когда целочисленный столбец сравнивается с литералом с плавающей точкой; например, предикаты вроде
WHERE x < 10.5теперь могут использовать первичный ключ для отсечения, а фильтры вродеprime < 1e9илиnumber < 1e5теперь передаются через pushdown для табличных функцийprimes()иnumbers()вместо того, чтобы приводить к неограниченному выполнению. #98516 (Nihal Z. Miaji). - Запросы с фильтрацией по столбцам первичного ключа MergeTree и regex-альтернациями над строковыми литералами, например
^(abc-1|abc-2), теперь могут использовать отсечение по первичному ключу, если альтернативы имеют общий префикс. #98988 (Yash). - Оптимизированы
INTERSECT ALLиEXCEPT ALL. #99097 (Raufs Dunamalijevs). - Добавлена поддержка оптимизации
read_in_order_use_virtual_rowдля чтения в обратном порядке. #99198 (Vladimir Cherkasov). - Ускорены прерывистые запросы для столбцов
LowCardinalityс одним словарём. #99285 (Ivan Babrou). - Исправлено ухудшение масштабируемости коротких запросов с агрегацией на машинах с большим числом ядер. Когда запрос читает мало marks, конвейер после агрегации больше не расширяется до
max_threads, что позволяет избежать накладных расходов из-за в основном пустых streams. #99493 (Alexey Milovidov). - Повышена производительность запросов с параллельными репликами за счёт корректного выбора размера задачи чтения. #99801 (Nikita Taranov).
- Удалены избыточные конечные элементы
ORDER BY, если все ключиGROUP BYуже покрыты префиксомORDER BY. #100157 (Alexey Milovidov). - Запросы оптимизированы за счёт проталкивания
LIMITвнутрьUNION ALL. #100364 (Alexey Milovidov). - Добавлена поддержка JIT-компиляции для сравнений столбцов
StringиFixedStringвORDER BY, что повышает производительность сортировки на этапе слияния на 6–17% для ключей сортировки с большим количеством строковых значений. #100577 (Raúl Marín). - Когда
read_in_order_use_virtual_rowвключён вместе с новой настройкойread_in_order_use_virtual_row_per_block, информация о границах виртуальных строк теперь выдаётся после чтения каждого block из MergeTree, что позволяет слиянию перераспределять приоритет источников по ходу потока для частей, чьи данные полностью отфильтровываются условиямиWHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov). - Улучшена распараллеливаемость запросов с простыми представлениями (поверх базовой таблицы семейства MergeTree), выполняемых с параллельными репликами. #100815 (Igor Nikonov).
- Добавлена поддержка параллельных реплик для простых представлений (включая подходящие представления
UNION ALLповерх таблицMergeTree) приparallel_replicas_allow_view_over_mergetree=1. Это распараллеливает внешний запрос представления вместо внутреннего, увеличивая параллелизм выполнения запроса между узлами. #100958 (Igor Nikonov). - Оптимизировано чтение в порядке первичного ключа для
full_sorting_merge, когда в плане запроса присутствуют фильтры сIN. #101261 (Nikita Taranov). - Повышена производительность
INSERT VALUESдля столбцовMap,ArrayиTuple, когда значения передаются как экранированные строки (например,'{\'key\':1}'), что позволяет избежать ненужного перехода к парсеру SQL-выражений. #102119 (Joanna Hulboj).
Производительность функций и агрегации
- Улучшена производительность функции
levenshteinDistance. #94543 (Joanna Hulboj). - Оптимизированы батчевые преобразования типов
Decimalза счёт отказа от вызовов функций для каждого элемента. #95923 (Konstantin Bogdanov). - Улучшена производительность запросов
LIKE. #98149 (Elmi Ahmadov). - Оптимизирована агрегатная функция
avgWeighted: вместо пересылки данных для каждой строки через aggregate state теперь используются локальные аккумуляторы, что повышает производительность до 27% для входных данныхNullable. #98793 (Antonio Andelic). - Ускорены функции
var*Stableиstddev*Stableдля столбцовFloat64за счёт девиртуализации внутреннего цикла. Это позволяет компилятору применять оптимизации (FMA/регистры), которые изменяют результаты вычислений с плавающей точкой на уровне ULP. #99460 (Riyane El Qoqui). - Для входных данных размером 32/64 байта используется оптимизированное кодирование base58 из Firedancer (автоматически для
base58Encode), а также разрешено использовать оптимизированное декодирование base58, если декодированный результат имеет размер 32/64 байта (явно черезbase58Decode('...', 32)). #99461 (Joanna Hulboj). - Оптимизирована функция
cutURLParameterза счёт устранения лишних сдвигов в памяти. #100218 (Nikita Semenov). - Ускорено преобразование float в строку для больших целочисленных значений за счёт расширения быстрого пути
itoaс округлением, совместимым с dragonbox. #100649 (Raúl Marín). - Dragonbox заменён на zmij, что ускорило преобразование float в строку в 1.5–3 раза. #100650 (Raúl Marín).
- Ускорено преобразование
Int128/UInt128в строку за счёт замены программного деления на редукцию Барретта и развёртывания цикла преобразования. #100671 (Raúl Marín). - Исключено создание лишних потоков при параллельном слиянии в
UniqExactSet. #100686 (Jiebin Sun). - Добавлено батчевое параллельное слияние для
UniqExactSet. #100687 (Jiebin Sun).
Производительность хранилища и ввода-вывода
- Снижена конкуренция за блокировки при операциях только для чтения в таблицах ReplicatedMergeTree с завершёнными мутациями. #95771 (Eduard Karacharov).
- Iceberg теперь может асинхронно заранее заполнять кэш метаданными; это включается настройкой
iceberg_metadata_async_prefetch_period_msпри создании таблицы. ЗапросыSELECTк таблицам Iceberg теперь могут задавать параметрiceberg_metadata_staleness_ms, который позволяет ClickHouse использовать кэшированную версию метаданных, если она свежее указанного порога устаревания; в противном случае для получения последних метаданных выполняется запрос к удалённому каталогу Iceberg. Это позволяет исключить обращения к каталогу Iceberg во время обработки запросов, что даёт заметный прирост производительности. #96191 (Arsen Muk). - Упорядоченный режим S3Queue теперь использует S3
ListObjectsV2StartAfter, чтобы избежать повторного перечисления всей истории по префиксу и сократить число вызововListObjects. #96370 (Venkata Vineel). - Включено параллельное чтение из движка таблицы YTsaurus. #97343 (MikhailBurdukov).
- Улучшена производительность озер данных. В предыдущих версиях чтение из Объектного хранилища не подстраивало размер конвейера под число потоков обработки. #99548 (Alexey Milovidov).
- Разрешена предвыборка при чтении удалённого файла через кэш страниц в пространстве пользователя. #99919 (Alexey Milovidov).
- Исправлена существенная регрессия производительности INSERT при
deduplicate_insert=enable(по умолчанию с 26.2): вычисление хеша данных перенесено с этапа squashing в sink, а также использовано батч-хеширование столбцов черезupdateHashWithValueRange, что снизило накладные расходы примерно с ~2.5s до ~0.5s для 5M строк и 22 столбцов. #101494 (Sema Checherinda).
Оптимизация памяти
- Для синхронных вставок исходный блок (необходимый для дедупликации) теперь можно не хранить, чтобы экономить память. #96661 (Sema Checherinda).
- В некоторых сценариях улучшены производительность и использование памяти для параллельных оконных функций, а также для рабочих нагрузок с
arrayFoldи большими массивами. Это также может снизить нагрузку, связанную со страничными ошибками, и повысить стабильность затронутых запросов при жёстких ограничениях по памяти. #98892 (filimonov).
Улучшения
Запросы и SQL
- Агрегатные проекции теперь корректно поддерживаются в представлениях. #88798 (Amos Bird).
optimize_aggregators_of_group_by_keysтеперь корректно оптимизирует агрегатные функции в запросахGROUPING SETS. #93935 (Xiaozhe Yu).- Добавлена поддержка оптимизации JOIN с преобразованием
OUTERвINNERпри использованииjoin_use_nulls. #95968 (Vladimir Cherkasov). cast_keep_nullableрасширен для работы с типамиDynamic/JSON. Если параметр включен, приведениеNULLиз типов, которые могут бытьNullable, возвращаетNULL; в противном случаеNULLвызывает ошибкуCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).- В
CREATE USERдобавлено предложениеROLE. #97074 (Vitaly Baranov). - В вывод запроса
EXPLAINдобавлена информация об отложенных фильтрах в виде отдельного пункта (при использовании политик строк/PREWHERE с FINAL). #97374 (Yarik Briukhovetskyi). - Добавлена поддержка заключенных в скобки выражений JOIN таблиц в предложении
FROM, напримерSELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - Теперь при распределенном анализе индексов применяются индексы пропуска данных. #97767 (Azat Khuzhin).
- Ключ сортировки таблицы теперь может быть выражением вида
toDate(time), а решение о том, откладывать ли такие выражения, теперь принимается, когда они входят в состав фильтров. #98237 (Yarik Briukhovetskyi). - Оптимизатор порядка JOIN теперь выводит транзитивные предикаты эквисоединения из существующих условий JOIN. Например, если заданы
A.x = B.x AND B.x = C.x, распознается эквивалентностьA.x = C.x, что позволяет оптимизатору рассматривать прямые JOIN между транзитивно связанными таблицами. Это может повысить качество плана для схем типа star и snowflake. Эта возможность управляется новой настройкойenable_join_transitive_predicates(по умолчанию выключена). #98479 (Alexander Gololobov). - Когда включены
apply_row_policy_after_finalилиapply_prewhere_after_final, составные условияANDв политиках строк иPREWHEREтеперь разлагаются, чтобы извлекать атомы ключа сортировки для анализа индекса первичного ключа. Ранее, если отложенный фильтр содержал смесь предикатов по ключу сортировки и не по ключу сортировки (например,x > 1 AND y != 'foo'), всё выражение исключалось из анализа индексов. #98513 (Yarik Briukhovetskyi). - Теперь в распределенном анализе индексов участвуют только “живые” (доступные для подключения) реплики. #98521 (Azat Khuzhin).
- Количество узлов, используемых автоматической эвристикой параллельных реплик, теперь ограничено фактическим количеством узлов в кластере (а не только значением настройки
max_parallel_replicas). #98668 (Nikita Taranov). - Для распределенного анализа индексов реализованы хеджированные запросы и асинхронное чтение. #98724 (Azat Khuzhin).
- Добавлена поддержка клаузы
SAMPLEв распределённом анализе индексов. #98931 (Azat Khuzhin). - Добавлена поддержка монотонности для
multiply, что позволяет выполнять pruning по первичному ключу для выражений видаkey * constant. #98983 (Amos Bird). - Сообщения об ошибках анализатора больше не выводят дамп всех столбцов таблицы (что могло приводить к исключениям размером более 150 КБ). Теперь списки столбцов ограничены 10 записями. #99002 (Yash).
- Статистика столбцов из подзапросов с JOIN теперь корректно возвращается, чтобы родительский запрос мог использовать её для переупорядочивания JOIN. #99096 (Alexander Gololobov).
ALTER TABLE MODIFY COLUMN x TTL ...теперь можно использовать без указания типа столбца. #99208 (Nikolay Degterinsky).- Улучшен вывод
EXPLAIN PLAN pretty=1: теперь отображаются выходные столбцы запроса верхнего уровня, метки/символы отношений JOIN с оценкой числа строк результата и локальности, а также выходные столбцы для каждого шага JOIN/source. #99462 (Kirill Kopnev). - Исправлена ошибка в табличной функции
merge(), из-за которой возникала ошибкаUNKNOWN_IDENTIFIERпри запросе столбцов, присутствующих не во всех базовых распределённых/удалённых таблицах. #99833 (Alexey Milovidov). ConditionSelectivityEstimatorбольше не используется в оптимизаторе, если условие не находится в CNF (например,where a = 0— это одиночное условие, для которого статистика не помогает). #100110 (Han Fei).distributed_index_analysis_min_indexes_bytes_to_activateтеперь применяется после отсечения партиций. #100477 (Azat Khuzhin).EXPLAIN PIPELINEтеперь поддерживает настройкуdistributed=1, чтобы включать удалённые фрагменты конвейера. #100513 (Nikita Taranov).use_partition_pruning = 0теперь также отключает pruning индексаMinMaxи оптимизациюcountдля столбцов ключа партиционирования, помимо отключения pruning на основе ключей партиционирования. #100904 (Nihal Z. Miaji).EXPLAIN [PLAN] pretty=1теперь выводит выражения в удобочитаемом формате. #100927 (Kirill Kopnev).accurateCastOrNullиaccurateCastOrDefaultтеперь поддерживают целевые типыTuple, включая вложенныеTupleс элементамиNullable. Ранее эти функции отклонялиTupleв качестве целевого типа, посколькуTupleне мог находиться внутриNullable. #100942 (Nihal Z. Miaji).- Теперь в клаузе
WITHможно использовать завершающую запятую перед запросомSELECT. #101093 (Aruj Bansal). - Реализована отложенная материализация столбцов для ReplacingMergeTree с FINAL, когда predicate достаточно селективен. #101647 (Nikolai Kochetov).
- Улучшены оценки селективности по умолчанию для условий без статистики в соответствии с общепринятыми отраслевыми эвристиками: 0,1 для селективности условия
LIKEи 0,33 для селективности неизвестного условия. #101653 (Alexander Gololobov). - Подзапрос VIEW теперь встраивается в дерево запроса, что позволяет применять к VIEW больше оптимизаций. #100830 (Dmitry Novik).
Функции
- Теперь функции
JSONExtractподдерживают нативный ввод JSON/Object. #96711 (Fisnik Kastrati). - Добавлена SQL-функция
tokensForLikePattern, которая токенизирует шаблоныLIKEс учетом семантики подстановочных символов:%и_рассматриваются как подстановочные символы, экранированные подстановочные символы (\%,\_) — как литералы, а токены рядом с неэкранированными подстановочными символами отбрасываются. #97872 (Amos Bird). - Реализована функция
toDaysInMonth(), которая возвращает количество дней в месяце для указанной даты. #99227 (Vitaly Baranov). - Токенизатор
unicodeWordпереименован вasciiCJK. #100956 (George Larionov). - Добавлен синтаксический сахар на уровне парсера для синтаксиса стандартной SQL-функции
OVERLAY. Функцияoverlayуже существует; это добавляет поддержку формы на основе ключевых слов с использованиемPLACING,FROMиFORв качестве разделителей. #101681 (Desel72). - Функция
ngramsтеперь отклоняет некорректные длины n-грамм. Например,SELECT ngrams('abc', 0)теперь возвращает ошибку. #101922 (Robert Schulze). - Добавлена поддержка токенизатора
arrayдля оптимизацииLIKE. #102880 (Elmi Ahmadov).
Движки таблиц и хранилище
- Для MergeTree добавлен выделенный поток очистки, чтобы предотвратить задержки очистки при высокой нагрузке из-за слияний. #91574 (Amos Bird).
- Таблицы с правилами
DELETE TTLтеперь могут использовать алгоритм вертикального слияния. #97332 (murphy-4o). - Метки вторичных индексов теперь предварительно загружаются, когда включена настройка
prewarm_mark_cache(они загружаются в кэш меток индекса во время загрузки частей данных и при запуске таблицы). #97772 (Anton Popov). - Текстовые индексы теперь можно строить по столбцам
Nullable([Fixed]String)иArray(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena). - Фоновые слияния в
DROP DATABASEдля ordinary shared merge tree теперь отменяются заранее. #98161 (Shaohua Wang). - Добавлена настройка
finalize_projection_parts_synchronously, позволяющая синхронно финализировать части проекций во время INSERT, уменьшая пиковое потребление памяти для таблиц с большим количеством проекций при сохранении существующего асинхронного поведения по умолчанию. #98228 (Amos Bird). - Добавлена настройка MergeTree
share_nested_offsets(по умолчаниюtrue). Если установлено значениеfalse, столбцы типа Array с именами через точку (например,n.a,n.b) рассматриваются как независимые столбцы вместо того, чтобы совместно использовать файлы смещений и проверять равенство размеров массивов в рамках устаревшей семантики Nested. #98416 (Amos Bird). TRUNCATE DATABASE TABLES LIKEоптимизирован за счет предварительной параллельной отмены слияний. #98597 (Shaohua Wang).- Снижена конкуренция за блокировки в
MergeTreeBackgroundExecutorза счет освобождения ресурсов задач без захвата блокировки. #98604 (Dmitry Novik). TRUNCATE DATABASEтеперь реагирует на отмену запроса. #98828 (Shaohua Wang).- После изменения настройки MergeTree теперь перезапускается кэш статистики. #98520 (Han Fei).
- Добавлена настройка MergeTree
compress_per_column_in_compact_partsдля управления тем, как организуются сжатые блоки в компактных частях. Когдаtrue(по умолчанию, с сохранением текущего поведения), каждый столбец начинает новый сжатый блок, что позволяет выполнять выборочную распаковку. Когдаfalse, все столбцы внутри гранулы упаковываются в один и тот же сжатый блок, что улучшает коэффициент сжатия и производительность чтения для рабочих нагрузок, которые всегда читают все столбцы. #101114 (Amos Bird). - Текстовый индекс теперь имеет статус GA и остается включенным независимо от настройки
compatibility, что предотвращает его неожиданное отключение при восстановлении из резервной копии или работе в режиме совместимости. #101518 (Nikita Fomichev). - Добавлена поддержка текстового индекса, построенного на
mapValues(map), для оператораIN. #99286 (Anton Popov). - Улучшен анализ нескольких текстовых индексов, одновременно используемых в одном запросе. Настройка
use_skip_indexes_on_data_readбольше не требуется для оптимизации прямого чтения текстовых индексов. #102255 (Anton Popov). - Добавлена поддержка анализа текстового индекса для функции
hasPhraseв режимеHINT. #102438 (Elmi Ahmadov). - Статистика MinMax для столбцов теперь хранит минимальные и максимальные значения как
Field(с типом), а не какFloat64. Сериализованный формат включает имя типа столбца вместе со значениями. Версия файла статистики повышена до V2; файлы, записанные более старыми версиями, требуют повторной материализации (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).
Озера данных
- Добавлен новый запрос для проверки состояния
DataLakeCatalog. #94690 (Smita Kulkarni). - Улучшены операции записи в Iceberg для Unity Catalog. #98162 (Konstantin Vedernikov).
- Переработаны сущности в
IcebergManifestFile, чтобы снизить вероятность ошибок при сопровождении кода (это также устраняет некоторые проблемы с кэшированием файлов манифеста). #98231 (Daniil Ivanik). - Расширена поддержка аргументов в Iceberg
ALTER TABLE ... EXECUTE expire_snapshots(...). #99130 (murphy-4o). - Изменён интерфейс для вставки в Iceberg через каталог. Параметры
storage_catalog_type,storage_aws_access_key_idи аналогичные объявлены устаревшими. #100334 (Konstantin Vedernikov). - Исправлена непоследовательная обработка путей в Iceberg, вызванная смешанным использованием путей хранилища и путей метаданных; теперь таблицы Iceberg записывают расположение таблицы либо как URL, либо как абсолютный путь; добавлен резервный механизм для подсчёта размеров файлов в Azure; обработка
version-hint.txtприведена в соответствие со Spark; введены абстракции на уровне типов, чтобы пути разных типов было сложнее перепутать; также исправлено использование position deletes. #100420 (Daniil Ivanik). - Исключено сканирование всего удалённого каталога озера данных для подсказок таблиц вида “Maybe you meant …”, когда
show_data_lake_catalogs_in_system_tablesотключён. #100452 (Alsu Giliazova). - Информация об объектах, используемая для разбора файлов данных Iceberg, теперь содержит число строк в файле и размер файла в байтах, полученные при разборе файла манифеста. #100645 (Daniil Ivanik).
- Добавлен pruner для Delta Lake с виртуальными столбцами. #101634 (Konstantin Vedernikov).
S3 и объектное хранилище
- Добавлен плейсхолдер
{_schema_hash}для движка таблицы S3, который добавляет хеш определений столбцов таблицы в путь S3. #98265 (Miсhael Stetsyuk). - Добавлена новая опция для принудительного использования стиля virtual/path для конечных точек S3. #102378 (Konstantin Vedernikov).
Настройки и конфигурация
- Теперь пользователи могут указывать несколько методов аутентификации в конфигурации
users_xml. #91998 (Flip-Liquid). - Теперь можно задавать настройки
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). type_json_allow_duplicated_key_with_literal_and_nested_objectтеперь включена по умолчанию, что позволяет избежать ошибок о дублирующихся ключах при разборе JSON вида{"a" : 42, "a" : {"b" : 42}}, который ClickHouse может формировать из исходных данных{"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).- Статистика по столбцам теперь имеет статус GA. Настройка
allow_experimental_statistics(по умолчаниюfalse) объявлена устаревшей в пользуallow_statistics(по умолчаниюtrue);allow_statistics_optimizeпереведена из бета-статуса в GA; ClickHouse создает статистикиminmaxиuniqдля новых столбцов (настройка MergeTreeauto_statistics_types); а чтобы избежать замедления INSERT,materialize_statistics_on_insertтеперь отключена по умолчанию. #97487 (Han Fei). - Уточнена взаимосвязь между
enable_parallel_replicasиautomatic_parallel_replicas_mode: запрос может использовать параллельные реплики, только еслиenable_parallel_replicas > 0. Приautomatic_parallel_replicas_mode=1решение принимается на этапе планирования на основе собранной статистики; приautomatic_parallel_replicas_mode=0параллельные реплики используются для всех поддерживаемых запросов независимо от статистики. Distributed insert-select с параллельными репликами всегда работает так, как если быautomatic_parallel_replicas_mode=0. #97517 (Nikita Taranov). - Возможность impersonate (EXECUTE AS target_user) теперь включена по умолчанию. #97870 (Vitaly Baranov).
- Добавлена настройка
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(включена по умолчанию), которая запрещает использовать определенные в конфигурации профили настроек (кроме профиляdefault) для пользователей, определенных через SQL. #98662 (Alexander Tokmakov). - Добавлена настройка для управления поведением при несовпадении типов для
VariantиDynamic(throwили возвратNULL). #99085 (Bharat Nallan). - Значение
stderr_reactionпо умолчанию для пользовательских функций (UDF), реализованных как исполняемые программы, изменено сthrowнаlog_last. UDF, которые записывают предупреждения в stderr, больше не завершаются ошибкой при коде выхода 0, а исключения при ненулевом коде выхода теперь включают содержимое stderr. #99232 (Xu Jia). - Добавлена настройка
input_format_column_name_matching_mode, которая позволяет задавать разную чувствительность к регистру для входных форматов. #99346 (manerone). - Автоматическая статистика больше не включается для системных таблиц, так как они редко получают от нее пользу. #102862 (Han Fei).
Системные таблицы и мониторинг
- Теперь в
system.query_logв новом столбцеskip_indicesфиксируются индексы пропуска данных, используемые при выполнении запросов. #99793 (Grant Holly). - В
system.part_logдобавлен столбецprojections_duration_ms, в котором записывается длительность слияния/перестроения для каждой проекции в миллисекундах. #98292 (Amos Bird). - В
information_schema.tablesдобавлен псевдоним столбцаINDEX_LENGTH. #101705 (Robert Schulze). information_schema.tablesтеперь игнорирует неактивные части таблицы, благодаря чему отображаемые значения размера таблиц стали более реалистичными. #101706 (Robert Schulze).
ClickHouse Keeper
find_super_nodesбольше не застревает при обходе дочерних узлов первого super node, благодаря чему теперь можно находить несколько таких узлов. #97819 (pufit).- Сеанс ZooKeeper теперь помечается как истёкший сразу при начале финализации, не дожидаясь завершения потока отправки. Это позволяет другим потокам без задержки установить новый сеанс. #99102 (Raúl Marín).
- Устаревшие запросы Keeper для уже отключившихся сеансов теперь пропускаются, что позволяет избежать лишних обменов с Raft. Количество отслеживаемых завершённых сеансов ограничено настройкой coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic). - Предотвращено зависание команды Keeper
mntrиз-за конкуренции за блокировки. #99472 (Antonio Andelic). - Снижена конкуренция за блокировки в dispatcher Keeper: обратные вызовы и read request теперь обрабатываются вне области действия mutex; также для обсервабилити добавлены профилируемые lock guard. #99751 (Antonio Andelic).
Управление памятью
- Добавлен параметр конфигурации
use_separate_cache_arenaдля настройки разделения арены кэша. #100664 (Seva Potapov).
Форматы данных
- Добавлена настройка
output_format_trim_fixed_stringдля удаления завершающих null-байтов из значенийFixedStringв текстовых выходных форматах. #97558 (NeedmeFordev). - Стало возможно разбирать файлы GeoParquet, содержащие разные гео-типы в одном столбце. #97851 (Mark Needham).
- Десериализация бинарных состояний
AggregateFunctionтеперь требует чтения всего входа целиком. Если присутствуют лишние завершающие байты, ClickHouse генерирует исключение вместо того, чтобы принимать некорректные данные состояния. #98786 (Nihal Z. Miaji). - Теперь пользователи могут записывать интервальные типы данных ClickHouse в формат Arrow. #99519 (Peter Nguyen).
- Добавлена встроенная поддержка импорта и экспорта типов данных UUID в форматах Arrow и Parquet с автоматическим логическим определением для UUID верхнего уровня и поддержкой явных указаний схемы для вложенных UUID. #99521 (Ivan).
- Теперь допускается отсутствие заполнения в конце последнего блока файла Parquet. #99857 (Seva Potapov).
- При экспорте UUID в Parquet через кодировщик Arrow теперь добавляется корректная аннотация типа UUID, что устраняет необходимость вручную приводить данные
FixedString(16)при обратном чтении файлов. #100150 (Ivan). - Добавлена встроенная поддержка импорта типов данных Apache Arrow
StringViewиBinaryViewв столбцы ClickHouseString, что улучшает совместимость для ингестии на основе Arrow. #100762 (Ivan). - Добавлена поддержка
Nullable(Tuple)в форматахArrow,ArrowStream,ORCи устаревшемParquet. #101272 (Nihal Z. Miaji).
Именованные коллекции и словари
- В список допустимых ключей для источников словарей PostgreSQL добавлен
sslmode, что позволяет настраивать режим SSL для подключений словарей PostgreSQL (например, для AWS RDS, где SSL по умолчанию обязателен). #98014 (mcalfin). - Предотвращено удаление именованных коллекций, от которых зависят источники словарей. #98127 (Pablo Marcos).
- Добавлена поддержка типов
MapиJSON/Objectв качестве атрибутов словарей. Теперь словари могут хранить и извлекать сложные типы, включаяMap(String, String),Map(String, Array(String)),JSONиNullable(JSON), в структурах FLAT и HASHED. #98627 (yanglongwei). SYSTEM RELOAD DICTIONARIESтеперь перезагружает словари в топологическом порядке, поэтому словари, использующие другие словари в качестве источника, после перезагрузки получают актуальные данные. #98356 (Alexey Milovidov).- Словари типа cache больше не используют exclusive-блокировку в
hasKeys, что снижает конкуренцию за блокировки за счёт использования разделяемой блокировки при чтении из кэша. #100796 (liuguangliang).
Другие улучшения
- Подсказки
ACCESS_DENIEDбольше не раскрывают имена столбцов, если пользователь не может видеть все необходимые столбцы; имена базы данных/таблицы по-прежнему видны в подсказке. #91067 (filimonov). - Конфигурация cluster теперь перезагружается при изменении IP-адресов hostname локального сервера, а не IP-адресов любого хоста. #93726 (Zhigao Hong).
- Добавлен flush буферов асинхронного logging в случае сбоя. #97836 (Azat Khuzhin).
- Уменьшено число блокировок при управлении доступом. #97894 (Nikita Taranov).
- ClickStack обновлён до версии 2.20.0. #98252 (Aaron Knudtson).
- Генерация SQL с помощью ИИ (команда
??) отключена во встроенном client (протоколы SSH и WebSocket), чтобы предотвратить доступ к переменным окружения сервера. #100290 (Alexey Milovidov). - При использовании хранилища RabbitMQ для повреждённых сообщений теперь отправляется NACK. #102157 (Seva Potapov).
Исправления ошибок
Все исправления ошибок (нажмите, чтобы развернуть)
Все исправления ошибок (нажмите, чтобы развернуть)
Исправления JOIN
- Исправлена ошибка, из-за которой отсутствовал столбец, если в JOIN со старым анализатором использовался псевдоним идентификатора нестандартного вида. #95679 (Zhigao Hong).
- Исправлен некорректный результат, когда алгоритм
grace_hashиспользовался с неэквивалентными JOIN, а левый блок не мог быть обработан полностью из-за ограничений на размер результата JOIN. #97866 (János Benjamin Antal). - Исправлена логическая ошибка при использовании
analyzer_compatibility_join_using_top_level_identifierиARRAY JOIN. #98179 (Vladimir Cherkasov). - Исправлено исключение
LOGICAL_ERROR, возникавшее, когдаRIGHT JOIN, обёрнутый вCROSS JOIN, переставлялся оптимизациейquery_plan_join_swap_tableв старом коде этапа JOIN. #98279 (Alexey Milovidov). - Исправлено исключение “Pipeline stuck” в JOIN
full_sorting_merge, вызванное взаимной блокировкой вPingPongProcessor, когда оптимизацияFilterBySetOnTheFlyсоздавала циклическую зависимость сMergeJoinTransform. #98454 (Alexey Milovidov). - Исправлено исключение логической ошибки, когда
CROSS JOINиспользовался вместе сINNER JOIN USING. #98459 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR, когдаarrayJoinиспользовался в выражении фильтра сOUTER JOINи включённымjoin_use_nulls. #98464 (Alexey Milovidov). - Исправлены исключение
BAD_GETи некорректные результаты запроса, когда небулево выражение (например,sin(col)) использовалось одновременно вWHEREиSELECTс JOIN из-за того, что оптимизация проталкивания фильтра повреждала общие узлы DAG. #98681 (Alexey Milovidov). - Исправлена
LOGICAL_ERROR“Replica decided to read in Default mode, not in WithOrder” при использованииread_in_order_through_joinс параллельными репликами. #98685 (Alexey Milovidov). LEFT ANTI JOINс несколькими столбцами ключа JOIN возвращал неверные результаты приenable_join_runtime_filters=1(по умолчанию). #98871 (Alexander Gololobov).- Исправлена ошибка в оптимизации
query_plan_convert_any_join_to_semi_or_anti_join, которая возвращала некорректный результат для несовпавших строк. #99112 (Yarik Briukhovetskyi). - Исправлено исключение в функциях, работающих с
ColumnReplicated, при необрабатываемых строках, созданных JOIN. #99564 (Hechem Selmi). - Исправлен редкий случай, когда JOIN с переупорядочиванием мог давать неверный результат. #100790 (Yarik Briukhovetskyi).
- Исправлены неверные результаты, когда JOIN с оптимизацией shard-by-PK использовал кэш условий запроса, и некоторые части отфильтровывались кэшированными условиями. #100926 (Groene AI).
- Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCKпри использованииARRAY JOINсJOIN USINGи включенной настройкойanalyzer_compatibility_join_using_top_level_identifier. #101507 (Vladimir Cherkasov). - Исправлен некорректный порядок строк в запросах, использующих
ORDER BYс алгоритмом JOINgrace_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).
Исправления запросов и анализатора
- Исправлено сохранение целевой Alias table как DDL-зависимости, если она указана не полностью: теперь она сохраняется с базой данных Alias table, а не с базой данных сеанса. #95175 (Enric Calabuig).
- Исправлена ошибка
Block structure mismatch in stream, вызванная лишними столбцами, возвращаемыми при отложенной материализации. #96682 (Nikolai Kochetov). - Исправлено исключение при сравнении кортежей с элементами типа
Nothing(например, при сравнении с элементами кортежаNULL) при использованииGROUPING SETSиORDER BY. #97509 (Alexey Milovidov). - Исправлено исключение “Context has expired” для коррелированных подзапросов, содержащих table functions, такие как
url(). #97544 (Alexey Milovidov). - Исправлены исключения и некорректное поведение в
optimize_syntax_fuse_functions, связанные с агрегатными проекциями, типом Date и сохранением имен столбцов. #97545 (Alexey Milovidov). - Удалено некорректное query rewrite из
replaceRegexpOneвextract, которое приводило к неправильным результатам, если регулярное выражение не совпадало; также исправлено исключение при использованииreplaceRegexpOneсGROUP BY ... WITH CUBEиgroup_by_use_nulls=1. #97546 (Alexey Milovidov). - Исправлены исключения
LOGICAL_ERRORи некорректное поведение, вызванныеLowCardinalityвнутри составных типов (Variant,Dynamic,Tuple), вconcatWithSeparator,format, подзапросахIN,GLOBAL INи JOIN с runtime filters. #97831 (Raúl Marín). - Исправлено исключение
LOGICAL_ERROR“Chunk info was not set for chunk in MergingAggregatedTransform” при использованииARRAY JOINс table functionmerge()по нескольким Distributed tables в сочетании сGROUP BY. #97838 (Raúl Marín). - Исправлена ошибка, из-за которой невозможно было использовать CTE с распределенными insert-select-запросами. #97889 (Yarik Briukhovetskyi).
- Исправлено несоответствие столбцов. #97921 (Kai Zhu).
- Исправлен segfault при оптимизации query plan во время преобразования outer join в inner join с
arrayJoinв filter expression. #98147 (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в table functionmerge. #98291 (Alexey Milovidov). - Исправлено исключение, возникавшее при использовании
ORDER BY ... WITH FILLвместе сLIMIT BY. #98361 (Alexey Milovidov). - Исправлено исключение “Column … query tree node does not have valid source node”, возникавшее при JOIN таблицы
Merge(оборачивающей таблицуDistributed) с другой таблицей. #98376 (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). - Исправлено исключение
LOGICAL_ERROR“Projection cannot increase the number of rows in a block”, возникавшее при слиянии частей с TTL, удаляющим все строки, и агрегатной проекцией с постоянным ключомGROUP BY. #98458 (Alexey Milovidov). - Исправлено исключение в запросах
DISTINCT, возникавшее при использовании агрегатных проекций иmaterialize, если между запросом и проекцией появлялись различия в типеLowCardinality. #98462 (Alexey Milovidov). - Исправлено исключение logical error “Replica decided to read in WithOrder mode, not in ReverseOrder”, возникавшее при использовании параллельных реплик с
optimize_aggregation_in_order. #98467 (Alexey Milovidov). - Исправлен неожиданный результат при использовании
read_in_order_use_virtual_rowи монотонных функций. #98514 (Vladimir Cherkasov). - Исправлено
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in', возникавшее при использованииPREWHEREс подзапросомINв таблицах семейства MergeTree. #98522 (Alexey Milovidov). - Исправлено исключение “Sorting column wasn’t found in the ActionsDAG’s outputs”, возникавшее, когда
query_plan_convert_join_to_inбыл включен приquery_plan_merge_expressions = 0. #98526 (Alexey Milovidov). - Исправлено
LOGICAL_ERROR, возникавшее, когдаIdentifierоказывался пустым после подстановки параметров. #98530 (Pervakov Grigorii). - Исправлен distributed index analysis для выражений (а не только столбцов) в primary key, из-за которого на удаленных репликах не выполнялась фильтрация лишних гранул. #98561 (Azat Khuzhin).
- Исправлена logical error “TABLE_FUNCTION is not allowed in expression context”, возникавшая, когда table function с псевдонимом появлялась несколько раз в одной области видимости запроса (например, и в секции
PREWHERE, и в секцииQUALIFY). #98557 (Alexey Milovidov). - Исправлено исключение “Bad cast from type
DB::TableFunctionNodetoDB::QueryNode” при использовании табличной функцииinputв качестве аргумента дляremote. #98694 (Alexey Milovidov). - Исправлено исключение в
LogicalExpressionOptimizerPass, возникавшее, когда булева функция в сравненииequalsвозвращала типVariant. #98712 (Alexey Milovidov). - Исправлено исключение
UNKNOWN_IDENTIFIERпри выполнении запроса к табличной функцииmerge()или движкуMergeпо таблицам с JSON-столбцами, имеющими разные параметры, и ALIAS-столбцами, ссылающимися на подпути JSON, при включенном новом анализаторе. #98753 (Pavel Kruglov). - Исправлена оптимизация
optimize_skip_unused_shardsв анализаторе, когда вViewиспользовался движокDistributed. #98754 (Nikolai Kochetov). - Исправлено исключение
LOGICAL_ERROR(несоответствие структуры блока вremoveUnusedColumns), которое могло возникать при использованииFINAL+PREWHERE+ константного выраженияWHERE+ агрегатных функций, не зависящих от столбцов, таких какcount(). #98778 (Alexey Milovidov). - Исправлено исключение “Inconsistent table names” при использовании табличной функции
view(), содержащей JOIN внутри другого JOIN (только со старым анализатором). #98809 (Alexey Milovidov). - Исправлено исключение при комбинировании
loopс кластерными табличными функциями. #98860 (Konstantin Bogdanov). - Исправлен
LOGICAL_ERROR“RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin). - Исправлено исключение “Scalar doesn’t exist” при выполнении запроса к удаленному сегменту с установленным
optimize_const_name_sizeиenable_scalar_subquery_optimization = 0. #98979 (andriibeee). - Исправлен
NOT_FOUND_COLUMN_IN_BLOCKдля некоторых запросов сGROUP BYи выражениями, включающими обратный поиск в словаре, сравнения преобразованийDate/DateTimeи сравнения кортежей. #98980 (Nihal Z. Miaji). - Исправлена ошибка, из-за которой
EXISTSигнорировал секцииLIMITиOFFSETв подзапросах, что приводило к некорректным результатам, когда подзапрос не возвращал строк из-за смещения или нулевого лимита. #99005 (andriibeee). - Исправлено исключение “Block structure mismatch”, возникавшее, когда оптимизация проталкивания фильтров сталкивалась с выражением
AND, которое сокращенно вычислялось до константы приGROUPING SETS. #99010 (Alexey Milovidov). - Исправлен
LOGICAL_ERRORпри выполнении запроса к таблице, у которой есть и ROW POLICY, и ALIAS-столбец, использующийdictGet; проблема была вызвана преждевременным доступом к табличному выражению во время разрешения ALIAS-столбца в новом анализаторе. #99065 (Peng). - Исправлен segfault в рекурсивном CTE с
remote()+view(). #99081 (Konstantin Bogdanov). - Убран лишний анализ индекса при применении оптимизации read-in-order. #99084 (Vladimir Cherkasov).
- Исправлены проверки доступа в
InverseDictionaryLookupPass: теперь доступ проверяется только один раз перед запуском прохода оптимизации. #99210 (Mikhail Artemenko). - Исправлена работа
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). - Исправлено исключение
std::length_errorпри запросе к пустым системным таблицам в формате Pretty через HTTP-интерфейс. #99541 (Alexey Milovidov). - Исправлена деградация производительности в анализаторе за счет отсечения неиспользуемых столбцов из
ARRAY JOIN. #99587 (Dmitry Novik). - Исправлено исключение (
Bad get: has Tuple, actual type String) вConditionSelectivityEstimator, когда запрос использовалINс одним скалярным параметром запроса (например,WHERE col IN ({p:String})) для таблицы, у столбцов которой есть статистика и включенuse_statistics. #99614 (Ilya Yatsishin). - Исправлено исключение “Block structure mismatch” в запросах с условием
HAVING, где выражение фильтра содержало и агрегатную функцию, обернутую в функцию, возвращающую NULL, иmaterialize(0). #99915 (Alexey Milovidov). - Исправлена логическая ошибка с коррелированным подзапросом внутри аргумента
untuple. #99917 (Vladimir Cherkasov). - Исправлено исключение “Inconsistent AST formatting” для
ALTER TABLE ... MODIFY QUERYс вложенными подзапросами, содержащимиSETTINGS, когда самALTERтоже содержалSETTINGS. #99938 (Nikita Mikhaylov). - Исправлено исключение
LOGICAL_ERROR“Not-ready Set” в функцииINво время оптимизации плана запроса сconvertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR“Unexpected node type for table expression … Actual IDENTIFIER”, возникавшее, когда скалярный подзапрос использовался внутри аргумента неразрешенной табличной функции. #100014 (Alexey Milovidov). - Исправлен квадратичный рост числа выполняемых запросов при использовании
distributed_index_analysisс предикатами, содержащими подзапросыIN. #100287 (Anton Popov). - Исправлено исключение “Block structure mismatch” при использовании
GROUP BY ... WITH TOTALS HAVINGв сочетании сUNION DISTINCTи выражениями с Nullable. #100293 (Alexey Milovidov). - Исправлено исключение “Inconsistent AST formatting” в отладочных сборках при использовании
GROUP BY CUBE(...) WITH ROLLUPи похожих комбинаций. #100376 (Alexey Milovidov). - Исправлено исключение при создании представления с псевдонимами столбцов и запросами
SELECT *илиEXCEPT/INTERSECT. #100386 (Alexey Milovidov). - Исправлено исключение
TOO_MANY_ROWSдля запросовSELECT count()сmax_rows_to_read/force_primary_key, когда данные были распределены по нескольким частям с несогласованными границами гранул. #100408 (Alexey Milovidov). - Исправлены случаи
NOT_FOUND_COLUMN_IN_BLOCK, когда проекцияSELECTсодержала столбцы, отсутствовавшие в исходной частиSELECTзапроса. #100623 (Yarik Briukhovetskyi). - Добавлена возможность передавать ключ сегментирования в табличные функции
cluster()иclusterAllReplicas(), если в качестве источника используется табличная функция (например,cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy). - Исправлены некорректные типы аргументов
AggregateFunctionв оптимизированном тривиальном count, из-за которых возникало исключениеNUMBER_OF_ARGUMENTS_DOESNT_MATCHпри запросах выражений вродеcount(v0 + v1)на распределённых таблицах. #100794 (YjyJeff). - Исправлена logical error “Invalid action query tree node” при использовании
INTERSECT ALL/UNION ALLс выражениями, свёрнутыми в константы. #100977 (Alexey Milovidov). - Исправлена некорректная ошибка
UNKNOWN_IDENTIFIER, возникавшая, когда один и тот же псевдоним использовался для нескольких выражений вSELECT; теперь вместо неё корректно возвращается ошибкаMULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov). - Исправлено исключение в
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). - Исправлена ошибка “Illegal type Decimal64 of start parameter” в агрегатных функциях временных рядов при использовании
serialize_query_plan=1с параллельными репликами. #101083 (Groene AI). - Исправлены неверные результаты запроса, когда большая целочисленная константа (например, 256 или 2147483648) использовалась как булев предикат в условии
WHEREсANDв таблицах семейства MergeTree. #101287 (Groene AI). - Исправлен сбой с ошибкой “Logical error: Reading from materialized CTE before materialization”, возникавший, когда скалярный подзапрос ссылался на цепочку зависимых materialized CTE. #101305 (Groene AI).
- Исправлено исключение при приведении строки с лишними данными в конце к пустому типу
Tuple(). #102011 (Alexey Milovidov). - Исправлена логическая ошибка при разборе некорректной строки, представляющей пустой кортеж. #102289 (Nihal Z. Miaji).
- Исправлены некорректные результаты агрегации (дублирующиеся строки) при использовании
optimize_aggregation_in_order=1, когда столбцыGROUP BYупорядочены иначе, чем ключ сортировки таблицы. #102299 (Groene AI). - Исправлено исключение в
getStructureOfRemoteTable, когда локальный сегмент возвращал пустые столбцы из-за одновременного DDL. #102604 (Alexey Milovidov). - Цепочки OR в политиках доступа на уровне строк оптимизированы в
INв новом анализаторе. #102915 (Azat Khuzhin). - Исправлены неверные результаты, возвращаемые
WHERE x AND toNullable(N)в таблицахMergeTree, когдаN— целое число ширеUInt8(например,256,65535,2147483648или любое отрицательное целое число). #103077 (Groene AI).
Исправления MergeTree и хранилища
- Исправлена логическая ошибка при присоединении части в MergeTree, если между отсоединением и присоединением происходило несколько последовательных переименований. #96351 (Alexey Milovidov).
- Исправлено недетерминированное вычисление
uncompressed_hashдля compact-частей MergeTree при использовании нескольких кодеков сжатия, что могло приводить к некорректной дедупликации. #97522 (Alexey Milovidov). - Исправлено некорректное срабатывание исключений
MEMORY_LIMIT_EXCEEDEDкакCORRUPTED_DATAво время слияния SummingMergeTree и CoalescingMergeTree. #97537 (János Benjamin Antal). hasPartitionIdтеперь возвращает false, если в наборе частей данных существует другая партиция с более высоким идентификатором партиции. #97748 (Mikhail Artemenko).- Исправлена мутация после легковесного обновления со secondary indices. #98044 (Raúl Marín).
- Исправлены некорректные результаты FINAL-запросов при смешанном использовании primary key и не-primary-key индексов пропуска данных. #98097 (Raúl Marín).
- Если столбцы ключа партиционирования не входят в ключ сортировки, partition pruning мог некорректно пропускать партиции, содержащие строки, которые должны были “побеждать” при FINAL-дедупликации. #98242 (Yarik Briukhovetskyi).
- Исправлена потенциальная взаимная блокировка, когда две параллельные операции
MOVE PARTITIONработают с одной и той же парой таблиц в противоположных направлениях. #98264 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERROR“Invalid binary search result inMergeTreeSetIndex”, возникавшее при преобразованииtoDateдля столбцов ключа с данными, пересекающими границу 65535. #98276 (Alexey Milovidov). - Исправлен редкий сбой дедупликации, при котором повторные вставки некорректно дедуплицировались из-за несогласованного порядка очистки каталогов ZooKeeper
blocks/иdeduplication_hashes/. #98293 (Alexey Milovidov). - Исправлено зависание мутаций
MATERIALIZE INDEXиMATERIALIZE PROJECTION, если индекс или проекция удалялись до завершения мутации. #98369 (Alexey Milovidov). - Исправлены некорректные результаты partition pruning после слияния частей со столбцами ключа партиционирования
Nullable, вызванные неверными границами min-max index. #98405 (Amos Bird). - Исправлено исключение
LOGICAL_ERRORвrenameAndCommitEmptyParts, которое могло возникать, когдаTRUNCATE TABLEвыполнялся одновременно сOPTIMIZE TABLEс использованием транзакций MergeTree. #98508 (Alexey Milovidov). - Исправлено десятичное переполнение при partition pruning с
DateTime64. #98628 (Yarik Briukhovetskyi). - Исправлено восстановление устаревших частей данных, вызванное некорректной очисткой пустых покрывающих частей. #98698 (Shaohua Wang).
- Исправлено определение полезности индекса пропуска данных типа set для предиката
ORсо значением false (то естьor(x, 0)). #98776 (Azat Khuzhin). - Исправлена проблема, из-за которой индексы пропуска данных (и условия первичного ключа) не применялись к столбцам ALIAS, когда слияние выражений в плане запроса отключено (
query_plan_merge_expressions = 0илиquery_plan_enable_optimizations = 0). #98960 (Peng). - Исправлено некорректное или недостаточное отсечение данных, когда
startsWith,LIKEилиNOT LIKEиспользовались со столбцомFixedString. Кроме того, функция приведенияFixedStringкStringтеперь может отфильтровывать гранулы, когда применяется к ключевому столбцу. #99001 (Nihal Z. Miaji). - Исправлено исключение при чтении патч-частей (легковесные обновления) без столбца
_part_offsetв плане запроса. #99023 (Alexey Milovidov). - Запрос вида
SELECT * FROM table WHERE pk_id = '', гдеpk_id— первичный ключ типаString, теперь корректно использует индекс первичного ключа для фильтрации гранул. #99027 (Shankar Iyer). - Исправлено исключение при создании таблицы со столбцом
EPHEMERAL, имеющим то же имя, что и виртуальный столбец (например,_part_offset). #99031 (Alexey Milovidov). - Исправлен
LOGICAL_ERROR, вызванный несоответствием порядка столбцов в патч-частях. #99164 (Pablo Marcos). - Исправлена ошибка, из-за которой
ALTER TABLE UPDATE/DELETEзавершался ошибкойMissing columns, когда в таблице есть столбец MATERIALIZED, выражение которого зависит от столбцаEPHEMERAL. #99281 (Yash). - Исправлена совместимость при обновлении реплицируемых таблиц с неявными индексами minmax с версии 25.10 до более новых версий. #99392 (Raúl Marín).
- Исправлена редкая ошибка, при которой часть данных некорректно помечалась как повреждённая и отсоединялась после запроса
DETACH/ATTACH TABLE. #99529 (Anton Popov). - Исправлен сбой проверки
rows_sourcesв Вертикальном слиянии, когдаSYSTEM STOP/START MERGESбыстро переключается во время слияния таблицы со столбцамиDynamic. #99532 (Alexey Milovidov). - Исправлено некорректное отсечение партиций для
toWeek(), из-за которого запросы сWHERE toWeek(date, mode) = Nвозвращали пустые результаты для недель 49–52 в таблицах, партиционированных поtoYYYYMM(date). #99542 (Takumi Hara). - Исправлен
LOGICAL_ERRORпри использованииALTER TABLE ADD COLUMNдля создания столбцаEPHEMERALс тем же именем, что и виртуальный столбец (например,_part_offset). #99549 (Alexey Milovidov). - Исправлена проблема, из-за которой
CLEAR COLUMNне пересобирал проекции и не пересчитывал материализованные столбцы, зависящие от очищаемого столбца, что могло приводить к исключениям или повреждению данных при последующих слияниях. #99565 (Desel72). - Часть с неизвестными проекциями больше не помечается как безвозвратно потерянная. #99623 (Sema Checherinda).
- Исправлена висячая ссылка в
injectRequiredColumns, приводившая к сбою во время слияния. #99679 (Tuan Pham Anh). - Исправлена логическая ошибка при слиянии частей проекций после
CLEAR COLUMNв таблице с проекциями и компактными частями. #100068 (Pavel Kruglov). - Исправлена ошибка
LOGICAL_ERROR“Stream … not found” при вставке в таблицу с вложенными столбцамиArray(JSON)в частях Wide приoptimize_on_insert=0. #100475 (Pavel Kruglov). - Аргументы движка для
StorageAliasтеперь вычисляются перед сохранением определения, чтобы выражения вродеcurrentDatabase()преобразовывались в литералы до сохранения в базу данных. #100902 (Nikolay Degterinsky). - Исправлено поведение
divideиintDiv, которые в некоторых случаях возвращалиILLEGAL_DIVISIONпри использовании в выражениях фильтра во время анализа индекса. #100928 (Nihal Z. Miaji). - Исправлена ситуация, при которой оптимизация
minmax_count_projectionи тривиальнаяCOUNT(*)оставались навсегда отключёнными после легковесного удаления, даже когда все части с маской легковесного удаления уже были слиты. #101212 (Anton Popov). - Исправлено состояние гонки для
storage_idвIStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky). - Исправлено поведение
materialize_skip_indexes_on_merge=false: текстовые (полнотекстовые) индексы не подавлялись во время слияния. Ранее подавлялись только нетекстовые индексы пропуска данных (minmax, set, bloom_filter). #101932 (Groene AI). - Записи кэша индекса векторного сходства теперь удаляются после удаления части (например, во время слияния), что устраняет проблему, из-за которой записи никогда не вытеснялись из-за несовпадения ключей кэша. #99575 (Seva Potapov).
- Исправлено ложное исключение
LOGICAL_ERRORво время динамического изменения размера файлового кэша, вызванное состоянием гонки при повышении приоритета в подочереди SLRU. #99850 (Alexey Milovidov). - Исправлена возможная логическая ошибка при чтении подстолбцов Map. #101641 (Pavel Kruglov).
- Исправлен приоритет точного совпадения подстолбца над совпадением по префиксу в
getSubcolumnData, чтобы избежать возможного сбоя. #101645 (Pavel Kruglov). - Исправлено использование неверных экстремальных значений в индексе min-max, созданном для JSON-столбца, что приводило к неверным результатам запроса. #101918 (Pavel Kruglov).
- Исправлена ошибка состояния гонки в SLRU в файловом кэше (26.1+), которая могла приводить к логической ошибке при резервировании места. #101991 (Kseniia Sumarokova).
- Исправлена логическая ошибка
Having zero bytesв кэше, возникавшая из-за перезаписи удалённого объекта междуlistиread, что ранее приводило к устареванию метаданных объекта. #101219 (Kseniia Sumarokova). - Исправлен сбой проверки
file_offset_of_buffer_end <= getFileSize()при чтении из таблицLogилиStripeLogв объектном хранилище S3 при одновременной записи. #100763 (Alexey Milovidov). - Исправлено ограничение размера кэша при перезагрузке конфигурации. #100659 (Aleksei Filatov).
- Исправлено аварийное завершение с
LOGICAL_ERRORпри динамическом изменении размера файлового кэша SLRU, вызванное общей статистикой вытеснения между подочередями и некорректным сценарием восстановления для кандидатов, завершившихся с ошибкой. #102396 (Antonio Andelic). - Исправлена проблема, из-за которой оптимизация
minmax_count_projectionи тривиальнаяCOUNT(*)навсегда отключались после легковесного удаления. #102900 (Anton Popov).
Исправления типов данных и сериализации
- Исправлены неверный результат или исключение при чтении подстолбцов столбцов ALIAS. #95408 (Pavel Kruglov).
- Исправлена проблема, из-за которой агрегатная функция
sumCountне могла читать старые сериализованные состояния после появленияNullable(Tuple). #97502 (Nihal Z. Miaji). - Исправлена логическая ошибка из-за отсутствующего потока во время
INSERT SELECTс JSON и бакетами в общих данных. #97523 (Pavel Kruglov). - Исправлены возможные сбои при чтении пустых гранул в расширенных общих данных JSON. #97778 (Pavel Kruglov).
- Исправлена неверная JIT-компиляция функции
signдля целочисленных типов ширеInt8— значения вне диапазона -128..127 могли давать неверный знак. #98012 (Alexey Milovidov). - Исправлено, что формат
ProtobufListне работал с Kafka engine, потому что состояние чтения не сбрасывалось между сообщениями. #98151 (Alexey Milovidov). - Исправлено скрытое повреждение данных при вставке столбца
Dateиз Parquet/Arrow в столбецEnum— теперь несовместимое преобразование типов корректно отклоняется вместо сохранения недопустимых значений enum. #98364 (Alexey Milovidov). - Исправлено исключение при чтении файла Arrow со столбцом
Arrayв таблицу со столбцомNested. #98365 (Alexey Milovidov). - Исправлено исключение при чтении из
Nullable(Tuple(...)), когда имя элемента Tuple конфликтует с подстолбцомnullу Nullable. #98372 (Alexey Milovidov). - Исправлено некорректное преобразование Parquet
BoolвFixedStringв native reader V3, из-за которого возвращались raw bytes вместо строкового представления. #98378 (Alexey Milovidov). - Исправлено:
tryGetColumnDescriptionтеперь фильтрует подстолбцы по Kind родительского столбца, как и другие методы поиска столбцов. #98391 (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). - Исправлено, что
parseDateTimeBestEffortнеправильно разбирал слова, начинающиеся с префиксов месяцев или дней недели. #98742 (Pavel Kruglov). - Исправлено исключение в
reverseUTF8при некорректном (усечённом) вводе UTF-8. #98770 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORв финансовых функциях (financialNetPresentValue,financialInternalRateOfReturnи т. д.) при передаче аргументов типаBFloat16. #98958 (Alexey Milovidov). - SummingMergeTree больше не суммирует столбцы
Bool(и другие столбцы доменных типов); значенияBoolтеперь сохраняются как есть, а не суммируются арифметически. #98976 (Yash). - Исправлено неопределённое поведение (разыменование нулевого указателя) при изменении столбца version/sign/is_deleted на
EPHEMERALилиALIASв движках MergeTree. Такие изменения теперь корректно отклоняются. #98985 (Alexey Milovidov). - Исправлена ошибка в
parseDateTimeBestEffort, из-за которой функция некорректно разбирала слова, начинающиеся с префиксов месяцев, в формате DD-month-YYYY. #99350 (Pavel Kruglov). - Исправлена работа
CHECK TABLEс разреженной сериализацией внутриTupleсDynamic. #99351 (Pavel Kruglov). - Исправлена логическая ошибка
unordered_map::at: key not foundв выходном формате Avro при сериализации столбцовEnum8/Enum16со значениями, отсутствующими в определении enum. #99332 (Desel72). - Исправлена ошибка, из-за которой сравнение типов
Time[64]иDateTime[64]было неоднозначным; теперь значенияTime[64]приводятся кDateTime[64]с добавлением1970-01-01в качестве даты. #99267 (Yarik Briukhovetskyi). - Исправлена десериализация
\N(NULL) для типаVariantв текстовых форматах Escaped/Raw. #99648 (Pavel Kruglov). - Исправлено неопределённое поведение в средстве чтения формата Avro при чтении числовых значений, выходящих за пределы целевого типа столбца. Теперь запросы завершаются ошибкой при переполнении вместо того, чтобы молча возвращать некорректные значения. #99697 (asyablue22).
- Исправлено ложноположительное аварийное завершение в
NativeReaderпри десериализации потока в Native format с несоответствием количества строк: ошибка изменена сLOGICAL_ERRORнаINCORRECT_DATA. #99822 (Rahul Nair). - Исправлено аварийное завершение процесса при десериализации столбца
Tuple, когда тип сериализации в бинарном потоке —DETACHED. #99823 (Rahul Nair). - Исправлена настройка
aggregate_functions_null_for_empty, чтобы она работала с агрегатными функциями, возвращающими не-Nullable-типы, такими какArrayилиMap(например,groupArray,sumMap). #99839 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORв функцииmidpointпри вызове со смешанными знаковыми и беззнаковыми целочисленными типами. #99867 (Alexey Milovidov). - Исправлено исключение
LOGICAL_ERRORв запросах со столбцамиDynamic, включающими CROSS JOIN и Runtime Filters; причиной было то, чтоColumnVariant::filterиспользовал общие указатели на variant-столбцы вместо их клонирования на пути оптимизацииhasOnlyNulls. #100234 (Pavel Kruglov). - Исправлена ошибка с массивом Variant, из-за которой при вызове
arrayFirst/arrayLastмог неверно интерпретироваться тип данных. Например,Array(Variant(Date, Bool))преобразовывался вBool, хотя фактическим базовым типом варианта былDate. #100255 (timothygk). - Исправлена ошибка, из-за которой форматы
CSVиMsgPackне могли корректно разбиратьNullable(Tuple). #100038 (Nihal Z. Miaji). - Исправлена ошибка, из-за которой функции
accurateCastOrDefaultиto*OrDefaultне сохраняли тип Const для константных входных данных. #100132 (Alexey Milovidov). - Пропущенные параметры запроса с типом
LowCardinality(Nullable(T))теперь по умолчанию корректно принимают значениеNULL, как иNullable(T). #100144 (Denys Melnyk). - Исправлено переполнение знакового целого числа (неопределённое поведение) в
toStartOfIntervalпри вызове с очень большими значениями интервала в миллисекундах/микросекундах для высокоточногоDateTime64. #100156 (Alexey Milovidov). - Исправлены Runtime Filters для JOIN поверх типа данных
Variant. #100182 (Dmitry Novik). - Исправлено приведение
Time64кUInt64, из-за которого значения могли ограничиваться 24 часами. #100025 (Yarik Briukhovetskyi). - Исправлено исключение при вычислении общего супертипа для пустых и непустых кортежей при включённом
use_variant_as_common_type. #100699 (Antonio Andelic). - Исправлено неопределённое поведение в
positiveModulo, когда беззнаковый делитель не помещается в знаковый тип результата. #100705 (Raúl Marín). - Исправлено неопределённое поведение (переполнение знакового целого числа) в
toStartOfIntervalпри использовании интервалов Week, Quarter или Year с аргументом origin и экстремальными значениями интервала. #100817 (Raúl Marín). - Исправлена ошибка, из-за которой комбинаторы агрегатных функций
If,Distinct,DistinctIfиIfStateс возвращаемым типомTupleи одним или несколькими аргументамиNullableне могли читать старые сериализованные состояния после появленияNullable(Tuple). #100826 (Nihal Z. Miaji). - При включённом
cast_keep_nullableбольше не генерируется исключение при приведенииDynamicnull кVariant. #100864 (Seva Potapov). - Исправлено исключение в
intDiv/intDivOrZeroдля массивов nullable-кортежей. #100895 (Raúl Marín). - Исправлено неопределённое поведение (переполнение знакового целого числа) в
parseDateTimeBestEffortпри разборе строк datetime с более чем 18 цифрами в дробной части секунды. #100948 (Vasily Chekalkin). - Исправлена ошибка, из-за которой агрегатная функция
sumCountOrDefaultс одним или несколькими аргументамиNullableне могла читать старые сериализованные состояния после появленияNullable(Tuple). #101021 (Nihal Z. Miaji). - Исправлены столбцы ALIAS с типами
DateTime/DateTime64, для которых не выполнялось преобразование часового пояса, если объявленный часовой пояс отличался от часового пояса выражения. #101043 (Alexey Milovidov). - Из результирующего столбца в
arrayIntersectи связанных функциях убранNullable, чтобы избежать несоответствия между сериализацией и десериализацией. #101569 (George Larionov). - Исправлена ошибка, из-за которой
positiveModulo(tuple, number)ошибочно направлялся на деление вместо взятия по модулю. #101709 (ClickGap AI Bot). - Исправлен некорректный вывод в
formatDateTimeс форматтером%Wпри некоторых нестандартных настройках форматирования. #101847 (Robert Schulze). - Исправлено исключение из-за несоответствия типов в
transform, когда столбец по умолчанию является константным в некоторых блоках. #100616 (Pavel Kruglov). - Разрешены пустые группы строк в Parquet. #100653 (Vitaly Baranov).
min/max/argMin/argMaxтеперь обрабатывают NaN согласованно сORDER BY: NaN всегда пропускается (возвращается только если все значения — NaN). Ранее результат зависел от положения NaN в данных из-за семантики неупорядоченного сравнения IEEE 754. #100448 (Raúl Marín).- Исправлен неверный вывод типа даты в случае переполнения после корректировки часового пояса. #102674 (Pavel Kruglov).
- Исправлен
CASEс выражениемDynamic, который возвращалELSEдля всех строк. #102684 (Pavel Kruglov). - Исправлена сериализация уплощённого типа
Dynamicс типами данных, закодированными в бинарном виде. #102692 (Pavel Kruglov). - Исправлена ошибка, из-за которой
cast_string_to_date_time_modeигнорировался приCASTвNullable(DateTime). #103035 (Pavel Kruglov). - Представление null при сериализации реплицируемых и разреженных столбцов теперь учитывает настройки (например,
format_tsv_null_representation). #102888 (Hechem Selmi).
Исправления text index и индекса пропуска данных
- Исправлено использование текстового индекса вместе с другими индексами пропуска данных. Ранее, когда фильтр запроса одновременно использовал текстовый индекс и другие обычные индексы пропуска данных, могли возникать логические ошибки, такие как “Trying to get non-existing mark”. #98555 (Anton Popov).
- Исправлена пересборка текстовых индексов при слияниях с TTL. #99107 (Anton Popov).
- Исправлена слишком строгая валидация препроцессора текстового индекса. #99359 (Anton Popov).
- Удалена поддержка функций с отрицанием (
notEquals,notLike,notIn) в анализе текстового индекса. Эти функции в любом случае не позволяли пропускать гранулы, поэтому их анализ только создавал лишние накладные расходы. #99393 (Anton Popov). - Исправлено исключение
NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда предикат текстового индекса (например,hasAllTokens) использовался через псевдоним и в секцииSELECT, и в секцииWHERE. #99504 (Anton Popov). - Исправлены некорректные результаты при использовании
hasAllTokensсORдля столбцов, имеющих отдельные текстовые индексы. #99505 (Anton Popov). - Исправлено чтение текстового индекса в таблице с существующими легковесными удалениями и политиками доступа к строкам. #99661 (Anton Popov).
- Исправлен анализ предикатов с функцией
INтекстовым индексом с препроцессором, а также исправлена коллизия искомых токенов, которая могла приводить к некорректным результатам. #99755 (Anton Popov). - Исправлено некорректное использование текстового индекса с функциями
startsWithиendsWithдля токенизаторов, не поддерживающих сопоставление подстрок (array,splitByString). Ранее такие токенизаторы могли незаметно выдавать неверные результаты. #100151 (Anton Popov). - Исправлен редкий сбой, возникавший, когда при построении текстового индекса выбрасывалось исключение “Memory Limit”. #100213 (Anton Popov).
- Исправлены ошибки “Not-ready Set is passed as the second argument”, возникавшие при анализе текстового индекса, построенного поверх
mapValues, для предикатов, содержащих выражениеIN. #100224 (Anton Popov). - Исправлен сбой при использовании текстового поискового индекса с выражением
IN, содержащим кортежный подзапрос, напримерWHERE (id, str) IN (SELECT (id, str) FROM ...), а также в случаях, когда число столбцов в подзапросе не совпадало с кортежем в левой частиIN. #100959 (Anton Popov). - Токенизатор
splitByStringтеперь отклоняет пустые строки-разделители. #101928 (Robert Schulze). - Исправлено: токенизатор
sparseGramsгенерировал токены длиннее заданной максимальной длины (из-за жёстко заданного+2в реализации). #101934 (Elmi Ahmadov). - Исправлено исключение при выполнении запросов к таблицам
MergeилиDistributedс полнотекстовым индексом и комбинированными условиями фильтрации, сочетающимиhas*TokensиLIKE, когда включен параметрquery_plan_direct_read_from_text_index. #101939 (Jimmy Aguilar Mena). - Исправлено поведение
hasToken/hasTokenOrNullсо строками поиска, состоящими только из разделителей (например,'()','!!!'), в столбцах с текстовым индексом: ранее индекс молча пропускал все гранулы вместо того, чтобы генерироватьBAD_ARGUMENTS(дляhasToken) или возвращатьNULL(дляhasTokenOrNull). #102544 (Jimmy Aguilar Mena). - Настройки полнотекстового индекса (
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read) больше не отключаются, когда настройкаcompatibilityуказывает на версию старее 26.1. #102422 (Nikita Fomichev). - Добавлена поддержка столбцов
ALIASв оптимизации прямого чтения из текстового индекса. #103037 (Anton Popov).
Исправления для озера данных
- Исправлена логическая гонка при смене версии снимка в движке таблицы
DeltaLake, а также убраны избыточные ресурсоемкие перезагрузки снимков. #96226 (Kseniia Sumarokova). - Исправлены исключение
DUPLICATE_COLUMNи незаметное появление NULL при чтении таблиц Delta Lake, использующих режим сопоставления столбцов “name” со struct-полями, имена которых содержат точки. #98013 (Caio Ishizaka Costa). - Исправлена ошибка при использовании Unity Catalog поверх GCS. #98456 (Melvyn Peignon).
DataLakeCatalogтеперь учитывает конфигурацию сервераhttp_forbid_headersпри проверке настройкиauth_header. #98827 (Michael Anastasakis).- Создание, Attach и обновление локальных таблиц озера данных вне пользовательских путей теперь запрещены; это проверяется при создании и обновлении
IDataLakeMetadata. #98936 (Daniil Ivanik). - Исправлено чтение Iceberg BigLake: учетные данные ADC теперь передаются в GCS S3 client (что устраняет ошибки 403), учетные данные OAuth2 перед отправкой URL-кодируются, а обход пространства имен больше не прерывается на HTTP 400 от BigLake. #98998 (Nikita Fomichev).
- Исправлена ошибка выхода за границы при выполнении запроса только к виртуальным столбцам из таблицы Iceberg с данными Avro. #99080 (alesapin).
- Исправлен сбой в
ALTER TABLE ... REMOVE SETTINGSдля движка таблицы Iceberg. #99108 (alesapin). - Исправлен очень редкий сбой, возникавший, когда таблица Iceberg содержит файлы смешанных форматов (ORC и Parquet). #99168 (alesapin).
- Исправлен сбой (разыменование нулевого указателя) при выполнении
ALTER TABLE ... MODIFY COLUMN ... COMMENTдля таблиц Iceberg. #99838 (Desel72). - ClickHouse теперь корректно обрабатывает таблицы в стиле Spark (с полным абсолютным путем для каждого файла или относительным путем к общему пути таблицы). #99935 (alesapin).
- Исправлено исключение, возникавшее, когда настройка пути к файлу метаданных Iceberg содержала null-байт. #100283 (Alexey Milovidov).
- Исправлена ошибка copy-paste, из-за которой
delta_lake_snapshot_end_version, заданный безdelta_lake_snapshot_start_version, молча игнорировался вместо выдачи ошибкиBAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar). - Исправлена logical error в отсортированных таблицах Iceberg во время мутаций. #100499 (alesapin).
- Исправлена работа Polaris catalog с Azure: начиная с 25.12 каталог добавлял бакет в начало пути. #100583 (Konstantin Vedernikov).
- Исправлено исключение
Logical error: 'partitions_count > 0', возникавшее при последовательном выполненииALTER TABLE UPDATEдля партиционированной таблицы Iceberg. #101278 (Desel72). - Исправлена операция
insert-selectиз кластера Delta Lake с ReplicatedMergeTree. #101299 (Konstantin Vedernikov). - Теперь генерируется ошибка, если настройки
delta_lake_snapshot_versionили версии CDF используются без включенного DeltaKernel, вместо того чтобы молча возвращать неверные данные. #101489 (Desel72). - Исправлена ошибка, из-за которой цикл повторных попыток Iceberg
INSERTзавершался сбоем, когда таблица была создана сiceberg_metadata_file_path, а целевая версия metadata уже существовала. #101548 (Groene AI). - Исправлено падение сервера (
LOGICAL_ERROR) при выборке из materialized view на основе движка таблицы IcebergLocal. #101577 (Groene AI). - Исправлено падение в IcebergLocal
ALTER TABLE ... UPDATEпри использовании формата Avro, вызванное тем, что типы-оберткиLowCardinality/Nullableне разворачивались перед сериализацией. #102337 (Desel72). - В
system.delta_lake_metadata_logиsystem.iceberg_metadata_logдобавлен отсутствующий столбецhostname. #102162 (Michael Russell). - Исправление в CoalescingMergeTree для типа Array. #102384 (Konstantin Vedernikov).
Исправления S3/Azure/объектного хранилища
- Исправлено исключение в
CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova). - Исправлен сбой, из-за которого при запросе файлов по glob-шаблону (например,
file('dir/**', 'LineAsString')) возникало необрабатываемое исключение файловой системы, если каталог содержал висячую символическую ссылку. Теперь такие ссылки молча пропускаются. #98143 (Mark Andreev). - Исправлено чрезмерное использование памяти (~514 MiB) при автоопределении формата во время чтения данных не в формате Arrow (например, JSON из
url()илиfile()без явно указанного формата), вызванное тем, что считыватель ArrowStream ошибочно интерпретировал первые байты как огромную длину metadata. #98893 (Konstantin Bogdanov). - Исправлено состояние гонки, которое могло вызывать исключение “ReadBuffer is canceled” в запросах, использующих
urlClusterили аналогичные cluster table functions. #98955 (Alexey Milovidov). - Исправлено вводящее в заблуждение сообщение “inflate failed: buffer error” при чтении несуществующих сжатых файлов через table function
url()с glob-шаблонами. #99034 (Alexey Milovidov). - Исправлены N+1 вызовов
HeadObjectдля S3 glob-шаблонов с раскрытием фигурных скобок. #99219 (Konstantin Bogdanov). - Исправлены случаи, когда числа с ведущими нулями в пути hive partitioning вызывали ошибки. #99458 (Yarik Briukhovetskyi).
- Исправлено некорректное seek в
AsynchronousReadBufferFromFileDescriptorсO_DIRECT. #99678 (Pavel Kruglov). - Исправлена ошибка, из-за которой ClickHouse мог пропускать файлы, если в ответе на HEAD-запрос отсутствовал header
Content-Length(например, из-за декомпрессионного транскодирования в GCS). #99971 (Yarik Briukhovetskyi). - Сервер больше не завершает запуск с ошибкой, если настроен диск Azure Blob Storage, но конечная точка временно недоступна (например, из-за сбоя DNS). #100701 (Raúl Marín).
- Исправлен segfault в
s3Clusterи distributed queries из-за use-after-free в пуле соединений. #100837 (Konstantin Bogdanov). - Исправлено исключение, выходившее из деструктора S3
Client::~Clientи приводившее к завершению сервера. #101798 (Gagan Dhakrey). - Исправлено некорректное логирование хоста и порта при повторном подключении. #102280 (Grant Holly).
- Исправлено исключение сервера в ClusterDiscovery, когда статический кластер (определённый в config) временно не имел активных узлов. #102661 (Kseniia Sumarokova).
Исправления S3Queue
- S3Queue: исправлено срабатывание assert после потери соединения с ZooKeeper при успешном коммите. #100210 (Kseniia Sumarokova).
- Исправлен перепутанный текст описания для столбца
alterableвsystem.s3_queue_settingsиsystem.azure_queue_settings— значения0и1поменяны местами в соответствии с фактическим поведением кода. #101703 (ClickGap AI Bot).
Исправления в области безопасности и управления доступом
- Табличная функция
loopнапрямую вызывалаinner_storage->read(), обходя слой интерпретатора, где применяются политики на уровне строк, привилегии на уровне столбцов и другие проверки безопасности. Это позволяло пользователю, ограниченному политиками на уровне строк, читать все строки черезloop(table). #97682 (pufit). - Добавлены проверки
READ ON FILEдля скалярнойfile()иDESCRIBE TABLE file(). #98115 (Nikolay Degterinsky). - Добавлена поддержка учётных данных в base64 без padding в HTTP Basic Auth. Некоторые HTTP-клиенты опускают завершающие символы заполнения
=в заголовкеAuthorization: Basic, что ранее приводило к сбоям аутентификации. #98392 (Amos Bird). - Исправлен обход RBAC, позволявший пользователям выполнять
DESCRIBEдля любой таблицы черезremote(),remoteSecure(),cluster()илиclusterAllReplicas(), указывающие на localhost, без привилегииSHOW_COLUMNS. #98669 (pufit). - Исправлена проблема, из-за которой в
system.grantsотсутствовали параметры регулярных выражений для grantURLиS3в столбцеaccess_object. #98987 (DQ). - Исправлен обход RBAC, позволявший пользователям получать структуру таблицы через
DESCRIBE TABLEилиCREATE TABLE ASдля табличных функций (mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc()и т. д.) без необходимых привилегий доступа к источнику. Для функций, определяющих схему по удалённым серверам, это также позволяло инициировать исходящие соединения (SSRF) без авторизации. #99122 (pufit). - Ограничения настроек теперь принудительно применяются в DDL-воркере для распределённых DDL-запросов. #99317 (Pablo Marcos).
- Исправлены незначительные проблемы с TOTP-аутентификацией: параметр CLI
--one-time-passwordс пустым паролем, а также проверка значений конфигурации<digits>и<period>. #99322 (Vladimir Cherkasov). - Учётные данные в строках подключения JDBC, ODBC и NATS теперь маскируются в журнале запросов и выводе
SHOW CREATE. Для строк подключения в формате URI маскируется только часть с паролем. Настройкаnats_tokenтеперь тоже маскируется. #99344 (János Benjamin Antal). - Запрещено читать учётные данные Google из локального файла, поскольку это небезопасно: зная путь к файлу, можно было прочитать и другие учётные данные. #99584 (Konstantin Vedernikov).
- Исправлено поведение источника словаря MySQL, который обходил
RemoteHostFilterдля встроенных DDL-параметров. #99720 (Shaohua Wang). - Исправлен
system.completions: теперь базы данных, таблицы и столбцы корректно фильтруются по правам доступа во всех комбинациях grant: на уровне таблицы, базы данных и сrevokeна уровне столбца. #100432 (Shaohua Wang). query_idв HTTP-обработчике теперь очищается, чтобы предотвратить CRLF-инъекцию в заголовки ответа через заголовокX-ClickHouse-Query-Id. #100500 (Pablo Marcos).- Некоторые каталоги могли показывать секретные данные в разделе
SETTINGSвыводаSELECT * FROM system.databases. Теперь это исключено. #100800 (Konstantin Vedernikov). - Политики на уровне строк не передавались от дочерних планировщиков родительскому планировщику для журналирования, поэтому отсутствовали в
query_logдля представлений, подзапросов и операцийINSERT SELECT. Теперь для журналирования они сохраняются вQueryAccessInfo. #101044 (Narasimha Pakeer).
Исправления резервного копирования и восстановления
- Исправлено:
max_execution_timeне применялся при резервном копировании/восстановлении. #99205 (Kseniia Sumarokova). - Исправлено Исключение
ReadBuffer is canceled. Can't read from it.при операциях резервного копирования/восстановления с использованием zip-архивов. #100400 (Alexey Milovidov). - Добавлена проверка путей записей файлов в метаданных резервной копии, чтобы отклонять обход путей, абсолютные пути и пустые имена во время
RESTORE. #100483 (Pablo Marcos). - Исправлены форматирование и клонирование AST для
BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
Исправления ClickHouse Keeper
- Исправлена гонка данных в клиенте ZooKeeper между потоком отправки и потоком получения. #97887 (Pablo Marcos).
- Исправлена потеря данных в Keeper после перезапуска при использовании Azure Blob Storage с метаданными
s3_plainдля хранения логов. #97987 (Antonio Andelic). - Для ответов с наблюдением в
aggregated_zookeeper_logтеперь задаётся компонентWatchвместо того, чтобы оставаться пустым. #98202 (Antonio Andelic). - Исправлена проблема, из-за которой ClickHouse Keeper отключал Java-клиенты ZooKeeper после запроса
addWatch. Java-клиент ожидает 4-байтное телоErrorResponse, но Keeper отправлял пустое тело, что вызывалоEOFExceptionи разрыв сеанса. #98499 (Antonio Andelic). - Исправлена проблема, из-за которой метрики Keeper
zk_followersиzk_synced_followersне уменьшались при отказе follower. В командуmntrдобавлены новые метрикиzk_learnersиzk_synced_non_voting_followers. #98504 (Antonio Andelic). - Исправлена проблема, из-за которой защищённый Raft-порт Keeper игнорировал
cipherListиdhParamsFileиз конфигурацииopenSSL. #98509 (Antonio Andelic). - Исправлены вводящие в заблуждение сообщения лога Keeper, такие как “Receiving request for session X took 9963 ms”, где указанное время на самом деле уходило на бездействующее ожидание в
poll()между heartbeat-сообщениями. #98510 (Antonio Andelic). - Исправлена проблема, из-за которой TCP-соединения Keeper мешали корректному завершению работы сервера, не реагируя на сигнал остановки. #98525 (Alexey Milovidov).
- Исправлен отладочный assert в
DDLWorker, вызванный устаревшимfirst_failed_task_nameпосле удаления записи ZooKeeper во время восстановления при повторной инициализации. #99099 (Antonio Andelic). - Исправлен один из сценариев сбоя Keeper. #99133 (JIaQi Tang).
- Исправлена ошибка в Keeper, из-за которой запрос на чтение мог зависнуть (что приводило к тайм-ауту сеанса), если в тот же сервер в крайне неудачный момент закрывался другой, не связанный с ним сеанс. #99484 (Michael Kolupaev).
- Исправлен segfault в NuRaft из-за состояния гонки. #100444 (Pablo Marcos).
- Исправлена ошибка, из-за которой
CREATE TABLEдляKeeperMapзавершался с ошибкой “Cannot create metadata for table”, если оставшиеся узлы ZooKeeper после частичного удаления в версиях до 25.1 не содержали узелdrop_lock_version. #101623 (Antonio Andelic). - Исправлена потеря реестра UDF, если сеанс ZooKeeper истекал во время периодического обновления — все пользовательские функции могли становиться недоступными, пока не завершится успешное полное обновление. #101891 (Nikita Fomichev).
- Исправлен сбой при обновлении UDF, вызванный тем, что
ZooKeeperRetriesControlвыполнял повторные попытки с устаревшим (истёкшим) сеансом ZooKeeper без его продления. #102059 (Nikita Fomichev).
Исправления сбоев и улучшения стабильности
- Исправлен сбой в функциях диалекта Kusto
bin(),bin_at(),extract()иindexof(), возникавший при передаче пустых аргументов. #95736 (NeedmeFordev). - Исправлен сбой сервера/assert в
mapContainsKey/mapContainsKeyLikeс индексом пропуска данныхtokenbf_v1. #97826 (Shankar Iyer). - Исправлен сбой сервера (
std::terminate), вызванный неперехваченным исключением в деструкторе пула HTTP-соединений, когда при высоком параллелизме достигался жёсткий лимит группы соединений. #97850 (Antonio Andelic). - Исправлен выход за границы в
ColumnConst::getExtremes, который мог приводить к сбою при включённомextremes = 1. #98263 (Alexey Milovidov). - Добавлена проверка повреждённых данных при десериализации
DDSketch, чтобы предотвратить сегфолты, исключения, бесконечные циклы и OOM при чтении повреждённых состояний агрегатной функцииquantilesDD. #98284 (Alexey Milovidov). - Исправлено редкое исключение в исполнителе конвейера, которое могло проявляться как
Received signal 6(в отладочных сборках), когда разворачивание конвейера происходило одновременно с отменой запроса. #98428 (Alexey Milovidov). - Исправлено разыменование нулевого указателя в
dictGetOrDefault, когда аргумент ключа имел типNullable. #98460 (Alexey Milovidov). - Исправлена взаимная блокировка конвейера при использовании
sort_overflow_mode = 'break'вместе с оконными функциями. #98543 (Alexey Milovidov). - Исправлен сбой из-за разыменования нулевого указателя при работе с системными таблицами, созданными после создания снимка таблиц в
IDatabaseTablesIterator::table(), если затем во время последующей итерации таблицы изменялись в другом потоке. #98792 (Grant Holly). - Исправлен дрейф учёта памяти, вызванный тем, что неудачные выделения памяти не откатывались, неопределённым поведением
nallocx(0)и ошибкой на единицу при отслеживании глобального пика. Учёт также расширен на ring-буферыio_uring. #98915 (Antonio Andelic). - Исправлен сбой сервера (
std::terminate) при выполненииALTER TABLE ... DROP PARTдля patch part после изменения схемы (например, ADD COLUMN). #99036 (Peng). - Исправлен сбой сервера, который мог возникать, если во время чтения с кэшированного диска генерировалось исключение о превышении лимита памяти. #99042 (Shankar Iyer).
- Исправлен сбой, возникавший из-за исключения о превышении лимита памяти во время применения patch part. #99086 (Anton Popov).
- Исправлен сбой при использовании таблицы Buffer с
SAMPLE, если целевая таблица это не поддерживает. #99141 (Kseniia Sumarokova). - Исправлена ошибка heap-use-after-free, возникавшая, когда таблица удалялась параллельно с выполняющимся запросом на чтение. #99483 (Alexey Milovidov).
- Исправлены heap-buffer-overflow в
CompressionCodecT64и аварийное завершение процесса вCompressionCodecMultipleпри распаковке некорректных сжатых данных. Теперь кодеки генерируют исключение вместо аварийного завершения. #99680 (Rahul Nair). - Исправлен бесконечный цикл при чтении файлов формата
Npyс отрицательными dimensions shape. #99812 (Desel72). - Исправлен global-buffer-overflow в функции
CRC32на аргументахFixedStringпри вычислении на нуле строк во время вычисления header плана запроса. #99835 (Alexey Milovidov). - Исправлен сбой из-за проверки assert в
sipHash128Keyed(и аналогичных keyed hash functions), когда аргумент данных представляет собой Map с ключами-массивами или другими вложенными типами массивов. #99921 (Alexey Milovidov). - Исправлен сбой проверки assert при умножении
NumericIndexedVectorсостояний агрегатной функции на чётную целочисленную константу, вызванный self-XOR в aliased Roaring bitmap вpointwiseAddInplace. #99976 (Desel72). - Исправлено разыменование nullptr в ридере Parquet, когда путь filter-in-decoder встречает отфильтрованные страницы. #99677 (Alexey Milovidov).
- Исправлен локальный сбой сервера, когда
CREATE DICTIONARYсодержит определение со значением-списком, включающим несуществующую функцию. #100036 (Yakov Olkhovskiy). - Исправлен SIGSEGV при чтении патч-частей после
ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky). - Исправлено использование неинициализированного значения в
StringSearcher.h. #100225 (Konstantin Bogdanov). - Исправлен сбой сервера (ошибка assert) при использовании параметрических агрегатных функций с комбинатором Array и аргументами NULL, например
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot). - Исправлен heap-buffer-overflow в usearch
sorted_buffer_gt::insert(), который мог привести к сбою или незаметному повреждению памяти во время vector similarity search. #100537 (Dustin Healy). - Исправлен сбой сервера (logical error “Unexpected return type from __topKFilter”), когда включён
use_top_k_dynamic_filtering, а столбецORDER BYимеет типDynamicилиVariant. #100742 (Groene AI). - Исправлен сбой сервера при использовании функции
has()с PREWHERE/WHERE для ключа Tuple, содержащего элементы LowCardinality. #100760 (Groene AI). - Исправлен segfault из-за разыменования нулевого указателя при загрузке словарей во время остановки сервера. #100839 (Miсhael Stetsyuk).
- Исправлено переполнение буфера в
ULIDStringToDateTime, когда входные данные содержат байты вне ASCII. #100843 (Konstantin Bogdanov). - Исправлен сбой (
LOGICAL_ERROR) при выполнении запроса к таблицеMerge(или табличной функцииmerge()), объединяющей несколько таблиц, включая таблицуDistributed, при включенномdistributed_group_by_no_merge=1. #100859 (Groene AI). - Исправлен сбой при построении словаря Polygon из таблицы семейства
MergeTree, использующей сериализацию разреженных столбцов. #100964 (Anton Popov). - Исправлен сбой (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) в алгоритмах слияния, когда отложенная репликация столбцов (enable_lazy_columns_replication) создает столбцыColumnReplicated, попадающие в конвейеры merge-sort с поздно поступающими входными данными. #101036 (Groene AI). - Исправлен сбой сервера (
SIGABRT) при использовании агрегатных функций с комбинаторомNull, предназначенным только для внутреннего использования (например,sumNull,avgNull), иaggregate_functions_null_for_empty = 1. #101147 (Groene AI). - Исправлена ошибка use-after-free в пути записи файлового кэша, которая могла приводить к чтению из уже освобожденной памяти при логировании завершенных сегментов файла. #101161 (Groene AI).
- Исправлен сбой сервера с сообщением “Trying to attach external table to a ready set without explicit elements”, возникавший, когда распределенный анализ индексов сталкивался с предикатом
GLOBAL IN, набор для которого был построен без явных элементов. #101178 (Groene AI). - Исправлены агрегатные функции
MAX/MINдля столбцовDecimal, которые возвращали некорректные результаты при включенной JIT-компиляции. #101203 (Raúl Marín). - Исправлен сбой сервера (
LOGICAL_ERROR: Bad cast fromColumnVectortoColumnLowCardinality) при выполнении запроса к таблице семейства MergeTree сORDER BY CAST(lc_column, 'Type'), гдеlc_columnимеет тип LowCardinality. #101220 (Groene AI). - Исправлено UB в
mergeTreeAnalyzeIndexes()в случае недопустимого аргументаoptimizations. #101253 (Azat Khuzhin). - Исправлен сбой сервера (Logical error: “Variant … is empty”) при одновременном чтении запросом столбца Tuple, содержащего тип Dynamic Map, и его подстолбца. #101448 (Groene AI).
- Исправлен сбой
LOGICAL_ERRORс сообщением “Current component is empty” при запросе кsystem.part_moves_between_shardsс включеннымenforce_keeper_component_tracking. #101462 (Groene AI). - Исправлена ошибка segmentation fault в
DataTypeDynamic::create(), когда fuzzer генерирует некорректный AST типа Dynamic. #101464 (Groene AI). - Исправлен сбой (
LOGICAL_ERROR: “ColumnUnique can’t contain null values”) при сравнении столбцаLowCardinalityс NULL-константойVariant, когдаuse_variant_default_implementation_for_comparisonsотключен. #101690 (Groene AI). - В
Bzip2ReadBufferдобавлена защита от пустого потока, чтобы он возвращал EOF вместо выбросаUNEXPECTED_END_OF_FILE, когда внутренний поток пуст. #101691 (ClickGap AI Bot). - Исправлен сбой use-after-free в планировщике аренды CPU, когда таймер ожидания живет дольше, чем воркер, на
ProfileEvents::Countersкоторого он ссылается. #101761 (Antonio Andelic). - Исправлена ошибка use-after-scope при параллельной десериализации динамических paths типа
Object, которая могла вызывать сбои при чтении таблиц с большим количеством таких paths. #101823 (Antonio Andelic). - Исправлен SIGSEGV в
MergeTreeDataPartWriterWide::cancel, когда конструктор stream генерирует исключение во времяaddStreams, оставляя null-элемент вcolumn_streams. #101936 (Antonio Andelic). - Исправлена segmentation fault в мутациях на материализованных столбцах без expression. #102342 (zoomxi).
- Исправлен segfault (или
LOGICAL_ERRORв debug-сборках) при чтении файлов Parquet с включенным push-down для bloom filter и условиями равенства/неравенства вWHERE, вызванный выходом за границы памяти в Parquet prefetcher. #102385 (Groene AI). - Исправлено чтение за пределами границ в string search functions (
countSubstrings,positionи т. д.) при поиске needle, состоящей только из null-байтов. #102401 (Raúl Marín). - Исправлено чтение за пределами границ в
printfс завершающим%. #102472 (Raúl Marín). - Исправлен сбой
LOGICAL_ERROR“Unexpected number of rows in column subchunk” в native Parquet V3 reader при чтении столбцов с типом Nullable с фильтромWHERE. #102628 (Groene AI). - Исправлен сбой сервера (SIGSEGV) при чтении файлов Avro с рекурсивными схемами, содержащими циклические символьные ссылки на типы. Такие схемы теперь обнаруживаются и отклоняются с понятным сообщением об ошибке. #102853 (Groene AI).
- Исправлен сбой сервера (assertion
LOGICAL_ERROR), когда функция для столбцаVariantдостигает memory limit или сталкивается с другим исключением, не связанным с преобразованием типов, во время приведения результата вFunctionVariantAdaptor. #102855 (Groene AI). - Исправлен сбой сервера в debug/sanitizer-сборках, когда
std::length_errorгенерируется во время schema inference. #102859 (Groene AI). - Исправлен сбой при использовании представления с
WHERE, где внутренний запрос возвращает столбцы с типами, отличающимися от metadata представления (например,NullableизLEFT JOINсjoin_use_nulls). #102085 (Miсhael Stetsyuk).
Другие исправления ошибок
- Исправлена ошибка, из-за которой явные настройки, отправленные вместе с
compatibilityв одном запросе, могли незаметно игнорироваться, если их значение совпадало со значением по умолчанию на сервере. #97078 (Raufs Dunamalijevs). - Исправлена ошибка, из-за которой клиент сообщал о
NETWORK_ERRORвместо фактической ошибки разбора (с правильным номером строки), когдаINSERTс параллельным разбором сталкивался с некорректными данными. #97339 (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). - Исправлена logical error в запросе политики маскирования данных с
ON CLUSTER. #97594 (Bharat Nallan). - Исправлено некорректное отсечение партиций при использовании доэпохального
DateTime64с функциейtoDate(). #97746 (Yarik Briukhovetskyi). - Исправлена ошибка
Cannot schedule a fileLOGICAL_ERRORприINSERTвDistributed, вызванная состоянием гонки междуDROPиINSERT. #97822 (Azat Khuzhin). - Исправлена logical error “Bad cast from type DB::ColumnConst to DB::ColumnArray” в
kql_array_sort_asc/kql_array_sort_descпри вызове с константными аргументами-массивами. #98251 (Alexey Milovidov). - HTTP-сервер теперь возвращает сообщение об ошибке в теле ответа для ответов 400 Bad Request, вызванных некорректными заголовками, вместо пустого тела. #98268 (Alexey Milovidov).
- Исправлены неверные результаты при использовании распределённого анализа индексов (экспериментальная возможность) и кэша условий запроса. #98269 (Azat Khuzhin).
- Исправлена ошибка, из-за которой источник словаря
MongoDBне работал с named collections. #98528 (Pablo Marcos). - Запрещено удалять столбец, если его подстолбцы используются в выражениях default/alias других столбцов; кроме того, для выражений default в
ALTER DROP COLUMNтеперь используется analyzer. #98569 (Nikita Mikhaylov). - Все
DB::ExceptionизPocoHTTPClient::makeRequestInternalImplтеперь считаются неповторяемыми, включаяHTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda). - Исправлены две ошибки в JIT-компиляции выражений: ошибка копирования-вставки в проверке типов
nativeCast, из-за которой ветви приведения integer-to-integer и float-to-float были недостижимы, а также некорректныйnullptrдля TargetMachine, передававшийся в LLVMPassBuilder. #98660 (Alexey Milovidov). - Исправлено Исключение “Inconsistent KeyCondition behavior” в отладочных сборках, возникавшее, когда первичный ключ содержал значения NaN типа Float:
accurateLessиaccurateEqualsтеперь обрабатывают NaN в соответствии с порядком сортировки ClickHouse. #98964 (Alexey Milovidov). - Исправлен
windowFunnelсstrict_deduplication, который возвращал некорректный уровень при обнаружении дублирующегося события. #99003 (Yash). - Сделано так, чтобы записи
system.trace_logдля автоматической перезагрузки словарей ClickHouse имели непустой Query id. #98784 (Miсhael Stetsyuk). - Исправлено поведение, при котором
SYSTEM START REPLICATED VIEWне пробуждал задачу обновления. #98797 (Pablo Marcos). - Исправлено поведение
WITH FILL STALENESS, из-за которого создавались лишние заполненные строки при чтении данных в несколько фрагментов (например, при небольшомindex_granularity). #98895 (Alexey Milovidov). - Исправлено падение при обфускации запросов для идентификаторов, начинающихся с заглавной буквы, например
Ab. #101450 (Xuewei Wang). - Исправлено игнорирование
TABLE_UUID_MISMATCHв пути кода без analyzer. #99380 (Azat Khuzhin). - Исправлено поведение
clickhouse format --obfuscate, из-за которого создавался некорректный SQL при обфускации типов индекса пропуска данных, имён кодеков сжатия, имён движков баз данных и определений структуры/источника словаря. #99260 (Raúl Marín). - Проверка изменений настроек добавлена в CREATE-запросы, когда сам движок тоже поддерживает настройки. #99279 (János Benjamin Antal).
- Исправлено поведение, при котором
insert_deduplication_tokenмолча игнорировался для запросовINSERT SELECTбезORDER BY ALL. Теперь для включения дедупликации достаточно указатьinsert_deduplication_tokenнезависимо отORDER BY ALL. #99206 (Desel72). - Обработка откладывается до завершения загрузки всех таблиц на сервере. #99700 (Seva Potapov).
- Исправлен разбор shell-подобных кавычек в аргументах табличной функции
executable. #99794 (Nikita Semenov). - Исправлено поведение, при котором запросы async insert сообщали нулевые значения
written_rows,read_rowsиresult_rowsвquery_logи выводе клиента. #99879 (Sema Checherinda). - Исправлено падение
INSERTсVALUES, если после данных на следующей строке следовал завершающий SQL-комментарий (--или/* */). Теперь комментарий пропускается, а не разбирается как ещё одна строка. #100016 (Pratima Patel). - Исправлено Исключение в
arrayRemoveпри сравнении Tuple с NULL-компонентами. #100017 (Alexey Milovidov). - Исправлена обработка отрицательных значений внутри
NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik). - Исправлена работа табличной функции
primes: в некоторых случаях она некорректно учитывалаmax_rows_to_read, особенно при наличии offset и step. #100199 (Nihal Z. Miaji). - Пользователи больше не видят
NATURAL CROSS JOINпри запросе AST для запроса с natural join, который переписывается вCROSS JOIN. #100223 (Peter Nguyen). - Несколько небольших изменений в функциях: функции h3 теперь лучше проверяют границы;
readWKBпроверяет ограничения размера (новая настройка —max_wkb_geometry_elements); функции генерации случайных чисел ограничивают максимальное число итераций. #100270 (Alexey Milovidov). - Исправлена проблема, из-за которой
cutURLParameterмог ошибочно пропускать параметры, если они встречались как подстроки других параметров. #100280 (Nikita Semenov). - Исправлено Исключение
LOGICAL_ERRORвestimateCompressionRatio, возникавшее, когда параметрblock_size_bytesбыл чрезвычайно большим. #100298 (Alexey Milovidov). - Исправлено бесконечное зависание
DROP TABLEдля таблиц на Kafka engine, когда consumers застревали в состоянии перебалансировки после ошибки heartbeat. #100388 (Alexey Milovidov). - Добавлена проверка размерностей shape формата Npy на соответствие размеру файла и ограничениям overflow, чтобы предотвратить отказ в обслуживании из-за специально созданных файлов
.npy. Также теперь отклоняются пустые shape, а объём памяти на строку ограничен 2 GiB. #100625 (Raúl Marín). - Исправлена ситуация, при которой
session_timezoneигнорировался при разборе значенийDateTimeво время async inserts (TCP) и всех вставок через HTTP. #100647 (Sema Checherinda). StorageRabbitMQ::shutdownсделан идемпотентным, а также добавлены защитные проверки на null, так как теперь он вызывается дважды (вStreamingStorageRegistryиDatabaseCatalog). #100455 (Miсhael Stetsyuk).- Исправлено Исключение
LOGICAL_ERRORпри использованииaccurateCastOrNullс целевым типомQBit. #100470 (Raufs Dunamalijevs). - Исправлен неработавший синтаксис
LIMIT m OFFSET n WITH TIES(эквивалентныйLIMIT n, m WITH TIES, который уже работал). #100491 (Nihal Z. Miaji). - Исправлен segfault, при котором
SerializationInfoTuple::addвыполнялassert_castдля обычной ссылкиSerializationInfoво время слияния частей после того, какALTER MODIFY COLUMNизменял столбец с типа, отличного от Tuple, на Tuple. #100509 (Miсhael Stetsyuk). - Исправлено Исключение “No set is registered for key” при использовании
INсо столбцамиNullable(Tuple)с именованными полями и элементамиLowCardinality. #100523 (Alexey Milovidov). - Исправлено:
EXECUTE ASигнорировал секцииFORMATиINTO OUTFILE, указанные в запросе. #100538 (pufit). - Исправлено несогласованное форматирование AST для
SAMPLEсOFFSETна уровне запроса. #100579 (Pavel Kruglov). - Исправлены ошибки “Целевая таблица не существует” для materialized view с внутренними таблицами при асинхронном запуске, вызванные неправильным порядком инициализации зависимостей. #100946 (Nikolay Degterinsky).
- Исправлено исключение в
optimizeLazyMaterialization, возникавшее при использовании проекции с PREWHERE вместе сORDER BY ... LIMIT. #101115 (Anton Popov). - Исправлено некорректное сообщение об ошибке при вызове
intExp10с аргументом NaN — в нём указывалсяintExp2вместоintExp10. #101582 (Krishna Chaitanya). - Исправлено поведение, при котором
allow_statistics=0не блокировалALTER TABLE ADD STATISTICSиALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya). - Исправлено поведение, при котором
CREATE TABLE ... AS merge()игнорировал явный список столбцов и вместо этого автоматически определял столбцы по исходным таблицам, что приводило к ошибкамNOT_FOUND_COLUMN_IN_BLOCK, когдаmerge_table_max_tables_to_look_for_schema_inferenceбыл достаточно мал, а схемы исходных таблиц различались. #101663 (Miсhael Stetsyuk). - Исправлено создание словаря
RANGE_HASHED, которое молча принимало несуществующий атрибут диапазонаMAXи использовало неверную конфигурацию типов, когда атрибуты минимального и максимального диапазона имели разные типы. #101732 (Yakov Olkhovskiy). - Исправлены ошибки в функциях
arrayLevenshteinDistanceWeightedиarraySimilarity. #101767 (Mikhail f. Shiryaev). - Исправлено поведение Prometheus Query API, который игнорировал тела POST-форм. #101794 (James Cunningham).
- Исправлено ложноотрицательное срабатывание
shouldPatchFunctionвSYSTEM INSTRUMENT ADD, когда строка поиска впервые появлялась внутри аргумента шаблона в demangled-имени символа. #101885 (Pablo Marcos). - Исправлено описание
system.codecsдляAES_256_GCM_SIV, чтобы оно указывалоAES-256вместоAES-128. #101917 (Jimmy Aguilar Mena). - Исправлено неопределённое поведение при разборе пакетов запроса собственного протокола с недопустимыми значениями
QueryProcessingStage. #101972 (Raúl Marín). - Закрыто TCP-соединение при возникновении исключения во время начального разбора запроса, чтобы предотвратить чтение мусорных данных из рассинхронизированного потока. #101989 (Raúl Marín).
- Исправлены случаи, когда
Timeс отрицательными значениями возвращал неверный результат при сравнении сDateTime. #102056 (Yarik Briukhovetskyi). - Исправлено отсутствие пробелов при форматировании команды unlock snapshot. #102063 (Han Fei).
- Исправлен сбой инициализации alias-таблиц без целевой таблицы на новой реплике в Database Replicated. #102397 (Nikolay Degterinsky).
- Обычные
INSERT-операции без materialized views больше не запрашивают чрезмерное количество слотов и потоковConcurrencyControl(max_threadsвместоmax_insert_threads), что предотвращает нехватку слотов CC и взрывной рост числа потоков в кластерах с высокой пропускной способностьюINSERT. #102961 (Sema Checherinda). - Повторно добавлен
ArrowMemoryPool, чтобы можно было сгенерироватьMEMORY_LIMIT_EXCEEDEDи избежать OOM на уровне ядра. #102999 (Azat Khuzhin). - Исправлен некорректный тип аргумента, указывавшийся в сообщениях об ошибках функций поиска в строках (например,
locate,position), когда аргументы передаются в обратном порядке (locate(needle, haystack)приfunction_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov). - Исправлено бесконечное зависание
waitForPause, когдаdisableFailPointвызывается, если ни один поток не приостановлен на failpoint. #103119 (Shaohua Wang).