Skip to main content

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

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

  • Оконные функции RANK и DENSE_RANK теперь отклоняют аргументы и генерируют исключение NUMBER_OF_ARGUMENTS_DOESNT_MATCH в соответствии со стандартом SQL. Ранее запросы вида RANK(x) OVER (ORDER BY id) принимались без каких-либо сообщений, а аргумент игнорировался, что часто вводило пользователей в заблуждение. Чтобы вернуть прежнее нестрогое поведение, установите allow_rank_dense_rank_arguments = 1. #104324 (groeneai).

Изменения типов данных

  • icebergHash и icebergBucket теперь выдают явную ошибку при передаче аргументов типов Int128, UInt128, Int256, UInt256 и Decimal256. Ранее они молча усекали значения большей разрядности, что приводило к коллизиям хешей. Спецификация Iceberg определяет хеширование только для 32- и 64-битных целых чисел и десятичных чисел с точностью до 38; для сохранения прежнего поведения значений, которые помещаются, приведите их к типу Int64 или Decimal128. #105866 (Algunenano).
  • toUUID, toUUIDOrNull, toUUIDOrZero, toUUIDOrDefault, CAST к UUID и Nullable(UUID), accurateCastOrNull к UUID, а также входные форматы, разбирающие UUID из текста (Avro, MsgPack, JSONExtract, …), теперь отклоняют строки правильной длины, но содержащие не шестнадцатеричные символы. Ранее такие входные данные молча превращались в вымышленный UUID из-за выхода за пределы таблицы поиска шестнадцатеричных цифр. Теперь toUUID генерирует исключение CANNOT_PARSE_UUID, а варианты Or* возвращают NULL, нулевой UUID или переданное значение по умолчанию. #104370 (groeneai).
  • Типы Dynamic и Variant теперь проверяются в оконном выражении PARTITION BY; ранее эта проверка не выполнялась при отключённой настройке allow_suspicious_types_in_group_by. Запросы, разбивающие окно по столбцу типа Dynamic или Variant, теперь генерируют исключение, если не задано allow_suspicious_types_in_group_by = 1. #105450 (Avogar).

Изменения хранилища и индексов

  • Запретить вложенные типы Dynamic/Variant в агрегатных функциях min/max и индексах minmax. Ранее проверялись только Dynamic/Variant верхнего уровня. #105468 (Avogar).
  • Значение по умолчанию настройки сервера insert_deduplication_version меняется с compatible_double_hashes на new_unified_hash. Дедупликация вставок теперь выполняется для всего вставляемого блока (на одну вставку), а не для каждой части/партиции: повторная попытка той же вставки по-прежнему дедуплицируется, однако две разные вставки, создающие идентичную часть, больше не дедуплицируются между собой, как и вставки тех же строк в ином порядке. Чтобы восстановить прежнее поведение, установите insert_deduplication_version = compatible_double_hashes. Дедупликация асинхронных вставок при new_unified_hash также определяется окном синхронной дедупликации: как её включение (replicated_deduplication_window), так и срок хранения (replicated_deduplication_window_seconds, по умолчанию 1 час) используют настройки синхронной дедупликации, поэтому *_for_async_inserts устарели и применяются только к old_separate_hashes / compatible_double_hashes. Инстансы, обновляющиеся напрямую с релиза, где по умолчанию использовался old_separate_hashes, должны сначала работать с compatible_double_hashes, пока не истечёт самое длительное применимое окно дедупликации (включая replicated_deduplication_window_for_async_inserts, по умолчанию одна неделя, если используются асинхронные вставки), и только затем переходить на new_unified_hash. Асинхронные рабочие нагрузки, переходящие с compatible_double_hashes, должны сначала увеличить replicated_deduplication_window[_seconds] до размера асинхронного окна (и проработать полный период этого окна), остановить асинхронные вставки или остаться на compatible_double_hashes, поскольку new_unified_hash больше не проверяет ID async_blocks, хранящиеся дольше. #107886 (CheSema).
  • Исправлена проблема, при которой hasToken с искомой подстрокой, содержащей разделитель, молча возвращал результаты через текстовый индекс вместо вызова ошибки BAD_ARGUMENTS. #108189 (Ergus).

Удалённые возможности

  • Больше нельзя использовать устаревшие ридер и writer Parquet на основе Arrow. Вместо них всегда используется native-реализация. Настройки, которые выбирали старые реализации или管 настраивали их, теперь устарели и игнорируются: input_format_parquet_use_native_reader_v3, output_format_parquet_use_custom_encoder, output_format_parquet_version, output_format_parquet_compliant_nested_types и output_format_parquet_unsupported_types_as_binary. Native writer всегда записывает Parquet V2.6+ с совместимыми вложенными типами и генерирует исключение UNKNOWN_TYPE для неподдерживаемых типов вместо записи их как необработанных двоичных данных. #100949 (alexey-milovidov).
  • Удалены устаревшая настройка allow_experimental_query_deduplication и связанное с ней неподдерживаемое экспериментальное поведение дедупликации запросов. #99398 (devcrafter).
  • ALTER TABLE ... REPLACE PARTITION ... FROM ... больше не удаляет молча данные партиции назначения, если в исходной таблице нет частей в указанной партиции. Ранее такой запрос удалял партицию назначения и ничего не записывал вместо неё. Теперь по умолчанию он отклоняется с ошибкой BAD_ARGUMENTS. Это обратно несовместимое изменение: REPLACE PARTITION из пустого источника, которое раньше успешно выполнялось (очищая партицию назначения), теперь после обновления сгенерирует исключение. Чтобы восстановить прежнее поведение с молчаливой очисткой, задайте новую настройку allow_replace_partition_from_empty_source = 1 (для отдельного запроса или в профиле) либо установите compatibility в значение 26.5 или ниже. Чтобы явно удалить данные партиции назначения, используйте ALTER TABLE ... DROP PARTITION .... #104939 (groeneai).
  • Удалены экспериментальные функции KQL (Kusto) array_sort_asc и array_sort_desc, а также их SQL-бэкенды kql_array_sort_asc и kql_array_sort_desc. Эти функции были экспериментальными, реализованы некачественно и приводили к ошибкам корректности и парсера. Запросы, использующие эти имена, теперь возвращают UNKNOWN_FUNCTION. #108101 (groeneai).

Новые возможности

Функции

  • Добавлена поддержка функции PromQL histogram_quantile в табличных функциях prometheusQuery и prometheusQueryRange. Это позволяет вычислять квантили по бакетам классических гистограмм Prometheus, обозначенным меткой le. #103477 (Yasumoto).
  • Добавлена функция h3PolygonToCellsWithContainment, поддерживающая режимы включения по центру, полного включения и пересечения. #104455 (yousefQadry).
  • Теперь можно указывать необязательный аргумент точности для функций formatReadableSize, formatReadableDecimalSize и formatReadableQuantity, задающий количество знаков после десятичной точки. Значение по умолчанию — 2, как и ранее. #104648 (antoniofilipovic).
  • Добавлены агрегатные псевдонимы min_by и max_by для argMin и argMax. #105712 (itsjoeoui).

Возможности SQL и запросов

  • formatReadableTimeDelta теперь принимает на вход выражения INTERVAL с типом, отличным от Month и Year. #64315 (Beetelbrox).
  • Добавлена поддержка выходного формата PNG, позволяющая напрямую визуализировать результаты запросов в виде изображений PNG. #74691 (m7kss1).
  • Добавлена возможность резервирования памяти для рабочих нагрузок. См. документацию по планированию рабочих нагрузок. #82414 (serxa).
  • Добавлены параметры IPV4_PREFIX_BITS и IPV6_PREFIX_BITS для квот с ключом IP_ADDRESS или FORWARDED_IP_ADDRESS, позволяющие применять лимиты квот к IP-подсетям вместо отдельных полных адресов. #89270 (adityachopra29).
  • Реализован ADD ENUM VALUES в запросах ALTER TABLE, упрощающий добавление новых значений в существующий тип Enum без необходимости повторно указывать все текущие значения Enum. #93830 (ilejn).
  • Добавлен входной формат GeoJSON для чтения. #98124 (mneedham).
  • В текстовый индекс добавлен постпроцессор, преобразующий токены после токенизации. #98939 (Ergus).
  • Добавлена поддержка TTL-узлов в ClickHouse Keeper, включаемая явно. TTL-узлы автоматически удаляются по истечении настроенного времени жизни и не могут иметь дочерних узлов. #100397 (scanhex12).
  • Добавлено хранение позиций токенов для текстовых индексов, поддерживающее точный поиск hasPhrase. Включите аргумент индекса support_phrase_search и настройку MergeTree allow_experimental_text_index_phrase_search. #103172 (ahmadov).
  • Добавлены функции arrayTopK и arrayBottomK: - arrayTopK(k, array) возвращает K наибольших элементов в порядке убывания - arrayBottomK(k, array) возвращает K наименьших элементов в порядке возрастания. #104563 (vitlibar).
  • Добавлена поддержка выбора столбцов по шаблону имени с помощью * LIKE '<pattern>' и * ILIKE '<pattern>', включая квалифицированные формы, такие как table.* LIKE '<pattern>' и table.* ILIKE '<pattern>'. LIKE сопоставляет имена столбцов с учётом регистра, ILIKE — без учёта регистра. #104569 (niyue).
  • Добавлены непрерывные запросы для таблиц MergeTree, использующие последовательность чтений снимков. #105114 (Michicosun).
  • Добавлен формат RowBinaryWithNamesAndTypesAndDefaults для улучшения поддержки изменения схемы. #105736 (mzitnik).
  • Добавлены функции для формирования векторных тайлов Mapbox непосредственно из SQL: MVTEncodeGeom проецирует геометрию в пиксельное пространство тайла slippy-map и обрезает её, MVTEncode агрегирует проецированные геометрии группы в бинарное представление однослойного тайла, а MVTBoundingBox / MVTBoundingBoxMercator возвращают ограничивающий прямоугольник тайла для ограничения строк его границами. Поддерживаются геометрии Point, line и polygon. Также доступны под псевдонимами PostGIS ST_AsMVTGeom и ST_AsMVT. #106107 (saarthak2002).
  • Добавлены LOCALTIME и LOCALTIMESTAMP (стандартный SQL / синтаксис PostgreSQL). LOCALTIMESTAMP — псевдоним now() (возвращает DateTime); LOCALTIME возвращает текущее время суток в виде значения Time. #106139 (thomas-cabral).
  • Добавлены две новые стратегии load_balancing: hostname_longest_common_prefix и hostname_longest_common_suffix. Они выбирают реплику, имя хоста которой имеет самый длинный общий префикс (соответственно, суффикс) с именем хоста инициатора. Эти стратегии полезны, когда код центра обработки данных указан в качестве префикса или суффикса имён хостов с числовыми сегментами переменной длины: в таких случаях существующие стратегии nearest_hostname и hostname_levenshtein_distance могут выбирать неправильную реплику. #107360 (den-crane).
  • Новые функции quantizeBFloat16ToInt8 и dequantizeInt8ToBFloat16: скалярный кодек, сжимающий компоненты embedding до 8 бит с помощью 256-уровневого гауссовского квантователя Ллойда — Макса; коды Int4/Int2/двоичные коды можно получить из него усечением битов. #108102 (alexey-milovidov).

Движки таблиц и хранилище

  • Добавлена поддержка записи в Azure Data Lake Storage Gen2. #105406 (scanhex12).

Настройки и конфигурация

  • Добавлена настройка output_format_always_write_decimal_point_in_float_and_decimal, которая всегда выводит десятичную точку для чисел с плавающей запятой и Decimal в текстовых форматах, даже если значение является целым числом. Например, выводится 1. вместо 1. По умолчанию отключена. #62614 (qoega).
  • Добавлена новая неизменяемая настройка MergeTree allow_tuple_element_aggregation, по умолчанию отключенная. Когда она включена, SummingMergeTree, AggregatingMergeTree и CoalescingMergeTree рекурсивно разворачивают столбцы Tuple и агрегируют каждый конечный элемент независимо во время слияний, как если бы это был столбец верхнего уровня: SummingMergeTree суммирует его, AggregatingMergeTree объединяет состояние агрегатной функции, а CoalescingMergeTree сохраняет последнее значение, отличное от NULL. Настройка должна быть указана при создании таблицы и молча игнорируется движками, которые ее не поддерживают. #98039 (JingYanchao).
  • Добавлена настройка output_format_float_precision для управления количеством десятичных знаков в текстовом выводе чисел с плавающей запятой. #99721 (phulv94).
  • Добавлены настройки таблиц семейства MergeTree materialize_projections_on_insert и materialize_projections_on_merge. Когда materialize_projections_on_insert = 0, операции INSERT пропускают создание частей проекций, что повышает пропускную способность вставки для таблиц с большим количеством проекций. Когда materialize_projections_on_merge = 1, при слиянии заново создается проекция, отсутствующая во всех исходных частях, поэтому проекции можно создавать во время слияний, а не при вставке. Слияния по-прежнему объединяют только части с одинаковым набором проекций. #100993 (cwurm).
  • Добавлена новая настройка S3Queue after_processing_move_preserve_path. Если она включена вместе с after_processing='move' и after_processing_move_prefix, обработанные объекты перемещаются с сохранением полного исходного пути под префиксом пункта назначения, а не сводятся только к имени файла. #105354 (asya-ch).
  • Добавлены элементы конфигурации HTTP-обработчика url_prefix и full_url_prefix для сопоставления всех путей с заданным префиксом, а также отдельные элементы url_regexp, full_url_regexp и headers_regexp. Устаревшая форма <url>regex:...</url> по-прежнему поддерживается. #107492 (vitlibar).

Аутентификация

  • Добавлены необязательные учётные данные external_id для ролевого доступа к S3. #106941 (eliangidoni).
  • В таблицу system.session_log добавлена информация о TLS-сертификате клиента (subjects, серийный номер, issuer и срок действия) для улучшения обсервабилити аутентификации на основе сертификатов. #107679 (alexey-milovidov).

Системные таблицы

  • Добавлена таблица system.iceberg_files, предоставляющая метаданные отдельных файлов таблиц Iceberg: по одной строке для каждого файла данных или файла удаления в текущем снимке таблицы. #104415 (asya-ch).
  • Добавлены гипотетические (what-if) индексы пропуска данных. Используйте CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ..., чтобы определить виртуальный индекс пропуска данных, действующий в рамках сеанса, а затем EXPLAIN WHATIF SELECT ..., чтобы оценить коэффициент пропуска и стоимость без его материализации. Определённые индексы отображаются в новой таблице system.hypothetical_indexes. #104608 (yariks5s).
  • Добавлена системная таблица system.constraints, содержащая информацию обо всех ограничениях CHECK и ASSUME во всех таблицах, включая имя, тип и выражение ограничения. #105337 (PedroTadim).
  • Добавлена системная таблица system.documentation, объединяющая в одной таблице встроенную справочную документацию по унифицированным компонентам системы (функциям, движкам таблиц, типам данных, настройкам, форматам и другим); документация представлена в формате Markdown. #107463 (alexey-milovidov).

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

  • Добавлены экспериментальный алгоритм изменения порядка внутренних JOIN dphyp в качестве варианта настройки query_plan_optimize_join_order_algorithm, а также настройка query_plan_optimize_join_order_max_searched_plans, ограничивающая поиск порядка JOIN и переключающаяся на следующий алгоритм в цепочке при достижении ограничения; установите значение 0, чтобы сохранить прежнее неограниченное поведение поиска. #98798 (davenger).
  • Добавлен отложенный режим применения списков вхождений для текстового индекса. При включении с помощью SET allow_experimental_text_index_lazy_apply = 1 и SET text_index_posting_list_apply_mode = 'lazy' списки вхождений декодируются по требованию на уровне упакованных блоков с помощью курсоров вместо полной материализации в Roaring Bitmaps, что сокращает использование памяти и время CPU при выполнении выборочных запросов к текстовому индексу. #100035 (fastio).
  • Разрешено подключать обработчики prometheus к основному HTTP-порту с необязательным префиксом. #104975 (JTCunning).
  • Добавлена экспериментальная настройка MergeTree packed_skip_index_max_bytes, которая объединяет небольшие подстримы индексов пропуска в один архив skp_idx.packed для каждой части, снижая нагрузку на inode при наличии в таблице множества индексов пропуска. Решение принимается для каждого подстрима при записи: подстримы, сериализованный размер которых не превышает порог, помещаются в архив, а более крупные сохраняют отдельную структуру skp_idx_<name>.idx2 / .mrk2. В одной части могут сочетаться разные структуры. Полнотекстовые индексы не поддерживаются и всегда хранятся в отдельных файлах. Значение по умолчанию — 0 (упаковка отключена). #105321 (Algunenano).
  • Добавлена поддержка сериализации Buffers для WebAssembly UDF с использованием ABI BUFFERED_V1, а также настройка функции WASM UDF webassembly_udf_enable_fuel, которая сохраняется. #105574 (antonio2368).
  • Многостадийное выполнение распределённого запроса: планировщик разделяет план запроса на стадии, соединённые обменами scatter / broadcast / gather / shuffle, и направляет фрагменты плана на узлы-воркеры. Данные между стадиями передаются потоком через TCP или через временные файлы в общем объектном хранилище; поддерживаются распределённые shuffle- и broadcast-hash JOIN, shuffle-агрегация и распределённая сортировка. Эта возможность экспериментальная и по умолчанию отключена. #106020 (davenger).
  • Экспериментальный движок плана распределённого запроса (make_distributed_plan) теперь может использовать отдельные порты диспетчеризации задач и потокового обмена для каждого воркера, настраиваемые для каждой реплики в <remote_servers> с помощью stateless_worker_port и streaming_exchange_port. Если они не заданы, используются прежние порты уровня сервера (stateless_worker_client.port и distributed_query.streaming_exchange_port). Это позволяет запускать несколько воркеров на одном хосте. #107885 (davenger).

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

Производительность JOIN

  • Реализовано отложенное применение индексов селектора и репликации для JOIN, за которым следует селективный LIMIT, TopN или другой JOIN. Чтобы задать количество столбцов полезной нагрузки, необходимое для включения отложенных индексов селектора, используйте настройку query_plan_min_columns_for_join_lazy_indexing (0 означает, что оптимизация отключена). Чтобы задать LIMIT, при котором применяется оптимизация, используйте настройку query_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi).
  • ASOF JOIN теперь может использовать алгоритм JOIN parallel_hash, распараллеливая построение по различным значениям ключей равенства. Ранее ASOF безусловно исключался из использования parallel_hash. #105375 (gregakinman).
  • FixedHashMap хеш-JOIN используется в качестве фильтра времени выполнения JOIN на стороне probe. Если хеш-таблица на стороне build является FixedHashMap или может быть преобразована в неё, она публикуется как фильтр времени выполнения и заменяет Set/BloomFilter, который иначе был бы установлен BuildRuntimeFilterStep. Управляется новой настройкой enable_join_runtime_filter_shared_fixed_hash_table (по умолчанию true). #105640 (wudidapaopao).
  • Изменение порядка DP JOIN теперь поддерживается с параллельными репликами. #105889 (nickitat).
  • Улучшен план запроса, когда JOIN использует фильтры времени выполнения (настройка enable_join_runtime_filters включена по умолчанию): модель стоимости изменения порядка JOIN теперь учитывает WindowTransform (и другие шаги плана, сохраняющие строки) в правом поддереве и использует фактическое количество строк и NDV для каждого столбца вместо отсутствующей статистики. #107229 (UnamedRus).

Оптимизация запросов

  • Повышена производительность анализа текстовых индексов при поиске по нескольким токенам за счёт оптимизации обработки редких токенов. #98226 (CurtizJ).
  • Повышена производительность функций encrypt, decrypt и halfMD5 за счёт исключения неявного поиска провайдера OpenSSL для каждой строки в OpenSSL 3.x. #99105 (thevar1able).
  • Объединение исходных блоков перед projection.calculate() во время MATERIALIZE PROJECTION сокращает число временных частей проекции и накладные расходы на слияние. Ускорение примерно в 3,4 раза для таблицы с 50 млн строк. #100047 (amosbird).
  • Повышена производительность Approximate Runtime Filters и индексов Bloom Filter. #100201 (cv4g).
  • Ускорены запросы ORDER BY ... LIMIT BY за счёт выполнения LIMIT BY в каждом параллельном отсортированном потоке на этапе Sort, когда столбцы LIMIT BY образуют префикс ORDER BY. Это уменьшает число строк, проходящих через финальное слияние сортировки и последующие этапы конвейера. Оптимизация управляется новой настройкой query_plan_push_limit_by_into_sort (включена по умолчанию). #104000 (nihalzp).
  • Снижены накладные расходы на обработку простых SELECT-запросов (парсинг, анализ и планирование). Например, SELECT count() FROM hits через одно подключение выполняется примерно на 50 % быстрее. #104513 (Algunenano).
  • Повышена производительность bitmapContains для состояний groupBitmap с типом, отличным от UInt64, за счёт исключения повторных вызовов rb_max при проверке диапазонов. #105960 (niyue).
  • Повышена производительность вставки в столбцы LowCardinality с индексами bloom_filter. #106410 (EmeraldShift).
  • Повышена производительность функций L2DistanceTransposed и cosineDistanceTransposed для типа данных QBit. #106701 (rienath).
  • Повышена производительность анализа запросов к таблицам с большим числом столбцов: исключено вычисление хешей узлов столбцов, включающих всё выражение исходной таблицы, когда оно не требуется. Анализ вложенных подзапросов SELECT * для таблицы с ~1200 столбцами теперь выполняется примерно в 50 раз быстрее. #106957 (novikd).
  • Производительность функций encrypt, decrypt, tryDecrypt, aes_encrypt_mysql и aes_decrypt_mysql повышена до десяти раз, что восстанавливает производительность, утраченную при миграции с BoringSSL на OpenSSL 3.x (24.4). #107339 (thevar1able).
  • Улучшено выполнение arrayElement для Array(LowCardinality(String)) и функций map LIKE для map с ключами или значениями LowCardinality(String) за счёт исключения ненужной материализации строк. #107450 (EmeraldShift).
  • Снижена загрузка CPU и повышена производительность оценки skip-индексов для запросов, фильтрующих столбцы DateTime64. #107707 (shankar-iyer).
  • Повышена производительность регистронезависимого поиска подстрок, включая positionCaseInsensitiveUTF8, ILIKE и multiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano).
  • Исправлена регрессия пропускной способности примерно на 16 % у кодека чисел с плавающей точкой FPC на ARM, возникшая после того, как его таблицы предикторов начали использовать VectorWithMemoryTracking. #108182 (groeneai).
  • Исправлена регрессия производительности, при которой один легковесный DELETE отключал кэш условий запроса для всей таблицы. Повторные выборочные запросы к таблице, которая хотя бы раз подвергалась легковесному удалению, переставали отсекать гранулы и переходили к чтению всех меток. #112947 (fm4v).
  • Ограничены затраты на оценку селективности col IN (...) по статистике столбцов, которые могли добавлять сотни миллисекунд к планированию одного запроса. Оценщик больше не выполняет подзапрос в col IN (subquery), чтобы заполнить множество, от которого ему требуется только одно значение селективности: вместо этого непостроенное множество пропускается. Для множеств, размер которых превышает значение новой настройки statistics_max_set_size_for_exact_selectivity_estimation (по умолчанию 10000), селективность теперь определяется по размеру множества и границам его диапазона. #114389 (nickitat).

Производительность функций и агрегации

  • Оптимизирован анализ индекса первичного ключа для длинных первичных ключей и ключей с высокой мощностью. Для длинного первичного ключа время анализа индекса теперь в основном зависит от сложности фильтра запроса (то есть от столбцов ключа, которые он фактически использует), а не от длины первичного ключа. Поэтому расширение ключа сортировки почти не увеличивает затраты на анализ индекса в запросах, фильтрующих лишь по нескольким его столбцам. Для первичного ключа с высокой мощностью, когда ClickHouse хранит в памяти только селективный префикс столбцов ключа и не загружает последующие столбцы, анализ индекса теперь работает только с этим префиксом в памяти, а не со всем ключом. Оптимизация включена по умолчанию; её можно отключить новой настройкой use_lightweight_primary_key_index_analysis. #91836 (nihalzp).
  • Снижено пиковое потребление памяти при слиянии частичных результатов двухуровневой агрегации с большими состояниями агрегатных функций (например, groupArray) благодаря постепенному освобождению исходных состояний каждого бакета во время слияния вместо хранения их всех до его завершения. #102330 (yurifedoseev).
  • Добавлена оптимизация GROUP BY для равномерно распределённых ключей высокой мощности: строки распределяются между потоками хешированием ключа группировки, поэтому каждый поток агрегирует непересекающееся подмножество ключей без этапа слияния. Чтобы включить её, задайте enable_sharding_aggregator = 1. #104233 (nihalzp).
  • Ускорены запросы LIMIT BY к партиционированным таблицам MergeTree: LIMIT BY выполняется параллельно внутри потока каждой партиции, а не после слияния всех потоков в один. Это применяется, когда выражение партиционирования является детерминированной функцией столбцов LIMIT BY, поэтому ни одна группа LIMIT BY не может охватывать две партиции. Управляется новой настройкой allow_limit_by_partitions_independently (включена по умолчанию). #105126 (nihalzp).
  • Ускорены запросы SELECT ... LIMIT N BY <cols>, когда <cols> являются префиксом ключа сортировки таблицы или становятся им после фиксации ведущих столбцов условием WHERE col = const. При включении этой оптимизации MergeTree читает данные в порядке первичного ключа, а LIMIT BY сначала фильтрует данные в потоковом режиме, используя O(1) памяти на каждый отсортированный поток и отбрасывая большую часть данных, после чего обычный LIMIT BY применяется к сокращённому набору данных для получения окончательного результата. Управляется новой настройкой optimize_limit_by_in_order (включена по умолчанию). #105135 (nihalzp).
  • Ускорены запросы LIMIT BY благодаря удалению избыточных ключевых выражений: ключ, являющийся детерминированной функцией других ключей, удаляется (например, LIMIT 5 BY x, f(x) становится LIMIT 5 BY x), а инъективная функция ключа заменяется её аргументом (например, LIMIT 5 BY toString(x) становится LIMIT 5 BY x). Благодаря этому для каждой строки вычисляется меньше выражений, и они проще. Управляется новыми настройками optimize_limit_by_function_keys и optimize_injective_functions_in_limit_by, обе включены по умолчанию. #106818 (nihalzp).
  • Ускорен анализ запросов с большим количеством или глубоко вложенными вызовами функций за счёт удаления избыточного хеша дерева запроса из кэша разрешения функций. #107516 (novikd).
  • Распараллелена обработка результата рекурсивного CTE: GROUP BY и другие операции над большим результатом WITH RECURSIVE больше не ограничены одним потоком. #107694 (alexey-milovidov).

Производительность хранилища и ввода-вывода

  • Клиенты S3 с одинаковыми конечной точкой и bucket используют общий кэш, что исключает повторное определение региона. #96802 (zvonand).
  • Повышена производительность копирования в объектном хранилище благодаря параллельному копированию блобов. #105089 (asya-ch).
  • Исключено чтение содержимого файлов при использовании входного формата One с файловыми табличными функциями, такими как file и s3. #105157 (niyue).
  • Первичный ключ MergeTree и индексы пропуска данных теперь могут отсеивать гранулы для фильтров, где ifNull или coalesce оборачивает условие, например ifNull(key = 0, 0) или coalesce(key = 0, 0). Такие предикаты, часто создаваемые генераторами запросов для преобразования сравнения с потенциальным NULL в однозначное логическое значение, ранее были непрозрачны для анализа индексов и не позволяли пропускать гранулы. Это расширяет существующую настройку allow_key_condition_coalesce_rewrite (включена по умолчанию). #106272 (andyzzhao).
  • Повышена производительность декодирования столбцов Parquet FLOAT и DOUBLE с кодировкой BYTE_STREAM_SPLIT. #106376 (Algunenano).
  • Исправлены длительные задержки при входе и запуске запросов в реплицируемом хранилище управления доступом, возникавшие, когда одновременно изменялось множество объектов управления доступом (политики строк, роли, квоты, профили настроек). Теперь кэш каждого объекта пересчитывается один раз на пакет уведомлений, а не для каждого изменённого объекта, что устраняет квадратичную сложность обработки, из-за которой блокировка доступа могла удерживаться несколько минут. #107672 (azat).
  • Исправлена регрессия производительности: при чтении множества небольших файлов из объектного хранилища через табличную функцию s3 и другие табличные функции перестала выполняться предварительная выборка, и система перешла на синхронное чтение. Это существенно замедляло однопоточное чтение или чтение с низким параллелизмом множества небольших файлов. #108872 (fm4v).
  • Включена начальная предварительная выборка небольших объектов при чтении из объектного хранилища через файловый кэш (filesystem_cache_name). Ранее чтение множества небольших файлов, например при загрузке через S3Queue, оставалось синхронным и зависело от задержек даже при включённом файловом кэше. #109478 (fm4v).
  • Улучшена оптимизация PREWHERE для подстолбцов Map с учётом их размера на диске. #110623 (Avogar).
  • Ленивая материализация теперь применяется к запросам с FINAL, фильтром и небольшим LIMIT даже без ORDER BY (для ReplacingMergeTree). #110722 (KochetovNicolai).
  • Сокращено потребление CPU при дедупликации во время сброса асинхронных вставок, охватывающих множество партиций. #111150 (valerypetrov).
  • Исправлена регрессия потребления CPU для запросов, выполняющих множество независимых небольших чтений из одной и той же части MergeTree, если таблица содержит столбцы LowCardinality. Проверка, определяющая, использует ли часть один общий словарь, при каждой задаче чтения сканировала все метки части; теперь последовательности одинаковых меток находятся с помощью двоичного поиска. Запросы такого типа к таблицам с небольшим значением index_granularity начиная с версии 26.6 выполнялись в несколько раз медленнее. #116134 (groeneai).

Оптимизация памяти

  • До 10 раз снижено потребление памяти метаданными типа Enum в таблицах со столбцами Enum. Поиск значений по именам остаётся таким же быстрым или ускоряется, тогда как поиск имён по значениям при парсинге и десериализации может замедлиться. #95668 (qoega).
  • Снижено пиковое потребление памяти BACKUP за счёт отказа от копирования внутреннего списка информации о файлах при записи записей резервной копии (что особенно существенно для резервных копий, содержащих миллионы файлов). #111162 (jkartseva).

Улучшения

Запросы и SQL

  • При удалении неиспользуемых столбцов из плана запроса столбцы теперь идентифицируются по позиции, а не по имени. Это позволяет удалять неиспользуемые столбцы при наличии столбцов с повторяющимися именами. #100586 (antaljanosbenjamin).
  • SESSION_USER добавлен в качестве регистронезависимого псевдонима currentUser() для совместимости с PostgreSQL и стандартом SQL. #106081 (takumihara).
  • Снижена задержка отмены запросов, выполняемых по протоколу PostgreSQL: KILL QUERY теперь прерывает сериализацию вывода в рамках одного фрагмента, не дожидаясь отправки клиенту всего фрагмента. #106535 (rvasin).
  • Исправлена ошибка ILLEGAL_TYPE_OF_ARGUMENT в распределённых запросах с serialize_query_plan = 1, содержащих лямбда-выражение с постоянным аргументом (например, arrayMap(t -> t.2, ...)). Постоянные столбцы узлов INPUT в ActionsDAG теперь сохраняются при сериализации плана запроса. #107124 (alexey-milovidov).
  • Снижена задержка отмены запросов, выполняемых по протоколу MySQL: KILL QUERY теперь прерывает сериализацию вывода в рамках одного фрагмента, не дожидаясь отправки клиенту всего фрагмента. #107228 (rvasin).

Функции

  • EXPLAIN SYNTAX теперь последовательно отображает операторы в выводе explain как вызовы функций (например, plus(1, 2) вместо 1 + 2). #94681 (1abdelhalim).
  • Теперь поддерживается синтаксис PostgreSQL expr OP SOME(array) / expr OP ALL(array) (с правой частью, не являющейся подзапросом), который для =/<> преобразуется в has / NOT has, а для других операторов сравнения — в лямбда-выражения arrayExists / arrayAll. ANY не поддерживается в форме с массивом, поскольку any также является агрегатной функцией; используйте SOME. Форма с подзапросом для ANY/SOME/ALL по-прежнему преобразуется в IN / NOT IN. #105129 (alexey-milovidov).
  • Добавлена поддержка функций multiSearchAny, multiSearchAnyUTF8 и multiMatchAny в текстовых индексах. Также улучшен анализ текстовых индексов для функции match: теперь шаблоны регулярных выражений с альтернативными группами позволяют пропускать больше гранул. #106279 (CurtizJ).
  • Функция h3PolygonToCells теперь применяет ограничение максимального размера массива ко всем полигонам в MultiPolygon, проверяет коды возврата базовой библиотеки H3 и отклоняет аргументы MultiLineString, вместо того чтобы без предупреждения возвращать пустой результат. #106399 (Algunenano).
  • Десериализация состояний агрегатных функций contingency, cramersV, cramersVBiasCorrected и theilsU теперь проверяет, что сохранённые счётчики образуют корректную таблицу сопряжённости, и в противном случае генерирует исключение CORRUPTED_DATA. #107185 (nihalzp).
  • Улучшена оценка мощности в оптимизаторе плана запроса: столбец, созданный детерминированной функцией с одним аргументом (например, toYear(date)), теперь наследует число уникальных значений своего аргумента в качестве верхней границы, а не остаётся без статистики, что позволяет точнее изменять порядок JOIN. #107757 (davenger).

Движки таблиц и хранилище

  • Исправлена работа потребителей движка таблицы Kafka, которые после назначения разделов продолжали использовать короткий интервал опроса: теперь они возвращаются к настроенному значению kafka_poll_timeout_ms, избегая чрезмерных пустых опросов, создания более мелких частей и дополнительных накладных расходов на слияние после перебалансировки. #100431 (sugaf1204).
  • Движки таблиц озёр данных, включая Iceberg и DeltaLake, теперь могут использовать S3- и Azure-диски с кэшированием, что позволяет задействовать файловый кэш при повторных чтениях. #102017 (RinChanNOWWW).
  • Фильтры, добавленные после первоначального выбора PREWHERE (проталкивание предикатов, фильтры времени выполнения или явный PREWHERE в сочетании с WHERE, заданным планировщиком), теперь можно объединять с существующим PREWHERE при втором проходе оптимизатора, вместо того чтобы оставлять их отдельным шагом Filter над чтением из MergeTree. #105445 (yariks5s).
  • Добавлена настройка wait_for_part_commit_in_dependent_materialized_views. Если она включена, каскадное materialized view, выполняющее соединение с исходной таблицей, может видеть вставляемую в данный момент строку. #105943 (ahmadov).
  • Добавлена совместимость с PostgreSQL для EXTRACT(TIMEZONE_HOUR FROM dt) и EXTRACT(TIMEZONE_MINUTE FROM dt), извлекающих часовую и минутную части смещения часового пояса, а также для EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>), извлекающих значение из интервала. #106227 (vinayakj592).
  • Реализована команда SYSTEM RESTART DISK <name>: она перезагружает хранящиеся в памяти метаданные диска и повторно сканирует части данных таблиц реплик только для чтения, расположенных на этом диске. Это позволяет реплике таблицы только для чтения в общем хранилище plain_rewritable по запросу видеть данные, записанные другим сервером, не дожидаясь refresh_parts_interval и без перезапуска сервера. #106645 (jrdi).
  • Пропускается ненужная загрузка файлов меток для расширенных общих данных JSON. #107051 (Avogar).
  • Добавлена настройка, задаваемая при создании, materialized_postgresql_use_extended_date_and_time_types для движка базы данных MaterializedPostgreSQL. По умолчанию она включена: столбцы PostgreSQL date/timestamp определяются как Date32/DateTime64; при установке значения 0 во время CREATE DATABASE определяются более узкие типы Date/DateTime. Настройка неприменима к движку таблицы MaterializedPostgreSQL. #107428 (alexey-milovidov).
  • MergeTree теперь может читать сжатый поток, блоки которого используют разные кодеки. Это необходимое условие на стороне чтения для адаптивного выбора кодека. #108592 (rienath).
  • Пропускающий индекс bloom_filter теперь используется для предикатов IN по столбцу с прямым индексированием, если transform_null_in = 1 и набор IN не содержит значения NULL. Ранее индекс не использовался для таких запросов, что вынуждало выполнять полное сканирование. #111329 (groeneai).

S3 и объектное хранилище

  • Привилегии теперь записываются в system.query_log.used_privileges для всех успешных проверок доступа, включая проверки по пути isGranted, не генерирующему исключения (checkAccessWithFilter). Ранее записывались только привилегии, проверяемые через точки входа, генерирующие исключения (checkAccess / checkGrantOption), поэтому READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL не отображались в журнале аудита для запросов DESCRIBE, CREATE TABLE AS и аналогичных запросов, использующих табличные функции file / s3 / azure / url. Контроль доступа не изменился. #104693 (alexbakharew).
  • Финальный запрос multipart-загрузки в S3 теперь завершается асинхронно через трекер задач, поэтому он может выполняться параллельно с загрузкой последней части, а не последовательно на этапе завершения. #105487 (asya-ch).
  • Значение настройки persistent_processing_node_ttl_seconds по умолчанию для S3Queue и AzureQueue увеличено с одного до шести часов, что предотвращает преждевременную потерю блокировки бакета при длительной обработке или после её перезапуска. #106838 (kssenii).
  • Добавлена поддержка значений REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, GLACIER_IR и EXPRESS_ONEZONE (помимо STANDARD и INTELLIGENT_TIERING) для настройки s3_storage_class_name. #107251 (adityaksolves).
  • Пример пути Hive-партиционирования для таблиц объектного хранилища (например, S3) теперь определяется при первом использовании таблицы, а не при CREATE/ATTACH, поэтому недоступная конечная точка больше не препятствует созданию таблицы и запуску сервера. #111842 (evillique).

Настройки и конфигурация

  • Стратегия партиционирования hive стала используемой по умолчанию в настройке совместимости file_like_engine_default_partition_strategy. #86746 (kssenii).
  • Добавлены четыре новые настройки таблиц семейства MergeTree для управления параметрами текстовых индексов по умолчанию: text_index_dictionary_block_size, text_index_dictionary_block_frontcoding_compression, text_index_posting_list_block_size и text_index_posting_list_codec. Эти настройки позволяют настраивать поведение текстовых индексов на уровне таблицы без указания параметров в каждом определении индекса. Явно заданные аргументы отдельных индексов по-прежнему имеют приоритет. #100626 (CurtizJ).
  • Добавлена настройка output_format_pretty_use_nbsp_for_padding, позволяющая использовать неразрывный пробел U+00A0 в качестве заполнения при отображении таблиц в форматах Pretty, если output_format_pretty_grid_charset имеет значение UTF-8. Это позволяет сохранять выравнивание таблиц в скопированном выводе Pretty в инструментах, которые сворачивают обычные пробелы. По умолчанию настройка отключена, а в выводе с кодировкой ASCII используются обычные пробелы. #103559 (ashrithb).
  • Добавлена поддержка совместимости со старым анализатором с помощью настройки analyzer_compatibility_allow_non_aggregate_in_having. Если она включена, неагрегатные условия будут перенесены из HAVING в WHERE. #104232 (novikd).
  • OPTIMIZE TABLE ... ON CLUSTER и другие DDL больше не зависают, если для целевой таблицы задано table_readonly = 1. Теперь эта настройка вызывает новый специальный код ошибки TABLE_IS_PERMANENTLY_READ_ONLY, который DDLWorker не пытается обработать повторно (в отличие от временной ошибки TABLE_IS_READ_ONLY, возникающей при временном отключении ZooKeeper у ReplicatedMergeTree). Настройка table_readonly теперь также явно запрещена для ReplicatedMergeTree — как при создании, так и через ALTER MODIFY SETTING. #105109 (alexey-milovidov).
  • Сортировка по убыванию в ключах сортировки MergeTree (например, ORDER BY (time DESC, key)) теперь всегда поддерживается и больше не требует экспериментальной настройки allow_experimental_reverse_key, которая стала устаревшей. #106440 (nikitamikhaylov).
  • Добавлена поддержка keyed_by_normalized_query_hash для квот, определённых в статической конфигурации сервера (users.xml), в соответствии с существующим синтаксисом DDL CREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov).
  • Настройка совместимости больше не применяет устаревшие настройки, поэтому не помечает их как изменённые и не выдаёт предупреждений об устаревших настройках. #107737 (UberDever).
  • Добавлена настройка analyzer_compatibility_multiple_joins_qualify_column_names (по умолчанию false). Если она включена и предложение FROM запроса содержит два или более JOIN, имена столбцов результата, формируемые анализатором, имитируют преобразование нескольких JOIN в старом анализаторе: столбцы, развёрнутые из *, получают имена <alias-or-table>.<column>, а ссылка на столбец без псевдонима в списке SELECT сохраняет имя точно в том виде, в котором оно записано. Благодаря этому внешние запросы, ссылающиеся на такие квалифицированные имена, например SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), работают так же, как со старым анализатором. Также исправлена потеря анализатором квалифицированных имён результирующих столбцов, развёрнутых из *, при сочетании group_by_use_nulls с ROLLUP, CUBE или GROUPING SETS, которая приводила к дублированию имён результирующих столбцов и нарушала внешние ссылки на них. #110746 (novikd).
  • Добавлена настройка analyzer_compatibility_apply_final_to_all_joined_tables, восстанавливающая прежнее поведение: модификатор FINAL для крайней левой таблицы в JOIN также применялся к другим присоединяемым таблицам. Настройка зарегистрирована в истории изменений настроек, поэтому при использовании compatibility с версиями до 26.6 прежняя семантика восстанавливается автоматически. #111589 (fm4v).
  • Добавлена новая настройка MergeTree text_index_version, управляющая версией формата хранения текстовых индексов на диске: v0_initial, v1_with_codec или v2_with_positions. Во время поэтапного обновления или перед понижением версии задайте более раннюю версию, чтобы новые серверы продолжали записывать части текстовых индексов в формате, который старые серверы всё ещё могут читать; настройка совместимости корректирует это значение автоматически. #111803 (CurtizJ).

Системные таблицы и мониторинг

  • Поле used_storages в system.query_log теперь заполняется именем движка хранилища при запросах к таблицам через DataLakeCatalog. #100706 (melvynator).
  • В system.merges добавлены столбцы current_projection, current_projection_progress, projections_completed и projections_remaining для отображения хода слияния проекций. #102611 (amosbird).
  • Движки таблиц теперь содержат встроенную документацию, доступную через новые столбцы description, syntax, examples, introduced_in и related таблицы system.table_engines. #106177 (alexey-milovidov).
  • Движки баз данных теперь содержат встроенную документацию, доступную через новые столбцы description, syntax, examples, introduced_in и related таблицы system.database_engines. #106178 (alexey-milovidov).
  • Типы данных теперь содержат встроенную документацию, доступную через новые столбцы description, syntax, examples, introduced_in и related таблицы system.data_type_families. #106180 (alexey-milovidov).
  • Форматы ввода-вывода теперь содержат встроенную документацию, доступную через новые столбцы description, examples, introduced_in и related таблицы system.formats. #106181 (alexey-milovidov).
  • Комбинаторы агрегатных функций теперь содержат встроенную документацию, доступную через новые столбцы description, syntax, examples, introduced_in и related таблицы system.aggregate_function_combinators. #106185 (alexey-milovidov).
  • Добавлена новая таблица system.data_skipping_index_types, в которой перечислены доступные типы индексов пропуска данных и встроенная документация к ним (description, syntax, examples, introduced_in, related). #106186 (alexey-milovidov).
  • Добавлена новая таблица system.disk_types, в которой перечислены доступные типы дисков и встроенная документация к ним (description, syntax, examples, introduced_in, related). #106187 (alexey-milovidov).
  • Добавлены асинхронные метрики TotalUncompressedBytesOfMergeTreeTables и TotalUncompressedBytesOfMergeTreeTablesSystem, отображающие общий несжатый размер данных, хранящихся в таблицах семейства MergeTree. #106364 (alexey-milovidov).
  • Добавлено событие профиля GlobalMemoryLimitExceeded, позволяющее операторам отслеживать достижение глобального лимита памяти сервера. #106466 (sacheendra).
  • Добавлены асинхронные метрики ExecutableUserDefinedFunctionMemoryResidentBytes и ExecutableUserDefinedFunctionProcesses, отображающие объём резидентной памяти (VmRSS) и число работающих процессов пользовательских функций executable и executable_pool, включая дочерние процессы и неактивные рабочие процессы пула. #107300 (HanziJiang).
  • Добавлена настройка show_remote_databases_in_system_tables, включенная по умолчанию, которая позволяет скрывать базы данных MySQL и PostgreSQL в system.tables, system.columns и system.completions. Настройка show_data_lake_catalogs_in_system_tables по-прежнему управляет только видимостью DataLakeCatalog. #104416 (pamarcos). #109082 (pamarcos).

ClickHouse Keeper

  • Различные изменения в Keeper, которые в целом ускоряют его примерно в 2 раза (улучшенный батчинг, конвейерная отправка сообщений лидеру, конвейерное добавление записей в журнал). #101757 (al13n321).
  • Добавлено больше событий профилирования Keeper (на стороне сервера и клиента) для наблюдений. #105336 (scanhex12).
  • Добавлена новая таблица system.keeper_snapshots, доступная только в Keeper, со сведениями о локальных снимках ClickHouse Keeper. #105571 (mstetsyuk).
  • Добавлена новая таблица system.keeper_changelogs, доступная только в Keeper, со сведениями о локальных файлах журнала изменений ClickHouse Keeper (журнала Raft). #105617 (mstetsyuk).
  • Добавлена таблица system.keeper_cluster, доступная только в Keeper. Содержит по одной строке для каждого участника кластера Raft, как его видит текущий Keeper. #105646 (mstetsyuk).
  • Снижено пиковое потребление памяти при применении полученных снимков в ClickHouse Keeper с KeeperMemoryStorage. #105851 (antonio2368).
  • Добавлены параметры coordination_settings Keeper для ограничения допуска незафиксированных записей журнала NuRaft и регулирования обратных проверок append-entries. #106108 (antonio2368).

Управление памятью

  • Исправлены сообщения о синтаксических ошибках, которые могли содержать байты из соседних областей памяти после возврата парсера за конец оператора. #105086 (groeneai).
  • Снижено использование памяти при открытии резервной копии (для RESTORE или в качестве основы для инкрементального BACKUP). Метаданные .backup теперь разбираются как поток, а не загружаются в находящееся в памяти дерево XML-документа, что позволяет избежать выделения многогигабайтного DOM-дерева для крупных (особенно инкрементальных) резервных копий. #109107 (jkartseva).
  • Снижено пиковое потребление памяти при завершении BACKUP. При записи метаданных резервной копии сведения обо всех файлах больше не копируются во временный вектор (что для резервных копий с миллионами файлов временно требовало нескольких гигабайтов); теперь они перебираются напрямую. #109861 (jkartseva).

Форматы данных

  • Теперь поддерживается вставка полей Avro Fixed для вариантов 8-, 16-, 32- и 64-битных целых чисел. #98139 (patrickpichler).
  • Формат AvroConfluent теперь повторно подключает HTTP-клиент Confluent Schema Registry при временных сбоях (транспортных тайм-аутах, отказах в подключении, ошибках DNS, HTTP 5xx/408/429) с экспоненциальной задержкой вместо отмены INSERT при первом сбое сети. Новые настройки format_avro_schema_registry_max_retries (по умолчанию 5) и format_avro_schema_registry_retry_initial_backoff_ms (по умолчанию 100) определяют эту политику. Ошибки валидации схемы (HTTP 409, некорректный Avro JSON) по-прежнему считаются критическими. #106661 (groeneai).
  • Сохранены исходные коды ошибок ClickHouse для ошибок, возвращаемых через Apache Arrow. #107267 (azat).

Именованные коллекции и словари

  • Добавлена настройка enable_compression для табличной функции mysql, движка таблицы MySQL, движка базы данных MySQL, источника словаря SOURCE(MYSQL) и именованных коллекций. Если она включена, ClickHouse согласовывает сжатие на уровне протокола MySQL для всех данных, передаваемых по соединению. #103229 (bernardlim).
  • Добавлена новая таблица system.dictionary_layouts, содержащая список доступных структур словарей и встроенную документацию (description, syntax, examples, introduced_in, related). #106182 (alexey-milovidov).
  • Добавлена новая таблица system.dictionary_sources, содержащая список доступных источников словарей и встроенную документацию (description, syntax, examples, introduced_in, related). #106184 (alexey-milovidov).
  • Фактически используемый тип хранилища именованных коллекций теперь доступен как named_collections_storage.type в system.server_settings и через getServerSetting('named_collections_storage_type'). #111806 (pamarcos).

Другие улучшения

  • Улучшены подсказки с именами таблиц в сообщениях об ошибках: теперь не предлагается то же имя, а в подсказке указывается имя базы данных (например, “Возможно, вы имели в виду other_db.my_table?”). #95116 (matt-metivier).
  • Улучшено сообщение об ошибке для неразрешённых идентификаторов в запросах без предложения FROM: теперь оно предлагает добавить предложение FROM. #101769 (Onyx2406).
  • Исправлена ситуация, при которой PREWHERE с подзапросом IN по столбцам первичного ключа не использовал индекс первичного ключа для отсечения гранул, что приводило к полному сканированию таблицы вместо чтения только нужных гранул. #102570 (nikitamikhaylov).
  • Refreshable materialized views теперь продолжают обновляться после замены их целевой таблицы с помощью EXCHANGE TABLES и удаления старой таблицы. Ранее обновления могли завершаться с исключением UNKNOWN_TABLE, поскольку сохраняли UUID старой таблицы. #102724 (seva-potapov).
  • enable_join_transitive_predicates теперь включён по умолчанию. #103724 (davenger).
  • Refreshable materialized view теперь поддерживает REFRESH DEPENDS ON, позволяя запускать обновление при обновлении другой RMV вместо использования расписания. (REFRESH EVERY ... DEPENDS ON уже существовал, но его нельзя было надёжно использовать для этого сценария.) См. документацию CREATE MATERIALIZED VIEW. #104440 (al13n321).
  • Добавлена возможность EXPLAIN PIPELINE для объединения повторяющихся цепочек процессоров. #104662 (niyue).
  • REGEXP_SUBSTR добавлен как регистронезависимый псевдоним regexpExtract для совместимости с Oracle, MySQL и Snowflake. #105122 (alexey-milovidov).
  • Добавлена функция date_part('unit', expr) как синтаксический сахар для EXTRACT(unit FROM expr). Поддерживаются все стандартные единицы интервала и дополнительные варианты PostgreSQL (epoch, dow, doy, isodow, isoyear, century, decade, millennium). #105127 (alexey-milovidov).
  • QueryConditionCache теперь отдельно записывает гранулы, отфильтрованные даже в пакетах чтения, которые частично проходят PREWHERE, сокращая количество меток, повторно считываемых последующими запросами с тем же условием. #105335 (hanfei1991).
  • Добавлена поддержка BFloat16 для числовых функций-предикатов. #105391 (mohhddhassan).
  • Добавлена поддержка basic statistics — компактной статистики по каждому столбцу, хранящей числовые минимум и максимум, среднюю длину строк и количество NULL, где применимо. #106048 (hanfei1991).
  • Добавлена поддержка завершающего модификатора NULL / NOT NULL в ALTER TABLE ... ADD/MODIFY COLUMN, как и в CREATE TABLE. #106150 (takumihara).
  • Оптимизатор PREWHERE теперь перед оценкой селективности группирует конъюнкты, ссылающиеся на один и тот же набор столбцов, поэтому такие условия, как a > 2500 AND a < 2502, оцениваются вместе как комбинированный диапазон (~0,02% селективности), а не как два независимых предиката (~50% каждый). Это позволяет точнее упорядочивать условия PREWHERE при наличии статистики по столбцам. #106337 (hanfei1991).
  • Преамбула “Stack trace (when copying this message, always include the lines below):” больше не выводится в сообщениях об исключениях, если трассировка стека пуста. #106524 (alexey-milovidov).
  • Исправлено: CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) на зашифрованных дисках копировал данные вместо создания жёстких ссылок. #106731 (nikitamikhaylov).
  • Исправлено чтение данных таблиц базами данных DataLakeCatalog с catalog_type = 'onelake': теперь по умолчанию используется конечная точка OneLake Blob (.blob.fabric.microsoft.com). Установите onelake_use_blob_endpoint = false, чтобы сохранить прежнее поведение с конечной точкой DFS (.dfs.fabric.microsoft.com). #106843 (scanhex12).
  • Снижены накладные расходы CPU на асинхронное логирование при высокой скорости поступления логов: уведомление потребителя логов теперь выполняется только при переходе очереди из пустого состояния в непустое, а не для каждого сообщения. #107352 (nikitamikhaylov).
  • Исправлено чтение длины auth_response при рукопожатии MySQL: байт длины >= 128 интерпретировался как значение в несколько гигабайт, поскольку считывался как знаковый char. #107384 (uwezkhan).
  • MaterializedPostgreSQL теперь сопоставляет столбцы PostgreSQL numeric(p, 0) с точностью больше 76 (например, numeric(78, 0), используемый для 256-битных целых чисел) с ClickHouse Int256 вместо сбоя с сообщением “Precision too big”. Значения, не помещающиеся в Int256, отклоняются с понятным сообщением об ошибке. #107431 (alexey-milovidov).
  • Nullable(Tuple(...)) теперь имеет статус Beta. По умолчанию отключён; для использования установите enable_nullable_tuple_type = 1. #107754 (nihalzp).
  • Асинхронные вставки больше не записывают полный список query_id на уровне trace/debug, что начиная с версии 26.2 могло переполнить text_log на сервисах с интенсивным трафиком асинхронных вставок. Подробные строки теперь выводятся на уровне test. #107852 (CheSema).
  • Сокращено использование метаданных кэша файловой системы за счёт оперативного освобождения недействительных записей приоритета. #107903 (kssenii).
  • Индекс пропуска данных bloom_filter для столбца Array теперь используется для arrayJoin(column) IN (set), arrayJoin(column) GLOBAL IN (set) и arrayJoin(column) = const — так же, как он уже использовался для hasAny(column, set) и has(column, const). Ранее эти варианты arrayJoin ... приводили к полному сканированию. #109536 (groeneai).
  • IS NOT DISTINCT FROM и IS TRUE теперь используют индексы первичного ключа и minmax для исключения гранул, так же как =. Ранее k IS NOT DISTINCT FROM 42 и (k = 42) IS TRUE сканировали все гранулы. #110006 (groeneai).

Исправления ошибок

Исправления JOIN

  • Исправлено удаление LowCardinality из типов столбцов функцией nested (внутренне используемой в ARRAY JOIN), из-за которого Array(LowCardinality(String)) в результатах становился Array(String). #98974 (Onyx2406).
  • Исправлено изменение порядка JOIN, из-за которого при соединении через запятую (cross) с другой таблицей могли незаметно отбрасываться несовпадающие строки RIGHT/LEFT JOIN, например t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Ранее запрос возвращал результат внутреннего JOIN вместо внешнего. #101684 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (“Port is not connected”, код 49), которая могла возникать при выполнении запросов с VIEW, содержащим агрегацию внутри JOIN. #102574 (Ergus).
  • Исправлено незаметное игнорирование max_rows_to_transfer и max_bytes_to_transfer для запросов GLOBAL IN и GLOBAL JOIN при использовании нового analyzer. Теперь эти настройки вызывают SET_SIZE_LIMIT_EXCEEDED (или прерывание — в зависимости от transfer_overflow_mode), когда материализованная внешняя таблица превышает заданный лимит, что соответствует поведению старого analyzer. #104119 (groeneai).
  • Исправлены неверные результаты или сбои запросов JOIN, использующих join_algorithm = 'direct' с таблицей MergeTree в правой части, когда оптимизация меняла порядок столбцов поиска. #104174 (groeneai).
  • Исправлена ошибка, при которой запросы, сочетающие arrayJoin с ORDER BY ... LIMIT после JOIN, могли незаметно возвращать ноль строк. Оптимизация плана запроса, поднимающая вычисление функций над SortingStep, больше не применяется, если поднимаемое выражение содержит arrayJoin, поскольку arrayJoin может изменять количество строк. #104558 (groeneai).
  • Исправлена логическая ошибка, возникавшая в некоторых случаях при использовании отрицательного LIMIT BY с ARRAY JOIN. #105403 (nihalzp).
  • Добавлена новая настройка совместимости analyzer_compatibility_prefer_alias_over_subcolumn (по умолчанию отключена). Если она включена, новый analyzer для составных идентификаторов предпочитает интерпретацию с префиксом псевдонима совпадениям с подстолбцами Tuple или столбцами с точками, восстанавливая поведение предыдущего интерпретатора. Это позволяет избежать ошибок AMBIGUOUS_IDENTIFIER (и связанных с ними), когда запрос выполняет JOIN с таблицей, имя которой совпадает с именем внутренней таблицы CTE/подзапроса, использующего SELECT * для JOIN: иначе столбцы, переименованные через звёздочку (например, b.id), приводили бы к утечке идентификаторов внутренней таблицы во внешнюю область видимости. #105491 (vdimir).
  • Исправлены потенциально неверные результаты запросов, сочетающих внешний JOIN с последующим внутренним JOIN, ссылающимся на сторону внешнего JOIN, предоставляющую NULL. Изменение порядка JOIN могло выбрать план, переносящий условия внутреннего JOIN в предложение ON внешнего JOIN. #105992 (vdimir).
  • Улучшена совместимость со старым analyzer. Если таблица содержит столбцы вида x.a Array, x.b Array, x String, для ARRAY JOIN x предпочтение отдаётся массивам. #106069 (KochetovNicolai).
  • Исправлено исключение для запросов INNER JOIN с пустой левой таблицей MergeTree, когда включены enable_parallel_replicas, query_plan_use_new_logical_join_step и query_plan_optimize_join_order_algorithm = 'greedy'. #106338 (KochetovNicolai).
  • Исправлена логическая ошибка (Left and right columns have same names) в оптимизаторе порядка JOIN, которая могла возникать при выполнении JOIN с параллельными репликами, если два отношения в графе JOIN имеют столбцы с одинаковыми именами. #106418 (alexey-milovidov).
  • Исправлено исключение LOGICAL_ERROR (Invalid number of rows in Chunk) в JoiningTransform для LEFT JOIN с уникальными ключами правой стороны, смешанным условием ON и небольшим значением max_joined_block_size_rows. #106928 (groeneai).
  • Исправлено исключение LOGICAL_ERROR в фильтре выполнения JOIN, возникавшее, когда ключ JOIN содержит тип Variant или Dynamic, вложенный в Tuple, Array или Map, а правая сторона JOIN содержит одно уникальное значение. #106931 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y), возникавшая при выполнении функции над столбцом Dynamic, созданным JOIN по Dynamic (например, для строк, не сопоставленных при RIGHT/FULL JOIN, или для коррелированного подзапроса EXISTS, декоррелированного в JOIN). #107095 (groeneai).
  • Исправлено исключение логической ошибки Bad cast from type DB::IColumn const* to DB::ColumnNullable const*, возникавшее, когда квалифицированная звездочка (t.*) для ключа JOIN ... USING передаётся в агрегатную функцию, а ключ на другой стороне внешнего JOIN имеет тип Nullable (при join_use_nulls = 0). #107129 (groeneai).
  • Исправлена логическая ошибка (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8), возникавшая, когда оптимизация проталкивания дизъюнкции (частичного предиката) проталкивает условие по ключу USING, тип которого расширяется JOIN. Также исправлен сбой сервера (ошибка сегментации) в анализаторе при разрешении идентификаторов в запросах JOIN ... USING, содержащих сворачиваемые в константу ветви if/multiIf, ссылающиеся на неизвестные идентификаторы. #107407 (groeneai).
  • Исправлен фильтр выполнения JOIN, выдававший неверные результаты для JSON-столбцов. #107663 (Avogar).
  • Исправлено исключение логической ошибки Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>, возникавшее, когда квалифицированная звездочка (t.*) выбирает ключ JOIN USING, а этот JOIN вложен под JOIN PASTE/CROSS/через запятую или внешний JOIN с ON, при join_use_nulls = 0. #108043 (groeneai).
  • Исправлена ошибка в новом анализаторе, из-за которой FINAL для одной таблицы в JOIN (например, FROM t1 FINAL JOIN t2) некорректно применялся и к другим объединяемым таблицам, что могло замедлять такие запросы. #108979 (vdimir).
  • При analyzer_compatibility_join_using_top_level_identifier = 1 идентификатор в JOIN ... USING теперь может разрешаться по псевдониму, определённому для подвыражения внутри списка SELECT (например, SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), что соответствует поведению старого анализатора. Ранее учитывались только псевдонимы проекции верхнего уровня, и такие запросы завершались исключением UNKNOWN_IDENTIFIER даже при включённой настройке. Подсказка об ошибке, предлагающая включить эту настройку, теперь также выводится, когда соответствующий псевдоним является вложенным. #110739 (novikd).
  • Исправлена ошибка INCOMPATIBLE_TYPE_OF_JOIN при ANY JOIN с таблицей движка Join, когда фильтр WHERE по столбцу правой стороны позволял планировщику запроса преобразовать JOIN в SEMI или ANTI. Для таблицы движка Join строгость фиксируется при объявлении и не может быть изменена, поэтому такое преобразование для этих таблиц теперь не выполняется. #111362 (groeneai).
  • Исправлена ошибка TYPE_MISMATCH (“Key type for complex key … does not match”), возникавшая, когда JOIN со словарём использовал ключ JOIN типа Nullable, LowCardinality или LowCardinality(Nullable), а ключ словаря не был обёрнут. Поиск в словаре при прямом JOIN теперь приводит ключ к объявленному типу ключа словаря (как уже делают dictGet/dictHas), при этом ключ NULL никогда не сопоставляется. #111857 (groeneai).
  • Исправлена ошибка AMBIGUOUS_COLUMN_NAME (Block structure mismatch in (columns with identical name must have identical structure)) для запроса, в котором условие JOIN ON повторяется в WHERE при join_use_nulls = 1. Теперь такой запрос возвращает результат вместо сбоя. #112007 (groeneai).
  • Исправлены некорректные результаты и аварийное завершение работы сервера при прямом JOIN со словарём, ключ которого использует разреженную сериализацию. #112327 (groeneai).
  • Исправлены некорректные результаты, возникавшие, когда hash join имел единственный ключ LowCardinality типа шире 8 байт (UInt128, Int128, UInt256, Int256 и их варианты Nullable). Такой JOIN без предупреждения возвращал строки с неравными значениями ключей. #113230 (groeneai).
  • Исправлено отсечение частей и гранул для условия JOIN ON, включающего постоянные столбцы другой стороны. #113484 (vdimir).
  • Исправлено неверное значение, возвращаемое для виртуального столбца, например _table или _database, выбранного из правой стороны JOIN, обслуживаемого DirectKeyValueJoin (хранилищем ключ-значение, таким как EmbeddedRocksDB, KeeperMap, Redis или словарь). Вместо него запрос возвращал содержимое столбца данных либо завершался ошибкой LOGICAL_ERROR. #113698 (groeneai).

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

  • Исправлена ошибка, из-за которой splitMultipartQuery выдавал ошибку “Empty query” для запросов, заканчивающихся комментарием после точки с запятой. #85491 (yariks5s).
  • Исправлен случай, когда парсер не принимал псевдоним после подзапроса в DESCRIBE TABLE, что приводило к синтаксической ошибке. #100205 (yariks5s).
  • Исправлена ситуация, при которой предложение FORMAT обрабатывалось оператором INSERT вместо применения к выводу EXPLAIN в EXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406).
  • Исправлено значительное замедление SELECT-запросов при выполнении параллельных INSERT. Ранее конвейер INSERT резервировал до max_threads слотов CPU в начале запроса, даже если большинство из них никогда не использовалось, из-за чего параллельным SELECT не хватало ресурсов. Теперь слоты CPU выделяются по требованию: конвейер запрашивает их только при фактической передаче распараллеливаемой работы. Это относится как к управлению параллелизмом, так и к вытесняющему планировщику CPU для рабочих нагрузок. Новая настройка сервера concurrent_threads_lazy_allocation (по умолчанию true) позволяет откатить это изменение. #102928 (seva-potapov).
  • Исправлена ошибка, при которой ALTER TABLE ... MODIFY SETTING для таблицы EmbeddedRocksDB мог сохранять недопустимое значение настройки в файл метаданных таблицы, даже если сервер отклонял запрос. При следующем перезапуске сервера таблицу не удавалось подключить из-за CANNOT_PARSE_BOOL (или аналогичной ошибки разбора), а в базах данных, где ошибки загрузки являются критическими, сервер отказывался запускаться. Теперь недопустимые значения настроек отклоняются до записи метаданных. #103417 (groeneai).
  • Исправлена потоковая INSERT с input_format_max_block_wait_ms для интерфейса HTTP и INSERT SELECT FROM input: теперь частичные входные блоки сбрасываются до завершения запроса. #104534 (alexey-milovidov).
  • Исправлена ошибка, при которой выражение CASE возвращало ветвь ELSE вместо соответствующей ветви THEN, когда и выражение, и значение WHEN были NULL. #105556 (Algunenano).
  • Исправлена поддержка SQL UDF WASM в определениях MATERIALIZED VIEW. #106161 (niyue).
  • Исправлен случай, когда INTERPOLATE () вызывал INVALID_WITH_FILL_EXPRESSION, если столбцам ORDER BY были назначены псевдонимы в списке SELECT при использовании старого анализатора. #106252 (yakov-olkhovskiy).
  • Функции base58Encode, base58Decode и tryBase58Decode теперь учитывают max_execution_time и отмену запроса при обработке больших входных данных, а также отклоняют входные данные размером более 10 КБ вместо того, чтобы работать очень долго. Ограничение настраивается новой настройкой function_base58_max_input_size (0 отключает его). #106428 (alexey-milovidov).
  • Исправлена ошибка, приводившая к неверным результатам: WHERE c0 = const не возвращал строк для таблиц с ORDER BY f(c0), когда f(const) интерпретировалось как NaN, например при ORDER BY sqrt(c0) с отрицательной константой. Анализ первичного ключа ошибочно отсеивал все гранулы и загрязнял кэш условий запроса для последующих запросов. #106507 (groeneai).
  • Исправлены неверные результаты запроса SELECT c, count() FROM t WHERE c GROUP BY c к таблицам с неявной _minmax_count_projection, явной агрегатной проекцией или обычной проекцией: ранее все группы сворачивались в одну строку с постоянным ключом и общим количеством строк. #106590 (groeneai).
  • FORMAT теперь применяется к выводу EXPLAIN в EXPLAIN ... INSERT ... SELECT ... FORMAT ... также когда SETTINGS предшествует FORMAT или выходной формат — Values. #106686 (alexey-milovidov).
  • Исправлена редкая ложная ошибка RESOURCE_ACCESS_DENIED (“Scheduler queue with resource request is about to be destructed”) для запроса, которому фактически был предоставлен доступ к ресурсу рабочей нагрузки. Причиной был повторно используемый локальный для потока объект запроса, сохранявший состояние сбоя предыдущего запроса. #106690 (alexey-milovidov).
  • Исправлена ошибка, из-за которой функции match, extract, extractAll и countMatches возвращали неверные результаты для регулярных выражений, содержащих шестнадцатеричные или восьмеричные экранированные последовательности. #106709 (ofeliacode).
  • Исправлен выход за нижнюю границу диапазона целого числа в парсере PostgreSQL wire protocol: сообщение с полем длины меньше 4 вызывало переполнение при вычислении size - 4 и чрезмерно большой resize/ignore. #107485 (uwezkhan).
  • При enable_analyzer = 1 (значение по умолчанию) запрос к таблице по имени без указания базы данных, если таблица существует только в другой базе данных, теперь предлагает правильную таблицу: например, SELECT * FROM functions сообщает Maybe you meant system.functions?. Ранее новый analyzer выдавал ошибку Unknown table expression identifier без подсказки, тогда как старый analyzer уже предлагал полезный вариант. #107550 (groeneai).
  • Исправлено аварийное завершение сервера (std::terminate, сигнал 6) при завершении запроса с распределённым планом (make_distributed_plan = 1), когда проверка статуса рабочего узла не могла запланировать следующую проверку (например, из-за CANNOT_SCHEDULE_TASK при завершении работы или MEMORY_LIMIT_EXCEEDED). Теперь запрос корректно завершается с ошибкой, а сервер продолжает работу. #107575 (groeneai).
  • Исправлены неверные результаты распределённых запросов, выбирающих столбцы ALIAS с общим подвыражением: столбцы могли быть неправильно выровнены, а значения возвращались в неверных столбцах. #107675 (vdimir).
  • Исправлена логическая ошибка Inconsistent AST formatting для оконной функции без аргументов в объявлении CODEC или движка (например, CODEC(cume_dist() OVER (...))); теперь такая функция сохраняет скобки, поэтому запрос корректно проходит цикл форматирования и разбора. #107806 (alexey-milovidov).
  • getClientHTTPHeader теперь корректно считается недетерминированной, поэтому её результат больше не переиспользуется кэшем результатов запроса. #108029 (alexey-milovidov).
  • Исправлены неверные результаты при использовании SELECT [...] SAMPLE [...] вместе с кэшем условий запроса (настройка use_query_condition_cache = 1, которая также включена по умолчанию). #108488 (groeneai).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK, возникающая, когда составному предикату присваивается псевдоним в GROUP BY, а затем на него снова ссылаются при включенном enable_identifier_resolve_cache (по умолчанию). Оптимизация optimize_and_compare_chain не была идемпотентной, и общий разрешенный узел накапливал дублирующий транзитивный конъюнкт. #108553 (groeneai).
  • Исправлена ошибка NUMBER_OF_COLUMNS_DOESNT_MATCH, возникающая, когда подзапрос к таблице Distributed читает два или более столбца ALIAS, разворачивающихся в одно и то же выражение (например, a1 String ALIAS toString(x), a2 String ALIAS toString(x)), а результат подзапроса используется во внешнем запросе, например SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai).
  • Исправлена ошибка UNKNOWN_IDENTIFIER при выполнении ALTER TABLE ... DROP COLUMN, когда у другого столбца есть выражение DEFAULT или MATERIALIZED, которое определяет встроенный псевдоним и ссылается на него. #109374 (alexey-milovidov).
  • Исправлено бесшумное пропускание баз данных в system.tables для пользователей с привилегиями на уровне отдельных баз данных, когда запрос читает только столбцы name/database. Добавлено в 26.2. #109723 (samay-sharma).
  • Исправлена ошибка UNKNOWN_IDENTIFIER для столбцов с квалификацией именем CTE (cte_name.column) в запросах, сохраненных в представлениях, когда включен анализатор. #111386 (novikd).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK, возникающая, когда запрос с FINAL фильтрует по столбцу ключа сортировки, отсутствующему в списке SELECT, а фильтр перемещается в PREWHERE (например, SELECT s FROM t FINAL WHERE k GROUP BY s при optimize_move_to_prewhere_if_final = 1). #111721 (groeneai).
  • Исправлены сбои запуска сервера и ATTACH с сообщением WITH RECURSIVE is not supported with the old analyzer для представления с рекурсивным CTE, когда значением enable_analyzer по умолчанию на сервере является 0. #112784 (evillique).
  • Исправлено распространение настроек запроса и обработка NULL в accurateCastOrDefault. #114912 (alexey-milovidov).
  • Исправлено, что read_rows, read_bytes, written_rows и written_bytes в system.query_thread_log сообщали накопленные за время жизни потока значения вместо значений для записанного запроса. Были затронуты строки долгоживущих потоков из пула, в частности поток HTTPHandler, инициирующий запрос. #115596 (groeneai).

Исправления в MergeTree и хранилище

  • Отсоединённые части с суффиксом tryN теперь можно удалять. #58957 (antaljanosbenjamin).
  • Исправлено исключение MULTIPLE_EXPRESSIONS_FOR_ALIAS в запросах с дублирующимися псевдонимами проекций (например, SELECT *, day + 365 AS day) во вложенных подзапросах при выполнении на параллельных репликах. #80310 (alexey-milovidov).
  • Исправлен некорректный выбор кодека сжатия для частей MergeTree, когда настройка уровня таблицы default_compression_codec была задана явно. Части, записываемые при вставке, во время слияний и для проекций, использовали общесерверный кодек по умолчанию вместо настройки уровня таблицы. Теперь также учитывается пустая часть, создаваемая мутацией, полностью удаляющей данные. #101784 (Onyx2406).
  • Исправлены ошибки MULTIPLE_EXPRESSIONS_FOR_ALIAS, генерируемые удалёнными репликами при выполнении запросов, ссылающихся на псевдонимы проекций в PREWHERE / WHERE / HAVING / QUALIFY (например, SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c), или SELECT * для самосоединений с совпадающими именами столбцов при использовании параллельных реплик и parallel_replicas_local_plan = 0. #103806 (groeneai).
  • Исправлена повреждённая patch-часть после ALTER TABLE ... DROP PARTITION ID 'patch-...' с последующим DETACH/ATTACH TABLE. Ранее пустая покрывающая часть записывалась без partition.dat и source_parts.dat, что приводило к появлению записи broken-on-start_patch-... в system.detached_parts после следующего подключения таблицы или перезапуска сервера. #104353 (groeneai).
  • Исправлена незаметная замена данных значениями по умолчанию, когда ALTER TABLE ... RENAME COLUMN выполнялся одновременно с OPTIMIZE TABLE ... FINAL или другим фоновым слиянием. #104822 (groeneai).
  • Исправлены два сценария возникновения исключения LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized в запросах с enable_materialized_cte: (1) повторно используемый материализованный CTE, отфильтрованный через IN (subquery) по другому материализованному CTE, и (2) материализованный CTE, на который ссылаются как напрямую, так и внутри фильтра WHERE ... IN (...), обращающегося к первичному ключу MergeTree через вложенный IN-подзапрос. Это также затрагивало EXPLAIN для тех же запросов, поскольку ошибки возникали при оптимизации плана. #105041 (novikd).
  • При skip_cache_on_disk_failure = 1 запросы теперь продолжают выполняться, если FileCache не может создать каталог кэша на диске. Сбой записывается в журнал, а запрос не завершается с ошибкой. #105250 (Diskein).
  • Исправлено исключение логической ошибки Mutation of Memory table produced incomplete output, возникавшее при выполнении ALTER TABLE <memory_table> APPLY PATCHES и ALTER TABLE <memory_table> APPLY DELETED MASK. Таблицы Memory не содержат patch-частей или масок удаления, поэтому обе команды теперь корректно обрабатываются как операции без действия. #105286 (groeneai).
  • Исправлена ошибка CANNOT_CONVERT_TYPE для Merge поверх Merge поверх Distributed с distributed_group_by_no_merge=1. #105330 (azat).
  • Исправлена функция singleValueOrNullMerge, возвращавшая конкретное значение вместо NULL при слиянии состояния, в котором уже было обнаружено несколько различных значений. #105734 (fallintoplace).
  • Исправлено аварийное завершение работы табличной функции mongodb, хранилища MongoDB и источника словаря MongoDB, возникавшее, когда имя коллекции пусто или содержит NUL-байты. #105776 (Algunenano).
  • Исправлено отклонение команды ALTER TABLE ... CLEAR COLUMN для явно указанных столбцов columns_to_sum движков SummingMergeTree и CoalescingMergeTree. #105785 (antonio2368).
  • Исправлены ошибки UNKNOWN_DATABASE при создании параметризованного представления, имя базы данных которого передаётся через параметр запроса. #105799 (groeneai).
  • Восстановлена оптимизация чтения в порядке сортировки для таблиц Merge при использовании анализатора. #105867 (KochetovNicolai).
  • Исправлены мутации UPDATE и DELETE для таблиц Iceberg, доступ к которым осуществляется через каталог, включая повторные обновления и удаления, не затрагивающие ни одной строки. #106111 (scanhex12).
  • Исправлена ситуация, когда optimize_skip_unused_shards не применялся, а force_optimize_skip_unused_shards ошибочно завершался с ошибкой при запросе к таблице Distributed через таблицу Merge или табличную функцию merge, если предикат применялся на более высоком уровне. #106250 (KochetovNicolai).
  • Исправлена логическая ошибка Column identifier ... is already registered, возникавшая, когда предикат мутации (DELETE/UPDATE) содержит подзапрос IN/EXISTS, читающий из выражения таблицы по умолчанию, вложенного в другой подзапрос. #106414 (alexey-milovidov).
  • Исправлены периодически возникающие неверные результаты запросов ORDER BY ... DESC при обратном чтении частей Wide с read_in_order_use_virtual_row_per_block = 1 и небольшим значением max_block_size. #106429 (vdimir).
  • Исправлено исключение Bad cast exception для словарей Redis, использующих STORAGE_TYPE 'simple' с компоновкой cache/direct и единственным строковым (составным) ключом; теперь такие словари работают, а для составных ключей поверх хранилища simple выводится понятная ошибка. #106501 (vdimir).
  • Исправлено исключение Mutation of Memory table produced incomplete output, вызываемое командами ALTER TABLE <memory_table>, которые не влияют на данные в отдельных строках таблицы с движком Memory, включая APPLY PATCHES, APPLY DELETED MASK, MATERIALIZE STATISTICS, MATERIALIZE INDEX, MATERIALIZE PROJECTION и REWRITE PARTS. Таблицы Memory не содержат этих структур, поэтому теперь такие команды считаются операциями без действия. #106621 (groeneai).
  • Исправлен сбой запуска сервера с ошибкой Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0), возникавший, когда таблица MergeTree содержит часть skip-index с нулевым числом гранул и непустой файл меток на диске. #106675 (groeneai).
  • Исправлен случай, когда параллельные реплики не применялись к представлению с UNION из-за пустой таблицы в UNION. #106900 (devcrafter).
  • Исправлено исключение логической ошибки conflicted_part_name.has_value(), которое могло возникать при синхронной вставке в таблицу ReplicatedMergeTree, если вставляемый блок был полностью дедуплицирован, а узел дедупликации конфликтующей части уже был удалён (например, параллельно выполнявшейся командой DROP PARTITION). #107026 (groeneai).
  • Исправлены редкая ошибка LOGICAL_ERROR “Attempt to release query context that does not exist” и сопутствующее аварийное завершение сервера при чтении таблиц MergeTree через диск с файловым кэшем, созданный с enable_filesystem_query_cache_limit = 1. #107028 (groeneai).
  • Исправлено аварийное завершение сервера при перемещении пустой части на диск plain_rewritable (например, с помощью ALTER TABLE ... MOVE PARTITION ... TO DISK для пустой части, сохраняемой при remove_empty_parts = 0). #107040 (groeneai).
  • Исправлено исключение Logical error: Too large size passed to allocator при INSERT в таблицу MergeTree, если для adaptive_write_buffer_initial_size задано чрезвычайно большое значение. Начальный размер адаптивного буфера записи теперь ограничивается максимальным размером буфера. #107104 (groeneai).
  • Исправлена ситуация, при которой пакеты ALTER TABLE ... ON CLUSTER, сочетающие MODIFY SETTING/RESET SETTING с изменением комментария (например, MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123), применялись только на ведущей реплике, из-за чего остальные реплики рассинхронизировались. Также исправлена ошибочная классификация позиционного или применяемого к отдельному столбцу SETTINGS в MODIFY COLUMN ... COMMENT как локального изменения метаданных, затрагивающего только комментарий. Из-за этого изменение порядка столбцов не попадало в реплицируемые метаданные и могло вызвать INCOMPATIBLE_COLUMNS при перезапуске реплики. #107142 (groeneai).
  • Исправлена ошибка Argument ... of GROUPING function is not a part of GROUP BY clause для запросов, использующих функцию grouping при включённой настройке group_by_use_nulls. #107206 (KochetovNicolai).
  • Исправлены легковесные запросы UPDATE с включёнными устаревшими параллельными репликами для нереплицируемых таблиц MergeTree. #107246 (groeneai).
  • Исправлено возможное исключение логической ошибки в SYSTEM SYNC DATABASE REPLICA ... STRICT; модификатор STRICT теперь действительно применяется к репликам базы данных. #107344 (PedroTadim).
  • Исправлена ошибка Logical error: 'Duplicate announcement received for replica number N', которая могла возникать при использовании параллельных реплик, если скалярный подзапрос содержал вложенные подзапросы, читающие одну и ту же таблицу. #107381 (groeneai).
  • Исправлена незаметная потеря данных в обычном (нереплицируемом) MergeTree, если REPLACE PARTITION, MOVE PARTITION, DETACH PARTITION или DETACH PART выполнялась для партиции с ещё неприменёнными легковесными патчами UPDATE. Теперь эти операции отклоняются (как и в ReplicatedMergeTree) с указанием на ALTER TABLE ... APPLY PATCHES вместо незаметной отмены зафиксированного обновления. #107386 (groeneai).
  • Исправлено незаметное прекращение репликации изменений в MaterializedPostgreSQL, если имя базы данных или таблицы PostgreSQL содержало прописные буквы (потребитель pgoutput запрашивал имя публикации без кавычек и в нижнем регистре, которое не соответствовало имени публикации с сохранённым регистром). #107423 (alexey-milovidov).
  • Исправлена ошибка THERE_IS_NO_COLUMN, возникавшая при optimize_if_transform_strings_to_enum = 1, если оптимизированное выражение if/transform со строковыми литералами использовалось как ключ GROUP BY или ORDER BY для таблицы Distributed или параллельных реплик. #107455 (groeneai).
  • Исправлена проблема, из-за которой SELECT ... FINAL и OPTIMIZE TABLE ... FINAL возвращали дублирующиеся строки после переноса частей из обычной MergeTree в ReplacingMergeTree, SummingMergeTree или AggregatingMergeTree с помощью CREATE TABLE ... CLONE AS, ATTACH PARTITION ... FROM или MOVE PARTITION ... TO TABLE. Уровень слияния перенесённой части теперь сбрасывается до 0, если движки источника и пункта назначения различаются, поэтому при следующем слиянии она будет дедуплицирована в пункте назначения. #107481 (groeneai).
  • Отмена запроса теперь корректнее отслеживается при ожидании кворума в ReplicatedMergeTree. #107513 (nickitat).
  • Память, используемая библиотекой rapidjson (в prettyPrintJSON, JSONMergePatch и JSON-парсере rapidjson), теперь учитывается трекером памяти, поэтому патологические входные данные отклоняются с MEMORY_LIMIT_EXCEEDED вместо неограниченного выделения памяти. #107555 (Algunenano).
  • Исправлена ошибка Logical error: Stream ... variant_discr ... is not found, которая могла возникать при слиянии или чтении части MergeTree, созданной в результате мутации таблицы со столбцом Dynamic. #107562 (alexey-milovidov).
  • Исправлена ошибка LOGICAL_ERROR (updateFormatPrewhereInfo called more than once), возникавшая при запросе к источнику file(), url() или объектному хранилищу с явными PREWHERE и WHERE, когда был включён optimize_prewhere_after_pushdown. #107568 (groeneai).
  • Исправлено исключение сервера (логическая ошибка Digest does not match), которое могло возникать при выполнении RENAME TABLE, RENAME DATABASE или CREATE OR REPLACE TABLE с таблицей TimeSeries в базе данных Replicated. Переименование таблиц TimeSeries теперь поддерживается. #107583 (groeneai).
  • Исправлена проблема с DROP TABLE для таблицы TimeSeries в базе данных Replicated: ранее внутренние таблицы не удалялись, а фоновая задача удаления повторялась бесконечно (DROP TABLE ... SYNC зависал). #107604 (groeneai).
  • Исправлены две уязвимости обхода пути в протоколе получения реплицируемых частей, которые могли позволить вредоносной реплике записывать файлы за пределами каталога части. #107606 (antonio2368).
  • Исправлена проблема, из-за которой ALTER TABLE ... REPLACE PARTITION в обычной таблице MergeTree восстанавливал заменённые части после перезапуска сервера, в результате чего таблица возвращала как строки замены, так и устаревшие строки из заменённых частей. #107623 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”), возникавшая при вставке в materialized view, целевая таблица TO которой объявляет столбец с более широким типом Enum, чем создаёт SELECT представления. Допустимое расширение Enum теперь применяется при вставке в materialized view, как и при прямом INSERT ... SELECT. #107648 (groeneai).
  • Исправлена ошибка NUMBER_OF_COLUMNS_DOESNT_MATCH при запросе к таблице Distributed (или при использовании параллельных реплик), содержащей несколько столбцов ALIAS, разворачивающихся в одно и то же выражение, если они используются вместе с ORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy).
  • Временная ошибка при обновлении частей данных таблицы только для чтения больше не приводит к окончательной остановке фоновой задачи обновления. #108034 (alexey-milovidov).
  • index_granularity_bytes теперь учитывается для столбцов с состояниями AggregateFunction. Ранее ограничение размера гранулы в байтах игнорировалось для таких столбцов (например, состояний uniqExact в таблицах AggregatingMergeTree и агрегирующих проекциях), что приводило к созданию гранул, значительно превышающих настроенное ограничение, а также к увеличению объёма чтения и потребления памяти при выполнении запросов. #108297 (groeneai).
  • Исправлено поведение insert_quorum = 'auto', при котором вставки не отклонялись сразу, если в работе находилось менее половины реплик. Теперь такие вставки немедленно завершаются ошибкой TOO_FEW_LIVE_REPLICAS вместо записи локальной части с последующим тайм-аутом UNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey).
  • Исправлено аварийное завершение сервера при асинхронной вставке с дедупликацией, когда optimize_on_insert делает вставляемый блок пустым (например, если сумма строк в SummingMergeTree равна нулю). #109229 (Diskein).
  • Исправлена потеря данных столбца без выражения по умолчанию, когда слияние выполняется одновременно с ALTER TABLE ... RENAME COLUMN или когда единственные значения столбца поступают из легковесного UPDATE. Столбец мог быть удалён из слитой части, из-за чего при чтении все его значения возвращались как NULL. #109356 (groeneai).
  • Исправлено редкое аварийное завершение сервера при слиянии агрегатных состояний uniqExact параллельно с GROUPING SETS, ROLLUP или CUBE. #109389 (groeneai).
  • Исправлено бесконечное перепланирование rollup-слияний. #109410 (Michicosun).
  • Исправлены мутации GROUP BY для таблиц с материализованными или постоянными виртуальными столбцами. #109532 (Michicosun).
  • Исправлена ошибка UNKNOWN_IDENTIFIER: Missing columns: '_block_offset' при выполнении ALTER TABLE ... MATERIALIZE INDEX для неявного индекса minmax, созданного add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column, в таблице с недавно вставленными частями (уровня 0). Теперь индекс строится для этих частей вместо завершения с ошибкой. #110236 (groeneai).
  • Исправлено поведение реплики объектного хранилища только для чтения (диска, настроенного с read_only = true), при котором она не обнаруживала новые части через refresh_parts_interval, а table_disk = true отклонялся на таком диске с сообщением “table_disk is not supported for non-ObjectStorage disks”. #110460 (jkartseva).
  • Исправлена ошибка LOGICAL_ERROR (“No set is registered for key”) в операциях ALTER TABLE … DROP COLUMN, мутациях ALTER TABLE … DELETE/UPDATE и легковесном DELETE для таблиц со столбцом ALIAS, выражение которого использует оператор IN (в том числе через другой столбец ALIAS). #111039 (PedroTadim).
  • Исправлены случаи, когда политика строк не применялась к проекциям MergeTree при выполнении запроса. #112329 (yariks5s).
  • Исправлена логическая ошибка ReadBufferFromEncryptedFile: Wrong file position при чтении части Compact с диска encrypted с прямым I/O, из-за которой слияния зависали в system.replication_queue. #112943 (alexey-milovidov).
  • Исправлено чтение внутренней базы данных _temporary_and_external_tables через табличную функцию merge и движок таблицы Merge, позволявшее одному сеансу читать временные таблицы других сеансов и пользователей и вызывавшее исключение при использовании старого analyzer. Теперь регулярное выражение для баз данных пропускает эту базу, а её явное указание запрещено — так же, как и прямой доступ к ней. #113224 (alexey-milovidov).
  • Исправлена проблема, при которой политика строк со скалярным подзапросом вычислялась лишь один раз и затем повторно использовалась при последующих чтениях таблицы через Merge. Разобранное условие политики кэшируется и совместно используется всеми запросами, а чтение через Merge изменяло кэшированное выражение на месте, что также приводило к гонке данных между одновременными запросами, использующими одну и ту же политику. #113563 (alexey-milovidov).
  • Исправлены ошибки CANNOT_CONVERT_TYPE при чтении таблицы Merge, содержащей таблицу Distributed с параллельными репликами и пользовательским ключом. #113742 (alexey-milovidov).
  • Исправлена ошибка Logical error: No set is registered for key ... при чтении через таблицу Merge, если её дочерняя таблица объявляет столбец ALIAS, содержащий IN, а дочерние таблицы имеют разные значения по умолчанию для этого столбца. #113757 (groeneai).
  • Исправлена возможность обхода политики строк, при которой табличная функция mergeTreeIndex раскрывала значения первичного ключа и индекса minmax для строк, скрытых политикой строк SELECT в исходной таблице; теперь чтение mergeTreeIndex для таблицы с политикой строк запрещено. #115304 (yariks5s).

Исправления типов данных и сериализации

  • Исправлено исключение в ARRAY JOIN при использовании числовых типов LowCardinality. #91784 (Ergus).
  • Исправлено создание столбцов NOT NULL как Nullable без уведомления, когда data_type_default_nullable = 1 и таблица создаётся в базе данных Replicated или с помощью ON CLUSTER. #97572 (xiaohuanlin).
  • Исправлено некорректное число строк, возвращаемое запросом к MaterializedView с query_plan_enable_optimizations = 0, когда представление сопоставляет столбец integer со столбцом Bool. #100692 (Maximus5).
  • Исправлены несогласованные метаданные части после мутаций столбцов с нестандартными сериализациями. #102817 (korowa).
  • Исправлено распространение NULL при чтении подстолбцов, извлечённых из столбцов Nullable(Tuple(...)). Например, для tup Nullable(Tuple(s Nullable(String))) запрос SELECT tup.s теперь корректно возвращает NULL в строках, где внешний кортеж имеет значение NULL, вместо некорректных значений. Это относится ко всем типам элементов, способным представлять NULL: Nullable, Dynamic, Variant и LowCardinality(Nullable(...)). #102942 (nihalzp).
  • Исправлено удаление функцией recursiveRemoveLowCardinality пользовательских имён геометрических типов (например, различий между LineString и Ring, MultiLineString и Polygon), которое приводило к неверной интерпретации геометрического типа. #103041 (jh0x).
  • Исправлена ситуация, когда dictGetOrNull незаметно перезаписывала NULL другие столбцы в проекции SELECT при вызове со столбцом ключа типа Nullable, значения которого отсутствуют в словаре. Функция изменяла на месте карту NULL, связанную с входными данными через псевдоним; теперь перед мутацией она выполняет глубокое копирование результирующего столбца. #104327 (groeneai).
  • Исправлено исключение для распределённых запросов, содержащих пустой кортеж IN в ключе сегментирования при включённом optimize_skip_unused_shards_rewrite_in. #104966 (alexey-milovidov).
  • Исправлена оценка селективности PREWHERE по статистике count-min для столбцов Float32, включая сравнения с литералами Float64. #105047 (hanfei1991).
  • Исправлена ошибка ILLEGAL_TYPE_OF_ARGUMENT при объединении состояний агрегатных функций quantileExactWeightedInterpolated, quantileDD или quantilePrometheusHistogram с соответствующими вариантами quantilesXxxMerge для множественных квантилей (и наоборот). Варианты единственного и множественного числа этих трёх семейств квантилей используют одно и то же внутреннее состояние агрегатной функции, но не были указаны во внутренней таблице сопоставления имён, поэтому объединение состояний между функциями — а также оптимизация объединения функций для этих семейств — отклонялось. #105189 (groeneai).
  • Исправлены некорректные результаты toStartOfWeek, toLastDayOfWeek, toMonday, toStartOfMonth, toLastDayOfMonth, toStartOfQuarter и toStartOfYear для аргументов Date32 и DateTime64, выходящие за пределы диапазона Date: вместо переполнения до произвольных дат результаты до 1970-01-01 теперь ограничиваются значением 1970-01-01, а результаты после 2149-06-06 — значением 2149-06-06. Также исправлены неверные результаты запросов (некорректно отсечённые части и гранулы), когда такие функции использовались в WHERE для ключа Date32 или DateTime64, содержащего значения вне диапазона. #105244 (yariks5s).
  • Исправлена логическая ошибка в arrayRemove, когда первый аргумент — массив Variant, все альтернативы которого несовместимы с типом второго аргумента, а variant_throw_on_type_mismatch отключён. Теперь функция считает такое сравнение «никогда не равным» и возвращает массив без изменений вместо сбоя серверной функции assertTypeEquality. #105248 (groeneai).
  • Исправлено игнорирование cast_keep_nullable функциями toFloat64/toUInt32/toString и т. д. для Dynamic. #105467 (Avogar).
  • Исправлен segfault сервера в uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (и аналогичных цепочках комбинаторов над uniq) при использовании с GROUP BY ... WITH ROLLUP, WITH CUBE или WITH TOTALS и аргументом Nullable. #105470 (groeneai).
  • Исправлено, что toStartOfMillisecond и toStartOfMicrosecond возвращали результат с ошибкой почти в секунду для отрицательных значений DateTime64 (до эпохи), а также переполнение знакового целого, выявляемое UndefinedBehaviorSanitizer, в toStartOfSecond, toStartOfMillisecond и toStartOfMicrosecond для значений DateTime64 вблизи INT64_MIN. #105482 (groeneai).
  • Исправлено завершение работы сервера при десериализации состояний singleValueOrNull для JSON. #105535 (Avogar).
  • Исправлено игнорирование input_format_try_infer_datetimes при вставке в общие данные в JSON. #105544 (Avogar).
  • Исправлено циклическое переполнение DateTime для значений вне диапазона в JSONExtract и при текстовой десериализации. #105551 (Avogar).
  • Исправлен сбой при вставке кортежей разного размера в одном предложении VALUES в столбец String. #105582 (Avogar).
  • Исправлена ошибка NOT_IMPLEMENTED при вызове toString для DateTime с Timezone, содержащим значение NULL. #105587 (yariks5s).
  • Добавлена проверка некорректно преобразованных в плоскую структуру столбцов Dynamic во входных данных Native. #105666 (Avogar).
  • Исправлена ошибка LOGICAL_ERROR (Unexpected return type from if) при планировании запроса для выражений if с типом результата Variant, вторая или третья ветвь которых представляет собой if с постоянным условием над литералом UInt64, помещающимся в Int64. #105680 (groeneai).
  • Исправлена ошибка Bad get: has Decimal32, requested Decimal128 в sumMap и sumMapWithOverflow при работе со столбцом Nested(... Nullable(Decimal(P, S))), когда состояние агрегации сериализуется (например, при использовании параллельных реплик, sumMapState через форматтер бинарного состояния или внешней агрегации). #105816 (groeneai).
  • Исправлены ошибки Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality, возникающие при использовании apply_mutations_on_fly = 1 в таблице с ожидающими on-fly-мутациями UPDATE/DELETE, поставленными в очередь до мутации ALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano).
  • Исправлена ошибка Cannot find column в новом анализаторе для распределённых запросов с фильтром IN Array(...). #105894 (KochetovNicolai).
  • Исправлено завершение работы сервера при изменении столбца с STATISTICS на Nullable, если другой ALTER одновременно удалял этот столбец. #105917 (groeneai).
  • Байты IntervalKind, выходящие за допустимый диапазон, теперь отклоняются при декодировании типов в RowBinaryWithNamesAndTypes (input_format_binary_decode_types_in_binary_format = 1) с понятной ошибкой INCORRECT_DATA вместо создания DataTypeInterval с недопустимым видом, который впоследствии мог привести к неопределённому поведению при хешировании. #106261 (groeneai).
  • Подстолбец ‘null’ в Nullable(JSON) теперь читается как JSON-путь, а не как карта NULL. #106295 (Avogar).
  • Исправлено чтение за пределами массива в sipHash64Keyed, sipHash128Keyed и sipHash128ReferenceKeyed при хешировании столбца, все массивы которого пусты, а ключ не является постоянным. #106355 (Algunenano).
  • Исправлена ошибка, из-за которой пользователи не могли использовать скалярные подзапросы в первом аргументе IN, если второй аргумент — неконстантный кортеж. #106610 (yariks5s).
  • Исправлено игнорирование session_timezone при сериализации столбцов LowCardinality(DateTime) в текстовые форматы (CSV, TSV, JSONEachRow и т. д.). Ранее после первой записи столбца LowCardinality(DateTime) на сервере каждый последующий запрос, записывающий такой столбец, отображал строку локального времени в первом использованном часовом поясе независимо от session_timezone. #106634 (groeneai).
  • Исправлено завершение работы сервера в if и multiIf, когда условием является постоянное значение Nullable(Nothing). #106678 (groeneai).
  • Отменено изменение, из-за которого sumMap и комбинатор -Map отклоняли числовые типы значений с пользовательскими именами (такие как SimpleAggregateFunction(sum, T) и Bool) с ошибкой ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, что нарушало работу ранее работавших агрегаций. #106729 (fm4v).
  • Исправлено исключение Bad cast при отсечении частей по статистике MinMax, когда ключевой столбец имеет тип LowCardinality, а константа предиката — тип LowCardinality(Nullable(...)). #106793 (groeneai).
  • Исправлена логическая ошибка в parseDateTime при наличии не-ASCII-байтов во входных данных. #106856 (Avogar).
  • Исправлено исключение THERE_IS_NO_COLUMN в распределённых запросах с оптимизацией optimize_rewrite_aggregate_function_with_if, когда аргумент агрегатной функции требует приведения к типу Nullable. #106908 (yakov-olkhovskiy).
  • Исправлено переполнение знакового целого числа (неопределённое поведение) в arrayLevenshteinDistanceWeighted и arraySimilarity, когда массивы весов содержат большие целочисленные значения. Взвешенное расстояние для целочисленных весов теперь накапливается в целочисленном типе увеличенной разрядности, поэтому большие значения весов больше не вызывают переполнения и сохраняют точность. #106934 (groeneai).
  • Исправлен сбой (Source column is not Map / SIGSEGV) при слиянии отсортированных блоков, содержащих столбец Variant с вариантом Map, локальный порядок хранения которого отличается от глобального. #107011 (groeneai).
  • Исправлена ошибка TYPE_MISMATCH (“Cannot convert string … to type …”) в запросах ORDER BY <numeric column> ... LIMIT n, когда отложенная материализация размещала другой столбец перед столбцом сортировки. Порог top-K теперь считывается из нужного столбца сортировки. #107060 (groeneai).
  • Исправлен составной запрос ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a, повторно использующий освобождённое имя столбца (выполняющий «обмен») между столбцами разных типов. В материализованной части записывался неверный тип столбца, из-за чего последующий SELECT завершался ошибкой Conversion between numeric types and IPv6 is not supported (или прерывался при загрузке части в отладочных сборках). #107064 (groeneai).
  • Исправлены недетерминированные результаты функции roundDown, когда массив границ содержит NaN. Одно и то же входное значение могло возвращать конечную границу или NaN в зависимости от окружающих строк в пакете. Границы NaN теперь игнорируются, поэтому результат зависит только от конечных границ. #107065 (groeneai).
  • Исправлена ошибка DECIMAL_OVERFLOW, которую quantileTDigest и quantileTDigestWeighted генерировали для аргументов Date и DateTime, когда интерполированный квантиль был дробным, но находился в допустимом диапазоне (например, quantileTDigestWeighted(date, weight) для значений, каждое из которых помещается в тип). Дробный результат теперь усекается до типа результата, как в quantilesTDigestWeighted; для значений, действительно выходящих за диапазон, по-прежнему возникает ошибка. #107066 (groeneai).
  • Исправлено бесшумное усечение целочисленных значений вне диапазона в определениях типов Enum8/Enum16. Enum8('a' = 200) теперь генерирует исключение ARGUMENT_OUT_OF_BOUND вместо бесшумного создания Enum8('a' = -56). #107081 (groeneai).
  • Исправлен неверный порядок строк (а также ошибка LOGICAL_ERROR “Rows are not sorted with permutation” в отладочных сборках) в запросах ORDER BY ... LIMIT с несколькими столбцами сортировки по Nullable, когда несколько строк имеют одинаковые значения в ведущих столбцах. #107094 (groeneai).
  • Исправлена ошибка Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple' при чтении столбца Array(Tuple(...)), заполненного значениями по умолчанию, например после ALTER TABLE ... ADD COLUMN или незавершённой применяемой на лету мутации ALTER TABLE ... CLEAR COLUMN. #107232 (groeneai).
  • Неподдерживаемое использование столбцов AggregateFunction в TTL-выражениях теперь отклоняется при выполнении CREATE TABLE (например, TTL toDateTime(state)), а не приводит позднее к сбою при выполнении TTL с ошибкой ILLEGAL_TYPE_OF_ARGUMENT. Это также относится к состояниям внутри альтернатив Variant и значений Dynamic. Допустимые функции, работающие с состояниями, такие как finalizeAggregation, по-прежнему разрешены. #107366 (Ria-K912).
  • Исправлена работа arrayResize с аргументом размера типа Decimal: размер теперь интерпретируется по фактическому значению (например, arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) возвращает один элемент), а не по исходному немасштабированному представлению. #107389 (alexey-milovidov).
  • Исправлена ошибка LOGICAL_ERROR: Unexpected return type from materialize (и аналогичные ошибки несоответствия типов) при использовании apply_mutations_on_fly = 1 для таблицы с ожидающим применяемым на лету UPDATE, целевой столбец которого также используется как входной аргумент функции в более раннем применяемом на лету UPDATE, перед мутацией ALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai).
  • Исправлено молчаливое преобразование значений NULL в пустые строки при вставке данных Arrow/ORC в столбец LowCardinality(Nullable(…)). Это была регрессия, появившаяся в 26.5. #107532 (Ergus).
  • Исправлена ошибка LOGICAL_ERROR (“Input nodes size mismatch in dag”), возникавшая, когда запрос с make_distributed_plan = 1 выполняет соединение по ключу, обёрнутому в функцию, стороны которого не имеют общего типа (например, ON intDiv(-1, t1.key) = t2.key с правым ключом UInt64). #107701 (groeneai).
  • Исправлено вычисление неверных хешей при дедупликации вставок для столбцов String и Array с настройкой сервера insert_deduplication_version = new_unified_hash: идентичные вставки могли не дедуплицироваться, поскольку хеш дедупликации зависел от позиции строки внутри вставленного блока. #107915 (CheSema).
  • Исправлено завершение работы сервера в has при поиске в Map с ключами Dynamic с использованием аргумента LowCardinality. #107956 (groeneai).
  • Исправлена регрессия производительности для подстолбцов Map, используемых с PREWHERE. #107988 (Avogar).
  • Исправлена логическая ошибка при приведении столбца Dynamic или Variant, вложенного в Tuple, к типу элемента без Nullable с помощью accurateCastOrNull или accurateCastOrDefault. #108061 (alexey-milovidov).
  • Исправлено исключение логической ошибки Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>, возникавшее, когда запрос LIKE читает из индекса text через резервный путь прямого чтения из столбца, хранящегося в разреженном виде. #108068 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (“Unexpected return type from if”) при чтении столбца с apply_mutations_on_fly = 1 после выполнения ALTER UPDATE col = ... WHERE <cond> с неконстантным или ложным условием, за которым следует ALTER MODIFY COLUMN col <new type>. #108128 (groeneai).
  • Исправлено переполнение знакового целого числа (signed integer overflow, неопределённое поведение) в dateDiff с единицами hour и minute для экстремальных значений DateTime64, близких к границам диапазона Int64. #108229 (groeneai).
  • Исправлено исключение сервера (Logical error в IColumn::insertFrom) при приведении Array(Dynamic) или Array(Variant) к QBit с помощью accurateCastOrNull, например accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai).
  • Исправлена ошибка, из-за которой parseDateTimeBestEffort с часовым поясом вызывала CANNOT_PARSE_DATETIME для строк со значением NULL в toString(Nullable(DateTime64)). #108310 (yariks5s).
  • Исправлен сбой сервера (переполнение стека), вызванный глубоко вложенными выражениями, такими как [[[ ... ]]] или array(array( ... )), когда для max_parser_depth задано большое значение. #108493 (Algunenano).
  • Исправлена проблема, при которой проекция SELECT * возвращала значение по умолчанию для типа столбца (например, 0) вместо значения DEFAULT столбца (например, -1) при чтении столбца, добавленного с помощью ALTER TABLE ... ADD COLUMN ... DEFAULT после создания проекции. Чтение из базовой таблицы уже было корректным; проблема затрагивала только запросы, обслуживаемые проекцией, до её пересоздания. #108569 (tiandiwonder).
  • Исправлено незаметное отключение отсечения по партициям и первичному ключу, когда ключевой столбец LowCardinality(FixedString) (или LowCardinality(Nullable(FixedString))) обёрнут в функцию в ключе, например PARTITION BY sipHash64(k) % N с WHERE k = 'literal'. Такие запросы сканировали все партиции вместо их отсечения. #108777 (groeneai).
  • Сохранён исходный порядок ключей при сериализации Map по бакетам, чтобы исправить зависящие от него операции сравнения. #109178 (Avogar).
  • Исправлено определение схемы для форматов Arrow, ArrowStream, Avro и устаревших средств чтения ORC и Parquet, которое возвращало Nullable(Tuple) для допускающих NULL структурных столбцов, хотя тип Nullable(Tuple) не разрешён (allow_experimental_nullable_tuple_type отключён). DESCRIBE возвращал тип, который отклоняет CREATE TABLE, поэтому создание таблицы или вставка данных с использованием определённой схемы завершались ошибкой Nullable Tuple type is not allowed. #109185 (nihalzp).
  • Исправлена ошибка, из-за которой значения DEFAULT для столбцов не применялись при INSERT INTO TABLE FUNCTION (например, remote(...) или file(...)) со встроенными данными VALUES, когда сервер самостоятельно разбирает встроенные данные (send_table_structure_on_insert_with_inline_data = 0). Явно указанное значение NULL, вставленное в не-Nullable столбец с DEFAULT, становилось 0 вместо объявленного значения по умолчанию. Теперь поведение соответствует обычному INSERT в таблицу и HTTP-протоколу. #109258 (groeneai).
  • Исправлен segfault в groupArrayLastMerge. Теперь десериализация состояния агрегатной функции проходит валидацию, поэтому повреждённое состояние не приводит к выходу за границы массива. #109485 (mstetsyuk).
  • Исправлен segfault в агрегатной функции largestTriangleThreeBuckets: повреждённое состояние агрегатной функции теперь отклоняется при десериализации. #109492 (mstetsyuk).
  • Исправлено чтение столбца Parquet с не допускающим NULL типом Tuple, когда запрошенный тип ClickHouse оборачивает его в Nullable (например, Nullable(Tuple(...))): ранее оно завершалось ошибкой TYPE_MISMATCH. #109615 (groeneai).
  • Собственный модуль чтения Parquet v3 теперь может читать физически допускающий NULL столбец struct (группу OPTIONAL в Parquet) как Nullable(Tuple(...)). Ранее это приводило к ошибке TYPE_MISMATCH. #109898 (groeneai).
  • Исправлено аварийное завершение сервера (переполнение нативного стека) при копировании или уничтожении глубоко вложенного литерала Array/Tuple/Map/Object, например в запросе с очень глубоко вложенным литералом при увеличенном max_parser_depth. #110393 (Algunenano).
  • Исправлены неверные результаты IS NULL / IS NOT NULL / count() при использовании optimize_functions_to_subcolumns для столбца, преобразованного в Nullable с помощью операции metadata-only ALTER MODIFY COLUMN T в Nullable(T). Для частей, записанных до преобразования, подстолбец .null заполнялся значением по умолчанию для типа хранения (NULL), а не формировался на основе физически присутствующего родительского столбца, поэтому существующие строки без NULL ошибочно определялись как NULL. #110584 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (“Bad cast from ColumnString to ColumnLowCardinality”) при анализе индекса первичного ключа, когда ключевой столбец LowCardinality обёрнут во вложенную цепочку CAST, повторно вводящую LowCardinality, например WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. В сборках debug и sanitizer это приводило к аварийному завершению сервера, а в release — к сбою запроса. #111050 (groeneai).
  • Исправлено чтение данных Arrow и ArrowStream с пустыми вложенными столбцами Array или Map, созданными Apache Arrow Java до версии 19.0.0 (поставляемой с Apache Spark). Ранее такие данные отклонялись с ошибкой INCORRECT_DATA о слишком маленьком буфере смещений. #111101 (Algunenano).
  • Исправлены логическая ошибка Block structure mismatch (в сборках debug и sanitizer) и ошибка Illegal types of arguments при операциях над множествами над совместимыми столбцами состояний агрегатных функций (например, quantileState и quantilesState(0.9)), вложенными в столбцы-контейнеры, такие как Tuple, Array, Map, Nullable или Variant. #111191 (alexey-milovidov).
  • Добавлена валидация повреждённых данных реплицированного индекса, полученных по собственному протоколу. #112331 (Avogar).
  • Исправлено чтение за границами массива при дедупликации вставок, когда INSERT проходит через materialized view, изменяющее количество строк перед записью в партиционированную целевую таблицу. #112649 (CheSema).
  • Исправлена запись за пределы буфера при чтении столбца Parquet типа DECIMAL, физический тип которого шире типа, соответствующего объявленной точности, например DECIMAL(9, 2), хранимого как INT64. Такие файлы являются допустимыми файлами Parquet, и другие средства записи их создают, однако считыватель определял размер целевого столбца по объявленной точности, тогда как декодер записывал данные физической ширины, что приводило к повреждению памяти. Теперь при чтении такого файла также возникает ошибка DECIMAL_OVERFLOW, если значение не помещается в объявленную точность, вместо возврата повреждённых данных; при использовании подсказки типа не уже физического типа данные читаются без потерь. #113046 (groeneai).
  • Исправлены сбои ATTACH PARTITION FROM, REPLACE PARTITION, MOVE PARTITION TO TABLE и добавления реплики ReplicatedMergeTree с ошибками Tables have different ..., METADATA_MISMATCH или INCOMPATIBLE_COLUMNS для таблиц, определения которых содержали избыточные скобки, например PARTITION BY (a), ORDER BY (b), INDEX ix (b * c) TYPE minmax, PROJECTION p (SELECT (b) ...), CONSTRAINT c CHECK (a > 0), TTL (d + INTERVAL 10 YEAR) или DEFAULT (a + 1). #114188 (alexey-milovidov).
  • Исправлена ошибка, при которой объект управления доступом с настройкой типа Map, например профиль настроек с http_response_headers или additional_table_filters, сохранялся в формате, который ClickHouse не мог прочитать, из-за чего после перезапуска объект становился недоступным для загрузки. #114620 (groeneai).
  • Исправлены has, indexOf, countEqual, mapContainsKey, mapContainsValue и обращение по индексу к Map, возвращавшие “не найдено” для константного искомого значения LowCardinality, равного значению по умолчанию типа элемента, например пустой строки String или нуля. #114624 (groeneai).
  • Исправлены неверные результаты тривиальной оптимизации GROUP BY ... LIMIT (настройка optimize_trivial_group_by_limit_query) для запросов с DISTINCT, QUALIFY, оконными функциями или arrayJoin в проекции: они обрабатывают или фильтруют группы после агрегации, поэтому ограничение агрегации до LIMIT + OFFSET ключей могло возвращать слишком мало строк или неверные значения. Эта оптимизация больше не применяется к таким запросам. #114695 (alexey-milovidov).
  • Исправлены неверные результаты для SELECT count(arrayJoin(arr)) при значении по умолчанию optimize_trivial_count_query = 1. Вместо числа элементов массива возвращалось сохранённое количество строк, а для file() и url() запрос возвращал 0. #115227 (groeneai).
  • Исправлены uniq, uniqExact, uniqHLL12 и uniqTheta, возвращавшие неверный результат для аргумента, обёрнутого в инъективную функцию, скрывающую допускаемость NULL, например uniqExact(tuple(x)) для столбца Nullable. Оптимизация optimize_injective_functions_inside_uniq удаляла оборачивающую функцию, после чего строки со значением NULL пропускались вместо подсчёта. #115466 (vdimir).
  • Считыватели KeeperMap теперь могут принимать общие метаданные, если эквивалентные первичные ключи отличаются только избыточными внешними скобками. #115642 (skuznetsov-clickhouse).

Исправления текстового индекса и индекса пропуска данных

  • Исправлено аварийное завершение сервера, когда запрос использует вложенные сравнения coalesce/ifNull (например, WHERE coalesce(a, b, coalesce(c, d), e) = const) в таблице MergeTree с несколькими индексами пропуска данных minmax и use_skip_indexes_for_disjunctions = 1. Теперь переписывание <op>(coalesce(...), const) для индекса пропуска данных рекурсивно применяется к внутренним аргументам coalesce, поэтому RPN KeyCondition каждого индекса соответствует RPN шаблона, как предполагает код отслеживания дизъюнкций. #103929 (groeneai).
  • Исправлено исключение NOT_FOUND_COLUMN_IN_BLOCK, возникавшее при выполнении ALTER TABLE ... MATERIALIZE INDEX для частей, созданных в версии 25.8 и содержащих индекс пропуска данных по столбцу, добавленному отдельной командой ALTER TABLE ... ADD COLUMN. Теперь при принудительном пересчёте мутация корректно считывает каждый столбец, необходимый для каждого существующего в части индекса пропуска данных и проекции. #105039 (groeneai).
  • Исправлен незаметный недоподсчёт в запросах SELECT, когда use_query_condition_cache = 1 (по умолчанию). Запрос вида PREWHERE pk_prefix = X WHERE non_pk IN (...) к столбцу с индексом пропуска данных на основе bloom-фильтра приводил к загрязнению QueryConditionCache для предиката pk_prefix = X, поэтому последующий безобидный запрос SELECT count() ... WHERE pk_prefix = X возвращал неверный результат с недоподсчётом. Затронуты все выпуски 26.x. #105686 (groeneai).
  • Исправлено исключение при использовании в запросе векторного поиска векторного индекса, другого индекса пропуска данных, например minmax, и use_skip_indexes_on_data_read = 1. #106473 (shankar-iyer).
  • Исправлена ошибка “Too many marks” для текстового индекса в пустой слитой части. #106867 (azat).
  • Исправлены неверные результаты при запросах к таблице ReplacingMergeTree с FINAL и фильтром по текстовому индексу, когда был включён параметр query_plan_optimize_lazy_final. Отложенная оптимизация FINAL формировала шаги чтения, не воспроизводившие прямое чтение из текстового индекса, поэтому фильтр отбрасывал все подходящие строки. #106894 (Ergus).
  • Исправлена ошибка LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality), возникавшая, когда константа Variant, содержащая элемент LowCardinality, сравнивается с ключевым столбцом, ключевым выражением которого является немонотонная детерминированная функция (например, индекс пропуска данных minmax по sipHash64(col)). #107111 (groeneai).
  • Исправлены неверные (часто пустые) результаты ORDER BY <col> LIMIT n, когда активна оптимизация use_skip_indexes_for_top_k и из части с индексом пропуска данных minmax по столбцу сортировки были удалены строки с помощью легковесного DELETE. Оптимизация больше не ранжирует устаревшие значения minmax в частях с легковесно удалёнными данными выше частей, содержащих актуальные верхние строки. #107320 (groeneai).
  • Исправлено отсутствие отсечения гранул индексом пропуска данных Set для столбцов LowCardinality. #107868 (thevar1able).
  • Параметр use_skip_indexes_on_data_read теперь можно вернуть к значению по умолчанию, действовавшему до версии 26.1 (false), с помощью параметра compatibility. Это позволяет обойти регрессию производительности, при которой путь чтения данных препятствует отсечению диапазонов меток индексами пропуска данных minmax/set/bloom_filter. #108330 (egor-click).
  • Исправлено прямое чтение из нескольких частично материализованных текстовых индексов. #108607 (CurtizJ).
  • Исправлена ситуация, при которой текстовый индекс, определённый для mapValues(map) или mapKeys(map), не использовался без каких-либо уведомлений при запросе к таблице движка Distributed с analyzer. Для локальной таблицы и при использовании cluster()/remote() индекс применялся, однако запрос через таблицу движка Distributed его пропускал (и завершался ошибкой INDEX_NOT_USED при force_data_skipping_indices). #109188 (groeneai).
  • Исправлен сбой сервера при выполнении CREATE HYPOTHETICAL INDEX ... TYPE set (а также ngrambf_v1/tokenbf_v1), если обязательный аргумент индекса не указан. Такие команды теперь отклоняются с понятным сообщением об ошибке. #109294 (groeneai).
  • Исправлены неверные результаты функций has, mapContainsKey и mapContainsValue с пустой искомой подстрокой при наличии текстового индекса. #110246 (rschu1ze).
  • Исправлена ошибка ATTEMPT_TO_READ_AFTER_EOF при слиянии частей с текстовым индексом, если одна из сливаемых частей была пустой, например после мутации, удалившей все строки из части. #112490 (CurtizJ).
  • Исправлено зависание оптимизации плана запроса, когда предложение WHERE содержит большую строковую константу с множеством точек, а таблица имеет индекс пропуска данных bloom_filter, tokenbf_v1, ngrambf_v1 или text. При сопоставлении имени столбца фильтра с индексными столбцами JSONAllPaths(...) перебирались все варианты разбиения имени по точкам, из-за чего построение условия индекса пропуска данных имело квадратичную сложность относительно длины константы. #113289 (groeneai).
  • Исправлена ошибка, из-за которой ORDER BY ... LIMIT возвращал меньше строк, чем запрошено, а иногда не возвращал ни одной, когда политика строк была единственным фильтром запроса, а столбец сортировки имел индекс пропуска данных minmax. Оптимизация top-K ограничивала чтение до применения политики строк. #114073 (alexey-milovidov).

Исправления для озёр данных

  • Исправлено исключение логической ошибки при чтении таблиц Iceberg, версию формата которых повысил внешний инструмент (например, Spark). #100407 (alexey-milovidov).
  • Исправлено исключение (LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') при чтении таблиц Iceberg, содержащих файлы данных ORC с включенной оптимизацией PREWHERE. #101206 (groeneai).
  • Исправлены исключения LOGICAL_ERROR при чтении таблиц озер данных Iceberg или DeltaLake по путям, которые могут передаваться в конвейер чтения без зафиксированного datalake_table_state, например при параллельном обновлении метаданных Iceberg или чтении merge таблиц DeltaLake. #102033 (groeneai).
  • Исправлена спорадическая ошибка Logical error: 'Database <name> not found' в DataLakeConfiguration::getCatalog, возникающая при загрузке таблицы с движком Iceberg в обычной базе данных во время асинхронной загрузки метаданных. #103775 (groeneai).
  • Исправлено чрезмерное чтение метаданных каталога и S3, когда операция INSERT или DDL-оператор ссылается на несуществующую таблицу в базе данных каталога DataLake с включенным show_data_lake_catalogs_in_system_tables. Механизм подсказок при опечатках загружал полные метаданные Iceberg для каждой таблицы всего каталога, что могло привести к исчерпанию памяти в больших каталогах. #104124 (il9ue).
  • Исправлено завышенное значение read_bytes (и производное значение байтов/с, отображаемое в system.query_log, индикаторе выполнения и т. д.) при чтении файлов Parquet. Предыдущая реализация сообщала общий сжатый размер группы строк для каждого блока, поэтому при чтении K из N столбцов значение завышалось в N / K раз. Теперь размер суммируется только по выбранным столбцам. Также исправлено отслеживание хода выполнения на уровне файлов для таблиц Iceberg, которое ранее никогда не сообщало размер файла данных. #105413 (groeneai).
  • Исправлены неверные результаты при чтении таблицы Iceberg с iceberg_use_version_hint = 1, если другой компонент записи (например, табличная функция icebergLocal/icebergS3) продвигал таблицу без этой настройки. Теперь после создания файла каждый компонент записи поддерживает version-hint.text в актуальном состоянии, поэтому последующие читатели, использующие подсказку, видят последний снимок. #105682 (groeneai).
  • Записи в Iceberg теперь сохраняют значения NULL в столбцах партиции Nullable(T). Ранее NULL, записанный ClickHouse, при последующем чтении в Spark или других средствах чтения Iceberg отображался как значение по умолчанию внутреннего типа (0 для int). #105862 (groeneai).
  • Исправлено, что позиционные удаления merge-on-read в Iceberg v2 возвращали неверные строки, когда один файл удаления ссылался на несколько файлов данных и к одному файлу данных применялось несколько файлов удаления. Теперь записи об удалении фильтруются по пути к файлу, на который они ссылаются. #105888 (groeneai).
  • Исправлен переход движка таблицы IcebergLocal в режим только для чтения после цикла DETACH + ATTACH или перезапуска сервера, из-за чего каждая последующая операция INSERT завершалась ошибкой Local object storage Local is readonly. (READONLY). #106016 (groeneai).
  • Исправлено незаметное отключение файлового кэша для Azure Blob Storage (например, для таблиц Delta Lake в Azure), поскольку метаданные объекта не содержали ETag blob. #106091 (thewisenerd).
  • Добавлена проверка путей для таблиц Delta Lake, предотвращающая доступ метаданных к объектам за пределами настроенного расположения хранилища. #106115 (scanhex12).
  • Отсечение партиций Iceberg теперь корректно обрабатывает фильтры WHERE partition_col = (SELECT ... FROM ...), в которых анализатор оборачивает результат скалярного подзапроса во внутренний _CAST(Const, 'TargetType') с совпадающими исходным и целевым типами. Ранее такие фильтры отключали отсечение партиций и приводили к полному сканированию таблицы. #106204 (groeneai).
  • Исправлена ошибка, из-за которой REST-каталоги Iceberg, содержащие таблицы, ошибочно определялись как пустые. #106301 (LefterisXefteris).
  • Исправлено исключение NOT_FOUND_COLUMN_IN_BLOCK при запросах к таблице Iceberg или S3 с составным условием WHERE, содержащим IS NOT NULL для столбца, отсутствующего в списке SELECT, при использовании нативного ридера Parquet V3. #106443 (tiandiwonder).
  • Исправлено завышенное отображение прогресса при чтении из таблиц Iceberg с фильтрами _file или _path. Ранее показатель прогресса total_bytes_to_read включал все файлы из манифеста независимо от фильтрации. #106491 (PedroTadim).
  • Исправлено исключение сервера (логическая ошибка std::out_of_range) при вставке в таблицу Iceberg, когда имена столбцов блока записи не соответствуют ID полей в последней схеме (например, если параллельный писатель переименовал столбец в пределах окна iceberg_metadata_staleness_ms). Теперь вместо аварийного завершения работы сервера вставка завершается понятной ошибкой запроса. #107279 (groeneai).
  • Исправлено возможное переполнение стека сервера (сбой) при чтении глубоко вложенной схемы или значения в форматах MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg и Paimon. Такие глубоко вложенные входные данные теперь отклоняются с исключением. #107341 (Algunenano).
  • Исправлены сбой (LOGICAL_ERROR в отладочных сборках) и ошибка, приводившая к незаметно некорректным результатам (в релизных сборках), при чтении таблицы Iceberg, метаданные которой повторно связывают существующий schema-id с другой схемой в разных версиях метаданных. Такие метаданные теперь отклоняются с ICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai).
  • Исправлено чтение таблиц Iceberg v3, в файлах данных Parquet которых присутствуют зарезервированные столбцы происхождения строк (например, _row_id); нативный ридер Parquet больше не вызывает ICEBERG_SPECIFICATION_VIOLATION для зарезервированных ID полей, не входящих в схему таблицы. #107377 (gregakinman).
  • Исправлено ложное исключение filesystem error: in last_write_time: No such file or directory при получении списка содержимого каталога объектного хранилища на локальном диске (например, таблицы Iceberg на диске local) во время параллельной замены файлов. Одновременно удалённая запись теперь пропускается при выводе списка вместо прерывания операции. #107432 (groeneai).
  • Исправлена ошибка ‘Необходимо указать учётную запись’ при чтении таблицы Delta Lake через Azure. #107620 (SmitaRKulkarni).
  • Исправлено аварийное завершение при чтении таблиц Iceberg с файлами удаления по равенству. Если столбец в файле удаления по равенству допускает NULL, а в схеме таблицы — нет (или наоборот), значения из файла удаления вставлялись в столбец другого типа через непроверяемое приведение типов (смешение типов столбцов), что приводило к повреждению столбца и аварийному завершению сервера. #109551 (mstetsyuk).
  • Исправлена ложная ошибка ICEBERG_SPECIFICATION_VIOLATION при чтении таблицы Iceberg, десятичный тип которой (или другой параметризованный примитивный тип) сериализован с различными пробелами в файлах метаданных, например decimal(20,0) в метаданных таблицы и decimal(20, 0) в манифесте. Такие эквивалентные с точки зрения спецификации строки типов теперь сравниваются без учета пробелов. #109676 (groeneai).
  • Исправлено чтение таблиц Iceberg, порядок сортировки по умолчанию которых ссылается на столбец, требующий заключения в кавычки (например, @timestamp). Такие таблицы было невозможно прочитать, поскольку синтезированное выражение ORDER BY для хранилища строилось из необработанного имени столбца и не разбиралось из-за SYNTAX_ERROR. #110233 (groeneai).
  • Исправлено чтение таблиц Paimon, содержащих допускающий NULL столбец ARRAY или MAP. Такие таблицы вообще не удавалось прочитать, поскольку сопоставитель схемы оборачивал составной тип в Nullable, что запрещено в ClickHouse, поэтому и DESC, и SELECT завершались ошибкой Nested type Array(Nullable(Int32)) cannot be inside Nullable type. Допускающий NULL составной столбец теперь сопоставляется с составным типом без Nullable, а значение NULL читается как пустое. #113450 (groeneai).
  • Регистрация пространства имен Iceberg в каталоге перед записью файлов таблицы (необходимо для SeaweedFS) #114285 (azat).

Исправления S3/Azure/объектных хранилищ

  • Исправлено исключение «Distributed task iterator is not initialized» при использовании табличных функций url, s3 и аналогичных в запросах с включенными параллельными репликами. #100146 (alexey-milovidov).
  • Исправлен возможный сбой сервера (segfault) в кластерных табличных функциях (s3Cluster, urlCluster, fileCluster, …), когда планировщик формирует SELECT с установленным флагом recursive_with, но без выражения WITH. #105433 (groeneai).
  • Исправлен pushdown фильтров для Parquet и ORC с предикатами IN (subquery), благодаря чему при чтении из file, url, s3 и объектного хранилища работает отсечение групп строк, страниц и bloom-фильтров. #105863 (arsenmuk).
  • Исправлено исключение LOGICAL_ERROR при предварительной загрузке кэша, возникавшее, если удаленный объект S3 между получением списка и чтением перезаписывался более коротким содержимым. #106375 (fm4v).
  • Исправлено молчаливое игнорирование табличной функцией s3 строчной формы позиционной стратегии партиционирования partition_strategy (например, hive). #107297 (jkartseva).
  • Исправлена регрессия, при которой настройка compatibility = '26.6' (неявно включающая стратегию партиционирования hive) молчаливо принимала {_partition_id} в путях таблиц S3 и объектного хранилища вместо выдачи ошибки BAD_ARGUMENTS. #107437 (LefterisXefteris).
  • Исправлено, что s3 и другие табличные функции объектного хранилища выдавали LOGICAL_ERROR вместо BAD_ARGUMENTS при дублировании аргумента ключ-значение, например s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai).
  • Исправлено исключение сервера (Logical error: 'index >= result.start') при форматировании некорректного запроса, в котором смешиваются позиционная и именованная формы аргумента secret табличных функций s3/gcs, например s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai).
  • Исправлен приоритет настроек S3: блок конечной точки <s3>, заданный для URL, теперь имеет приоритет над настройками по умолчанию верхнеуровневого блока <s3>. #109251 (bharatnc).
  • Исправлены ошибки 411 Length Required от сервисов Azure: HTTP-транспорт Azure на основе Poco теперь задает Content-Length на основе тела запроса для клиентов SDK, которые сами не устанавливают этот заголовок (например, Azure Key Vault). #110299 (thevar1able).

Исправления S3Queue

  • Исправлено падение сервера (выход за границы массива) в S3Queue/AzureQueue при enable_hash_ring_filtering = 1, если батч содержал необрабатываемый файл и одновременно завершался ошибкой запрос Keeper на перевод батча в состояние обработки. #108977 (groeneai).
  • Исправлены утечки учётных данных в SHOW CREATE, system.query_log, серверных журналах и выводе EXPLAIN. Во всех формах локаторов S3 теперь маскируются session_token и секреты Google ADC, значения extra_credentials/headers в любой позиции аргументов, дублирующиеся ключи секретов и ключи секретов в выражениях, недопустимые позиционные формы (безопасная обработка при ошибке), а также учётные данные, встроенные в URL S3; это относится к табличным функциям s3/s3Cluster с явным URL и именованными коллекциями, движкам таблиц на базе S3 (S3, GCS, движки озёр данных, S3Queue), движку базы данных S3, BACKUP ... TO S3 и движку базы данных Backup. Кроме того, секретные аргументы encrypt/decrypt/HMAC, сформированные выражением (включая встроенные из SQL UDF), теперь скрываются в именах проекций, EXPLAIN QUERY TREE и EXPLAIN actions. #109768 (Algunenano).
  • Исправлен упорядоченный режим S3Queue/AzureQueue с постоянными узлами обработки: блокировки бакетов теперь обновляются во время стриминга, поэтому очистка по TTL (persistent_processing_node_ttl_seconds) не удаляет блокировки активного процессора. Если владение блокировкой всё же утрачивается, это обнаруживается и регистрируется (логическая ошибка и событие профиля ObjectStorageQueueBucketLockLostOwnership), а стриминг возобновляется с новым итератором файлов. #110292 (kssenii).

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

  • Исправлено падение сервера (SIGSEGV), воспроизводимое любым пользователем с правами CREATE TABLE при отправке по HTTP или собственному протоколу команды CREATE TABLE ... TO INNER UUID '...' без предложения ENGINE. Эта же ошибка также приводила к падению клиента. Теперь парсер возвращает корректную ошибку BAD_ARGUMENTS вместо разыменования нулевого указателя. #105579 (groeneai).
  • Исправлено падение сервера при запросах к таблицам DeltaLake с включённым allow_experimental_delta_kernel_rs, если учётные данные или параметр содержали недопустимые байты (Rust FFI паниковал при пересечении границы extern "C"). #106109 (Algunenano).
  • Исправлены множественные чтения за границами кучи в средстве чтения формата Arrow IPC (ArrowColumnToCHColumn). Некорректно сформированный файл Arrow мог объявлять больше строк, чем содержится в его буферах, задавать длины дочерних элементов list/struct/map, не согласованные с родительским элементом, содержать немонотонные смещения list или усекать битмап валидности дочернего элемента, что приводило к чтению за пределами выделенной памяти в куче. Проблема доступна любому пользователю с привилегией SELECT через file(), format(), табличные функции или входные данные ArrowFlight. Теперь перед любым доступом к необработанным указателям проверяются все буферы данных, смещений, view-struct и битмапов валидности, а согласованность структур и смещений list/struct/map проверяется отдельно. #106395 (Algunenano).
  • Исправлена ошибка, из-за которой столбцы used_privileges и missing_privileges в system.query_log могли содержать строки привилегий, оставшиеся от несвязанных предыдущих запросов другого пользователя, базы данных или сеанса. #106425 (alexey-milovidov).
  • Исправлено переполнение буфера кучи (падение сервера) в decodeHTMLComponent при декодировании строк, содержащих расширяющиеся HTML-сущности &nGt; или &nLt;, воспроизводимое любым пользователем с одной привилегией SELECT. #106741 (Algunenano).
  • Исправлены неверные результаты запроса, вызванные кэшем условий запроса, когда мутации на лету (apply_mutations_on_fly) или патч-части отфильтровывали строки до PREWHERE. Запрос с apply_mutations_on_fly = 1 мог испортить кэш, из-за чего последующий запрос с apply_mutations_on_fly = 0 и тем же предикатом пропускал метки, которые должен был прочитать, и возвращал слишком мало строк. Исправление также распространяется на политики безопасности на уровне строк, которые добавляются в качестве фильтра перед PREWHERE: запрос, выполненный с ограничительной политикой на уровне строк, мог испортить кэш для последующего запроса с тем же предикатом, но без этой политики. #107145 (groeneai).
  • Исправлено переполнение буфера кучи (падение сервера) в windowFunnel при финализации специально сформированного состояния агрегатной функции с типом события вне допустимого диапазона, воспроизводимое любым пользователем с одной привилегией SELECT. #107412 (uwezkhan).
  • Исправлена ошибка, из-за которой currentUser(), user(), SESSION_USER и authenticatedUser() вычислялись как пустая строка при сбросе асинхронной вставки (с async_insert = 1). Это затрагивало выражения столбцов DEFAULT/MATERIALIZED и materialized views, ссылающиеся на эти функции: вместо пользователя, выполняющего вставку, они незаметно сохраняли пустую строку. #107541 (groeneai).
  • Если одному пользователю или роли назначено несколько квот, теперь все они применяются одновременно (запрос отклоняется при превышении любой из них), а не только одна квота, выбираемая недетерминированно. SHOW QUOTA и system.quota_usage теперь показывают все квоты, применяемые к текущему пользователю. #107664 (alexey-milovidov).
  • Для SYSTEM RESET DDL WORKER теперь требуется новая привилегия SYSTEM RESET DDL WORKER. Ранее эту команду мог выполнить любой аутентифицированный пользователь (включая пользователей с правами readonly) и многократно сбрасывать состояние воркера DDL, блокируя DDL с ON CLUSTER. #108460 (groeneai).
  • Исправлена идентификация пользователей по ssl_certificate: один подстановочный знак * теперь соответствует ровно одному компоненту имени (RFC 6125 6.4.3). Ранее подстановочный знак в CN или DNS: SAN (например, *.corp.example.com) также соответствовал многоуровневым именам, таким как evil.deep.corp.example.com, что позволяло владельцу сертификата для более глубокого поддомена аутентифицироваться как пользователь с подстановочным знаком. Сопоставление URI: SAN не изменилось. #108472 (groeneai).
  • Команды протокола MySQL COM_FIELD_LIST (mysql_list_fields) и COM_INIT_DB (USE database) теперь применяют те же правила управления доступом, что и их SQL-эквиваленты (SHOW COLUMNS/DESCRIBE и USE). Ранее они могли раскрывать имена столбцов таблиц, для которых у пользователя были привилегии только на часть столбцов, а также переключать текущую базу данных без привилегии SHOW DATABASES. #108508 (groeneai).
  • Сопоставление http_forbid_headers теперь выполняется без учёта регистра. Имена HTTP-заголовков регистронезависимы, поэтому запрет Authorization теперь также блокирует authorization, AUTHORIZATION и другие варианты регистра. Настроенные шаблоны header_regexp теперь сопоставляются без учёта регистра без явного флага (?i). #108509 (groeneai).
  • Исправлена уязвимость, раскрывавшая метаданные: DESCRIBE loop('db', 'table') и DESCRIBE loop(<inner table function>) обходили проверку SHOW COLUMNS / проверку доступа к источнику, позволяя непривилегированному пользователю прочитать схему столбцов таблицы. #108624 (groeneai).
  • Исправлена ошибка запуска, при которой базу данных DataLakeCatalog, созданную в более старой версии (25.12 или ранее) с некорректным auth_header, нельзя было подключить после обновления до версии 26.2 или новее, что препятствовало запуску сервера. auth_header теперь проверяется только при CREATE, а при ATTACH каталог создаётся отложенно при первом использовании, а не во время запуска. Поэтому одна неправильно настроенная или недоступная база данных каталога больше не блокирует запуск сервера. #108674 (groeneai).
  • Усилена защита подключений RabbitMQ от вредоносных AMQP-фреймов чрезмерного размера, а проверки remote_url_allow_hosts теперь последовательно применяются к rabbitmq_address. #112479 (kssenii).
  • Исправлен случай, когда CREATE TABLE ... ENGINE = Distributed(...) без списка столбцов мог раскрыть структуру локальной таблицы, к которой создающий пользователь не имеет доступа. При CREATE, выполняемом самим локальным сервером, структура теперь определяется в контексте самого пользователя, поэтому для целевой таблицы требуется SHOW COLUMNS, как и для движка Remote. Это не относится к CREATE, воспроизведённому из очереди DDL (ON CLUSTER или внутри базы данных Replicated). #113220 (groeneai).
  • Исправлен случай, когда CREATE TABLE ... ENGINE = Buffer(...) без списка столбцов мог раскрывать структуру целевой таблицы пользователю, не имеющему права её просматривать. При выполнении CREATE локальным сервером структура теперь выводится в контексте самого пользователя, поэтому для целевой таблицы требуется право SHOW COLUMNS, как и для Merge и Remote. Это не распространяется на CREATE, воспроизведённый из очереди DDL (ON CLUSTER или внутри базы данных Replicated). #113372 (groeneai).
  • Ограничен размер стартового сообщения PostgreSQL wire protocol, считываемого до аутентификации. #115708 (alexey-milovidov).

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

  • Исправлено аварийное завершение работы сервера при выполнении RESTORE резервных копий, содержащих таблицы с циклическими зависимостями. #103824 (thevar1able).
  • Исправлено игнорирование класса хранилища S3 (s3_storage_class / s3_storage_class_name) для объектов, записываемых посредством multipart-загрузки на диски S3 и в объектное хранилище, из-за чего крупные объекты создавались с классом STANDARD по умолчанию. Для дисков, объектного хранилища и резервных копий теперь принимаются оба имени параметра: s3_storage_class и s3_storage_class_name. #106214 (alexey-milovidov).
  • Исправлено отбрасывание SYSTEM RELOAD CONFIG настроек Azure Blob Storage для отдельных конечных точек (например, use_native_copy), из-за чего настроенные параметры диска игнорировались при BACKUP/RESTORE до перезапуска сервера. #106357 (jkartseva).
  • Исправлена ошибка, из-за которой резервное копирование завершалось с FILE_DOESNT_EXIST при сборе цели REPLACE для refreshable materialized view в базе данных Replicated или Shared, если materialized view ещё не было создано на реплике, инициировавшей резервное копирование. #106411 (jkartseva).
  • Исправлено игнорирование Azure BACKUP/RESTORE настроек конечной точки для дисков azure_blob_storage устаревшего формата. #106784 (jkartseva).
  • Исправлено выполнение BACKUP в AzureBlobStorage: при копировании файла данных внутри резервной копии целевой объект записывался вне каталога резервной копии. Проверки существования объектов резервной копии в пунктах назначения S3 теперь используют точные запросы HeadObject вместо перечисления по префиксу, что предотвращает ложные совпадения ключей с похожими префиксами. #107153 (pamarcos).
  • Инкрементальные резервные копии больше не сохраняют учётные данные S3 в локаторе <base_backup> файла метаданных .backup. Резервные копии, созданные с use_same_s3_credentials_for_base_backup = 1 или с явно указанными учётными данными базовой резервной копии, совпадающими с локатором этой резервной копии, сохраняют несекретный маркер и восстанавливаются без дополнительных настроек при восстановлении. Для резервных копий, созданных с другими явно указанными учётными данными базовой резервной копии или дополнительными аргументами аутентификации базовой резервной копии, передайте их в RESTORE с настройкой base_backup. Резервные копии, созданные старыми версиями со встроенными учётными данными, по-прежнему можно восстановить. #107357 (pamarcos).
  • Исправлено выполнение RESTORE для таблиц ReplicatedMergeTree: части из резервной копии с одинаковым содержимым теперь сохраняются, а не молча дедуплицируются. #107652 (pamarcos).
  • Заполнитель {_partition_id} в пути файлового движка (S3, AzureBlobStorage, URL и т. д.) без явно указанного partition_strategy снова подразумевает стратегию wildcard независимо от file_like_engine_default_partition_strategy. Это восстанавливает обратную совместимость с DDL до версии 26.6, которые начали завершаться с BAD_ARGUMENTS (“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”). #111279 (fm4v).

Исправления ClickHouse Keeper

  • Исправлена очистка снимков Keeper после неудачных записей: частичные снимки теперь безопасно удаляются, а неудачные записи можно повторить без изменения latest_snapshot_meta. #105779 (antonio2368).
  • Исправлены сбои Keeper при дозагрузке follower, когда новая очередь ответов диспетчера запросов могла заполниться до запуска потока обработки ответов. #106049 (antonio2368).
  • Исправлена проблема, из-за которой Keeper иногда зависал при запуске, если для настройки nuraft_max_log_gap_in_stream задано нестандартное значение (по умолчанию — 0, то есть конвейерная обработка запросов append_entries отключена). #106220 (al13n321).
  • Внутренний Raft TLS в Keeper теперь учитывает настройку openSSL.client.verificationMode. Ранее проверка сертификатов peer для межузлового Raft-взаимодействия Keeper всегда была включена независимо от этой настройки, поэтому none молча игнорировалось. Теперь none явно отключает проверку сертификатов Raft peer, а отсутствие настройки сохраняет прежнее безопасное поведение по умолчанию. Конфигурации, в которых явно задано none, после обновления перестанут проверять сертификаты Raft peer в соответствии с заданной настройкой. #106726 (antonio2368).
  • Исправлено ошибочное пересоздание сеанса ZooKeeper при перезагрузке конфигурации. #107096 (azat).
  • Исправлена ошибка в ClickHouse Keeper, из-за которой метаданные снимка, передаваемые через last_snapshot (и zk_latest_snapshot_size в mntr), могли откатываться к меньшим значениям после установки устаревшего или дублирующего снимка. Это также могло привести к тому, что локальный снимок с тем же индексом перезаписывал зарегистрированный файл снимка, пока тот ещё передавался peer или загружался в S3. #107321 (antonio2368).
  • Исправлена проблема, из-за которой refreshable materialized view зависало при потере соединения с ZooKeeper в неподходящий момент. #108234 (al13n321).
  • Исправлены мутации с параметром запроса в качестве партиции (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): подставленное значение партиции сериализовалось в запись мутации в формате, который нельзя было разобрать обратно, что нарушало загрузку таблицы (для реплицируемых таблиц — на каждой реплике). Теперь перед записью в ZooKeeper или на диск также проверяется, что команды мутаций можно разобрать обратно, поэтому подобное несоответствие приведёт к ошибке запроса ALTER, а не к нарушению работы таблицы. #111518 (al13n321).
  • Исправлено числовое переполнение при разборе данных для system.zookeeper_info. #111629 (kssenii).

Исправления сбоев и повышения стабильности

  • Исправлено исключение NOT_FOUND_COLUMN_IN_BLOCK при использовании LIMIT BY с константными столбцами вместе с DISTINCT и ORDER BY при новом analyzer. #93195 (ashrithb).
  • Повышена стабильность подключения HiveCatalog: добавлены механизм автоматических повторных попыток и логика переподключения для обработки ошибок TTransportException при взаимодействии с Hive Metastore. #98471 (otselnik).
  • Исправлена свёртка констант на этапе анализа для функций с коротким замыканием (if, multiIf, and, or и т. д.), благодаря чему статически недостижимые ветви больше не вызывают исключений во время анализа. Например, WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) теперь корректно возвращает 0 вместо ошибки деления на ноль. #103157 (fastio).
  • Исправлено аварийное завершение работы сервера при вызове runningAccumulate для агрегатной функции, возвращающей собственное состояние. #105085 (antaljanosbenjamin).
  • Исправлена функция getServerSetting: теперь она возвращает текущее фактическое значение изменяемых во время выполнения настроек сервера (таких как max_server_memory_usage, mark_cache_size, max_concurrent_queries, размеры пулов потоков и т. д.) в соответствии с данными system.server_settings. #105172 (alexey-milovidov).
  • Исправлено исключение NOT_FOUND_COLUMN_IN_BLOCK при сочетании ORDER BY ... WITH FILL INTERPOLATE и LIMIT N BY с включённым analyzer. #105481 (yakov-olkhovskiy).
  • Исправлено исключение сервера (логическая ошибка Trying to execute PLACEHOLDER action), возникавшее, когда MATERIALIZED CTE с коррелированным подзапросом в теле использовался в правой части IN. Такой CTE теперь отклоняется на этапе анализа, как и тот же шаблон при прямом указании CTE в FROM. #105518 (groeneai).
  • Исправлено отсутствие перехвата исключений во время выполнения функций при variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false. #105543 (Avogar).
  • Исправлено исключение NOT_FOUND_COLUMN_IN_BLOCK, возникавшее, когда TTL-выражение ссылается на подстолбец. #105578 (Avogar).
  • Исправлено аварийное завершение работы сервера, которое могло происходить при отмене запроса, читающего данные из PostgreSQL — через табличную функцию postgresql, движок таблицы PostgreSQL или словарь с источником PostgreSQL, — например с помощью KILL QUERY, если не удавалось отменить удалённый запрос PostgreSQL. #105949 (rorylshanks).
  • Исправлено возможное аварийное завершение работы из-за слишком большого строкового литерала, переданного в запросе. #105996 (nickitat).
  • Исправлено исключение INVALID_WITH_FILL_EXPRESSION при использовании пустого INTERPOLATE () с префиксом сортировки в ORDER BY и включённым use_with_fill_by_sorting_prefix. Столбцы префикса сортировки теперь корректно исключаются из набора для неявной интерполяции, как и при явно указанном INTERPOLATE (col). #106001 (yakov-olkhovskiy).
  • Некорректные состояния AggregateFunction(uniqTheta, ...), полученные из входных данных RowBinary или параметров запроса, теперь отклоняются с ошибкой CORRUPTED_DATA вместо аварийного завершения сервера. #106260 (groeneai).
  • Исправлены сбой и возможная ошибка NOT_FOUND_COLUMN_IN_BLOCK, возникающие при использовании оптимизации на основе ограничений (optimize_using_constraints) с коррелированными подзапросами. #106349 (Algunenano).
  • Исправлено исключение NUMBER_OF_COLUMNS_DOESNT_MATCH при запросах к таблице Distributed, содержащей два или более столбца ALIAS, разворачивающихся в одно и то же выражение (например, оба определены как toString(x)), а также когда одно и то же выражение указано и как ссылка на столбец ALIAS, и непосредственно в списке SELECT при наличии предложения ORDER BY. #106404 (yakov-olkhovskiy).
  • Исправлена ошибка LOGICAL_ERROR “Trying to get name of not a column: ExpressionList”, возникавшая в запросах, передающих звёздочку внутри multiIf в качестве аргумента табличной функции, например numbers(multiIf(*, ...), 2). Теперь запрос отклоняется с ошибкой UNSUPPORTED_METHOD, если сопоставитель не удаётся разрешить. #106647 (groeneai).
  • Отклоняются некорректные glob-шаблоны file, которые могли вызвать неограниченную рекурсию при перечислении содержимого каталога. Теперь максимальная глубина рекурсии ограничена 1000; при её превышении запрос завершается ошибкой TOO_DEEP_RECURSION вместо аварийного завершения сервера из-за переполнения стека. #106676 (groeneai).
  • Исправлено исключение 'Trying to read from input() twice.', возникавшее, когда табличная функция input обёрнута в нематериализованный CTE, на который ссылаются из нескольких мест запроса. Теперь на этапе планирования запрос отклоняется с понятной ошибкой INVALID_USAGE_OF_INPUT. input — однократно читаемый клиентский поток, который может использоваться только одним источником в плане запроса. #106682 (groeneai).
  • Исправлена несогласованность столбцов при возникновении исключения (например, MEMORY_LIMIT_EXCEEDED) во время парсинга, которая позднее приводила к LOGICAL_ERROR. #106802 (azat).
  • Исправлен сбой сервера (SIGSEGV) при чтении усечённых данных Protobuf с input_format_allow_errors_num > 0. #106905 (atsarevskiy).
  • Исправлен сбой сервера (разыменование нулевого указателя) при выполнении TRUNCATE или DROP для таблицы EmbeddedRocksDB, дескриптор RocksDB которой был освобождён, например таблицы read_only, каталог данных которой был очищен предыдущим TRUNCATE. #106940 (groeneai).
  • Исправлено исключение (std::length_error, сообщаемое как LOGICAL_ERROR) при чтении из табличной функции *Cluster, такой как urlCluster, при очень большом значении настройки max_streams_for_files_processing_in_cluster_functions. Количество потоков теперь ограничено разумным значением. #106946 (groeneai).
  • Исправлено аварийное завершение сервера, когда распределённый запрос отменялся непосредственно перед отправкой на шард. #106950 (groeneai).
  • Исправлено исключение сервера (логическая ошибка this->visited_views == right->visited_views) при выполнении INSERT, когда два materialized view одной исходной таблицы записывают данные в одну целевую таблицу, а зависимое представление читает эту целевую таблицу при включенной настройке materialized_views_squash_parallel_inserts. #107027 (groeneai).
  • Исправлено исключение LOGICAL_ERROR при вставке в таблицу DeltaLake со столбцами, не соответствующими её схеме записи (например, столбец Nested, разворачивающийся в подстолбцы, или табличная функция с явно заданным подмножеством столбцов). Теперь такие вставки завершаются ошибкой INCOMPATIBLE_COLUMNS, понятной пользователю. #107058 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (“Table expression … data must be initialized”), возникавшая, когда квалифицированный сопоставитель со звёздочкой (например, x.*) ссылался по имени на рекурсивное CTE внутри собственного рекурсивного члена. Теперь такие сопоставители разворачивают столбцы рекурсивной таблицы, как уже делают в этой позиции квалифицированный столбец (x.a) или неквалифицированный сопоставитель (*). #107144 (groeneai).
  • Исправлено исключение LOGICAL_ERROR (“Unexpected exception in refresh scheduling”), которое могло приводить к циклическим сбоям сервера при перезапуске, если refreshable materialized view имеет зависимость REFRESH ... DEPENDS ON <name>, неквалифицированное имя которой совпадает с именем временной таблицы или CTE. #107156 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (Variant N (T) has size X, but expected Y), возникавшая, когда функция, например toString или concat, применяется к столбцу Variant или Dynamic, содержащему один непустой вариант и значения NULL, а функция возвращает входной столбец без изменений. #107374 (groeneai).
  • Исправлена ошибка LOGICAL_ERROR (block.rows() == getRows()), возникавшая при асинхронном INSERT в таблицу Alias, если была включена настройка use_strict_insert_block_limits. #107400 (groeneai).
  • Исправлено исключение сервера (Logical error: Not-ready Set is passed as the second argument for function 'in'), возникавшее, когда ключевое выражение (ORDER BY, PRIMARY KEY, PARTITION BY или пропускающий INDEX) содержало оператор IN с таблицей в правой части, например ORDER BY (x IN some_table). Такие ключевые выражения теперь отклоняются при создании таблицы. #107424 (groeneai).
  • Исправлен редкий сбой сервера при обработке DISTINCT, который мог возникать при ошибке выделения памяти (например, при достижении лимита памяти) во время инициализации набора уникальных ключей. #107467 (groeneai).
  • Исправлены сбои операций DeltaLake после истечения срока действия временных учётных данных S3: перед следующей операцией теперь обновляются кэшированные учётные данные. Учётные данные STS для assume-role также обновляются после сбоев аутентификации. #107480 (ahmadov).
  • Исправлена ошибка Not-ready Set is passed as the second argument for function 'in' (LOGICAL_ERROR), возникавшая при выполнении запроса к таблице с ключом PARTITION BY и подзапросом IN/NOT IN, заключённым в более крупное выражение, например WHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai).
  • Исправлено падение (разыменование нулевого указателя), которое могло произойти при локальном выполнении распределённого плана запроса (make_distributed_plan + distributed_plan_execute_locally) с log_formatted_queries = 1. #107570 (groeneai).
  • Исправлено падение сервера при чтении materialized view, целевой таблицей которой является Distributed, если запрос выполняется с enable_analyzer = 0. #107653 (groeneai).
  • Исправлено падение сервера (SIGSEGV) при чтении данных Protobuf с input_format_allow_errors_num > 0, когда в том же блоке корректное сообщение предшествует некорректному, которое можно пропустить. #107739 (atsarevskiy).
  • Исправлено зависание табличных функций odbc и jdbc на несколько минут и игнорирование отмены запроса (KILL QUERY, max_execution_time), если bridge перестаёт отвечать при определении структуры удалённой таблицы. #107809 (alexey-milovidov).
  • Исправлено возможное падение (разыменование нулевого указателя), когда переопределение database/db именованной коллекции, переданной в remote()/remoteSecure(), не является константным именем базы данных, например remote(nc, database = (SELECT 1)). Теперь вместо падения запрос завершается с понятной ошибкой. #108271 (groeneai).
  • Запросы векторного поиска, выбирающие данные из столбца _distance, теперь возвращают корректную ошибку вместо сбоя с LOGICAL_ERROR. #108423 (rschu1ze).
  • Исправлено возможное падение (переполнение буфера кучи), когда столбец состояния агрегатной функции семейства quantileTDigest использовался в качестве ключа GROUP BY и одновременно сериализовался несколькими потоками. #110263 (groeneai).
  • Исправлено некорректное отсечение данных при анализе индекса первичного ключа в таблицах с обратным (убывающим) ключом сортировки (ORDER BY (g, r DESC)). Гранула, охватывающая изменение ведущего ключевого столбца, за которым следует убывающий ключевой столбец, могла быть ошибочно отсечена, из-за чего исключались совпадающие строки. #111059 (nihalzp).
  • Исправлена логическая ошибка block.rows() == getRows() (чтение за пределами массива и нарушение дедупликации вставок в release-сборках), возникавшая, когда INSERT проходит через зависимое materialized view, целевой таблицей которого является Alias, а его внутренний запрос изменяет количество строк, при этом за псевдонимом доступна таблица с дедупликацией. #111103 (alexey-milovidov).
  • Исправлен segfault из-за обращения к памяти за пределами массива при десериализации некорректного состояния агрегатной функции, содержащего значение String. Теперь такие состояния проверяются и отклоняются, а не приводят к segfault. #111606 (mstetsyuk).
  • Исправлено падение при чтении файла Parquet с несогласованными метаданными bloom filter. Такие файлы также могли незаметно возвращать меньше строк, чем должны. #112498 (tiandiwonder).
  • Исправлены segfault и скрытое повреждение данных при добавлении данных командой INSERT в непустой файл через движок File или табличную функцию file в формате, не поддерживающем добавление, например Avro. Запись через файловый дескриптор или путь с партициями обходила существующую проверку: префикс формата не записывался, а после уже существующих байтов записывался второй заголовок, из-за чего файл становился нечитаемым. Теперь такой INSERT отклоняется с ошибкой CANNOT_APPEND_TO_FILE, как и при использовании обычного пути. #112839 (groeneai).
  • Исправлено зависание DROP TABLE и SYSTEM STOP VIEW, если refreshable materialized view блокировалось при планировании запроса на обновление. #113188 (evillique).
  • Исправлено редкое аварийное завершение сервера, возникавшее, когда элементы очереди асинхронной вставки имели одинаковые дедлайны. #113363 (mstetsyuk).
  • Исправлено повреждение памяти кучи при чтении Parquet через входной формат, владеющий собственным буфером чтения, например через словарь с SOURCE(FILE(... format 'Parquet')). Фоновые задачи предвыборки и декодирования могли продолжать читать и записывать через буфер после его освобождения конвейером, что могло привести к аварийному завершению сервера. #114668 (groeneai).
  • Исправлено зависание при удалении таблицы TimeSeries, имя которой лексикографически предшествует именам её внутренних таблиц, например таблицы с именем -ts, а также при удалении materialized view, объявленного с ENGINE = TimeSeries. Операция удаления приводила к взаимоблокировке с самой собой на DDL-защите, и её нельзя было отменить с помощью KILL QUERY. #114953 (groeneai).

Другие исправления ошибок

  • Функции like, ilike, notLike, notILike и match теперь поддерживают постоянную строку поиска с непостоянным шаблоном (например, 'foo' LIKE pattern_column), что ранее приводило к ошибке ILLEGAL_COLUMN. #100479 (Onyx2406).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK при выборке из VIEW над таблицей с обычной проекцией. #101218 (amosbird).
  • Теперь отклоняются отрицательные значения Float64 (например, -100.5) в настройках рабочей нагрузки, таких как max_bytes_per_second, max_cpus и т. д. Ранее проверялись только отрицательные целые числа, поэтому отрицательные числа с плавающей запятой могли незаметно создавать неисправные узлы планировщика. #101842 (groeneai).
  • Чтение из объектного хранилища теперь оперативно реагирует на отмену запроса. #103016 (SmitaRKulkarni).
  • Исправлено незаметное игнорирование input_format_max_block_size_bytes при разборе INSERT, когда max_insert_block_size_bytes равен 0 (значение по умолчанию). Теперь эта настройка корректно ограничивает размер блоков, создаваемых входными форматами строк. #103068 (Fgrtue).
  • Исправлена периодическая генерация ClickHouse недопустимых токенов GSSAPI из-за некорректного удаления завершающих null-байтов. #103114 (EmeraldShift).
  • EXPLAIN SYNTAX разворачивает параметризованные представления. #103263 (jrdi).
  • Исправлено повреждение данных при записи Parquet (и других форматов с трейлером, таких как ORC и Arrow) в HDFS через INSERT INTO FUNCTION hdfs(...). Начиная с версии 26.1, WriteBufferFromHDFS не сбрасывал рабочий буфер при finalize(), из-за чего последние до DBMS_DEFAULT_BUFFER_SIZE байтов каждого файла незаметно терялись, включая нижний колонтитул Parquet PAR1. При чтении таких файлов возвращалась ошибка Not a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai).
  • Исправлены неверные результаты и возможная логическая ошибка в коррелированных подзапросах, когда ограничение размера JOIN (max_rows_in_join / max_bytes_in_join) задано вместе с join_overflow_mode = 'break'. JOIN, внутренне создаваемый для вычисления коррелированного подзапроса, теперь игнорирует эти пользовательские ограничения и больше не может преждевременно остановиться и отбросить строки. #103322 (groeneai).
  • Исправлены неверные результаты или неиспользование проекции, когда агрегатная проекция содержит несколько агрегатов sumIf с разными условиями IN (...). #104765 (Ergus).
  • Исправлено, что deltaSumTimestamp возвращала неверные результаты для знаковых целочисленных типов при переходе через ноль. #104830 (thevar1able).
  • Исправлена ошибка Logical error: 'Metadata is not initialized', возникавшая при DELETE FROM для только что подключённой таблицы Iceberg, DeltaLake или Hudi, файл метаданных которой повреждён или не может быть загружен. Вместо неё теперь возвращается обычное пользовательское исключение, а сервер продолжает работу. #104917 (groeneai).
  • Запросы ATTACH TABLE name <clauses>;, содержащие секции хранения (ORDER BY, PARTITION BY, PRIMARY KEY, SAMPLE BY, TTL, UNIQUE KEY или SETTINGS движка), но без ENGINE, теперь завершаются ошибкой BAD_ARGUMENTS вместо того, чтобы молча повторно подключать таблицу с сохранённым определением и игнорировать указанные пользователем секции. Сессионные SETTINGS уровня запроса (например, log_comment) по-прежнему применяются. Используйте ATTACH TABLE t; для повторного подключения с сохранёнными метаданными или ALTER TABLE t MODIFY SETTING ... после ATTACH, чтобы изменить настройки. #105068 (groeneai).
  • Исправлены переполнение буфера кучи при чтении файлов Arrow или ArrowStream с повреждёнными промежуточными смещениями в двоичном или строковом столбце, а также разыменование нулевого указателя при чтении геотегированных столбцов Arrow. #105449 (Algunenano).
  • Исправлено аварийное завершение работы сервера при чтении подстолбцов Dynamic из сжатой таблицы Memory после ALTER. #105464 (Avogar).
  • skip_first_lines добавлен в ключ кеша схемы для форматов WithNames. #105469 (Avogar).
  • Исправлена функция histogram, возвращавшая неверные результаты для небольших неотсортированных входных данных. #105548 (Avogar).
  • Исправлено использование таблицы вставки в табличных функциях при включённом optimize_trivial_insert_select. #105555 (Avogar).
  • Исправлена оконная функция estimateCompressionRatio, терявшая накопленные данные между строками. #105581 (Avogar).
  • Извлечение значений Hive-партиций теперь учитывает настройку cast_string_to_date_time_mode и по умолчанию принимает в ключах партиционирования временные метки ISO 8601 с суффиксами часового пояса (например, +0000, +00:00, Z). #105584 (alexey-milovidov).
  • Исправлено восстановление после ошибок во входном формате Template при обработке некорректных строк. #105735 (niyue).
  • Исправлено форматирование SYSTEM INSTRUMENT ADD: аргументы обработчика теперь разделяются одним пробелом. Также теперь отклоняются недопустимые списки аргументов инструментации SLEEP, содержащие более двух значений или диапазон, в котором минимум больше максимума. #105984 (pamarcos).
  • Исправлено молчаливое завершение сбоем операций ALTER TABLE с партициями при ключах партиционирования типа Bool. #106004 (Avogar).
  • Исправлены JSONExtractRaw и JSONHas для типизированных JSON-путей со значениями по умолчанию. #106005 (Avogar).
  • Исправлен лишний префикс / для пустых базовых путей в конфигурациях озёр данных. #106013 (thewisenerd).
  • Исправлена ситуация, когда system.dictionaries возвращала 0 строк при частичном отзыве права SHOW DICTIONARIES. #106105 (Avogar).
  • Исправлены некорректные результаты запросов к таблицам, в ORDER BY которых используется монотонно убывающая функция, например (c0 / -42) или intDiv(c0, -42). Предикаты по исходному столбцу (например, c0 < 0) могли ошибочно отбрасывать гранулы с подходящими строками, что приводило к отсутствию части результатов. #106136 (nihalzp).
  • Добавлена валидация некорректных состояний агрегатной функции DDSketch при вставке. #106236 (yariks5s).
  • Исправлена согласованность кэша файловой системы после неудачного понижения версии SLRU, предотвращающая зависание записей в состоянии вытеснения. Также исправлены изменение размера разделённого кэша System/Data и очистка свободного пространства: теперь лимиты обновляются атомарно, а пространство может быть освобождено в обоих сегментах кэша. #106286 (kssenii).
  • Исправлено некорректное преобразование субнормальных значений Float16 в Float32 (например, при чтении из файлов Numpy .npy), вызванное сдвигом мантиссы на единицу. #106343 (jh0x).
  • Исправлена функция regexpExtract(haystack, pattern): шаблоны без захватывающей группы теперь возвращают полное совпадение вместо генерации ошибки INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai).
  • Исправлена логическая ошибка при построении словаря полигонов из исходных данных, содержащих NaN или бесконечные координаты точек. Такие координаты теперь отклоняются с понятным сообщением об ошибке. #106423 (alexey-milovidov).
  • HTTP-словари теперь могут указывать заголовки запросов через именованные коллекции. #106459 (ZelvaMan).
  • Некорректные значения перечислений Avro теперь проверяются и отклоняются с исключением вместо того, чтобы вызывать чтение памяти за пределами допустимой области и завершение работы сервера. #106476 (mstetsyuk).
  • Исправлено поведение LIMIT WITH TIES и дробного LIMIT WITH TIES, которые не учитывали collation из ORDER BY ... COLLATE при определении совпадающих строк. Строки, равные согласно collation (например, '1' и '01' при числовой collation), сравнивались побайтно, поэтому некоторые совпадающие строки ошибочно исключались из результата. #106539 (nihalzp).
  • Исправлены оптимизации DISTINCT по порядку и LIMIT BY по порядку (включая отрицательный LIMIT BY), которые возвращали неверные результаты, если входные данные были отсортированы с collation (ORDER BY ... COLLATE). Строки, равные согласно collation (например, 'a' и 'A' при регистронезависимой collation), упорядочиваются по ключу collation и не располагаются рядом по значению, поэтому оптимизация по порядку теперь пропускается при использовании collator. #106564 (nihalzp).
  • Исправлено состояние гонки при завершении работы consumer NATS, которое могло привести к завершению работы сервера. #106692 (mstetsyuk).
  • Исправлены многочисленные проблемы с безопасностью памяти и исчерпанием ресурсов в ридерах форматов, доступных через недоверенный ввод: чтение за границами кучи при обработке длины уровней определения и повторения DataPageV2 в нативном ридере Parquet, переполнение стека в файлах Parquet с глубоко вложенными схемами, а также выделения памяти, игнорировавшие max_memory_usage при разборе геометрии GeoParquet WKB/WKT и строк/байтов Avro. #106739 (Algunenano).
  • Исправлена отправка незашифрованных HTTP-ответов HTTPS-клиентам через keeper_server.http_control.secure_port. Теперь защищённый порт корректно обслуживает HTTPS. #106822 (linjiayu1025-collab).
  • Исправлен вывод restrictive/permissive в нижнем регистре вместо верхнего в SHOW CREATE ROW POLICY, не согласованный с другими ключевыми словами. #106865 (valerypetrov).
  • Исправлена ошибочная пометка частей как повреждённых и их отключение при любой перезагрузке частей (перезапуске сервера, DETACH или ATTACH) в таблицах со столбцом LowCardinality(Nullable(...)) в ключе партиционирования. Начиная с версии 26.5, файл индекса minmax для каждой части не записывался, если минимум и максимум такого столбца были NULL, хотя проверка целостности части по-прежнему требовала наличия этого файла. В частях, записанных затронутыми версиями, отсутствует файл индекса minmax, поэтому их всё ещё необходимо повторно подключать вручную. #106945 (PedroTadim).
  • Исправлено: elapsed_us всегда был равен нулю, а значения read_rows/read_bytes занижались в system.processors_profile_log и system.query_log для запросов сброса буфера асинхронной вставки (AsyncInsertFlush). #106982 (cwurm).
  • Исправлена логическая ошибка Block structure mismatch in UnionStep stream (аварийное завершение сервера в отладочных сборках и сборках с санитайзерами, Code: 49 в релизных сборках), возникавшая, когда одна ветвь UNION/INTERSECT/EXCEPT читала столбец с сериализацией Sparse, а другая — тот же столбец в полной сериализации (например, при записи в materialized view). #107041 (groeneai).
  • Исправлен некорректный порядок строк в запросах с ORDER BY к UNION ALL при включённых optimize_read_in_order и read_in_order_use_virtual_row. #107053 (vdimir).
  • Исправлена синтаксическая ошибка, возникавшая, когда предложение FORMAT, SETTINGS или INTO OUTFILE следовало за SHOW ROW POLICIES или SHOW MASKING POLICIES (например, SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai).
  • Исправлено возникновение TOO_LARGE_STRING_SIZE в trimLeft, trimRight и trimBoth (а также в псевдонимах ltrim, rtrim, trim), когда пользовательский набор символов для обрезки содержал более 16 символов. Наборы символов для обрезки любой длины теперь снова поддерживаются. #107071 (fm4v).
  • Исправлено переполнение знакового целого числа в quantileExactExclusive, quantilesExactExclusive, quantileExactInclusive и quantilesExactInclusive, которое могло приводить к неверному результату для значений Int64 из большого диапазона. #107154 (groeneai).
  • Перезагрузка конфигурации больше не запускает стартовые скрипты повторно, предотвращая повторное выполнение однократных действий при запуске. #107187 (mstetsyuk).
  • Исправлен некорректный порядок результатов для ORDER BY с UNION ALL при включённом optimize_read_in_order, когда конвейер UNION сужался из-за настройки max_streams_for_union_step; теперь сужение не выполняется, если план использует отсортированные выходные потоки UNION. #107208 (vdimir).
  • Исправлено возможное разыменование нулевого указателя при разрешении конфигурации прокси на позднем этапе остановки сервера. #107231 (PedroTadim).
  • Исправлено появление лишних строк при использовании ORDER BY ... WITH FILL, если столбец ORDER BY перед заполняемым столбцом использует collation COLLATE. Теперь строки группируются по префиксу сортировки с учётом этой collation, в соответствии с порядком сортировки. #107365 (groeneai).
  • Исправлено неопределённое поведение при передаче неконечного значения с плавающей точкой (например, nan или inf) в качестве аргумента временной метки или длительности табличных функций prometheusQuery / prometheusQueryRange. Теперь такой аргумент вызывает ошибку BAD_ARGUMENTS, а не приводит к некорректной временной метке. #107417 (groeneai).
  • Исправлены неверные результаты оптимизации optimize_rewrite_aggregate_function_with_if для агрегатных функций, сохраняющих значения NULL (семейство *_respect_nulls: anyRespectNulls, first_value_respect_nulls, anyLast_respect_nulls, last_value_respect_nulls). Оптимизация больше не преобразует f(if(cond, x, NULL)) в форму -If для таких функций. #107430 (groeneai).
  • Добавлена проверка некорректно сформированных границ во входных данных ORC. #107580 (al13n321).
  • Устранена возможность неаутентифицированной атаки типа «отказ в обслуживании» с исчерпанием памяти через порт протокола MySQL. #107599 (tiandiwonder).
  • Исправлена невозможность использования интерфейса MySQL с MySQL Connector/J 8.2.0 и более новыми версиями, включая 9.x. Поле info пакета OK теперь кодируется с указанием длины, как на сервере MySQL, поэтому JDBC-драйвер может подключаться. #107693 (alexey-milovidov).
  • Исправлена логическая ошибка Block structure mismatch in UnionStep stream (аварийное завершение сервера в отладочных сборках и сборках с sanitizer, Code: 49 в релизных сборках), возникавшая, когда соседние ветви UNION/INTERSECT/EXCEPT различались только предикатом WHERE, а предикат одной из ветвей сворачивался в константный столбец Const. #107719 (groeneai).
  • Чтение данных Arrow и ArrowStream с пустыми столбцами String или Binary, созданными Apache Arrow Java до версии 19.0.0, включая Apache Spark, больше не вызывает ошибку INCORRECT_DATA. #107764 (Algunenano).
  • Некорректно сформированные блоки Native, в которых дискриминатор Variant ссылается на несуществующий вариант, теперь безопасно отклоняются. #107991 (uwezkhan).
  • Исправлена регрессия производительности при чтении столбцов Dynamic несколькими потоками. #107997 (Avogar).
  • Устаревшая настройка озера данных storage_catalog_url теперь корректно отклоняется проверкой каталога (ранее проверялись только storage_catalog_type и storage_aws_access_key_id), а сообщение об ошибке содержит список всех устаревших настроек. #108040 (alexey-milovidov).
  • Исправлена ошибка, из-за которой табличная функция/движок ArrowFlight отклоняла именованную коллекцию без необязательного ключа dataset с сообщением No such key 'dataset'. #108041 (alexey-milovidov).
  • Секреты и учетные данные теперь маскируются в system.query_views_log.view_query, а не отображаются в SQL представления, записанном в журнал. #108214 (Fidelaggio).
  • Исправлена ошибка, из-за которой type_json_allow_duplicated_key_with_literal_and_nested_object не работала с типизированными путями в JSON. #108218 (Avogar).
  • Исправлено неопределенное поведение (нулевой указатель передавался в memcpy) в функциях detectCharset и detectLanguageUnknown, когда входная строка превышает 32768 байт и определить кодировку невозможно. #108250 (groeneai).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK в запросах, использующих виртуальные столбцы _part_starting_offset/_part_offset в WHERE вместе с отложенной материализацией. #108287 (vdimir).
  • Скрыты секретные аргументы таких функций, как encrypt, decrypt и HMAC, в выводе EXPLAIN actions, EXPLAIN header и EXPLAIN PIPELINE, если параметр format_display_secrets_in_show_and_select отключен (по умолчанию). #108386 (Algunenano).
  • CREATE OR REPLACE теперь успешно выполняется для refreshable materialized view, если целевой объект TO уже принадлежит этому же представлению. Целевые объекты, принадлежащие другому представлению, по-прежнему отклоняются. #108392 (evillique).
  • Путь к модели для catboostEvaluate ограничен каталогом user_files, как и для file() и источников словарей. Ранее функция принимала произвольный путь в файловой системе без проверки нахождения в этом каталоге, что позволяло проверять существование файлов за пределами user_files и инициировать их чтение. Теперь модели должны находиться в user_files. #108463 (groeneai).
  • Исправлена ошибка, из-за которой CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE не подписывал новое представление на исходную таблицу, что приводило к незаметному отбрасыванию всех строк, вставленных после замены. #108728 (alexey-milovidov).
  • Исправлена ошибка сегментации при слиянии состояний агрегатной функции uniqExact с GROUPING SETS, ROLLUP или CUBE при max_threads > 1. #108928 (Algunenano).
  • Исправлена возможная логическая ошибка “Unexpected substream … for column …” при обновлении настройки compatibility. #109496 (Avogar).
  • Функция getClientHTTPHeader теперь обрабатывает имена заголовков регистронезависимо в соответствии с RFC 9110; в частности, заголовок authorization теперь отфильтровывается независимо от регистра. #109791 (Felixoid).
  • Исправлена незаметная потеря данных при асинхронных вставках и дедупликации (async_insert=1, async_insert_deduplicate=1). Когда несколько записей асинхронной вставки с разными значениями insert_deduplication_token объединялись в один flush, записывающий данные в непересекающиеся партиции, каждый токен регистрировался в журнале дедупликации всех затронутых flush партиций, а не только той партиции, в которую попадали соответствующие строки. В результате последующая вставка, повторно использующая один из этих токенов в партиции, в которую он никогда не записывался, незаметно дедуплицировалась. Теперь токены регистрируются только для партиции, в которую фактически попали их строки. #111049 (groeneai).
  • Исправлена асинхронная вставка в формате Native: теперь одна буферизованная запись, ставшая несовместимой после ALTER ... MODIFY COLUMN, не приводит к сбою всего пакета. #111108 (Felixoid).
  • Исправлено выполнение CREATE OR REPLACE для словаря с объектом другого типа: ранее оно завершалось ошибкой CANNOT_DETACH_DICTIONARY_AS_TABLE уже после фиксации замены, оставляя временную таблицу _tmp_replace_* без связей. #111142 (evillique).
  • Исправлена утечка памяти сертификата удалённого узла при TLS-рукопожатиях с включённой проверкой сертификатов. #111425 (thevar1able).
  • Исправлена логическая ошибка Block structure mismatch in IntersectOrExceptStep stream: different number of columns, которая могла возникать, когда оптимизация разделения фильтра (query_plan_split_filter) применялась к условию WHERE, в котором имя столбца фильтра совпадало с именем входного столбца. Оптимизация оставляла внутренний столбец __split_filter в заголовке выходных данных ветви, из-за чего он отличался от заголовка соседней ветви операции над множествами, например INTERSECT или UNION. #111930 (groeneai).
  • Исправлены некорректные результаты для фильтров или выражений ORDER BY, использующих toString со значениями Time, Time64 или DateTime в часовых поясах с переходом на летнее время. Также восстановлена оптимизация чтения в порядке сортировки для ORDER BY по префиксу ключа сортировки таблицы и для преобразований из String в Nullable(String). #113291 (vdimir).
  • Исправлено выполнение ATTACH таблицы Kafka, когда kafka_num_consumers превышает ограничение, рассчитанное на основе количества ядер CPU. #113390 (evillique).
  • Отключён распределённый анализ индекса при использовании проекций, чтобы предотвратить некорректные результаты запроса. #115132 (azat).
  • Исправлена ошибка в функции formatRowNoNewline, которая могла приводить к некорректным результатам или логической ошибке при форматировании строки в пустой результат. #115669 (alexey-milovidov).
  • Устранён возврат неинициализированной памяти в результате двоичного строкового литерала, длина которого не кратна восьми, а также декомпрессором LZ4, когда сжатый блок не содержит тела. #115704 (alexey-milovidov).
  • Пути объектов включены в хеши дедупликации, чтобы предотвратить ошибочную дедупликацию значений разных объектов. #115866 (Felixoid).
Последнее изменение 26 сентября 2026 г.