Skip to main content

Изменения, нарушающие обратную совместимость

Изменения в запросах и синтаксисе

  • Оператор 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. Это поведение управляется настройкой MergeTree propagate_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, что включает корректное сопоставление MySQL DATE с Date32, DECIMAL/NUMERIC с Decimal, а DATETIME/TIMESTAMP с указанной точностью — с DateTime64. Ранее столбцы MySQL DATE сопоставлялись с Date, который не может представлять даты до 1970-01-01, что приводило к повреждению данных. #97716 (Alexey Milovidov).

Изменения во вставке и дедупликации

  • Async insert теперь включен по умолчанию — ClickHouse по умолчанию объединяет все небольшие вставки в батчи. Это поведение регулируется настройкой compatibility: если установить compatibility на версию ниже 26.2, будет восстановлено прежнее значение по умолчанию — false. Async inserts можно включать и отключать на нескольких уровнях: в профилях пользователей в config, для сеанса, для запроса или для таблицы семейства MergeTree. #97590 (Sema Checherinda).

Изменения в системных таблицах

Другие изменения, нарушающие обратную совместимость

  • 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. Количеством бакетов и стратегией бакетизации можно управлять с помощью новых настроек MergeTree map_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 и FULL JOIN на основе статистики оптимизатора. #97498 (Hechem Selmi).
  • Снижены конфликты доступа к кэшу в RIGHT и FULL JOIN за счёт проверки, установлен ли 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).
  • Оптимизация чтения по порядку и отсечение по первичному ключу теперь допускаются, когда целевой тип CASTNullable, а преобразование монотонно; например, при PRIMARY KEY x ClickHouse может использовать оптимизацию чтения по порядку для ORDER BY x::Nullable(UInt64) и отсечение по первичному ключу для предикатов вроде WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • Отсечение по индексу и pushdown фильтров теперь допускаются, когда целочисленный столбец сравнивается с литералом с плавающей точкой; например, предикаты вроде WHERE x < 10.5 теперь могут использовать первичный ключ для отсечения, а фильтры вроде prime < 1e9 или number < 1e5 теперь передаются через 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 ListObjectsV2 StartAfter, чтобы избежать повторного перечисления всей истории по префиксу и сократить число вызовов 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 для новых столбцов (настройка MergeTree auto_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 в столбцы ClickHouse String, что улучшает совместимость для ингестии на основе 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 с алгоритмом JOIN grace_hash, из-за чего результат мог быть неверным без явного уведомления об ошибке. #102036 (János Benjamin Antal).
  • Исправлена ошибка LOGICAL_ERROR (Unexpected size of index type), которая могла возникать в запросах RIGHT JOIN и FULL JOIN при заданном max_bytes_in_join. #102042 (Jimmy Aguilar Mena).

Исправления запросов и анализатора

  • Исправлено сохранение целевой 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 function merge() по нескольким 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 function merge. #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::TableFunctionNode to DB::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 in MergeTreeSetIndex”, возникавшее при преобразовании 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 больше не генерируется исключение при приведении Dynamic null к 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 отсутствовали параметры регулярных выражений для grant URL и 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 from ColumnVector to ColumnLowCardinality) при выполнении запроса к таблице семейства 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 file LOGICAL_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, передававшийся в LLVM PassBuilder. #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).
Last modified on June 29, 2026