Обратно несовместимые изменения
Изменения в запросах и синтаксисе
- Оконные функции
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больше не проверяет IDasync_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и настройкуMergeTreeallow_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. Также доступны под псевдонимами PostGISST_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).
Движки таблиц и хранилище
Настройки и конфигурация
- Добавлена настройка
output_format_always_write_decimal_point_in_float_and_decimal, которая всегда выводит десятичную точку для чисел с плавающей запятой иDecimalв текстовых форматах, даже если значение является целым числом. Например, выводится1.вместо1. По умолчанию отключена. #62614 (qoega). - Добавлена новая неизменяемая настройка
MergeTreeallow_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 UDFwebassembly_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теперь может использовать алгоритм JOINparallel_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. По умолчанию она включена: столбцы PostgreSQLdate/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), в соответствии с существующим синтаксисом DDLCREATE 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_settingsKeeper для ограничения допуска незафиксированных записей журнала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, HTTP5xx/408/429) с экспоненциальной задержкой вместо отмены INSERT при первом сбое сети. Новые настройкиformat_avro_schema_registry_max_retries(по умолчанию5) иformat_avro_schema_registry_retry_initial_backoff_ms(по умолчанию100) определяют эту политику. Ошибки валидации схемы (HTTP409, некорректный 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теперь сопоставляет столбцы PostgreSQLnumeric(p, 0)с точностью больше 76 (например,numeric(78, 0), используемый для 256-битных целых чисел) с ClickHouseInt256вместо сбоя с сообщением “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 вложен под JOINPASTE/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приANYJOIN с таблицей движка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 … betweenConvertingTransformandRemovingReplicatedColumnsTransform”), возникавшая при вставке в 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-onlyALTER 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, поэтому RPNKeyConditionкаждого индекса соответствует 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 в
Icebergv2 возвращали неверные строки, когда один файл удаления ссылался на несколько файлов данных и к одному файлу данных применялось несколько файлов удаления. Теперь записи об удалении фильтруются по пути к файлу, на который они ссылаются. #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-сущности≫⃒или≪⃒, воспроизводимое любым пользователем с одной привилегией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), возникавшее, когдаMATERIALIZEDCTE с коррелированным подзапросом в теле использовался в правой части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байтов каждого файла незаметно терялись, включая нижний колонтитул ParquetPAR1. При чтении таких файлов возвращалась ошибка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 перед заполняемым столбцом использует collationCOLLATE. Теперь строки группируются по префиксу сортировки с учётом этой 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/J8.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).