Перейти к основному содержанию
Перейти к основному содержанию

Журнал изменений за 2024 год

Содержание

Релиз ClickHouse v24.12, 2024-12-19
Релиз ClickHouse v24.11, 2024-11-26
Релиз ClickHouse v24.10, 2024-10-31
Релиз ClickHouse v24.9, 2024-09-26
Релиз ClickHouse v24.8 LTS, 2024-08-20
Релиз ClickHouse v24.7, 2024-07-30
Релиз ClickHouse v24.6, 2024-07-01
Релиз ClickHouse v24.5, 2024-05-30
Релиз ClickHouse v24.4, 2024-04-30
Релиз ClickHouse v24.3 LTS, 2024-03-26
Релиз ClickHouse v24.2, 2024-02-29
Релиз ClickHouse v24.1, 2024-01-30
Журнал изменений за 2023 год

Релиз ClickHouse 24.12 от 2024-12-19. Презентация, Видео

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

  • Функции greatest и least теперь игнорируют значения аргументов, равные NULL, тогда как ранее они возвращали NULL, если один из аргументов был NULL. Например, SELECT greatest(1, 2, NULL) теперь возвращает 2. Это делает поведение совместимым с PostgreSQL, но при этом нарушает совместимость с MySQL, который возвращает NULL. Чтобы сохранить предыдущее поведение, установите значение настройки least_greatest_legacy_null_behavior (по умолчанию: false) в true. #65519 #73344 (kevinyhzou).
  • Новая интеграция с MongoDB теперь используется по умолчанию. Пользователи, которые предпочитают использовать устаревший драйвер MongoDB (на основе драйвера Poco), могут включить серверную настройку use_legacy_mongodb_integration. #73359 (Kirill Nikiforov.

Новая функция

  • Перевели типы JSON/Dynamic/Variant из разряда экспериментальных в стадию beta. #72294 (Pavel Kruglov). Также мы перенесли все исправления, включая это изменение, в 24.11.
  • Эволюция схемы для формата хранения данных Iceberg предоставляет пользователю широкие возможности по изменению схемы своей таблицы. Порядок столбцов, имена столбцов и простые расширения типов могут меняться прозрачно для пользователя. #69445 (Daniil Ivanik).
  • Интеграция с Iceberg REST Catalog: новый движок базы данных Iceberg, который встраивает весь каталог в ClickHouse. #71542 (Kseniia Sumarokova).
  • Добавлен кэш для первичного индекса таблиц MergeTree (может быть включен настройкой таблицы use_primary_key_cache). Если для первичного индекса включены ленивая загрузка и кэш, он будет загружаться в кэш по требованию (аналогично кэшу меток), вместо того чтобы постоянно находиться в памяти. Добавлен предварительный прогрев первичного индекса при вставках/слияниях/выборках частей данных и при перезапусках таблицы (может быть включен настройкой prewarm_primary_key_cache). Это позволяет снизить использование памяти для огромных таблиц на общем хранилище; мы протестировали это на таблицах с более чем одним квадриллионом записей. #72102 (Anton Popov). #72750 (Alexander Gololobov).
  • Реализована команда SYSTEM LOAD PRIMARY KEY для загрузки первичных индексов всех частей указанной таблицы или всех таблиц, если таблица не указана. Это полезно для бенчмарков и для предотвращения дополнительной задержки при выполнении запросов. #66252 #67733 (ZAWA_ll).
  • Добавлен запрос, позволяющий подключать таблицы MergeTree в виде ReplicatedMergeTree и наоборот: ATTACH TABLE ... AS REPLICATED и ATTACH TABLE ... AS NOT REPLICATED. #65401 (Kirill).
  • Добавлена новая настройка http_response_headers, позволяющая настраивать HTTP-заголовки ответа. Например, вы можете указать браузеру отобразить изображение, хранящееся в базе данных. Это закрывает #59620. #72656 (Alexey Milovidov).
  • Добавлена функция toUnixTimestamp64Second, которая преобразует DateTime64 в значение Int64 с фиксированной точностью до секунды, благодаря чему можно возвращать отрицательные значения, если дата предшествует эпохе Unix. #70597 (zhanglistar). #73146 (Robert Schulze).
  • Добавлена новая настройка enforce_index_structure_match_on_partition_manipulation, позволяющая выполнять ATTACH, когда множество проекций и вторичных индексов исходной таблицы является подмножеством соответствующих объектов в целевой таблице. Закрыт #70602. #70603 (zwy991114).
  • Добавлен синтаксис ALTER USER {ADD|MODIFY|DROP SETTING}, ALTER USER {ADD|DROP PROFILE}, а также для ALTER ROLE и ALTER PROFILE. Теперь вместо замены всего набора настроек можно изменять их по отдельности. #72050 (pufit).
  • Добавлена функция arrayPRAUC, которая вычисляет AUC (Area Under the Curve, площадь под кривой) для precision–recall-кривой. #72073 (Emmanuel).
  • Добавлена функция indexOfAssumeSorted для массивов. Оптимизирует поиск в массивах, отсортированных в неубывающем порядке. Эффект заметен на очень больших массивах (более 100 000 элементов). #72517 (Eric Kurbanov).
  • Добавлена возможность использовать разделитель в качестве необязательного второго аргумента агрегатной функции groupConcat. #72540 (Yarik Briukhovetskyi).
  • Функция translate теперь поддерживает удаление символов, если в аргументе from указано больше символов, чем в аргументе to. Пример: SELECT translate('clickhouse', 'clickhouse', 'CLICK') теперь возвращает CLICK. #71441 (shuai.xu).

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

  • Новая настройка MergeTree allow_experimental_reverse_key, которая включает поддержку убывающего порядка сортировки в ключах сортировки MergeTree. Это полезно для анализа временных рядов, особенно для TopN‑запросов. Пример использования: ENGINE = MergeTree ORDER BY (time DESC, key) — порядок по убыванию для поля time. #71095 (Amos Bird).

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

  • Перестановка JOIN. Добавлен параметр для выбора стороны JOIN, которая будет выступать в роли внутренней (build) таблицы в плане запроса. Это контролируется настройкой query_plan_join_swap_table, которую можно установить в значение auto. В этом режиме ClickHouse попытается выбрать таблицу с наименьшим количеством строк. #71577 (Vladimir Cherkasov).
  • Теперь алгоритм parallel_hash будет использоваться (когда применимо), если параметр join_algorithm имеет значение default. Две предыдущие альтернативы (direct и hash) по-прежнему учитываются, если parallel_hash не может быть использован. #70788 (Nikita Taranov).
  • Добавлена опция, позволяющая извлекать общие выражения из условий WHERE и ON, чтобы уменьшить количество хэш-таблиц, используемых при выполнении операций JOIN. Это имеет смысл, когда условие JOIN ON содержит общие части, объединённые оператором AND, в разных ветках OR. Можно включить параметром optimize_extract_common_expressions = 1. #71537 (János Benjamin Antal).
  • Позволяет использовать индексы в операторе SELECT, когда индексированный столбец приводится (CAST) к типу LowCardinality(String), что может происходить, когда запрос выполняется над таблицей Merge, где в одних таблицах столбец имеет тип String, а в других — LowCardinality(String). #71598 (Yarik Briukhovetskyi).
  • Во время выполнения запросов с параллельными репликами и включённым локальным планом выполнения анализ индексов на рабочих узлах не выполняется. Координатор выбирает диапазоны для чтения рабочими узлами, основываясь на анализе индексов на своей стороне (на инициаторе запроса). Это позволяет коротким запросам с параллельными репликами достигать такой же низкой задержки, как и одновузловые запросы. #72109 (Igor Nikonov).
  • Использование памяти при выполнении команды clickhouse disks remove --recursive уменьшено для дисков объектного хранилища. #67323 (Kirill).
  • Вернули оптимизацию для чтения подстолбцов одного столбца в компактных частях из #57631. Она была случайно удалена. #72285 (Pavel Kruglov).
  • Ускорена сортировка столбцов типа LowCardinality(String) за счёт девиртуализации вызовов компаратора. #72337 (Alexander Gololobov).
  • Оптимизированы функции argMin/argMax для ряда простых типов данных. #72350 (alesapin).
  • Оптимизирован механизм блокировок в трекере памяти за счёт использования разделяемых блокировок, что снижает конфликты при блокировке и повышает производительность на системах с очень большим числом CPU. #72375 (Jiebin Sun).
  • Добавлена новая настройка use_async_executor_for_materialized_views. Она включает асинхронное и потенциально многопоточное выполнение запроса materialized view, что может ускорить обработку представлений во время INSERT, но при этом потребляет больше памяти. #72497 (alesapin).
  • Улучшена производительность десериализации состояний агрегатных функций (в типе данных AggregateFunction и в распределённых запросах). Незначительно улучшена производительность разбора формата RowBinary. #72818 (Anton Popov).
  • Диапазоны чтения при использовании параллельных реплик теперь разбиваются в порядке ключа таблицы, что уменьшает потребление памяти при чтении. #72173 (JIaQi).
  • Ускорены вставки в таблицы MergeTree в случае, когда во вставляемом пакете данных используется только одно значение ключа партиции. #72348 (alesapin).
  • Реализовано параллельное создание таблиц при восстановлении из резервной копии. До этого PR команда RESTORE всегда создавала таблицы в одном потоке, что могло быть медленно в случае резервных копий, содержащих много таблиц. #72427 (Vitaly Baranov).
  • Удаление mark cache может занять заметное время, если он велик. Если при этом удерживать context mutex, это блокирует множество других операций: новое клиентское соединение не сможет установиться до тех пор, пока мьютекс не будет освобождён. При этом удержание этого мьютекса на самом деле не требуется для синхронизации — достаточно иметь локальную ссылку на cache через shared_ptr. #72749 (Alexander Gololobov).

Улучшения

  • Удалена настройка allow_experimental_join_condition, теперь по умолчанию разрешены условия соединения, не основанные на равенстве. #69910 (Vladimir Cherkasov).
  • Настройки из конфигурации сервера (users.xml) теперь применяются и на клиенте. Полезно для настроек формата вывода, например date_time_output_format. #71178 (Michael Kolupaev).
  • Автоматический перевод операций GROUP BY/ORDER BY на диск в зависимости от использования памяти сервером/пользователем. Управляется настройками запроса max_bytes_ratio_before_external_group_by/max_bytes_ratio_before_external_sort. #71406 (Azat Khuzhin).
  • Добавлена новая логика отмены: CancellationChecker проверяет таймауты для каждого запущенного запроса и останавливает их, как только таймаут истекает. #69880 (Yarik Briukhovetskyi).
  • Добавлена поддержка ALTER для преобразования Object в JSON, что позволяет легко мигрировать с устаревшего типа Object. #71784 (Pavel Kruglov).
  • Разрешить неизвестные значения в Set, которые отсутствуют в Enum. Исправление #72662. #72686 (zhanglistar).
  • Добавлена поддержка оператора строкового поиска (например, LIKE) для типа данных Enum, что реализует #72661. #72732 (zhanglistar).
  • Ранее принимались некоторые бессмысленные запросы ALTER USER. Исправлена проблема #71227. #71286 (Arthur Passos).
  • Учитывать параметр prefer_locahost_replica при построении плана выполнения для распределённой операции INSERT ... SELECT. #72190 (filimonov).
  • Azure нарушила спецификацию Iceberg, ошибочно пометив Iceberg v1 как Iceberg v2. Проблема описана здесь. Azure Iceberg Writer создает файлы метаданных Iceberg (а также manifest-файлы), которые не соответствуют спецификации. Теперь мы пытаемся читать метаданные формата Iceberg v1 с помощью ридера v2 (поскольку они записывают их именно так) и добавили генерацию ошибки, если в manifest-файле не созданы соответствующие поля. #72277 (Daniil Ivanik).
  • Теперь можно выполнять CREATE MATERIALIZED VIEW с UNION [ALL] в запросе. Поведение такое же, как для materialized view с JOIN: только первая таблица в выражении SELECT будет работать как триггер для вставки данных, все остальные таблицы будут игнорироваться. Однако, если есть несколько ссылок на первую таблицу (например, UNION с самой собой), все они будут обработаны как один вставленный блок данных. #72347 (alesapin).
  • Добавлена проверка исходного запроса, когда ClickHouse используется в качестве источника данных для словаря. #72548 (Alexey Katsman).
  • Обеспечить, чтобы ClickHouse обнаруживал изменения в ZooKeeper при перезагрузке конфигурации. #72593 (Azat Khuzhin).
  • Улучшена оценка объёма памяти, занимаемой кэшированными метками, для снижения общего потребления памяти кэша. #72630 (Antonio Andelic).
  • Добавлена новая метрика StartupScriptsExecutionState. Метрика может принимать три значения: 0 = стартовые скрипты ещё не завершили выполнение, 1 = стартовые скрипты выполнены успешно, 2 = стартовые скрипты завершились с ошибкой. Эта метрика необходима, чтобы понимать, успешно ли выполняются стартовые скрипты в Cloud, особенно после релизов базовых конфигураций. #72637 (Miсhael Stetsyuk).
  • Добавлена новая метрика MergeTreeIndexGranularityInternalArraysTotalSize в таблицу system.metrics. Эта метрика нужна, чтобы находить экземпляры с огромными наборами данных, подверженными высокой
  • Добавлены повторные попытки создания реплицируемой таблицы. #72682 (Vitaly Baranov).
  • Добавлен столбец total_bytes_with_inactive в таблицу system.tables для подсчёта общего объёма данных в неактивных частях. #72690 (Kai Zhu).
  • Добавить настройки MergeTree в system.settings_changes. #72694 (Raúl Marín).
  • Добавлена поддержка типа JSON в функции notEmpty. #72741 (Pavel Kruglov).
  • Добавлена поддержка парсинга ошибки GCS S3 AuthenticationRequired. #72753 (Vitaly Baranov).
  • Добавлена поддержка типа Dynamic в функциях ifNull и coalesce. #72772 (Pavel Kruglov).
  • Добавлена поддержка Dynamic в функциях toFloat64/touInt32/и т.д. #72989 (Pavel Kruglov).
  • Добавлены настройки запросов к S3 http_max_fields, http_max_field_name_size, http_max_field_value_size и их использование при разборе ответов S3 API во время создания или восстановления резервной копии. #72778 (Vitaly Baranov).
  • Удалять метаданные таблиц в Keeper для Storage S3(Azure)Queue только после удаления последней таблицы, использующей эти метаданные. #72810 (Kseniia Sumarokova).
  • Добавлены события профилирования JoinBuildTableRowCount/JoinProbeTableRowCount/JoinResultRowCount. #72842 (Vladimir Cherkasov).
  • Добавлена поддержка подстолбцов в ключе сортировки MergeTree и пропускающих индексах. #72644 (Pavel Kruglov).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Исправлена потенциальная проблема пересечения частей в MergeTree (после неудачной операции перемещения части в каталог detached, возможно из-за операции с объектным хранилищем). #70476 (Azat Khuzhin).
  • Исправлена обработка ошибки, возникающей, когда имя таблицы слишком длинное. Добавлена диагностика с указанием максимально допустимой длины. Добавлена новая функция getMaxTableNameLengthForDatabase. #70810 (Yarik Briukhovetskyi).
  • Исправлены процессы‑зомби после аварийного завершения работы clickhouse-library-bridge (эта программа позволяет запускать небезопасные библиотеки). #71301 (MikhailBurdukov).
  • Исправлена ошибка NoSuchKey при откате транзакции, возникающая при неудачной попытке создания каталога для диска plain_rewritable. #71439 (Julia Kartseva).
  • Исправлена проблема с сериализацией значений Dynamic в форматах JSON Pretty. #71923 (Pavel Kruglov).
  • Теперь автоматически определённое имя формата добавляется в запрос CREATE в движках File/S3/URL/HDFS/Azure. Ранее имя формата определялось заново при каждом перезапуске сервера, и если указанные файлы данных были удалены, это приводило к ошибкам во время запуска сервера. #72108 (Pavel Kruglov).
  • Исправлены ошибки при использовании UDF в выражении JOIN ON со старым анализатором. #72179 (Raúl Marín).
  • Исправлены несколько небольших ошибок в StorageObjectStorage. Теперь параметр use_hive_partitioning включён по умолчанию. #72185 (Yarik Briukhovetskyi).
  • Исправлена ошибка, из-за которой min_age_to_force_merge_on_partition_only зацикливался, пытаясь повторно объединить одну и ту же партицию, уже сведённую к одной части, и не объединял партиции, содержащие несколько частей. #72209 (Christoph Wurm).
  • Исправлена ошибка, приводившая к аварийному завершению работы SimpleSquashingChunksTransform в редких случаях при обработке разреженных столбцов. #72226 (Vladimir Cherkasov).
  • Исправлена гонка данных в GraceHashJoin, из-за которой некоторые строки могли отсутствовать в результате объединения. #72233 (Nikita Taranov).
  • Исправлены запросы ALTER DELETE с материализованным столбцом _block_number (при включённой настройке enable_block_number_column). #72261 (Anton Popov).
  • Исправлена гонка данных при конкурентном вызове ColumnDynamic::dumpStructure(), например из конструктора ConcurrentHashJoin. #72278 (Nikita Taranov).
  • Исправлена потенциальная ошибка (LOGICAL_ERROR), возникавшая при наличии повторяющихся столбцов в ORDER BY ... WITH FILL. #72387 (Vladimir Cherkasov).
  • Исправлены несоответствия типов в ряде случаев после применения optimize_functions_to_subcolumns. #72394 (Anton Popov).
  • Используйте AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE вместо AWS_CONTAINER_AUTHORIZATION_TOKEN_PATH. Исправление для #71074. #72397 (Konstantин Богданов).
  • Исправлена ошибка при разборе запросов BACKUP DATABASE db EXCEPT TABLES db.table. #72429 (Konstantin Bogdanov).
  • Запрещено создание пустого Variant. #72454 (Pavel Kruglov).
  • Исправлено неверное форматирование поля result_part_path в таблице system.merges. #72567 (Konstantin Bogdanов).
  • Исправлена обработка glob-шаблона с одним элементом (например, {file}). #72572 (Konstantin Bogdanov).
  • Исправлена генерация запросов для ведомого сервера в случае распределённого запроса с ARRAY JOIN. Исправляет #69276. #72608 (Dmitry Novik).
  • Исправлена ошибка, из-за которой DateTime64 IN DateTime64 не возвращал результаты. #72640 (Yarik Briukhovetskyi).
  • Исправлены несогласованные метаданные при добавлении новой реплики в реплицируемую базу данных, в которой есть таблица, созданная с flatten_nested=0. #72685 (Alexander Tokmakov).
  • Исправлена расширенная настройка SSL для внутреннего взаимодействия Keeper. #72730 (Antonio Andelic).
  • Исправлена ошибка «No such key» в режиме unordered для S3Queue при значении настройки tracked_files_limit, меньшем, чем скорость появления файлов в S3. #72738 (Kseniia Sumarokova).
  • Исправлено исключение, выбрасываемое в RemoteQueryExecutor, если локально отсутствует пользователь. #72759 (Andrey Zvonov).
  • Исправлены мутации с материализованным столбцом _block_number (если включена настройка enable_block_number_column). #72854 (Anton Popov).
  • Исправлена проблема с резервным копированием и восстановлением при использовании обычного перезаписываемого диска в случае наличия пустых файлов в резервной копии. #72858 (Kseniia Sumarokova).
  • Обеспечена корректная отмена вставок в DistributedAsyncInsertDirectoryQueue. #72885 (Antonio Andelic).
  • Исправлена ошибка, приводившая к аварийному завершению при разборе некорректных данных в разреженные столбцы (может происходить при включённой настройке enable_parsing_to_custom_serialization). #72891 (Anton Popov).
  • Исправлено потенциальное аварийное завершение при восстановлении из резервной копии. #72947 (Kseniia Sumarokova).
  • Исправлена ошибка в методе JOIN parallel_hash, которая могла проявляться, когда запрос содержал сложное условие в предложении ON с операторами неравенства. #72993 (Nikita Taranov).
  • Используйте настройки формата по умолчанию при разборе JSON во избежание ошибок десериализации. #73043 (Pavel Kruglov).
  • Исправлено аварийное завершение работы в транзакциях при использовании неподдерживаемого хранилища. #73045 (Raúl Marín).
  • Исправлена возможная завышенная оценка потребления памяти при её учёте (когда разница между MemoryTracking и MemoryResident постоянно увеличивалась). #73081 (Azat Khuzhin).
  • При разборе Tuple теперь выполняется проверка на дублирующиеся JSON-ключи. Ранее это могло приводить к логической ошибке Invalid number of rows in Chunk при разборе. #73082 (Pavel Kruglov).

Улучшения сборки/тестирования/упаковки

  • Все небольшие утилиты, ранее расположенные в папке /utils и требовавшие ручной компиляции из исходников, теперь входят в основной пакет поставки ClickHouse. Это закрывает: #72404. #72426 (Nikita Mikhaylov).
  • Отменено удаление /etc/systemd/system/clickhouse-server.service, добавленное в 22.3 #39323. #72259 (Mikhail f. Shiryaev).
  • Разделены слишком крупные единицы трансляции, чтобы избежать сбоев компиляции из‑за ограничений по памяти и CPU. #72352 (Yakov Olkhovskiy).
  • OSX: сборка с поддержкой ICU, что позволяет использовать коллации, преобразование кодировок и другие функции локализации. #73083 (Raúl Marín).

Релиз ClickHouse 24.11, 2024-11-26. Презентация, видео

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

  • Удалены системные таблицы generate_series и generateSeries. Они были добавлены по ошибке здесь: #59390. #71091 (Alexey Milovidov).
  • Удалён StorageExternalDistributed. Закрывает #70600. #71176 (flynn).
  • Табличные движки Kafka, NATS и RabbitMQ теперь регулируются собственными грантами в иерархии SOURCES. Добавьте гранты для любых пользователей БД, отличных от пользователя по умолчанию, которые создают таблицы с этими движками. #71250 (Christoph Wurm).
  • Перед выполнением теперь полностью проверяется запрос мутации (включая подзапросы). Это предотвращает случайный запуск некорректного запроса и накопление «мёртвых» мутаций, блокирующих корректные мутации. #71300 (Christoph Wurm).
  • Переименован параметр кэша файловой системы skip_download_if_exceeds_query_cache в filesystem_cache_skip_download_if_exceeds_per_query_cache_write_limit. #71578 (Kseniia Sumarokova).
  • Удалена поддержка аргументов типа Enum, а также UInt128 и UInt256 в deltaSumTimestamp. Удалена поддержка типов Int8, UInt8, Int16 и UInt16 для второго («timestamp») аргумента deltaSumTimestamp. #71790 (Alexey Milovidov).
  • При получении данных напрямую из словаря с использованием хранилища Dictionary, табличной функции словаря или прямого SELECT из самого словаря теперь достаточно иметь разрешение SELECT или разрешение dictGet для этого словаря. Это согласуется с предыдущими попытками предотвратить обход ACL: https://github.com/ClickHouse/ClickHouse/pull/57362 и https://github.com/ClickHouse/ClickHouse/pull/65359. Это также делает последнее из них обратносовместимым. #72051 (Nikita Mikhaylov).

Экспериментальная функциональность

  • Реализован allow_feature_tier как глобальный переключатель для отключения всех экспериментальных и beta-функций. #71841 #71145 (Raúl Marín).
  • Исправлена возможная ошибка No such file or directory, возникающая из‑за неэкранированных специальных символов в файлах для JSON-подстолбцов. #71182 (Pavel Kruglov).
  • Добавлена поддержка ALTER с типа String на JSON. Этот PR также переводит сериализацию типов JSON и Dynamic на новую версию V2. Старая версия V1 по-прежнему может использоваться при включении настройки merge_tree_use_v1_object_and_dynamic_serialization (может использоваться во время обновления, чтобы при необходимости можно было без проблем откатиться на предыдущую версию). #70442 (Pavel Kruglov).
  • Реализован простой CAST из Map/Tuple/Object в новый JSON через сериализацию/десериализацию из JSON-строки. #71320 (Pavel Kruglov).
  • По умолчанию запрещено использование типов Variant/Dynamic в ORDER BY/GROUP BY/PARTITION BY/PRIMARY KEY, так как это может приводить к неожиданным результатам. #69731 (Pavel Kruglov).
  • Запрещено использовать типы Dynamic/Variant в функциях min/max, чтобы избежать путаницы. #71761 (Pavel Kruglov).

Новая функциональность

  • Добавлен SQL-синтаксис для описания управления нагрузкой и ресурсами. https://clickhouse.com/docs/operations/workload-scheduling. #69187 (Sergei Trifonov).
  • Добавлен новый тип данных BFloat16, представляющий 16‑битные числа с плавающей запятой с 8‑битным показателем, знаком и 7‑битной мантиссой. Закрывает #44206. Закрывает #49937. #64712 (Alexey Milovidov).
  • Добавлен запрос CHECK GRANT для проверки, предоставлена ли текущему пользователю/роли конкретная привилегия и существует ли соответствующая таблица/столбец в памяти. #68885 (Unalian).
  • Добавлены табличные функции iceberg[S3;HDFS;Azure]Cluster, deltaLakeCluster, hudiCluster. #72045 (Mikhail Artemenko).
  • Добавлена возможность задавать имя пользователя/пароль в http_handlers (для dynamic_query_handler/predefined_query_handler). #70725 (Azat Khuzhin).
  • Добавлена поддержка предложения STALENESS в операторе ORDER BY WITH FILL. #71151 (Mikhail Artemenko).
  • Разрешено задавать отдельный срок действия для каждого метода аутентификации; срок действия больше не хранится в сущности пользователя. #70090 (Arthur Passos).
  • Добавлены новые функции parseDateTime64, parseDateTime64OrNull и parseDateTime64OrZero. По сравнению с существующей функцией parseDateTime (и её вариантами), они возвращают значение типа DateTime64 вместо DateTime. #71581 (kevinyhzou).

Улучшения производительности

  • Оптимизировано использование памяти для значений гранулярности индекса, если гранулярность постоянна для части. Добавлена возможность всегда использовать постоянную гранулярность для части (настройка use_const_adaptive_granularity), что помогает обеспечить её оптимальное размещение в памяти. Это помогает при больших нагрузках (триллионы строк в разделяемом хранилище) избежать постоянного роста использования памяти метаданными частей данных (значениями гранулярности индекса). #71786 (Anton Popov).
  • Теперь мы не копируем столбцы входных блоков для join_algorithm = 'parallel_hash' при их распределении между потоками для параллельной обработки. #67782 (Nikita Taranov).
  • Оптимизирован алгоритм слияния Replacing для непересекающихся частей. #70977 (Anton Popov).
  • Не перечислять отсоединённые части с дисков только для чтения и дисков с одноразовой записью в метриках и в таблице system.detached_parts. #71086 (Alexey Milovidov).
  • По умолчанию не вычислять тяжёлые асинхронные метрики. Функция была добавлена в #40332, но запуск тяжёлого фонового задания, нужного лишь одному клиенту, нежелателен. #71087 (Alexey Milovidov).
  • Для дисков plain_rewritable: не обращайтесь к API объектного хранилища при перечислении каталогов, так как это может быть экономически неэффективно. Вместо этого храните список имён файлов в памяти. Компромисс заключается в увеличении времени начальной загрузки и объёма памяти, необходимого для хранения имён файлов. #70823 (Julia Kartseva).
  • Улучшены производительность и точность интервала сбора данных в журнале system.query_metric_log за счёт сокращения критической секции. #71473 (Pablo Marcos).
  • Оптимизация последовательного чтения за счёт генерации виртуальных строк, благодаря чему во время сортировки слиянием считывается меньше данных, что особенно полезно при наличии нескольких частей. #62125 (Shichao Jin).
  • Добавлена настройка сервера async_load_system_database, которая позволяет запускать сервер до полной загрузки системной базы данных. Это помогает запускать ClickHouse быстрее, если в системе много системных таблиц. #69847 (Sergei Trifonov).
  • Добавлен параметр --threads в утилиту clickhouse-compressor, который позволяет выполнять параллельное сжатие данных. #70860 (Alexey Milovidov).
  • Добавлена настройка prewarm_mark_cache, которая включает загрузку меток в кэш меток при вставках, слияниях, получении частей и при запуске таблицы. #71053 (Anton Popov).
  • Массив index_granularity в памяти теперь уменьшается до фактического размера (shrink-to-fit), что снижает потребление памяти семейством движков таблиц MergeTree. #71595 (alesapin).
  • Отключена настройка файлового кэша boundary_alignment для чтения не с диска, что повышает производительность чтения из отдельных удалённых файлов с кэшированием. #71827 (Kseniia Sumarokova).
  • Запросы вида SELECT * FROM table LIMIT ... раньше приводили к загрузке индексов кусков, хотя те не использовались. #71866 (Alexander Gololobov).
  • Включить параметр parallel_replicas_local_plan по умолчанию. Построение полноценного локального плана на инициаторе запроса улучшает производительность параллельных реплик при меньшем потреблении ресурсов и дает дополнительные возможности для применения оптимизаций запросов. #70171 (Igor Nikonov).

Улучшения

  • Теперь можно использовать clickhouse с файловым аргументом, как в ch queries.sql. #71589 (Raúl Marín).
  • Формат Vertical (который также активируется, если вы завершаете запрос последовательностью \G) получил функции форматов Pretty, такие как: - подсветка разрядов тысяч в числах; - вывод подсказки с числом в удобочитаемом формате. #71630 (Alexey Milovidov).
  • Передавать внешние пользовательские роли от инициатора запроса на другие узлы кластера. Полезно, если только инициатор запроса имеет доступ к внешнему аутентификатору (например, LDAP). #70332 (Andrey Zvonov).
  • Добавлены псевдонимы anyRespectNulls, firstValueRespectNulls и anyValueRespectNulls для агрегатной функции any. Также добавлены псевдонимы anyLastRespectNulls и lastValueRespectNulls для агрегатной функции anyLast. Это позволяет использовать более естественный синтаксис в чистом camelCase вместо смешанного стиля camelCase/underscore, например: SELECT anyLastRespectNullsStateIf вместо anyLast_respect_nullsStateIf. #71403 (Peter Nguyen).
  • Добавлен параметр конфигурации date_time_utc, который позволяет форматировать JSON‑логи с датой и временем в UTC по стандарту RFC 3339/ISO8601. #71560 (Ali).
  • Добавлен новый тип заголовка для S3‑эндпоинтов для аутентификации пользователей (access_header). Это позволяет задать заголовок доступа с наименьшим приоритетом, который будет перезаписан значением access_key_id из любого другого источника (например, схемы таблицы или именованной коллекции). #71011 (MikhailBurdukov).
  • Функции высшего порядка с константными массивами и константными захваченными аргументами будут возвращать константы. #58400 (Alexey Milovidov).
  • Имена шагов плана запроса (EXPLAIN PLAN json=1) и имена процессоров конвейера (EXPLAIN PIPELINE compact=0,graph=1) теперь содержат уникальный идентификатор в качестве суффикса. Это позволяет сопоставлять вывод профилировщика процессоров и OpenTelemetry-трейсы с выводом EXPLAIN. #63518 (qhsong).
  • Добавлена опция проверки существования объекта после его записи в Azure Blob Storage, управляемая параметром check_objects_after_upload. #64847 (Smita Kulkarni).
  • По умолчанию использовать базу данных Atomic в clickhouse-local. Решает пункты 1 и 5 из #50647. Закрывает #44817. #68024 (Alexey Milovidov).
  • Исключения нарушают протокол HTTP, чтобы сообщить клиенту об ошибке. #68800 (Sema Checherinda).
  • Регистрировать хосты, выполняющие распределённые DDL-запросы, путём создания replica_dir и пометки реплик как активных в DDLWorker. #69658 (tuanpach).
  • Ожидать только активные реплики при выполнении запросов ON CLUSTER к базе данных, если distributed_ddl_output_mode имеет значение *_only_active. #69660 (tuanpach).
  • Улучшена обработка ошибок и отмена резервных копий и восстановлений ON CLUSTER: - Если резервное копирование или восстановление завершается ошибкой на одном хосте, оно будет автоматически отменено на других хостах - Не должны возникать странные ошибки из‑за того, что на одних хостах операция завершилась с ошибкой, пока другие продолжали работу - Если резервное копирование или восстановление отменяется на одном хосте, оно будет автоматически отменено на других хостах - Исправлены проблемы с test_disallow_concurrency — теперь отключение параллельного выполнения должно работать лучше - Операции резервного копирования и восстановления теперь значительно устойчивее к разрывам соединения с ZooKeeper. #70027 (Vitaly Baranov).
  • Добавлена поддержка ALTER TABLE ... MODIFY/RESET SETTING ... для отдельных настроек в хранилище S3Queue. #70811 (Kseniia Sumarokova).
  • Добавлена возможность перезагружать клиентские сертификаты аналогично процедуре перезагрузки серверных сертификатов. #70997 (Roman Antonov).
  • Сделали размер истории клиента настраиваемым и увеличили его значение по умолчанию. #71014 (Jiří Kozlovský).
  • Поддержка булевых типов данных для нативного Parquet-ридера. #71055 (Arthur Passos).
  • Расширен перечень ошибок, при которых выполняются повторные попытки при взаимодействии с S3, например «Malformed message». #71088 (Alexey Milovidov).
  • Уменьшен уровень логирования некоторых сообщений о S3. #71090 (Alexey Milovidov).
  • Добавлена поддержка записи файлов HDFS с пробелами в именах. #71105 (exmy).
  • Введены настройки, ограничивающие число реплицируемых таблиц, словарей и представлений. #71179 (Kirill).
  • Используйте AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE вместо AWS_CONTAINER_AUTHORIZATION_TOKEN, если он доступен. Исправляет #71074. #71269 (Konstantin Bogdanov).
  • Удалено создание узла ZooKeeper metadata_version в потоке перезапуска ReplicatedMergeTree. Единственный сценарий, в котором нужно создавать этот узел, — когда пользователь обновился с версии более ранней, чем 20.4, напрямую на версию новее 24.10. ClickHouse не поддерживает обновления, охватывающие период более года, поэтому вместо создания узла следует генерировать исключение и просить пользователя обновляться поэтапно. #71385 (Miсhael Stetsyuk).
  • Добавлены дашборды по хостам Overview (host) и Cloud overview (host) в расширенный дашборд. #71422 (alesapin).
  • clickhouse-local по умолчанию использует неявный SELECT, что позволяет применять его как калькулятор. Улучшена подсветка синтаксиса для режима неявного SELECT. #71620 (Alexey Milovidov).
  • Приложения командной строки будут подсвечивать синтаксис даже для нескольких команд SQL. #71622 (Alexey Milovidov).
  • Консольные приложения теперь возвращают ненулевые коды выхода при ошибках. В предыдущих версиях приложение disks возвращало ноль при ошибках, а другие приложения возвращали ноль для ошибок 256 (PARTITION_ALREADY_EXISTS) и 512 (SET_NON_GRANTED_ROLE). #71623 (Alexey Milovidov).
  • При указании пользователя/группы по ID команда clickhouse su завершалась с ошибкой. Этот патч исправляет это, добавляя поддержку формата UID:GID. #71626 (Mikhail f. Shiryaev).
  • Позволяет отключить увеличение размера буфера памяти для кэша файловой системы с помощью настройки filesystem_cache_prefer_bigger_buffer_size. #71640 (Kseniia Sumarokova).
  • Добавлена отдельная настройка background_download_max_file_segment_size для задания максимального размера сегмента файла при фоновой загрузке в файловом кэше. #71648 (Kseniia Sumarokova).
  • Слегка улучшен разбор типов JSON: если текущий блок для JSON-пути содержит значения разных типов, выполняется попытка выбрать наиболее подходящий тип, перебирая варианты в специальном порядке best-effort. #71785 (Pavel Kruglov).
  • Ранее при чтении из system.asynchronous_metrics выполнялось ожидание завершения конкурентного обновления. Это могло занимать много времени, если система находилась под высокой нагрузкой. С этим изменением ранее собранные значения теперь всегда можно прочитать. #71798 (Alexander Gololobov).
  • S3Queue и AzureQueue: значения polling_max_timeout_ms установлены на 10 минут, polling_backoff_ms — на 30 секунд. #71817 (Kseniia Sumarokova).
  • Обновлять HostResolver три раза за период history. #71863 (Sema Checherinda).
  • На HTML-странице расширенного дашборда добавлен выпадающий список для выбора дашборда из таблицы system.dashboards. #72081 (Sergei Trifonov).
  • Проверять наличие базы данных по умолчанию после авторизации. Устраняет проблему #71097. #71140 (Konstantin Bogdanov).

Исправление ошибки (ошибка, приводящая к заметному для пользователя некорректному поведению в официальном стабильном релизе)

  • Части, дедуплицированные во время запроса ATTACH PART, больше не остаются с префиксом attaching_. #65636 (Kirill).
  • Исправлена ошибка, приводившая к потере точности DateTime64 при использовании функции IN. #67230 (Yarik Briukhovetskyi).
  • Исправлена потенциальная логическая ошибка при использовании функций с IGNORE/RESPECT NULLS в ORDER BY ... WITH FILL, закрыт #57609. #68234 (Vladimir Cherkasov).
  • Исправлены редкие логические ошибки при асинхронных вставках с форматом Native при достижении предела памяти. #68965 (Anton Popov).
  • Исправлен COMMENT в CREATE TABLE для столбца EPHEMERAL. #70458 (Yakov Olkhovskiy).
  • Исправлена логическая ошибка в функции JSONExtract с LowCardinality(Nullable). #70549 (Pavel Kruglov).
  • Разрешено выполнение команды SYSTEM DROP REPLICA с параметром zkpath, если существует другая реплика с тем же zkpath. #70642 (MikhailBurdukov).
  • Исправлены аварийное завершение работы и утечка памяти в AggregateFunctionGroupArraySorted. #70820 (Michael Kolupaev).
  • Добавлена возможность переопределять Content-Type с помощью пользовательских HTTP‑заголовков в URL-движке. #70859 (Artem Iurin).
  • Исправлена логическая ошибка в StorageS3Queue, вызывавшая сообщение «Cannot create a persistent node in /processed since it already exists». #70984 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой в некоторых случаях именованные сессии могли не закрываться и зависать бесконечно. #70998 (Márcio Martins).
  • Исправлена ошибка, из-за которой при использовании опции rebuild для легковесного удаления проекции не учитывался столбец _row_exists. #71089 (Shichao Jin).
  • Исправлена проблема AT_* is out of range при работе под управлением Oracle Linux UEK 6.10. #71109 (Örjan Fors).
  • Исправлено некорректное значение в system.query_metric_log из-за неожиданной гонки состояний. #71124 (Pablo Marcos).
  • Исправлено несоответствие в названии агрегатной функции quantileExactWeightedInterpolated. Ошибка появилась в https://github.com/ClickHouse/ClickHouse/pull/69619. cc @Algunenano. #71168 (李扬).
  • Исправлена ошибка, приводившая к исключению bad_weak_ptr при сравнении функций с Dynamic. #71183 (Pavel Kruglov).
  • Теперь проверяется, что читаемый файл 7z находится на локальной машине. #71184 (Daniil Ivanik).
  • Исправлено игнорирование настроек формата при использовании формата Native через HTTP и Async Inserts. #71193 (Pavel Kruglov).
  • Запросы SELECT, выполняемые с настройкой use_query_cache = 1, больше не отклоняются, если имя системной таблицы используется в виде строкового литерала, например: SELECT * FROM users WHERE name = 'system.metrics' SETTINGS use_query_cache = true; теперь работает. #71254 (Robert Schulze).
  • Исправлена ошибка, приводившая к росту потребления памяти при enable_filesystem_cache=1, если диск в конфигурации хранилища не имел настроек кэша. #71261 (Kseniia Sumarokova).
  • Исправлена возможная ошибка «Cannot read all data» при десериализации словаря LowCardinality из столбца типа Dynamic. #71299 (Pavel Kruglov).
  • Исправлена проблема неполной очистки параллельного формата вывода в клиенте. #71304 (Raúl Marín).
  • Исправлено отсутствие снятия экранирования в именованных коллекциях. Без этого исправления clickhouse-server не может запуститься. #71308 (MikhailBurdukov).
  • Исправлена проблема асинхронных вставок с пустыми блоками через нативный протокол. #71312 (Anton Popov).
  • Исправлено неконсистентное форматирование AST при выдаче некорректных wildcard‑привилегий #71309. #71332 (pufit).
  • Добавлен блок try/catch в деструкторы частей данных, чтобы избежать вызова std::terminate. #71364 (alesapin).
  • Проверять подозрительные и экспериментальные типы в подсказках типов JSON. #71369 (Pavel Kruglov).
  • Запускать поток управления памятью и на ОС, отличных от Linux (исправляет #71051). #71384 (Alexandre Snarskii).
  • Исправлена ошибка Invalid number of rows in Chunk для столбца Variant. #71388 (Pavel Kruglov).
  • Исправлена ошибка column "attgenerated" does not exist в более старых версиях PostgreSQL, см. #60651. #71396 (0xMihalich).
  • Чтобы не засорять серверные логи, неудачные попытки аутентификации теперь записываются на уровне DEBUG вместо ERROR. #71405 (Robert Schulze).
  • Исправлено падение в табличной функции mongodb при передаче некорректных аргументов (например, NULL). #71426 (Vladimir Cherkasov).
  • Исправлено падение при использовании optimize_rewrite_array_exists_to_has. #71432 (Raúl Marín).
  • Исправлено использование настройки max_insert_delayed_streams_for_parallel_write при вставках. Ранее она работала некорректно, что могло приводить к высокому потреблению памяти при вставках, записывающих данные в несколько партиций. #71474 (Anton Popov).
  • Исправлена возможная ошибка вида Argument for function must be constant (старый анализатор) в случае, когда arrayJoin может появиться в условии WHERE. Регрессия, появившаяся после https://github.com/ClickHouse/ClickHouse/pull/65414. #71476 (Nikolai Kochetov).
  • Предотвращён сбой в SortCursor при отсутствии столбцов (старый анализатор). #71494 (Raúl Marín).
  • Исправлен выход значения типа Date32 за допустимый диапазон, вызванный неинициализированными данными ORC. Для получения дополнительной информации см. https://github.com/apache/incubator-gluten/issues/7823. #71500 (李扬).
  • Исправлен подсчёт размера столбца в широкой части для типов Dynamic и JSON. #71526 (Pavel Kruglov).
  • Исправлена ошибка анализатора для случая, когда запрос внутри materialized view использует IN с CTE. Закрывает #65598. #71538 (Maksim Kita).
  • Исправлен сбой при использовании UDF в ограничении. #71541 (Raúl Marín).
  • Возвращать 0 или символ по умолчанию вместо выбрасывания ошибки в функциях bitShift при выходе за пределы допустимого диапазона. #71580 (Pablo Marcos).
  • Исправлено падение сервера при использовании materialized view с некоторыми движками. #71593 (Pervakov Grigorii).
  • Операция ARRAY JOIN с вложенной структурой данных, содержащей алиас на константный массив, приводила к разыменованию нулевого указателя. Это закрывает #71677. #71678 (Alexey Milovidov).
  • Исправлена ошибка LOGICAL_ERROR при выполнении ALTER с пустым кортежем. Это исправляет #71647. #71679 (Amos Bird).
  • Не преобразовывать константный Set в предикатах по столбцам партиций при использовании оператора NOT IN. #71695 (Eduard Karacharov).
  • Исправлено сообщение журнала о сбое скрипта инициализации Docker, чтобы сделать его более понятным. #71734 (Андрей).
  • Исправлено приведение типа (CAST) из LowCardinality(Nullable) к Dynamic. Ранее это могло приводить к ошибке Bad cast from type DB::ColumnVector<int> to DB::ColumnNullable. #71742 (Pavel Kruglov).
  • Исправлено исключение, возникавшее при использовании toDayOfWeek в условии WHERE с первичным ключом типа DateTime64. #71849 (Yakov Olkhovskiy).
  • Исправлено заполнение значений по умолчанию после разбора в разреженные столбцы. #71854 (Anton Popov).
  • Исправлена ошибка функции GROUPING при использовании ALIAS в distributed таблице, закрыт #68602. #71855 (Vladimir Cherkasov).
  • Исправлено возможное аварийное завершение работы при использовании allow_experimental_join_condition, закрыта #71693. #71857 (Vladimir Cherkasov).
  • Исправлены операторы SELECT с предложением WITH TIES, которые могли возвращать недостаточное количество строк. #71886 (wxybear).
  • Исправлено исключение TOO_LARGE_ARRAY_SIZE, возникавшее, когда столбец при вычислении arrayWithConstant ошибочно считался превышающим ограничение размера массива. #71894 (Udi).
  • clickhouse-benchmark сообщал некорректные значения метрик для запросов, выполнявшихся дольше одной секунды. #71898 (Alexey Milovidov).
  • Исправлено состояние гонки между индикатором прогресса и таблицей прогресса в clickhouse-client. Эта проблема проявляется при использовании оператора FROM INFILE. Во время выполнения запросов INSERT теперь перехватываются нажатия клавиш для переключения отображения таблицы прогресса. #71901 (Julia Kartseva).
  • Используются вспомогательные Keeper-узлы для автообнаружения кластера. #71911 (Anton Ivashkin).
  • Исправлен столбец rows_processed в таблице system.s3/azure_queue_log, некорректно работавший в версии 24.6. Закрывает #69975. #71946 (Kseniia Sumarokova).
  • Исправлена ошибка, из-за которой функции s3/s3Cluster могли возвращать неполный результат или выбрасывать исключение. Она возникала при использовании glob-шаблона в s3 URI (например, pattern/*) при наличии пустого объекта с ключом pattern/ (такие объекты автоматически создаются консолью S3). Также значение по умолчанию для настройки s3_skip_empty_files изменено с false на true. #71947 (Nikita Taranov).
  • Исправлено падение clickhouse-client при подсветке синтаксиса. Закрывает #71864. #71949 (Nikolay Degterinsky).
  • Исправлена ошибка Illegal type для таблиц MergeTree с бинарной монотонной функцией в ORDER BY при константном первом аргументе. Исправляет #71941. #71966 (Nikolai Kochetov).
  • Допускаются только запросы SELECT в EXPLAIN AST, используемом внутри подзапроса. Любые другие типы запросов приводят к логической ошибке: 'Bad cast from type DB::ASTCreateQuery to DB::ASTSelectWithUnionQuery' или Inconsistent AST formatting. #71982 (Pavel Kruglov).
  • При вставке записи через clickhouse-client клиент считывает описания столбцов с сервера. Однако была ошибка: мы записывали описания в неправильном порядке, хотя он должен быть таким: [statistics, ttl, settings]. #71991 (Han Fei).
  • Исправлено форматирование ALTER-команд MOVE PARTITION ... TO TABLE ... при включённой опции format_alter_commands_with_parentheses. #72080 (János Benjamin Antal).
  • Исправлены операции RIGHT / FULL JOIN в запросах с параллельными репликами. Теперь операции RIGHT JOIN могут выполняться с параллельными репликами (чтение правой таблицы распределяется между ними). Операции FULL JOIN по-прежнему не могут быть распараллелены между узлами и выполняются локально. #71162 (Igor Nikonov).
  • Исправлена проблема, из-за которой ClickHouse в Docker-контейнерах выводил сообщение "get_mempolicy: Operation not permitted" в stderr из-за ограничений на системные вызовы. #70900 (filimonov).
  • Исправлена запись metadata_version в ZooKeeper в потоке перезапуска, а не в attach-потоке. #70297 (Miсhael Stetsyuk).
  • Это исправление проблемы с репликацией «zero-copy», которая не поддерживается и будет полностью удалена. Не удаляйте blob-объект, если есть узлы, использующие его в ReplicatedMergeTree с репликацией zero-copy. #71186 (Antonio Andelic).
  • Это исправление для репликации «zero-copy», которая не поддерживается и будет полностью удалена. Добавлено получение общей блокировки zero-copy перед перемещением парта на диск zero-copy, чтобы предотвратить возможную потерю данных, если Keeper недоступен. #71845 (Aleksei Filatov).

Релиз ClickHouse 24.10 от 31.10.2024. Презентация, Видео

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

  • Разрешена запись SETTINGS перед FORMAT в цепочке запросов с UNION, если подзапросы заключены в круглые скобки. Это закрывает #39712. Изменено поведение в случае, когда в запросе клауза SETTINGS указана дважды в последовательности. Ближайшая клауза SETTINGS будет иметь приоритет и применяться к соответствующему подзапросу. В предыдущих версиях внешняя клауза SETTINGS могла иметь приоритет над внутренней. #68614 (Alexey Milovidov).
  • Перестановка условий фильтрации в клаузе [PRE]WHERE теперь по умолчанию разрешена. Это можно отключить, установив allow_reorder_prewhere_conditions в false. #70657 (Nikita Taranov).
  • Удалена библиотека idxd-config, имеющая несовместимую лицензию. Это также удаляет экспериментальный кодек Intel DeflateQPL. #70987 (Alexey Milovidov).

Новая возможность

  • Добавлена возможность предоставлять доступ к префиксам с подстановочными символами. GRANT SELECT ON db.table_pefix_* TO user. #65311 (pufit).
  • Если во время выполнения запроса нажать пробел, клиент отобразит интерактивную таблицу с подробными метриками. Её можно включить глобально с помощью новой опции --progress-table в clickhouse-client; новая опция --enable-progress-table-toggle связана с --progress-table и позволяет переключать отображение таблицы прогресса сочетанием клавиш Ctrl+Пробел. #63689 (Maria Khristenko), #70423 (Julia Kartseva).
  • Позволяет кэшировать файлы при чтении из движков таблиц объектного хранилища и озер данных, используя хеш, вычисленный по ETag и пути к файлу, в качестве ключа кэша. #70135 (Kseniia Sumarokova).
  • Поддержка создания таблицы с помощью запроса CREATE TABLE ... CLONE AS .... Запрос клонирует схему исходной таблицы, а затем присоединяет все партиции к новой таблице. Эта возможность поддерживается только для таблиц семейства MergeTree. Закрывает #65015. #69091 (tuanpach).
  • Добавлена новая системная таблица system.query_metric_log, которая содержит историю значений использования памяти и метрик из таблицы system.events для отдельных запросов; данные периодически сбрасываются на диск. #66532 (Pablo Marcos).
  • Простой запрос SELECT можно записать с использованием неявного SELECT, чтобы включить выражения в стиле калькулятора, например ch "1 + 2". Это контролируется новой настройкой implicit_select. #68502 (Alexey Milovidov).
  • Добавлена поддержка режима --copy для clickhouse local как сокращения для преобразования форматов #68503. #68583 (Denis Hananein).
  • Добавлена встроенная HTML-страница для визуализации слияний, доступная по адресу /merges. #70821 (Alexey Milovidov).
  • Добавлена поддержка функции arrayUnion. #68989 (Peter Nguyen).
  • Добавлена поддержка параметризованных SQL-псевдонимов. #50665 (Anton Kozlov).
  • Новая агрегатная функция quantileExactWeightedInterpolated — интерполированная версия, основанная на quantileExactWeighted. Некоторые могут задаться вопросом, зачем нужна новая quantileExactWeightedInterpolated, если у нас уже есть quantileExactInterpolatedWeighted. Дело в том, что новая функция обеспечивает более высокую точность по сравнению со старой. Это сделано для совместимости со Spark. #69619 (李扬).
  • Новая функция arrayElementOrNull. Она возвращает NULL, если индекс массива выходит за допустимые границы или ключ в Map не найден. #69646 (李扬).
  • Позволяет пользователям задавать регулярные выражения с помощью новых полей message_regexp и message_regexp_negative в файле config.xml для отфильтровывания логов. Логирование применяется к отформатированному тексту без раскраски для максимально интуитивного восприятия разработчиками. #69657 (Peter Nguyen).
  • Добавлена функция RIPEMD160, которая вычисляет криптографический хэш RIPEMD-160 от строки. Пример: SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog')) возвращает 37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #70087 (Dergousov Maxim).
  • Поддержка чтения таблиц Iceberg из HDFS. #70268 (flynn).
  • Поддержка CTE в виде WITH ... INSERT, тогда как ранее была доступна только конструкция INSERT ... WITH .... #70593 (Shichao Jin).
  • Интеграция с MongoDB: поддержка всех типов MongoDB, поддержка команд WHERE и ORDER BY на стороне MongoDB, ограничения на выражения, не поддерживаемые MongoDB. Обратите внимание, что новая интеграция по умолчанию отключена; чтобы использовать её, установите параметр <use_legacy_mongodb_integration> в значение false в конфигурации сервера. #63279 (Kirill Nikiforov).
  • Добавлена новая функция getSettingOrDefault, которая возвращает значение по умолчанию и не выбрасывает исключение, если пользовательская настройка не найдена в текущем профиле. #69917 (Shankar).

Экспериментальная функциональность

  • Refreshable materialized views готовы для промышленной эксплуатации. #70550 (Michael Kolupaev). Refreshable materialized views теперь поддерживаются в реплицируемых базах данных. #60669 (Michael Kolupaev).
  • Параллельные реплики переведены из экспериментального состояния в бета-версию. Переработаны настройки, управляющие поведением алгоритмов параллельных реплик. Краткое напоминание: в ClickHouse есть четыре различных алгоритма параллельного чтения с участием нескольких реплик, что отражено в настройке parallel_replicas_mode, значение по умолчанию для неё — read_tasks. Дополнительно добавлена настройка-переключатель enable_parallel_replicas. #63151 (Alexey Milovidov), (Nikita Mikhaylov).
  • Добавлена поддержка типа Dynamic в большинстве функций за счёт выполнения их над внутренними типами внутри Dynamic. #69691 (Pavel Kruglov).
  • Добавлена возможность читать/писать тип JSON как бинарную строку в формате RowBinary при использовании настроек input_format_binary_read_json_as_string/output_format_binary_write_json_as_string. #70288 (Pavel Kruglov).
  • Добавлена возможность сериализовать/десериализовать столбец JSON как один столбец типа String в формате Native. Для вывода используйте настройку output_format_native_write_json_as_string. Для ввода используйте версию сериализации 1 перед данными столбца. #70312 (Pavel Kruglov).
  • Введён специальный (экспериментальный) режим селектора слияний для таблиц MergeTree, который делает его более агрессивным для партиций, близких к ограничению по количеству частей. Он управляется настройкой уровня MergeTree merge_selector_use_blurry_base. #70645 (Nikita Mikhaylov).
  • Реализован универсальный механизм сериализации/десериализации (ser/de) между типами Union в Avro и Variant в ClickHouse. Закрывает задачу #69713. #69712 (Jiří Kozlovský).

Улучшения производительности

  • Выполнен рефакторинг IDisk и IObjectStorage для повышения производительности. Таблицы из хранилищ объектов plain и plain_rewritable будут инициализироваться быстрее. #68146 (Alexey Milovidov, Julia Kartseva). Исключён вызов API хранилища объектов LIST при определении существования файла или директории на диске plain_rewritable, так как он может оказаться слишком дорогостоящим. #70852 (Julia Kartseva). Снижено количество запросов к API хранилища объектов HEAD на диске plain_rewritable. #70915 (Julia Kartseva).
  • Добавлена возможность разбирать данные непосредственно в разреженные столбцы. #69828 (Anton Popov).
  • Улучшена производительность разбора форматов с большим числом пропущенных значений (например, JSONEachRow). #69875 (Anton Popov).
  • Добавлена поддержка параллельного чтения групп строк Parquet и предварительной выборки групп строк в однопоточном режиме. #69862 (LiuNeng).
  • Добавлена поддержка minmax-индекса для pointInPolygon. #62085 (JackyWoo).
  • Использовать фильтры Блума при чтении файлов Parquet. #62966 (Arthur Passos).
  • Переименование частей без блокировок, чтобы INSERT не влиял на SELECT (из-за блокировок частей) (в нормальных условиях с fsync_part_directory QPS для SELECT при параллельных INSERT увеличился в 2 раза, под высокой нагрузкой эффект ещё сильнее). Обратите внимание, что сейчас это относится только к ReplicatedMergeTree. #64955 (Azat Khuzhin).
  • Учитывать ttl_only_drop_parts при выполнении materialize ttl; читать только необходимые столбцы для перерасчёта TTL и удалять части, заменяя их пустой частью. #65488 (Andrey Zvonov).
  • Оптимизировано создание потоков в ThreadPool для минимизации конкуренции за блокировки. Создание потоков теперь происходит вне критической секции, чтобы избежать задержек при планировании задач и управлении потоками в условиях высокой нагрузки. Это делает ClickHouse значительно более отзывчивым при интенсивной конкурентной нагрузке. #68694 (filimonov).
  • Добавлена поддержка чтения строковых столбцов типа LowCardinality из ORC. #69481 (李扬).
  • Используйте LowCardinality для ProfileEvents в системных журналах, таких как part_log, query_views_log, filesystem_cache_log. #70152 (Alexey Milovidov).
  • Улучшена производительность функций fromUnixTimestamp/toUnixTimestamp. #71042 (kevinyhzou).
  • Не отключайте неблокирующее чтение из кэша страниц для всего сервера при операциях чтения с блокирующим вводом-выводом. Это приводило к снижению производительности, когда одна из файловых систем (например, tmpfs) не поддерживала системный вызов preadv2, тогда как остальные поддерживали его. #70299 (Antonio Andelic).
  • ALTER TABLE .. REPLACE PARTITION больше не дожидается завершения мутаций и слияний, выполняющихся в других партициях. #59138 (Vasily Nemkov).
  • Не выполнять проверку при синхронизации ACL из Keeper. Проверка выполняется во время создания. Это не должно иметь большого значения, но существуют установки с десятками тысяч и даже большим числом созданных пользователей, и ненужная проверка хэша может занимать много времени при запуске сервера (поскольку при запуске сервер синхронизирует все данные из Keeper). #70644 (Raúl Marín).

Улучшение

  • CREATE TABLE AS теперь копирует PRIMARY KEY, ORDER BY и другие аналогичные конструкции (для таблиц MergeTree). #69739 (sakulali).
  • Поддерживается 64-битный XID в Keeper. Его можно включить с помощью конфигурационного параметра use_xid_64. #69908 (Antonio Andelic).
  • Аргументы командной строки для логических (Bool) настроек устанавливаются в значение true, если для аргумента не указано значение (например, clickhouse-client --optimize_aggregation_in_order --query "SELECT 1"). #70459 (davidtsuk).
  • Добавлены настройки на уровне пользователя min_free_disk_bytes_to_perform_insert и min_free_disk_perform_to_throw_insert, чтобы предотвратить выполнение вставок на почти заполненные диски. #69755 (Marco Vilas Boas).
  • Встроенная документация по настройкам будет существенно более подробной и полной, чем документация на сайте. Это первый шаг к тому, чтобы документация на сайте всегда автоматически генерировалась из исходного кода. Это имеет долгосрочные последствия: - будет гарантировано наличие описания всех настроек; - не будет риска устаревших значений по умолчанию; - мы сможем генерировать эту документацию для каждой версии ClickHouse; - документация может отображаться самим сервером даже без доступа к Интернету. Документация на сайте теперь генерируется из исходного кода. #70289 (Alexey Milovidov).
  • Разрешено использование пустой подстроки (needle) в функции replace; поведение теперь соответствует PostgreSQL. #69918 (zhanglistar).
  • Разрешено пустое значение параметра needle в функциях replaceRegexp*. #70053 (zhanglistar).
  • Символические ссылки для таблиц в каталоге data/database_name/ создаются и указывают на фактические пути к данным таблицы в соответствии с политикой хранения, а не на каталог store/... на диске по умолчанию. #61777 (Kirill).
  • При разборе поля Enum из JSON строка, содержащая целое число, будет интерпретироваться как соответствующий элемент Enum. Это исправляет #65119. #66801 (scanhex12).
  • Разрешить выполнение TRIM с LEADING или TRAILING и пустой строкой как операции без эффекта. Закрывает #67792. #68455 (Peter Nguyen).
  • Улучшена совместимость функции cast(timestamp as String) со Spark. #69179 (Wenzheng Liu).
  • Всегда использовать новый анализатор для вычисления константных выражений, когда enable_analyzer имеет значение true. Добавлена поддержка вычисления аргументов табличной функции executable без использования запроса SELECT для константных выражений. #69292 (Dmitry Novik).
  • Добавлена настройка enable_secure_identifiers для запрета использования идентификаторов, содержащих специальные символы. #69411 (tuanpach).
  • Добавлен параметр show_create_query_identifier_quoting_rule для задания поведения заключения идентификаторов в кавычки в результате запроса SHOW CREATE TABLE. Возможные значения: - user_display: когда идентификатор является ключевым словом. - when_necessary: когда идентификатор является одним из {"distinct", "all", "table"} и это может привести к неоднозначности, например для имён столбцов и атрибутов словарей. - always: всегда заключать идентификаторы в кавычки. #69448 (tuanpach).
  • Улучшено восстановление зависимостей объектов доступа #69563 (Vitaly Baranov).
  • Если вы запускаете clickhouse-client или другое CLI-приложение, и оно медленно запускается из-за перегруженного сервера, и вы начинаете набирать запрос, например SELECT, то в предыдущих версиях сначала отображалась оставшаяся часть эхо-вывода терминала, а уже затем приветственное сообщение, так что вы видели, например, SELECTClickHouse local version 24.10.1.1. вместо ClickHouse local version 24.10.1.1.. Теперь это исправлено. Это закрывает #31696. #69856 (Alexey Milovidov).
  • Добавлен новый столбец readonly_duration в таблицу system.replicas. Он необходим, чтобы можно было различать действительно readonly-реплики и сторожевые (sentinel) реплики в оповещениях. #69871 (Miсhael Stetsyuk).
  • Изменен тип настройки join_output_by_rowlist_perkey_rows_threshold на беззнаковый целочисленный тип. #69886 (kevinyhzou).
  • Улучшено логирование спанов OpenTelemetry: добавлены настройки запроса. #70011 (sharathks118).
  • Добавлена диагностическая информация о функциях высшего порядка для работы с массивами, если тип результата лямбда-выражения отличается от ожидаемого. #70093 (ttanay).
  • Улучшение в Keeper: меньше блокировок при изменениях кластера. #70275 (Antonio Andelic).
  • Добавить ключевые слова WITH IMPLICIT и FINAL к команде SHOW GRANTS. Исправить небольшую ошибку с неявными правами: #70094. #70293 (pufit).
  • Теперь учитывается compatibility для настроек MergeTree. Значение compatibility берётся из профиля default при запуске сервера, и значения настроек MergeTree по умолчанию изменяются соответствующим образом. Последующие изменения настройки compatibility не влияют на настройки MergeTree. #70322 (Nikolai Kochetov).
  • Не засорять логи большими телами HTTP‑ответов при ошибках межсерверного взаимодействия. #70487 (Vladimir Cherkasov).
  • Добавлена новая настройка max_parts_to_move, ограничивающая максимальное количество частей, которые могут быть перемещены за один раз. #70520 (Vladimir Cherkasov).
  • Ограничена частота вывода некоторых сообщений журнала. #70601 (Alexey Milovidov).
  • Конструкция CHECK TABLE с квалификатором PART была некорректно отформатирована в клиенте. #70660 (Alexey Milovidov).
  • Добавлена поддержка записи индекса столбца и индекса смещения с использованием нативного средства записи Parquet. #70669 (LiuNeng).
  • Добавлена поддержка разбора DateTime64 с микросекундной точностью и часовым поясом в синтаксисе joda («joda» — популярная Java-библиотека для работы с датой и временем, а «синтаксис joda» — это стиль этой библиотеки). #70737 (kevinyhzou).
  • Изменён подход к определению того, поддерживает ли облачное хранилище пакетное удаление или нет. #70786 (Vitaly Baranov).
  • Поддержка страниц Parquet v2 в нативном ридере. #70807 (Arthur Passos).
  • Добавлена проверка того, что у таблицы заданы и storage_policy, и disk. Также добавлена проверка совместимости новой политики хранения со старой при использовании настройки disk. #70839 (Kirill).
  • Добавлены system.s3_queue_settings и system.azure_queue_settings. #70841 (Kseniia Sumarokova).
  • Функции base58Encode и base58Decode теперь принимают аргументы типа FixedString. Пример: SELECT base58Encode(toFixedString('plaintext', 9));. #70846 (Faizan Patel).
  • Столбец partition добавлен ко всем типам записей журнала частей. Ранее он был задан только для некоторых записей. Закрывает #70819. #70848 (Alexey Milovidov).
  • Добавлены события MergeStart и MutateStart в system.part_log для анализа и визуализации слияний. #70850 (Alexey Milovidov).
  • Добавлено событие профилирования, фиксирующее количество объединённых исходных частей. Это позволяет мониторить фан-аут дерева MergeTree в продакшене. #70908 (Alexey Milovidov).
  • Снова были включены фоновые загрузки в кэш файловой системы. #70929 (Nikita Taranov).
  • Добавлен новый алгоритм выбора слияний Trivial, предназначенный только для профессионального использования. Он хуже, чем алгоритм выбора слияний Simple. #70969 (Alexey Milovidov).
  • Поддержка атомарного CREATE OR REPLACE VIEW. #70536 (tuanpach)
  • Добавлен режим strict_once для агрегатной функции windowFunnel, чтобы избежать многократного учёта одного и того же события в случае, когда оно удовлетворяет нескольким условиям, что закрывает #21835. #69738 (Vladimir Cherkasov).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Применяет обновления конфигурации в глобальном объекте контекста. Это исправляет такие проблемы, как #62308. #62944 (Amos Bird).
  • Исправлена проблема, из-за которой ReadSettings не использовал значения, заданные пользователем, поскольку применялись только значения по умолчанию. #65625 (Kseniia Sumarokova).
  • Исправлена ошибка несоответствия типов в sumMapFiltered при использовании знаковых аргументов. #58408 (Chen768959).
  • Исправлена монотонность функций преобразования вида toHour и аналогичных при использовании необязательного аргумента часового пояса. #60264 (Amos Bird).
  • Ослаблена проверка supportsPrewhere для таблиц Merge. Это исправляет #61064. Эта проверка была излишне ужесточена в #60082. #61091 (Amos Bird).
  • Исправлена обработка настройки use_concurrency_control для корректного применения ограничения concurrent_threads_soft_limit_num. Это включает управление параллелизмом по умолчанию, поскольку ранее оно не работало. #61473 (Sergei Trifonov).
  • Исправлена некорректная оптимизация секции JOIN ON в случае проверки IS NULL внутри любой другой функции (например, NOT), что могло приводить к некорректным результатам. Закрывает #67915. #68049 (Vladimir Cherkasov).
  • Теперь предотвращается выполнение запросов ALTER, которые могли бы сделать запрос CREATE таблиц недопустимым. #68574 (János Benjamin Antal).
  • Исправлено несогласованное форматирование AST для функций negate (-) и NOT с кортежами и массивами. #68600 (Vladimir Cherkasov).
  • Исправлена ошибка вставки неполного типа в Dynamic при десериализации. Это могло приводить к ошибкам Parameter out of bound. #69291 (Pavel Kruglov).
  • Репликация без копирования (zero-copy replication), которая пока носит экспериментальный характер и не должна использоваться в продакшене: исправлен бесконечный цикл после выполнения restore replica в ReplicatedMergeTree с zero copy. #69293 (MikhailBurdukov).
  • Вернуть значение по умолчанию параметра processing_threads_num в хранилище S3Queue — равным числу ядер CPU. #69384 (Kseniia Sumarokova).
  • Обойти использование try/catch при де/сериализации вложённого повторяющегося сообщения protobuf во вложенные столбцы (исправляет #41971). #69556 (Eliot Hautefeuille).
  • Исправлено аварийное завершение при вставке данных в столбец типа FixedString в движке PostgreSQL. #69584 (Pavel Kruglov).
  • Исправлено падение при выполнении create view t as (with recursive 42 as ttt select ttt);. #69676 (Han Fei).
  • Исправлена ошибка, из-за которой maxMapState выбрасывал 'Bad get' при типе значения DateTime64. #69787 (Michael Kolupaev).
  • Исправлена обработка getSubcolumn со столбцами LowCardinality путем переопределения useDefaultImplementationForLowCardinalityColumns так, чтобы он возвращал true. #69831 (Miсhael Stetsyuk).
  • Исправлена ситуация, когда при неудачном выполнении DROP distributed таблицы навсегда блокировалась отправка данных в нее. #69843 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой запросы, содержащие WITH FILL с ключами NaN, нельзя было отменить. Исправляет #69261. #69845 (Alexey Milovidov).
  • Исправлено значение по умолчанию для анализатора при старом режиме совместимости. #69895 (Raúl Marín).
  • Не выполнять проверку зависимостей при CREATE OR REPLACE VIEW во время DROP старой таблицы. Ранее запрос CREATE OR REPLACE VIEW завершался с ошибкой, если существовали таблицы, зависящие от пересоздаваемого представления. #69907 (Pavel Kruglov).
  • Изменения в Decimal. Исправляет #69730. #69978 (Arthur Passos).
  • Теперь DEFINER/INVOKER поддерживает параметризованные представления. #69984 (pufit).
  • Исправлен парсинг секции DEFINER в представлениях. #69985 (pufit).
  • Исправлена ошибка, при которой часовой пояс мог влиять на результат запроса с аргументами типа Date или Date32. #70036 (Yarik Briukhovetskyi).
  • Устраняет ошибку Block structure mismatch в запросах с вложенными представлениями и условием WHERE. Исправляет #66209. #70054 (Nikolai Kochetov).
  • Не переиспользуйте столбцы в разных именованных кортежах при вычислении функций tuple. Это исправляет #70022. #70103 (Amos Bird).
  • Исправлена некорректная генерация LOGICAL_ERROR при замене литералов в диапазонах. #70122 (Pablo Marcos).
  • Проверять наличие типа Nullable(Nothing) при выполнении ALTER TABLE MODIFY COLUMN/QUERY, чтобы не допускать таблиц с таким типом данных. #70123 (Pavel Kruglov).
  • Корректное сообщение об ошибке для недопустимого запроса вида JOIN ... ON *, закрывает задачу #68650. #70124 (Vladimir Cherkasov).
  • Исправлен неверный результат при использовании пропускающего индекса. #70127 (Raúl Marín).
  • Исправлена гонка данных в методе декомпрессии ColumnObject/ColumnTuple, которая могла приводить к обращению к памяти кучи после её освобождения. #70137 (Pavel Kruglov).
  • Исправлено возможное зависание операции ALTER COLUMN с типом Dynamic. #70144 (Pavel Kruglov).
  • Теперь ClickHouse будет относить большее число ошибок к временным (retriable) и не будет помечать части данных как повреждённые при таких ошибках. #70145 (alesapin).
  • Теперь используется корректный параметр max_types при создании типа Dynamic для подстолбца JSON. #70147 (Pavel Kruglov).
  • Исправлена ошибка, из‑за которой пароль отображался в system.query_log для пользователей с методом аутентификации пароля на основе bcrypt. #70148 (Nikolay Degterinsky).
  • Исправлен счетчик событий для нативного интерфейса (InterfaceNativeSendBytes). #70153 (Yakov Olkhovskiy).
  • Исправлен возможный сбой, связанный с JSON-столбцами. #70172 (Pavel Kruglov).
  • Исправлено несколько ошибок в arrayMin и arrayMax. #70207 (Raúl Marín).
  • Учитывать настройку allow_simdjson в парсере типа данных JSON. #70218 (Pavel Kruglov).
  • Исправлена ошибка разыменования нулевого указателя при создании materialized view с двумя SELECT и оператором INTERSECT, например: CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);. #70264 (Konstantin Bogdanov).
  • Не изменяйте глобальные настройки с помощью стартовых скриптов. Ранее изменение настройки в стартовом скрипте делало это изменение глобальным. #70310 (Antonio Andelic).
  • Исправлена обработка ALTER для типа Dynamic при уменьшении параметра max_types, что могло приводить к аварийному завершению работы сервера. #70328 (Pavel Kruglov).
  • Исправлено падение при некорректном использовании WITH FILL. #70338 (Raúl Marín).
  • Исправлена потенциальная ошибка использования уже освобождённой памяти в SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf. #70358 (Azat Khuzhin).
  • Исправлено падение при выполнении GROUP BY по подстолбцу подобъекта JSON. #70374 (Pavel Kruglov).
  • Не выполнять предварительную выборку частей для вертикальных слияний, если в части нет строк. #70452 (Antonio Andelic).
  • Исправлен сбой в выражении WHERE при использовании lambda-функций. #70464 (Raúl Marín).
  • Исправлено создание таблицы с помощью CREATE ... AS table_function(...) в базе данных Replicated в случае недоступности источника table function на вторичной реплике. #70511 (Kseniia Sumarokova).
  • Теперь при асинхронной вставке с wait_for_async_insert=1 весь вывод игнорируется. Закрывает #62644. #70530 (Konstantin Bogdanov).
  • Не учитывать файл frozen_metadata.txt при обходе теневого каталога из system.remote_data_paths. #70590 (Aleksei Filatov).
  • Исправлена ошибка при создании оконных функций с состоянием на невыровненной памяти. #70631 (Raúl Marín).
  • Исправлены редкие падения в запросах SELECT и при слияниях после добавления столбца типа Array с непустым выражением по умолчанию. #70695 (Anton Popov).
  • Операция вставки в табличную функцию s3 теперь учитывает настройки запроса. #70696 (Vladimir Cherkasov).
  • Исправлена бесконечная рекурсия при выводе схемы protobuf при включённом пропуске неподдерживаемых полей. #70697 (Raúl Marín).
  • По умолчанию отключить enable_named_columns_in_function_tuple. #70833 (Raúl Marín).
  • Исправлена проблема, при которой настройка processing_threads_num движка таблицы S3Queue не применялась в случае, если она вычислялась на основе количества ядер CPU на сервере. #70837 (Kseniia Sumarokova).
  • Нормализованы аргументы именованных кортежей в состояниях агрегации. Это исправляет ошибку #69732. #70853 (Amos Bird).
  • Исправлена логическая ошибка из‑за отрицательных нулей в двухуровневой хеш-таблице, что закрывает #70973. #70979 (Alexey Milovidov).
  • Исправлена работа операторов limit by и limit with ties для распределённых и параллельных реплик. #70880 (Nikita Taranov).

Релиз ClickHouse 24.9, 2024-09-26. Презентация, Видео

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

  • Выражения вида a[b].c поддерживаются для именованных кортежей, а также именованная индексация из произвольных выражений, например expr().name. Это полезно для обработки JSON. Исправляет #54965. В предыдущих версиях выражение вида expr().name разбиралось как tupleElement(expr(), name), и анализатор запроса искал столбец name, а не соответствующий элемент кортежа; в новой версии это изменено на tupleElement(expr(), 'name'). В большинстве случаев предыдущая версия не работала, но можно представить себе крайне необычный сценарий, когда это изменение может привести к несовместимости: если вы хранили имена элементов кортежей в столбце или псевдониме, который назывался иначе, чем имя элемента кортежа: SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a. Маловероятно, что вы использовали такие запросы, но мы всё равно должны пометить это изменение как потенциально обратно несовместимое. #68435 (Alexey Milovidov).
  • Когда включена настройка print_pretty_type_names, тип данных Tuple будет выводиться в удобочитаемом виде в командах SHOW CREATE TABLE, функции formatQuery, а также в интерактивном режиме в clickhouse-client и clickhouse-local. В предыдущих версиях эта настройка применялась только к запросам DESCRIBE и функции toTypeName. Исправляет #65753. #68492 (Alexey Milovidov).
  • Запрещено явно указывать UUID при создании таблицы в базах данных типа Replicated. Также запрещено явно указывать путь в Keeper и имя реплики для таблиц *MergeTree в базах данных типа Replicated. Вводится новая настройка database_replicated_allow_explicit_uuid и изменяется тип database_replicated_allow_replicated_engine_arguments с Bool на UInt64. #66104 (Alexander Tokmakov).

Новая возможность

  • Позволяет пользователю иметь несколько методов аутентификации, а не только один. Добавляет возможность сбрасывать методы аутентификации к последнему добавленному методу. Если вы хотите какое-то время параллельно запускать экземпляры версии 24.8 и один экземпляр 24.9, на этот период лучше установить max_authentication_methods_per_user = 1, чтобы избежать потенциальных несовместимостей. #65277 (Arthur Passos).
  • Добавлена поддержка операции ATTACH PARTITION ALL FROM. #61987 (Kirill Nikiforov).
  • Добавлена настройка input_format_json_empty_as_default, которая при включении трактует пустые поля во входных JSON-данных как значения по умолчанию. Закрывает #59339. #66782 (Alexis Arnaud).
  • Добавлены функции overlay и overlayUTF8, предназначенные для замены части строки другой строкой. Пример: SELECT overlay('Hello New York', 'Jersey', 11) возвращает Hello New Jersey. #66933 (李扬).
  • Добавлена поддержка легковесного удаления с указанием партиции в DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr; #67805 (sunny).
  • Реализована поддержка сравнения значений типа данных Interval с разными единицами измерения (такими как секунды и минуты), при котором они приводятся к наименьшему супертипу. #68057 (Yarik Briukhovetskyi).
  • Добавлена настройка create_if_not_exists, которая по умолчанию включает поведение IF NOT EXISTS для команд CREATE. #68164 (Peter Nguyen).
  • Даёт возможность читать таблицы Iceberg в Azure и локально. #68210 (Daniil Ivanik).
  • Записи кэша запросов теперь можно удалять по тегу. Например, запись кэша запросов, созданная запросом SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc', теперь может быть удалена с помощью SYSTEM DROP QUERY CACHE TAG 'abc'. #68477 (Michał Tabaszewski).
  • Добавлено шифрование хранилища для именованных коллекций. #68615 (Pablo Marcos).
  • Добавлен виртуальный столбец _headers в движок таблицы URL. Закрыта задача #65026. #68867 (flynn).
  • Добавлена таблица system.projections для отслеживания доступных проекций. #68901 (Jordi Villar).
  • Добавлена новая функция arrayZipUnaligned для совместимости со Spark (в Spark она называется arrays_zip), которая допускает массивы разной длины и основана на исходной функции arrayZip. #69030 (李扬).
  • Добавлены команды cp/mv для клиентского приложения командной строки keeper, которые атомарно копируют/перемещают узел. #69034 (Mikhail Artemenko).
  • В функцию arrayAUC добавлен аргумент scale (по умолчанию true), позволяющий пропустить шаг нормализации (issue #69609). #69717 (gabrielmcg44).

Экспериментальная функция

  • Добавлена настройка input_format_try_infer_variants, которая позволяет определять тип Variant при выводе схемы для текстовых форматов, когда существует более одного возможного типа для элементов столбца/массива. #63798 (Shaun Struwig).
  • Добавлены агрегатные функции distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes для более удобной интроспекции содержимого типов в JSON-столбцах. #68463 (Kruglov Pavel).
  • Новый алгоритм определения единицы распределения меток между параллельными репликами по согласованному хэшу. Для разных шаблонов чтения выбирается различное количество меток для улучшения производительности. #68424 (Nikita Taranov).
  • Ранее алгоритмическая сложность логики дедупликации кусков (parts) при обработке объявлений от параллельных реплик была O(n^2), что могло занимать заметное время для таблиц с большим количеством кусков (или партиций). Это изменение уменьшает сложность до O(n*log(n)). #69596 (Alexander Gololobov).
  • Улучшения для refreshable materialized view: режим добавления (... REFRESH EVERY 1 MINUTE APPEND ...) для добавления строк в существующую таблицу вместо полной перезаписи таблицы, повторные попытки (по умолчанию отключены, настраиваются в секции SETTINGS запроса), запрос SYSTEM WAIT VIEW <name>, который ожидает завершения текущего обновления, некоторые исправления. #58934 (Michael Kolupaev).
  • Добавлен min_max как новый тип (экспериментальной) статистики. Он поддерживает оценку диапазонных условий над числовыми столбцами, например x < 100. #67013 (JackyWoo).
  • Улучшен castOrDefault для столбцов Variant/Dynamic, чтобы он работал, когда вложенные типы вообще не конвертируемы. #67150 (Kruglov Pavel).
  • Репликация подмножества столбцов теперь доступна через MaterializedPostgreSQL. Закрывает #33748. #69092 (Kruglov Kirill).

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

  • Реализовано чтение только необходимых файлов для Hive-разбиения. #68963 (Yarik Briukhovetskyi).
  • Улучшена производительность JOIN за счёт перераспределения правой таблицы по ключам, когда ключи таблицы плотные в LEFT или INNER hash joins. #60341 (kevinyhzou).
  • Улучшена производительность ALL JOIN за счёт отложенного добавления списка строк. #63677 (kevinyhzou).
  • Асинхронная загрузка метаданных кэша файловой системы во время запуска, чтобы ускорить перезапуски (управляется настройкой load_metadata_asynchronously). #65736 (Daniel Pozo Escalona).
  • Функции array и map оптимизированы для гораздо более быстрого выполнения некоторых распространённых случаев. #67707 (李扬).
  • Небольшая оптимизация чтения строковых значений ORC, особенно когда столбец не содержит NULL. #67794 (李扬).
  • Улучшена общая производительность слияний за счёт снижения накладных расходов на планирование шагов слияний. #68016 (Anton Popov).
  • Ускорены запросы к S3, когда профиль не задан, учётные данные не заданы и IMDS недоступен (например, когда вы выполняете запрос к публичному бакету с машины вне облака). Закрывает #52771. #68082 (Alexey Milovidov).
  • Девиртуализирован ридер формата в RowInputFormatWithNamesAndTypes для некоторого улучшения производительности. #68437 (李扬).
  • Добавлено параллельное слияние для агрегатной функции uniq при агрегировании с группировкой по ключу для максимального использования CPU. #68441 (Jiebin Sun).
  • Добавлена настройка output_format_orc_dictionary_key_size_threshold, позволяющая включить словарное кодирование для строкового столбца в формате вывода ORC. Это помогает значительно уменьшить размер выходного файла ORC и существенно улучшить производительность чтения. #68591 (李扬).
  • Добавлен новый запрос Keeper RemoveRecursive, который удаляет узел вместе со всем его поддеревом. #69332 (Mikhail Artemenko).
  • Ускорена вставка в таблицу с индексом векторного сходства за счёт параллельного добавления данных в векторный индекс. #69493 (flynn).
  • Снижено потребление памяти при вставках в JSON за счёт использования адаптивного размера буфера записи. Многие файлы, создаваемые JSON-столбцом в широкой части, содержат небольшое количество данных, и нет смысла выделять для них буфер размером 1 МБ. #69272 (Kruglov Pavel).
  • Исключён возврат потока в пул потоков concurrent hash join, чтобы предотвратить чрезмерное создание потоков одним запросом. #69406 (Duc Canh Le).

Улучшения

  • CREATE TABLE AS теперь копирует предложения PRIMARY KEY, ORDER BY и аналогичные. В данный момент это поддерживается только для семейства движков таблиц MergeTree. #69076 (sakulali).
  • Усилены механизмы в кодовой базе, связанные с разбором небольших сущностей. Были обнаружены и исправлены следующие (незначительные) ошибки: - если таблица DeltaLake разбита на партиции по полю типа Bool, значение партиции всегда интерпретировалось как false; - таблица ExternalDistributed использовала только один сегмент из указанных адресов; значение настройки max_threads и подобных выводилось как 'auto(N)' вместо auto(N). #52503 (Alexey Milovidov).
  • Использовать метрики, специфичные для cgroup, для учета использования CPU вместо системных метрик. #62003 (Nikita Taranov).
  • Планирование ввода-вывода для удалённых дисков S3 теперь выполняется на уровне потоков HTTP-сокетов (вместо целых S3-запросов), чтобы устранить проблемы с ограничением скорости bandwidth_limit. #65182 (Sergei Trifonov).
  • Функции upperUTF8 и lowerUTF8 ранее умели переводить в верхний/нижний регистр только кириллические символы. Это ограничение снято, и теперь символы на любых языках переводятся в верхний/нижний регистр. Пример: SELECT upperUTF8('Süden') теперь возвращает SÜDEN. #65761 (李扬).
  • Ранее при выполнении легковесного удаления в таблице с проекциями пользователи могли выбрать: либо выбросить исключение (значение по умолчанию), либо удалить проекцию при выполнении легковесного удаления. Теперь появился третий вариант — всё равно выполнить легковесное удаление, а затем перестроить проекции. #66169 (jsc0218).
  • Добавлены две опции (dns_allow_resolve_names_to_ipv4 и dns_allow_resolve_names_to_ipv6) для блокировки подключений по семейству IP-адресов. #66895 (MikhailBurdukov).
  • Добавлена возможность настраивать игнорирование Ctrl-Z (ignore&#95;shell&#95;suspend) в clickhouse-client. #67134 (Azat Khuzhin).
  • Улучшена проверка UTF-8 в форматах вывода JSON. Обеспечивается генерация корректного JSON при некоторых байтовых последовательностях в результирующих данных. #67938 (mwoenker).
  • Добавлены события профилирования для слияний и мутаций для более детального анализа. #68015 (Anton Popov).
  • ODBC: получать значение http_max_tries из конфигурации сервера. #68128 (Rodolphe Dugé de Bernonville).
  • Добавлена поддержка подстановочных символов для идентификации пользователя в расширении SubjectAltName сертификатов X.509. #68236 (Marco Vilas Boas).
  • Улучшено определение схемы для значений даты и времени. Теперь DateTime64 используется только если значение имеет дробную часть, в противном случае используется обычный DateTime. Определение типов Date/DateTime теперь более строгое, особенно при date_time_input_format='best_effort', чтобы избежать вывода дат и времени из строк в пограничных случаях. #68382 (Kruglov Pavel).
  • Удалён старый код именованных коллекций из словарей и заменён на новый, который позволяет использовать именованные коллекции, созданные с помощью DDL, в словарях. Закрывает #60936, закрывает #36890. #68412 (Kseniia Sumarokova).
  • Теперь для внешних HTTP-аутентификаторов используется HTTP/1.1 вместо HTTP/1.0 (использовавшегося по умолчанию). #68456 (Aleksei Filatov).
  • Добавлен новый набор метрик для анализа работы пула потоков, обеспечивающий более глубокое понимание его производительности и поведения. #68674 (filimonov).
  • Добавлена поддержка параметров запроса в асинхронных вставках с форматом Values. #68741 (Anton Popov).
  • Реализована поддержка типа Date32 в функциях dateTrunc и toStartOfInterval. #68874 (LiuNeng).
  • В таблицу system.processors_profile_log добавлены столбцы plan_step_name и plan_step_description. #68954 (Alexander Gololobov).
  • Добавлена поддержка испанского языка во встроенных словарях. #69035 (Vasily Okunev).
  • В краткое сообщение о сбое добавлена архитектура CPU. #69037 (Konstantин Bogданов).
  • Запросы будут быстрее завершаться с ошибкой, если при повторных попытках не удаётся установить новое соединение с Keeper. #69148 (Raúl Marín).
  • Обновили DatabaseFactory, чтобы пользовательские движки баз данных могли принимать аргументы, настройки и переопределения таблиц (аналогично StorageFactory). #69201 (NikBarykin).
  • Режим восстановления, в котором все внешние движки таблиц и функции заменяются на движок Null (настройки restore_replace_external_engines_to_null, restore_replace_external_table_functions_to_null), завершался с ошибкой, если таблица имела SETTINGS. Теперь в этом случае из определения таблицы удаляются настройки, и такие таблицы можно восстановить. #69253 (Ilya Yatsishin).
  • CLICKHOUSE_PASSWORD теперь корректно экранируется для использования в XML в entrypoint образа ClickHouse. #69301 (aohoyd).
  • Разрешить пустые аргументы для arrayZip/arrayZipUnaligned, как это делал concat в https://github.com/ClickHouse/ClickHouse/pull/65887. Это сделано для совместимости со Spark в бэкенде Gluten CH. #69576 (李扬).
  • Добавлена поддержка более продвинутых параметров SSL для внутреннего взаимодействия Keeper’а (например, закрытых ключей, защищённых фразой-паролем). #69582 (Antonio Andelic).
  • Анализ индексов может занимать заметное время для больших таблиц с большим количеством частей или партиций. Это изменение должно позволить прерывать ресурсоёмкий запрос на этом этапе. #69606 (Alexander Gololobov).
  • Маскирование конфиденциальной информации в табличной функции gcs. #69611 (Vitaly Baranov).
  • Перестроение проекций при слияниях, уменьшающих количество строк. #62364 (cangyin).

Исправление ошибки (заметимое пользователем некорректное поведение в официальном стабильном релизе)

  • Исправлена ошибка подключения таблицы, если pg dbname содержит «-» в экспериментальном и неподдерживаемом движке MaterializedPostgreSQL. #62730 (takakawa).
  • Исправлена ошибка в вычисляемых столбцах в экспериментальном и полностью неподдерживаемом движке MaterializedPostgreSQL при нарушении порядка adnum #63161. Исправлена ошибка в столбце id со значением по умолчанию — выражением nextval — в экспериментальном и полностью неподдерживаемом MaterializedPostgreSQL при наличии вычисляемых столбцов в таблице. Исправлена ошибка при удалении публикации, содержащей символы, отличные от [a-z1-9-]. #67664 (Kruglov Kirill).
  • В Storage Join добавлена поддержка столбцов типа Nullable в левой таблице, что закрывает #61247. #66926 (vdimir).
  • Некорректный результат запроса с параллельными репликами (и распределением запросов), когда оператор IN содержит преобразование в Decimal(). Ошибка была вызвана новым анализатором. #67234 (Igor Nikonov).
  • Исправлена проблема, из‑за которой ALTER MODIFY ORDER BY приводил к несогласованности метаданных. #67436 (iceFireser).
  • Исправлена верхняя граница функции fromModifiedJulianDay. Она должна была быть равна 9999-12-31, но по ошибке была установлена как 9999-01-01. #67583 (PHO).
  • Исправлена ошибка, возникавшая, когда индекс находился не в начале кортежа в запросе с IN. #67626 (Yarik Briukhovetskyi).
  • Исправлена логика истечения срока действия в RoleCache. #67748 (Vitaly Baranov).
  • Исправлена проблема с пропущенными блоками в оконном представлении из‑за медленного сброса данных в представление. #67983 (Raúl Marín).
  • Исправлена ошибка MSan, вызванная некорректным форматом даты. #68105 (JackyWoo).
  • Исправлено аварийное завершение при фильтрации Parquet, возникавшее, когда типы данных в файле существенно отличались от запрошенных типов (например, ... FROM file('a.parquet', Parquet, 'x String'), но в файле x Int64). До установки этого исправления используйте input_format_parquet_filter_push_down = 0 в качестве обходного решения. #68131 (Michael Kolupaev).
  • Исправлен сбой в функциях lag/lead, появившийся в #67091. #68262 (lgbo).
  • Попытка устранить аварийное завершение работы postgres при отмене запроса. #68288 (Kseniia Sumarokova).
  • После https://github.com/ClickHouse/ClickHouse/pull/61984 schema_inference_make_columns_nullable=0 по‑прежнему мог делать столбцы Nullable в форматах Parquet/Arrow. Изменение оказалось несовместимым с предыдущим поведением, и пользователи заметили изменения. В этом PR schema_inference_make_columns_nullable=0 снова работает как раньше (столбцы типа Nullable больше не выводятся автоматически) и добавлено новое значение auto для этой настройки, при котором столбцы будут становиться Nullable только в том случае, если в данных есть информация о nullability. #68298 (Kruglov Pavel).
  • Исправлена проблема #50868. Малые константные значения типа DateTime64, возвращаемые вложенным подзапросом в распределённом запросе, ошибочно преобразовывались в значения Null, что приводило к ошибкам и потенциально некорректным результатам запроса. #68323 (Shankar).
  • Исправлено отсутствие режима синхронизации реплики в запросе SYSTEM SYNC REPLICA. #68326 (Duc Canh Le).
  • Исправлена ошибка в ключевом условии. #68354 (Han Fei).
  • Исправлен сбой при удалении или переименовании роли, используемой во внешнем пользовательском каталоге LDAP. #68355 (Andrey Zvonov).
  • Исправлено значение столбца Progress в system.view_refreshes, если оно больше 1 #68377. #68378 (megao).
  • Исправлена корректная обработка флагов регулярных выражений. #68389 (Han Fei).
  • Оператор приведения типов в стиле PostgreSQL (::) теперь корректно работает и для шестнадцатеричных и двоичных строковых литералов в SQL-стиле (например, SELECT x'414243'::String). Это закрывает задачу #68324. #68482 (Alexey Milovidov).
  • Небольшой патч к https://github.com/ClickHouse/ClickHouse/pull/68131. #68494 (Chang chen).
  • Исправлена ошибка в обработке #68239 SAMPLE n, где n — целое число. #68499 (Denis Hananein).
  • Исправлена ошибка в mann-whitney-utest, возникавшая при неравных размерах двух распределений. #68556 (Han Fei).
  • После неожиданного перезапуска не удаётся запустить репликацию ReplicatedMergeTree из‑за некорректной обработки части, перекрытой повреждённой частью. #68584 (baolin).
  • Исправлены LOGICAL_ERROR при применении функций sipHash64Keyed, sipHash128Keyed или sipHash128ReferenceKeyed к пустым массивам или кортежам. #68630 (Robert Schulze).
  • Полнотекстовый индекс мог отфильтровывать неверные столбцы при индексации нескольких столбцов: он не сбрасывал row_id между разными столбцами. Процедура воспроизведения находится в tests/queries/0_stateless/03228_full_text_with_multi_col.sql. Без этого исправления: #68644 (siyuan).
  • Исправлена проблема с недопустимыми символами '\t' и '\n' в replica_name при создании таблицы Replicated, которые приводили к некорректному разбору поля 'source replica' в LogEntry. Упомянуто в issue #68640. #68645 (Zhigao Hong).
  • В distributed таблицы возвращены виртуальные столбцы _table и _database. Они были доступны до версии 24.3. #68672 (Anton Popov).
  • Исправлена возможная ошибка Size of permutation (0) is less than required (...) при перестановке столбца типа Variant. #68681 (Kruglov Pavel).
  • Исправлена возможная ошибка DB::Exception: Block structure mismatch in joined block stream: different columns:, возникающая при использовании нового JSON-столбца. #68686 (Kruglov Pavel).
  • Исправлена проблема с материализованными константными ключами при хешировании отображений (Map), где в качестве ключей используются массивы, в функциях sipHash(64/128)Keyed. #68731 (Salvatore Mesoraca).
  • Сделать так, чтобы ColumnsDescription::toString форматировал все столбцы, используя один и тот же объект IAST::FormatState. Это приводит к записи метаданных столбцов на диск и в ZooKeeper в единообразном виде. #68733 (Miсhael Stetsyuk).
  • Исправлено объединение агрегированных данных для GROUPING SETS. #68744 (Nikolai Kochetov).
  • Исправлена логическая ошибка, возникавшая при создании таблицы ReplicatedMergeTree, изменении столбца и последующем выполнении MODIFY STATISTICS. #68820 (Han Fei).
  • Исправлено определение динамических подстолбцов из подзапросов в анализаторе. #68824 (Kruglov Pavel).
  • Исправлен разбор метаданных сложных типов данных в DeltaLake. Закрывает #68739. #68836 (Kseniia Sumarokova).
  • Исправлена проблема с асинхронными вставками в случае, когда метаданные таблицы изменяются (запросами ALTER ADD/MODIFY COLUMN) после вставки, но до сброса данных в таблицу. #68837 (Anton Popov).
  • Исправлено неожиданное исключение при передаче пустого кортежа в массив. Исправлена #68618. #68848 (Amos Bird).
  • Исправлена обработка команд мутаций, затрагивающих только метаданные. #68935 (János Benjamin Antal).
  • Исправлена потенциальная ошибка, приводившая к некорректному результату при слиянии состояния anyHeavy. #68950 (Raúl Marín).
  • Исправлена запись в materialized view при включённой настройке optimize_functions_to_subcolumns. #68951 (Anton Popov).
  • Не используйте кэш сериализаций в const-методах столбца Dynamic. Это могло приводить к использованию неинициализированных значений или даже к состоянию гонки во время агрегаций. #68953 (Kruglov Pavel).
  • Исправлена ошибка разбора, возникавшая в случаях, когда при разборе типа JSON в качестве значения по умолчанию должен был вставляться null. #68955 (Kruglov Pavel).
  • Исправлена ошибка, из-за которой заголовок Content-Encoding не отправлялся в некоторых сжатых ответах. #64802. #68975 (Konstantin Bogdanov).
  • Были случаи, когда путь формировался некорректно и содержал подстроку //; эту проблему устранили с помощью нормализации пути. #69066 (Yarik Briukhovetskyi).
  • Исправлена логическая ошибка, возникающая при пустой асинхронной вставке. #69080 (Han Fei).
  • Исправлена гонка данных индикации прогресса в clickhouse-client при отмене запроса. #69081 (Sergei Trifonov).
  • Исправлена ошибка, из-за которой индекс векторного сходства (в настоящее время экспериментальный) не использовался при использовании косинусного расстояния в качестве функции расстояния. #69090 (flynn).
  • Это изменение исправляет проблему, при которой попытка повторно создать базу данных Replicated после сбоя сервера во время первоначального создания могла приводить к ошибке. #69102 (Miсhael Stetsyuk).
  • Не определять тип Bool из String в CSV, когда input_format_csv_try_infer_numbers_from_strings = 1, так как чтение логических значений из строк не поддерживается. #69109 (Kruglov Pavel).
  • Исправлены ошибки разбора при выполнении EXPLAIN AST для запросов INSERT на клиенте при включённой опции --multiquery. #69123 (wxybear).
  • Оператор UNION в подзапросах некорректно обрабатывался в запросах с параллельными репликами и приводил к LOGICAL_ERROR с сообщением Duplicate announcement received for replica. #69146 (Igor Nikonov).
  • Исправлена передача аргумента structure в s3Cluster. Ранее выражение DEFAULT столбца могло теряться при отправке запроса к репликам в s3Cluster. #69147 (Kruglov Pavel).
  • Учитывать настройки формата Values при преобразовании выражения в целевой тип. #69149 (Kruglov Pavel).
  • Исправлена работа clickhouse-client --queries-file для пользователей с правами только на чтение (ранее приводило к ошибке Cannot modify 'log_comment' setting in readonly mode). #69175 (Azat Khuzhin).
  • Исправлена гонка данных в clickhouse-client, возникающая при перенаправлении его вывода в процесс, который завершился раньше времени. #69186 (vdimir).
  • Исправлены некорректные результаты операций uniq и GROUP BY для типов JSON/Dynamic. #69203 (Kruglov Pavel).
  • Исправлено определение формата INFILE для асинхронных вставок. Если формат явно не указан в предложении FORMAT, он определяется по расширению файла INFILE. #69237 (Julia Kartseva).
  • После исправления этой проблемы в продакшене появилось довольно много реплик таблиц, у которых значение узла metadata_version равно 0, при этом оно отличается от значения узла metadata соответствующей таблицы. Это приводит к сбоям выполнения запросов ALTER на таких репликах. #69274 (Miсhael Stetsyuk).
  • Обозначили тип Dynamic как небезопасный для использования в качестве первичного ключа, чтобы избежать проблем с Fields. #69311 (Kruglov Pavel).
  • Улучшено восстановление зависимостей объектов доступа. #69346 (Vitaly Baranov).
  • Исправлено неопределённое поведение, возникавшее, когда все попытки установления соединения для вставки данных завершались неудачей. #69390 (Pablo Marcos).
  • Закрыта #69135. Ранее мы пытались повторно использовать присоединённые данные для соединения типа cross, хотя в текущей версии ClickHouse это невозможно. Поэтому лучше оставить have_compressed в reuseJoinedData. #69404 (lgbo).
  • Сделать так, чтобы функция materialize() возвращала полный столбец, если параметр является разреженным столбцом. #69429 (Alexander Gololobov).
  • Исправлена ошибка LOGICAL_ERROR в функции sqidDecode (#69450). #69451 (Robert Schulze).
  • Оперативное исправление проблемы s3queue в 24.6 или при создании запроса с реплицированной базой данных. #69454 (Kseniia Sumarokova).
  • Исправлен случай, когда потребление памяти было слишком высоким из-за «схлопывания» в запросах INSERT INTO ... SELECT или CREATE TABLE AS SELECT. #69469 (Yarik Briukhovetskyi).
  • Команды SHOW COLUMNS и SHOW INDEX теперь корректно работают, если в имени таблицы есть точки. #69514 (Salvatore Mesoraca).
  • Теперь запрещено использование кэша запросов для запросов с режимом переполнения, отличным от 'throw'. Это предотвращает ситуации, когда потенциально усечённые и некорректные результаты запросов могли бы быть сохранены в кэше запросов. (issue #67476). #69549 (Robert Schulze).
  • Сохранять исходный порядок условий при переносе в prewhere. Ранее порядок мог изменяться, что приводило к падению запросов, когда порядок был важен. #69560 (Kruglov Pavel).
  • Исправлена предобработка пакетных запросов Keeper после ошибки ZNOAUTH. #69627 (Antonio Andelic).
  • Исправлена ошибка METADATA_MISMATCH, которая могла возникать из-за использования TTL с предложением WHERE в DatabaseReplicated при создании новой реплики. #69736 (Nikolay Degterinsky).
  • Исправлен параметр tracked_file_ttl_sec в настройках StorageS3(Azure)Queue. Мы записывали его в keeper с ключом tracked_file_ttl_sec, но читали как tracked_files_ttl_sec, что было опечаткой. #69742 (Kseniia Sumarokova).
  • Используется tryconvertfieldtotype в gethyperrectangleforrowgroup. #69745 (Miсhael Stetsyuk).
  • Откат изменения «Fix prewhere without columns and without adaptive index granularity (almost w/o anything)». Из-за отката этих изменений при чтении частей данных, созданных старыми релизами ClickHouse (предположительно 2021 года или более ранними), могут возникать ошибки. #68897 (Alexander Gololobov).

Релиз ClickHouse 24.8 LTS от 2024-08-20. Презентация, Видео

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

  • clickhouse-client и clickhouse-local теперь по умолчанию работают в режиме multi-query (вместо single-query). Например, команда clickhouse-client -q "SELECT 1; SELECT 2" теперь работает, тогда как ранее пользователям нужно было добавлять --multiquery (или -n). Переключатель --multiquery/-n стал устаревшим. INSERT-запросы в multi-query-режиме обрабатываются особым образом в зависимости от их клаузы FORMAT: если FORMAT — VALUES (наиболее распространённый случай), конец оператора INSERT определяется завершающей точкой с запятой ; в конце запроса. Для всех остальных FORMAT (например, CSV или JSONEachRow) конец оператора INSERT определяется двумя переводами строки \n\n в конце запроса. #63898 (FFish).
  • В предыдущих версиях можно было использовать альтернативный синтаксис для типов данных LowCardinality, добавляя WithDictionary к имени типа данных. Это была первоначальная рабочая реализация, и она никогда не документировалась и не была публично доступна. Теперь этот синтаксис помечен как устаревший. Если вы использовали его, вам необходимо выполнить ALTER для таблиц и переименовать типы данных в LowCardinality. #66842 (Alexey Milovidov).
  • Исправлены логические ошибки при использовании хранилища Buffer с распределённой целевой таблицей. Это обратное несовместимое изменение: запросы, использующие Buffer с распределённой целевой таблицей, могут перестать работать, если таблица встречается в запросе более одного раза (например, в self-join). #67015 (vdimir).
  • В предыдущих версиях вызов функций для случайных распределений, основанных на гамма-функции (таких как хи-квадрат, Стьюдента, Фишера), с отрицательными аргументами, близкими к нулю, приводил к длительным вычислениям или бесконечному циклу. В новой версии вызов этих функций с нулевыми или отрицательными аргументами приводит к генерации исключения. Это закрывает задачу #67297. #67326 (Alexey Milovidov).
  • Системная таблица text_log теперь включена по умолчанию. Это полностью совместимо с предыдущими версиями, но вы можете заметить немного увеличившееся использование пространства на локальном диске (эта системная таблица занимает совсем немного места). #67428 (Alexey Milovidov).
  • В предыдущих версиях arrayWithConstant могла работать медленно при генерации очень больших массивов. В новой версии размер ограничен 1 ГБ на массив. Это закрывает задачу #32754. #67741 (Alexey Milovidov).
  • Исправлено форматирование модификатора REPLACE (запрещено опускать скобки). #67774 (Azat Khuzhin).
  • Бекпортировано в #68349: тип Dynamic реализован заново. Теперь при достижении лимита динамических типов данных новые типы не приводятся к String, а сохраняются в специальной структуре данных в бинарном формате с бинарно закодированным типом данных. Теперь любой тип, когда-либо записанный в столбец Dynamic, может быть прочитан из него как подстолбец. #68132 (Kruglov Pavel).

Новая функция

  • Добавлена новая настройка движка MergeTree deduplicate_merge_projection_mode для управления проекциями во время слияний (для отдельных движков) и запроса OPTIMIZE DEDUPLICATE. Поддерживаемые варианты: throw (выбрасывать исключение, если проекция не полностью поддерживается для движка *MergeTree), drop (удалять проекцию во время слияния, если её нельзя корректно слить) и rebuild (перестраивать проекцию с нуля, что является тяжёлой операцией). #66672 (jsc0218).
  • Добавлен виртуальный столбец _etag в табличный движок S3. Исправлена #65312. #65386 (skyoct).
  • Добавлен механизм тегирования (пространств имён) для кэша запросов. Кэш запросов рассматривает одни и те же запросы с разными тегами как разные. Пример: SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc' и SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def' теперь создают разные записи в кэше запросов. #68235 (sakulali).
  • Расширена поддержка вариантов строгости JOIN (LEFT/RIGHT SEMI/ANTI/ANY JOIN) с условиями неравенства, которые затрагивают столбцы как левой, так и правой таблицы, например t1.y < t2.y (см. настройку allow_experimental_join_condition). #64281 (lgbo).
  • Интерпретировать партиционирование в стиле Hive для различных движков (File, URL, S3, AzureBlobStorage, HDFS). Партиционирование в стиле Hive организует данные в подкаталоги партиций, что повышает эффективность выполнения запросов и управления большими наборами данных. В настоящий момент оно только создаёт виртуальные столбцы с соответствующими именами и данными. Последующий PR добавит соответствующую фильтрацию данных для повышения производительности. #65997 (Yarik Briukhovetskyi).
  • Добавлена функция printf для совместимости со Spark (но вы можете использовать существующую функцию format). #66257 (李扬).
  • Добавлены опции restore_replace_external_engines_to_null и restore_replace_external_table_functions_to_null, позволяющие заменять внешние движки и table_engines на движок Null, что может быть полезно для тестирования. Работает для RESTORE и при явном создании таблиц. #66536 (Ilya Yatsishin).
  • Добавлена поддержка чтения геометрии MULTILINESTRING формата WKT с использованием функции readWKTLineString. #67647 (Jacob Reckhard).
  • Добавлена новая табличная функция fuzzQuery. Эта функция позволяет модифицировать заданную строку запроса, внося в неё случайные изменения. Пример: SELECT query FROM fuzzQuery('SELECT 1') LIMIT 5;. #67655 (pufit).
  • Добавлен запрос ALTER TABLE ... DROP DETACHED PARTITION ALL, позволяющий удалять все отсоединённые партиции. #67885 (Duc Canh Le).
  • Добавлена статистика rows_before_aggregation_at_least в ответ на запрос при включённой новой настройке rows_before_aggregation. Эта статистика отражает количество строк, прочитанных до агрегации. В контексте распределённого запроса, при использовании агрегационной функции group by или max без limit, rows_before_aggregation_at_least может отражать количество строк, попавших под действие запроса. #66084 (morning-color).
  • Добавлена поддержка запроса OPTIMIZE для таблиц Join для сокращения объёма потребляемой памяти. #67883 (Duc Canh Le).
  • Добавлена возможность мгновенно выполнять запрос в Play, если вы добавите &run=1 в URL #66457 (Aleksandr Musorin).

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

  • Реализован новый тип данных JSON. #66444 (Kruglov Pavel).
  • Добавлен новый движок таблицы TimeSeries. #64183 (Vitaly Baranov).
  • Добавлен новый экспериментальный движок хранения Kafka для сохранения смещений в Keeper вместо фиксации их в Kafka. Это делает коммит в таблицы ClickHouse атомарным по отношению к чтению из очереди. #57625 (János Benjamin Antal).
  • Используется метод адаптивного вычисления размера задач чтения (адаптивный — то есть зависящий от размеров читаемых столбцов) для параллельных реплик. #60377 (Nikita Taranov).
  • Добавлен тип статистики count_min (скизы count-min), который обеспечивает оценки селективности для предикатов равенства вида col = 'val'. Поддерживаемые типы данных: строковые, date, datetime и числовые типы. #65521 (JackyWoo).

Улучшение производительности

  • Настройка optimize_functions_to_subcolumns включена по умолчанию. #68053 (Anton Popov).
  • Метаданные каталога диска plain_rewritable хранятся в структуре __meta отдельно от данных MergeTree в объектном хранилище. Диск plain_rewritable переведён на плоскую структуру каталогов. #65751 (Julia Kartseva).
  • Улучшено уплотнение столбцов (операция, выполняемая в запросах INSERT) для типов String/Array/Map/Variant/Dynamic за счёт предварительного резервирования требуемой памяти для всех подстолбцов. #67043 (Kruglov Pavel).
  • Ускорена операция SYSTEM FLUSH LOGS и добавлен сброс логов при завершении работы. #67472 (Sema Checherinda).
  • Повышена общая производительность слияний за счёт уменьшения накладных расходов на этапы планирования слияний. #68016 (Anton Popov).
  • Ускорено удаление таблиц для запроса DROP DATABASE, значение по умолчанию для database_catalog_drop_table_concurrency увеличено до 16. #67228 (Nikita Mikhaylov).
  • Исключено избыточное выделение ёмкости для столбца массива при записи в формат ORC. Это даёт прирост производительности около 15% для столбца типа Array. #67879 (李扬).
  • Существенно ускорены мутации для нереплицируемых таблиц MergeTree. #66911 #66909 (Alexey Milovidov).

Улучшения

  • Настройка allow_experimental_analyzer переименована в enable_analyzer. Старое имя сохранено в виде псевдонима. Это означает, что Analyzer больше не является бета-версией и полностью готов к промышленной эксплуатации. #66438 (Nikita Mikhaylov).
  • Улучшен вывод схемы для значений даты и времени. Теперь DateTime64 используется только тогда, когда значение даты и времени имеет дробную часть, в остальных случаях используется обычный DateTime. Определение типов Date/DateTime теперь более строгое, особенно при date_time_input_format='best_effort', чтобы избежать интерпретации строк как значений даты и времени в пограничных случаях. #68382 (Kruglov Pavel).
  • Сервер ClickHouse теперь поддерживает новую настройку max_keep_alive_requests. Для keep-alive HTTP-соединений с сервером она работает в тандеме с keep_alive_timeout: если время простоя ещё не истекло, но по данному соединению уже выполнено больше запросов, чем указано в max_keep_alive_requests, соединение будет закрыто сервером. #61793 (Nikita Taranov).
  • Несколько улучшений расширенной панели мониторинга. Закрывает #67697. Закрывает #63407. Закрывает #51129. Закрывает #61204. #67701 (Alexey Milovidov).
  • Теперь при создании Distributed таблицы не требуется привилегия REMOTE: достаточно привилегии для движка Distributed. #65419 (jsc0218).
  • Не указывать явно логи Keeper в Docker-образе, чтобы их можно было переопределять. #65564 (Azat Khuzhin).
  • Добавлены настройки use_same_password_for_base_backup для запросов BACKUP и RESTORE, позволяющие создавать и восстанавливать инкрементные бэкапы в архивы, защищённые паролем, и из них. #66214 (Samuele).
  • Теперь async_load_databases игнорируется для запроса ATTACH (раньше ATTACH мог завершиться до того, как таблицы были присоединены). #66240 (Azat Khuzhin).
  • Добавлены логи и метрики для отклонённых попыток подключения (когда недостаточно ресурсов). #66410 (Alexander Tokmakov).
  • Добавлена корректная поддержка типа UUID в движке MongoDB. #66671 (Azat Khuzhin).
  • Добавлены метрики задержки репликации и времени восстановления. #66703 (Miсhael Stetsyuk).
  • Добавлена метрика DiskS3NoSuchKeyErrors. #66704 (Miсhael Stetsyuk).
  • Обеспечена поддержка оператора COMMENT для всех движков таблиц. #66832 (Joe Lynch).
  • Функция mapFromArrays теперь принимает Map(K, V) в качестве первого аргумента, например: SELECT mapFromArrays(map('a', 4, 'b', 4), ['aa', 'bb']) теперь работает и возвращает {('a',4):'aa',('b',4):'bb'}. Также, если первый аргумент — это массив, он теперь может иметь тип Array(Nullable(T)) или Array(LowCardinality(Nullable(T))) при условии, что значения элементов массива не равны NULL. #67103 (李扬).
  • Чтение конфигурации clickhouse-local из файла ~/.clickhouse-local. #67135 (Azat Khuzhin).
  • Переименована настройка input_format_orc_read_use_writer_time_zone в input_format_orc_reader_timezone и добавлена возможность пользователю указывать часовой пояс чтения. #67175 (kevinyhzou).
  • Понижен уровень серьёзности ошибки Socket is not connected, возникающей, когда HTTP‑соединение немедленно сбрасывается клиентом сразу после установления, что позволило закрыть #34218. #67177 (vdimir).
  • Добавлена возможность загружать дашборды для system.dashboards из конфигурации (после настройки они переопределяют набор дашбордов по умолчанию). #67232 (Azat Khuzhin).
  • Оконные функции в SQL традиционно записываются в snake_case. ClickHouse использует camelCase, поэтому были созданы новые алиасы denseRank() и percentRank(). Эти новые функции можно вызывать точно так же, как и исходные функции dense_rank() и percent_rank(). Оба варианта синтаксиса — snake_case и camelCase — остаются доступны. Также добавлен новый тест для каждой функции. Это закрывает #67042. #67334 (Peter Nguyen).
  • Автоматически определяет формат файла конфигурации, если он не в формате .xml, .yml или .yaml. Если файл начинается с <, предполагается XML, в противном случае — YAML. Это полезно при передаче файла конфигурации через pipe: clickhouse-server --config-file <(echo "hello: world"). #67391 (sakulali).
  • Функции formatDateTime и formatDateTimeInJodaSyntax теперь рассматривают параметр формата как необязательный. Если он не указан, по умолчанию используются строки формата %Y-%m-%d %H:%i:%s и yyyy-MM-dd HH:mm:ss. Пример: SELECT parseDateTime('2021-01-04 23:12:34') теперь возвращает значение типа DateTime 2021-01-04 23:12:34 (ранее это приводило к исключению). #67399 (Robert Schulze).
  • Автоматически повторять запросы к Keeper в KeeperMap в случае таймаута или потери соединения. #67448 (Antonio Andelic).
  • Добавлен флаг -no-pie в сборки для AArch64 под Linux, чтобы обеспечить корректную интроспекцию и символизацию трасс стека после перезапуска ClickHouse. #67916 (filimonov).
  • Добавлены профильные события для слияний и мутаций для более детального анализа. #68015 (Anton Popov).
  • Удалены лишние журнальные сообщения для нереплицируемых таблиц MergeTree. #68238 (Daniil Ivanik).

Улучшение сборки/тестирования/упаковки

  • Проверка нестабильных интеграционных тестов теперь будет запускать каждый тестовый кейс несколько раз, чтобы находить больше проблем в тестах и делать их более надёжными. Для многократного запуска тестового кейса в одной и той же среде используется библиотека pytest-repeat. Важно очищать таблицы и другие сущности в конце тестового кейса, чтобы он прошёл. Повторные запуски работают гораздо быстрее, чем несколько отдельных запусков pytest, поскольку необходимые контейнеры запускаются только один раз. #66986 (Ilya Yatsishin).
  • Сняты ограничения на использование CLion с ClickHouse. В предыдущих версиях CLion зависал на минуту при каждом нажатии клавиши. Это закрывает #66994. #66995 (Alexey Milovidov).
  • getauxval: предотвращён сбой при повторном запуске под санитайзером из-за высокой энтропии ASLR в новых ядрах Linux. #67081 (Raúl Marín).
  • Некоторые части клиентского кода вынесены в один файл, и к ним применяется максимально возможный уровень оптимизации даже для отладочных сборок. Это закрывает #65745. #67215 (Nikita Mikhaylov).

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

  • Относится только к экспериментальному типу данных Variant. Исправлена ошибка, приводившая к аварийному завершению при использовании типов Variant и AggregateFunction. #67122 (Kruglov Pavel).
  • Исправлено аварийное завершение DistributedAsyncInsert при отсутствии соединения. #67219 (Pablo Marcos).
  • Исправлена ошибка, приводившая к сбою функций uniq и uniqTheta при использовании аргумента tuple(). Закрывает #67303. #67306 (flynn).
  • Исправляет #66026. Исключён обход неразрешённых аргументов табличных функций в ReplaceTableNodeToDummyVisitor. #67522 (Dmitry Novik).
  • Исправлено потенциальное переполнение стека в функции JSONMergePatch. Эта функция была переименована из jsonMergePatch в JSONMergePatch, так как прежнее имя было некорректным. Прежнее имя по-прежнему сохраняется для совместимости. Улучшена диагностика ошибок этой функции. Это исправление закрывает #67304. #67756 (Alexey Milovidov).
  • Исправлена ошибка разыменования NULL-указателя, приводившая к сбою сервера при выполнении специально сформированного запроса, использующего функции hopEnd, hopStart, tumbleEnd и tumbleStart. #68098 (Salvatore Mesoraca).
  • Исправлена ошибка, из-за которой при фильтрации с использованием подзапросов некоторые системные таблицы могли показывать Not-ready Set. #66018 (Michael Kolupaev).
  • Исправлено чтение подстолбцов после выполнения запроса ALTER ADD COLUMN. #66243 (Anton Popov).
  • Исправлены булевы литералы в запросах, отправляемых во внешние базы данных (для движков, таких как PostgreSQL). #66282 (vdimir).
  • Исправлено форматирование запроса с псевдонимом выражения в JOIN ON: например, ... JOIN t2 ON (x = y) AS e ORDER BY x следует форматировать как ... JOIN t2 ON ((x = y) AS e) ORDER BY x. #66312 (vdimir).
  • Исправлена работа cluster() с межсерверным секретом (изначальный пользователь сохраняется, как и раньше). #66364 (Azat Khuzhin).
  • Исправлена возможная ошибка времени выполнения при преобразовании поля типа Array, содержащего значения NULL, в Array(Variant). #66727 (Kruglov Pavel).
  • Исправлена редкая взаимоблокировка в Context::getDDLWorker. #66843 (Alexander Gololobov).
  • Исправлена ошибка при создании таблицы KeeperMap после неполного удаления. #66865 (Antonio Andelic).
  • Исправлена ошибка «broken part» при восстановлении на диск s3_plain_rewritable. #66881 (Vitaly Baranov).
  • В редких случаях ClickHouse мог считать части повреждёнными из‑за неожиданных проекций на диске. Эта проблема устранена. #66898 (alesapin).
  • Исправлена ошибка некорректного определения формата при выводе схемы, которая могла приводить к логической ошибке «Format doesn't support schema inference.». #66899 (Kruglov Pavel).
  • Исправлена возможная взаимоблокировка при отмене запроса на параллельных репликах. #66905 (Nikita Taranov).
  • Запретить CREATE AS SELECT даже если включена настройка database_replicated_allow_heavy_create. В версии 23.12 это было безусловно запрещено и по ошибке оказалось разрешено при включённой настройке в невыпущенной версии 24.7. #66980 (vdimir).
  • Чтение из numbers могло некорректно приводить к выбрасыванию исключения при установленном лимите max_rows_to_read. Исправлена #66992. #66996 (Alexey Milovidov).
  • Добавлено корректное преобразование типов в оконные функции lagInFrame и leadInFrame, что исправляет msan-тест. #67091 (Yakov Olkhovskiy).
  • TRUNCATE DATABASE ранее останавливал репликацию так, как если бы выполнялся запрос DROP DATABASE; это исправлено. #67129 (Alexander Tokmakov).
  • Выделен отдельный клиентский контекст в clickhouse-local. #67133 (Vitaly Baranov).
  • Исправлена ошибка Cannot convert column because it is non constant in source stream but must be constant in result. при выполнении запроса, который читает из таблицы Merge над таблицей Distriburted с одним сегментом. #67146 (Nikolai Kochetov).
  • Обеспечено корректное поведение ORDER BY all при отключённом enable_order_by_all и использовании параллельных реплик (в том числе в распределённых запросах). #67153 (Igor Nikonov).
  • Исправлено некорректное использование input_format_max_bytes_to_read_for_schema_inference в кэше схем. #67157 (Kruglov Pavel).
  • Исправлена утечка памяти при операции COUNT DISTINCT, если во время GROUP BY по одному ключу типа Nullable выбрасывалось исключение. #67171 (Jet He).
  • Исправлена ошибка оптимизации, приводившая к преобразованию OUTER JOIN в INNER JOIN. Это исправление закрывает #67156. Это исправление закрывает #66447. Ошибка была внесена в https://github.com/ClickHouse/ClickHouse/pull/62907. #67178 (Maksim Kita).
  • Исправлена ошибка Conversion from AggregateFunction(name, Type) to AggregateFunction(name, Nullable(Type)) is not supported. Ошибка была вызвана оптимизацией optimize_rewrite_aggregate_function_with_if. Исправление для #67112. #67229 (Nikolai Kochetov).
  • Исправлено зависание запроса при использовании пустого кортежа в качестве левого аргумента (lhs) функции IN. #67295 (Duc Canh Le).
  • Можно было создать очень глубоко вложенную JSON-структуру, которая вызывала переполнение стека при игнорировании неизвестных полей. Это закрывает #67292. #67324 (Alexey Milovidov).
  • Исправлено подключение таблицы ReplicatedMergeTree после возникновения исключения при запуске. #67360 (Antonio Andelic).
  • Исправлен сбой сегментации памяти, вызванный некорректным отсоединением от группы потоков в Aggregator. #67385 (Antonio Andelic).
  • Исправлен ещё один случай, когда в PK была задана недетерминированная функция. #67395 (Nikolai Kochetov).
  • Исправлена ошибка в индексе bloom_filter, из-за которой некорректно выполнялись запросы со слегка нетипичными условиями, такими как (k=2)=(k=2) или has([1,2,3], k). #67423 (Michael Kolupaev).
  • Корректно разбирать имя файла/URI, содержащее ::, если это не архив. #67433 (Antonio Andelic).
  • Исправлено ожидание задач в ~WriteBufferFromS3 в случае отмены WriteBuffer. #67459 (Kseniia Sumarokova).
  • Защитить каталоги временных частей от удаления при выполнении RESTORE. #67491 (Vitaly Baranov).
  • Исправлено исполнение вложенных функций с коротким замыканием. #67520 (Kruglov Pavel).
  • Исправлена логическая ошибка Logical error: Expected the argument №N of type T to have X rows, but it has 0. Она могла возникать в удалённом запросе с константным выражением в GROUP BY при использовании нового анализатора. #67536 (Nikolai Kochetov).
  • Исправлено соединение по кортежу с NULL: некоторые запросы с новым анализатором и NULL внутри кортежа в выражении JOIN ON возвращали некорректные результаты. #67538 (vdimir).
  • Исправлено лишнее перепланирование FileCache::freeSpaceRatioKeepingThreadFunc() в случае полностью невытесняемого кэша. #67540 (Kseniia Sumarokova).
  • Исправлена вставка в потоковые движки (Kafka, RabbitMQ, NATS) через HTTP-интерфейс. #67554 (János Benjamin Antal).
  • Исправлена ошибка в функции toStartOfWeek, которая возвращала неверный результат для малых значений типа DateTime64. #67558 (Yarik Briukhovetskyi).
  • Исправлена ошибка при создании представления с рекурсивным CTE. #67587 (Yakov Olkhovskiy).
  • Исправлена логическая ошибка Logical error: 'file_offset_of_buffer_end <= read_until_position' в кэше файловой системы. Закрывает #57508. #67623 (Kseniia Sumarokova).
  • Исправлена #62282. Удалён вызов convertFieldToString() и добавлен типоспецифичный код сериализации. Подстановка параметризованных представлений не работала для нескольких типов данных, когда значение параметра представляло собой функцию или выражение, возвращающее экземпляр типа данных. #67654 (Shankar).
  • Исправлен сбой при выполнении percent_rank. Тип фрейма по умолчанию для percent_rank изменён на range unbounded preceding and unbounded following. Теперь учитывается фрейм окна по умолчанию для IWindowFunction, и оконные функции без явного определения фрейма окна в SQL могут корректно помещаться в различные трансформеры WindowTransfomer. #67661 (lgbo).
  • Исправлена повторная загрузка SQL UDF с оператором UNION. Ранее после перезапуска сервера UDF могла становиться недействительной. #67665 (Antonio Andelic).
  • Исправлена возможная логическая ошибка «Unexpected return type from if» при использовании экспериментального типа Variant и включённой настройки use_variant_as_common_type в функции if при работе с типами Tuple и Map. #67687 (Kruglov Pavel).
  • Из-за ошибки в ядре Linux запрос может повиснуть в TimerDescriptor::drain. Это исправление закрывает #37686. #67702 (Alexey Milovidov).
  • Исправлено завершение выполнения команды RESTORE ON CLUSTER. #67720 (Vitaly Baranov).
  • Исправлено зависание словаря при ошибке CANNOT_SCHEDULE_TASK во время загрузки. #67751 (Azat Khuzhin).
  • Запросы вида SELECT count() FROM t WHERE cast(c = 1 or c = 9999 AS Bool) SETTINGS use_skip_indexes=1 с индексами bloom-фильтра по c теперь работают корректно. #67781 (jsc0218).
  • Исправлен неверный результат агрегации в некоторых запросах с агрегацией без ключей и фильтра, закрыт #67419. #67804 (vdimir).
  • Выполняется проверка экспериментальных/подозрительных типов данных при ALTER ADD/MODIFY COLUMN. #67911 (Kruglov Pavel).
  • Исправлен разбор DateTime64 после свертки констант в распределенных запросах, закрыт #66773. #67920 (vdimir).
  • Исправлена ошибка, приводившая к некорректному результату count() при наличии недетерминированной функции в предикате. #67922 (János Benjamin Antal).
  • Исправлен расчет максимального мягкого лимита на число потоков в контейнеризованных средах, где ограничено доступное число CPU. #67963 (Robert Schulze).
  • Теперь ClickHouse не считает часть повреждённой, если проекция отсутствует на диске, но указана в checksums.txt. #68003 (alesapin).
  • Исправлен пропуск нетронутых частей в мутациях с новым анализатором. Ранее при включённом анализаторе данные в части могли быть перезаписаны мутацией, даже если согласно предикату мутация не затрагивала эту часть. #68052 (Anton Popov).
  • Убирает некорректную оптимизацию, которая удаляла сортировку в подзапросах, использующих OFFSET. Исправляет #67906. #68099 (Graham Campbell).
  • Попытка исправить Block structure mismatch in AggregatingStep stream: different types для оптимизации projection агрегатов. #68107 (Nikolai Kochetov).
  • Попытка исправить аварийное завершение postgres при отмене запроса. #68288 (Kseniia Sumarokova).
  • Исправлено отсутствие режима синхронизации реплики в запросе SYSTEM SYNC REPLICA. #68326 (Duc Canh Le).

Релиз ClickHouse 24.7 от 2024-07-30. Презентация, видео

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

  • Запрещена конструкция CRATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ... с реплицируемыми базами данных. #63963 (vdimir).
  • clickhouse-keeper-client теперь принимает пути только в строковых литералах, таких как ls '/hello/world', а не строки без кавычек, такие как ls /hello/world. #65494 (Alexey Milovidov).
  • Метрика KeeperOutstandingRequets была переименована в KeeperOutstandingRequests. #66206 (Robert Schulze).
  • Поле is_deterministic удалено из таблицы system.functions. #66630 (Alexey Milovidov).
  • Функция tuple теперь будет пытаться конструировать именованные кортежи в запросе (поведение управляется настройкой enable_named_columns_in_function_tuple). Добавлена функция tupleNames для извлечения имён из кортежей. #54881 (Amos Bird).
  • Изменён принцип работы дедупликации для Materialized Views. Исправлено множество случаев, таких как: - для целевой таблицы: данные разбиваются на 2 или более блока, и эти блоки считаются дубликатами, когда блок вставляется параллельно; - для целевой таблицы MV: одинаковые блоки дедуплицируются, что происходит, когда MV часто выдаёт одинаковые данные как результат для разных входных данных из‑за выполнения агрегации; - для целевой таблицы MV: одинаковые блоки, которые поступают из разных MV, дедуплицируются. #61601 (Sema Checherinda).
  • Функции bitShiftLeft и bitShitfRight теперь возвращают ошибку при выходе позиции сдвига за пределы допустимого диапазона. #65838 (Pablo Marcos).

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

  • Добавлена поддержка ASOF JOIN для алгоритма full_sorting_join. #55051 (vdimir).
  • Добавлена поддержка аутентификации по JWT в clickhouse-client (будет доступна только в ClickHouse Cloud). #62829 (Konstantin Bogdanov).
  • Добавлены SQL-функции changeYear, changeMonth, changeDay, changeHour, changeMinute, changeSecond. Например, SELECT changeMonth(toDate('2024-06-14'), 7) возвращает дату 2024-07-14. #63186 (cucumber95).
  • Добавлены стартовые скрипты, которые позволяют выполнять преднастроенные запросы на этапе запуска. #64889 (pufit).
  • Добавлена поддержка accept_invalid_certificate в конфигурации клиента, чтобы разрешить подключение по защищённому TCP к серверу с самоподписанным сертификатом — может использоваться как сокращённая форма для соответствующих настроек клиента openSSL verificationMode=none + invalidCertificateHandler.name=AcceptCertificateHandler. #65238 (peacewalker122).
  • Добавлена таблица system.error_log, которая содержит историю значений ошибок из таблицы system.errors и периодически сбрасывается на диск. #65381 (Pablo Marcos).
  • Добавлена агрегатная функция groupConcat. Примерно то же самое, что arrayStringConcat(groupArray(column), ','). Может принимать 2 параметра: строковый разделитель и количество обрабатываемых элементов. #65451 (Yarik Briukhovetskyi).
  • Добавлено хранилище AzureQueue. #65458 (Kseniia Sumarokova).
  • Добавлена новая настройка для включения/отключения записи индекса страниц в файлы Parquet. #65475 (lgbo).
  • Добавлен параметр конфигурации сервера logger.console_log_level для управления уровнем логирования в консоль (если оно включено). #65559 (Azat Khuzhin).
  • Автоматически добавляется подстановочный символ * в конец пути каталога в табличной функции file. #66019 (Zhidong (David) Guo).
  • Добавлена опция --memory-usage для клиента в неинтерактивном режиме. #66393 (vdimir).
  • Реализован интерактивный клиент для clickhouse-disks, добавлено добавление локального диска из локального каталога. #64446 (Daniil Ivanik).
  • Когда легковесное удаление выполняется в таблице с проекциями, пользователь может либо получить исключение (по умолчанию), либо удалить проекцию. #65594 (jsc0218).
  • Добавлены системные таблицы с основной информацией обо всех отсоединённых таблицах. #65400 (Konstantin Morozov).

Экспериментальная функциональность

  • Изменена двоичная сериализация типа данных Variant: добавлен режим compact, чтобы избежать повторной записи одного и того же дискриминатора для гранул с единственным вариантом или только со значениями NULL. Добавлена настройка MergeTree use_compact_variant_discriminators_serialization, которая включена по умолчанию. Обратите внимание, что тип Variant всё ещё является экспериментальным, и обратно несовместимое изменение в сериализации допустимо. #62774 (Kruglov Pavel).
  • Добавлена поддержка файлового (on-disk) бэкенд-хранилища для clickhouse-keeper. #56626 (Han Fei).
  • Рефакторинг функций JSONExtract, добавлена поддержка большего числа типов, включая экспериментальный тип Dynamic. #66046 (Kruglov Pavel).
  • Добавлена поддержка подстолбца null map для подстолбцов Variant и Dynamic. #66178 (Kruglov Pavel).
  • Исправлено чтение подстолбцов Dynamic из изменённой таблицы Memory. Ранее, если параметр max_types типа Dynamic был изменён в таблице Memory через ALTER, последующее чтение подстолбцов могло возвращать неверный результат. #66066 (Kruglov Pavel).
  • Добавлена поддержка cluster_for_parallel_replicas при использовании параллельных реплик с пользовательским ключом. Это позволяет использовать параллельные реплики с пользовательским ключом для таблиц MergeTree. #65453 (Antonio Andelic).

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

  • Заменён алгоритм преобразования int в string на более быстрый (с модифицированного amdn/itoa на модифицированный jeaiii/itoa). #61661 (Raúl Marín).
  • Размеры хэш-таблиц, создаваемых join (алгоритм parallel_hash), теперь измеряются и кэшируются. Эта информация будет использоваться для предварительного выделения памяти в хэш-таблицах для последующих выполнений запросов и экономии времени на их переразмеривание. #64553 (Nikita Taranov).
  • Оптимизированы запросы с ORDER BY по первичному ключу и WHERE с условием высокой селективности за счёт буферизации. Управляется настройкой read_in_order_use_buffering (включена по умолчанию) и может увеличить потребление памяти запросом. #64607 (Anton Popov).
  • Улучшена производительность загрузки метаданных plain_rewritable. #65634 (Alexey Milovidov).
  • Подключение таблиц на дисках только для чтения теперь использует меньше ресурсов за счёт пропуска загрузки устаревших частей. #65635 (Alexey Milovidov).
  • Добавлена поддержка minmax-гиперпрямоугольника для индексов Set. #65676 (AntiTopQuark).
  • Выгружается первичный индекс устаревших частей для снижения общего потребления памяти. #65852 (Anton Popov).
  • Функции replaceRegexpAll и replaceRegexpOne теперь значительно быстрее, если шаблон тривиален, то есть не содержит метасимволов, классов символов, флагов, группирующих символов и т. п. (Спасибо Taiyang Li). #66185 (Robert Schulze).
  • Запросы к S3: уменьшено время ожидания между повторами для запросов, увеличено количество повторов для бэкапов. 8,5 минут и 100 повторов для запросов, 1,2 часа и 1000 повторов для восстановления бэкапа. #65232 (Sema Checherinda).
  • Добавлена поддержка оптимизации LIMIT на уровне плана запроса. Добавлена поддержка проталкивания LIMIT (LIMIT pushdown) для хранилища и табличной функции PostgreSQL. #65454 (Maksim Kita).
  • Улучшено балансирование нагрузки ZooKeeper. Текущая сессия не истекает до тех пор, пока не станут доступны оптимальные узлы, несмотря на fallback_session_lifetime. Добавлена поддержка балансировки с учётом зон доступности (AZ-aware balancing). #65570 (Alexander Tokmakov).
  • DatabaseCatalog теперь удаляет таблицы быстрее, используя до database_catalog_drop_table_concurrency потоков. #66065 (Sema Checherinda).

Улучшение

  • Улучшена балансировка нагрузки ZooKeeper. Текущая сессия не истекает, пока оптимальные узлы не станут доступны, несмотря на fallback_session_lifetime. Добавлена поддержка балансировки с учетом зон доступности (AZ). #65570 (Alexander Tokmakov).
  • Настройка optimize_trivial_insert_select по умолчанию отключена. В большинстве случаев это должно быть полезно. Однако, если вы наблюдаете более медленный INSERT SELECT или повышенное потребление памяти, вы можете снова её включить или выполнить SET compatibility = '24.6'. #58970 (Alexey Milovidov).
  • Выводить стек вызовов и диагностическую информацию при сбое clickhouse-client или clickhouse-local. #61109 (Alexander Tokmakov).
  • Ранее результат выполнения SHOW INDEX | INDEXES | INDICES | KEYS сортировался по именам столбцов первичного ключа. Поскольку это оказалось неочевидным, теперь результат сортируется по порядку столбцов первичного ключа в определении первичного ключа. #61131 (Robert Schulze).
  • Изменён механизм дедупликации для Materialized Views. Исправлен ряд случаев, в том числе: - для таблицы назначения: данные разбиваются на 2 и более блока, и эти блоки ошибочно считаются дубликатами при их параллельной вставке; - для таблицы назначения MV: одинаковые блоки дедуплицируются в ситуациях, когда MV из-за агрегации часто выдаёт одинаковый результат для разных входных данных; - для таблицы назначения MV: одинаковые блоки, поступающие из разных MV, дедуплицируются. #61601 (Sema Checherinda).
  • Поддержка чтения партиционированных данных Delta Lake. Определение схемы Delta Lake по метаданным, а не по самим данным. #63201 (Kseniia Sumarokova).
  • В composable-протоколах слой TLS принимал только параметры certificateFile и privateKeyFile. https://clickhouse.com/docs/operations/settings/composable-protocols. #63985 (Anton Ivashkin).
  • Добавлено профилируемое событие SelectQueriesWithPrimaryKeyUsage, которое показывает, сколько запросов SELECT используют первичный ключ при вычислении условия WHERE. #64492 (0x01f).
  • Исправления и улучшения, связанные с StorageS3Queue. Значение по умолчанию для s3queue_processing_threads_num теперь определяется в соответствии с количеством физических ядер CPU на сервере (вместо прежнего значения по умолчанию — 1). Значение по умолчанию для s3queue_loading_retries установлено равным 10. Исправлено возможное неконкретное сообщение «Uncaught exception» в столбце исключения таблицы system.s3queue. Счётчик повторных попыток больше не увеличивается при исключении MEMORY_LIMIT_EXCEEDED. Фиксация файлов перенесена на этап после полного завершения вставки в таблицу, чтобы избежать ситуации, когда файлы фиксируются до их вставки. Добавлены настройки s3queue_max_processed_files_before_commit, s3queue_max_processed_rows_before_commit, s3queue_max_processed_bytes_before_commit, s3queue_max_processing_time_sec_before_commit для более точного контроля момента фиксации и времени сброса. #65046 (Kseniia Sumarokova).
  • Поддержка алиасов в параметризованной функции представления (только для нового анализатора). #65190 (Kseniia Sumarokova).
  • В azureBlobStorage реализована маскировка ключа учетной записи в логах. #65273 (SmitaRKulkarni).
  • Отсечение партиций для предикатов IN, когда выражение фильтра является частью выражения PARTITION BY. #65335 (Eduard Karacharov).
  • arrayMin/arrayMax могут применяться ко всем сравнимым типам данных. #65455 (pn).
  • Улучшен учет использования памяти для cgroups v2, чтобы исключать объем, занимаемый кэшем страниц. #65470 (Nikita Taranov).
  • Не создавать настройки формата для каждой строки при сериализации фрагментов для вставки в таблицу EmbeddedRocksDB. #65474 (Duc Canh Le).
  • Сокращено приглашение clickhouse-local до просто :). getFQDNOrHostName() слишком долго выполняется в macOS, и в любом случае мы не хотим отображать имя хоста в приглашении clickhouse-local. #65510 (Konstantин Bogdanov).
  • Не выводить сообщение jemalloc о per-CPU аренах на маломощных виртуальных машинах. #65532 (Alexey Milovidov).
  • Отключить фоновую загрузку файлового кэша по умолчанию. Она будет снова включена, когда мы исправим проблему с возможным "Memory limit exceeded", поскольку освобождение памяти выполняется вне контекста запроса (в то время как буфер выделяется внутри контекста запроса), если используются фоновые потоки загрузки. Кроме того, нам нужно добавить отдельную настройку для задания максимального объема данных, загружаемых фоновыми воркерами (сейчас он ограничен max_file_segment_size, что может быть слишком большим). #65534 (Kseniia Sumarokova).
  • Добавлен новый параметр конфигурации <config_reload_interval_ms>, который задаёт, как часто ClickHouse будет перезагружать конфигурацию. #65545 (alesapin).
  • Реализована двоичная кодировка для типов данных ClickHouse и добавлена её спецификация в документацию. Она используется в Dynamic binary serialization, также её можно задействовать в форматах RowBinaryWithNamesAndTypes и Native через настройки. #65546 (Kruglov Pavel).
  • Настройки сервера compiled_expression_cache_size и compiled_expression_cache_elements_size теперь отображаются в system.server_settings. #65584 (Robert Schulze).
  • Добавлена поддержка идентификации пользователей по расширению SubjectAltName в сертификатах x509. #65626 (Anton Kozlov).
  • clickhouse-local теперь учитывает параметры max_server_memory_usage и max_server_memory_usage_to_ram_ratio из файла конфигурации. По умолчанию он также устанавливает максимальный объем используемой памяти на уровне 90% от объема памяти системы, как это делает clickhouse-server. #65697 (Alexey Milovidov).
  • Добавлен скрипт для резервного копирования файлов в ClickHouse. #65699 (Alexey Milovidov).
  • Добавлена поддержка отмены запросов для источника PostgreSQL. #65722 (Maksim Kita).
  • Сделать так, чтобы параметр allow_experimental_analyzer контролировался инициатором для распределённых запросов. Это обеспечивает совместимость и корректность работы в кластерах со смешанными версиями. #65777 (Nikita Mikhaylov).
  • Соблюдать лимит CPU cgroup в Keeper. #65819 (Antonio Andelic).
  • Добавлена возможность использовать функцию concat с пустыми аргументами: :) select concat();. #65887 (李扬).
  • Добавлена возможность управлять именованными коллекциями в clickhouse-local. #65973 (Alexey Milovidov).
  • Улучшены события профилирования, связанные с Azure. #65999 (alesapin).
  • Добавлена поддержка чтения файлов ORC с учётом часового пояса источника записи. #66025 (kevinyhzou).
  • Добавлены настройки для управления соединениями с PostgreSQL. Настройка postgresql_connection_attempt_timeout задаёт значение, передаваемое параметру connect_timeout URL-подключения. Настройка postgresql_connection_pool_retries задаёт количество попыток установления соединения с конечной точкой PostgreSQL. #66232 (Dmitry Novik).
  • Уменьшена погрешность значений input_wait_elapsed_us/elapsed_us в system.processors_profile_log. #66239 (Azat Khuzhin).
  • Улучшены ProfileEvents для кэша файловой системы. #66249 (zhukai).
  • Добавлены настройки, позволяющие игнорировать предложение ON CLUSTER в запросах для управления именованными коллекциями при использовании реплицируемого хранилища. #66288 (MikhailBurdukov).
  • Функция generateSnowflakeID теперь позволяет указывать идентификатор машины в качестве параметра, чтобы избежать коллизий в крупных кластерах. #66374 (ZAWA_ll).
  • Отключено приостановление по Ctrl+Z в интерактивном режиме. Это распространённая ловушка и поведение, которого почти никто из пользователей не ожидает. Полагаю, только немногие особо продвинутые пользователи могут оценить приостановку терминальных приложений с переводом их в фоновый режим, но я таких не знаю. #66511 (Alexey Milovidov).
  • Добавлена опция проверки типа первичного ключа в Dictionaries. Без этой опции при использовании простых layout любой тип столбца будет неявно преобразован в UInt64. #66595 (MikhailBurdukov).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Проверяем циклические зависимости в запросах CREATE/REPLACE/RENAME/EXCHANGE и выбрасываем исключение, если обнаружена такая зависимость. Ранее это могло приводить к взаимоблокировке при запуске сервера. Также исправлены некоторые ошибки при создании зависимостей. #65405 (Kruglov Pavel).
  • Исправлена проблема с неожиданными размерами столбцов LowCardinality при вызове функций. #65298 (Raúl Marín).
  • Исправлено аварийное завершение в maxIntersections. #65689 (Raúl Marín).
  • Исправлена ошибка, из-за которой предложение VALID UNTIL в определении пользователя сбрасывалось после перезапуска. #66409 (Nikolay Degterinsky).
  • Исправлен столбец с оставшимся временем в SHOW MERGES. #66735 (Alexey Milovidov).
  • Сообщение Query was cancelled могло выводиться дважды в clickhouse-client. Это поведение исправлено. #66005 (Nikita Mikhaylov).
  • Исправлено падение при использовании MaterializedMySQL (неподдерживаемой экспериментальной функции) с TABLE OVERRIDE, сопоставляющим поле MySQL со значением NULL полю ClickHouse, не допускающему значений NULL. #54649 (Filipp Ozinov).
  • Исправлена логическая ошибка, возникавшая, когда выражение PREWHERE не читало никаких столбцов, а в таблице не была включена адаптивная гранулярность индекса (очень старая таблица). #59173 (Alexander Gololobov).
  • Исправлена ошибка в буфере отмены при отмене запроса. #64478 (Sema Checherinda).
  • Исправлено заполнение столбцов частей по метаданным (когда columns.txt не существует). #64757 (Azat Khuzhin).
  • Исправлено аварийное завершение работы при выполнении ALTER TABLE ... ON CLUSTER ... MODIFY SQL SECURITY. #64957 (pufit).
  • Исправлен сбой при уничтожении AccessControl: добавлено явное завершение работы. #64993 (Vitaly Baranov).
  • Рекурсивно исключена инъективная функция из аргумента функций uniq*. Ранее это работало корректно, но было сломано в новом анализаторе. #65140 (Duc Canh Le).
  • Исправлено неожиданное имя проекции при выполнении запроса с CTE. #65267 (wudidapaopao).
  • Теперь требуется привилегия dictGet при доступе к словарям в прямых запросах или через движок таблицы Dictionary. #65359 (Joe Lynch).
  • Исправлена аутентификация в S3 для отдельных пользователей при инкрементных резервных копиях. #65481 (Antonio Andelic).
  • Отключена оптимизация non-intersecting-parts для запросов с FINAL в случае, если была включена оптимизация read-in-order. Это могло приводить к некорректным результатам запросов. В качестве временного решения отключите do_not_merge_across_partitions_select_final и split_parts_ranges_into_intersecting_and_non_intersecting_final до включения этого исправления. #65505 (Nikolai Kochetov).
  • Исправлена ошибка, приводившая к возникновению исключения Index out of bound for blob metadata в случае, когда все файлы из списка в батче были отфильтрованы. #65523 (Kseniia Sumarokova).
  • Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK при слиянии проекции с дедупликацией. #65573 (Yakov Olkhovskiy).
  • Исправлена ошибка в MergeJoin. Столбец в разрежённой сериализации мог интерпретироваться как столбец его вложенного типа, хотя требуемое преобразование не было выполнено. #65632 (Nikita Taranov).
  • Исправлена ошибка, из-за которой уровень совместимости '23.4' применялся некорректно. #65737 (cw5121).
  • Исправлена таблица ODBC с полями Nullable. #65738 (Rodolphe Dugé de Bernonville).
  • Исправлена гонка данных в TCPHandler, которая могла возникнуть при фатальной ошибке. #65744 (Kseniia Sumarokova).
  • Исправлены некорректные исключения в функции parseDateTime при использовании плейсхолдеров %F и %D. #65768 (Antonio Andelic).
  • Для запросов к PostgreSQL при завершении запроса ClickHouse отменять внутренний запрос PostgreSQL. В противном случае запрос ClickHouse нельзя отменить, пока не завершится внутренний запрос PostgreSQL. #65771 (Maksim Kita).
  • Исправлена ошибка в логике вычислений с коротким замыканием при использовании старого анализатора и dictGetOrDefault. #65802 (jsc0218).
  • Исправлена ошибка, из-за которой EmbeddedRocksDB с TTL записывал повреждённые файлы SST. #65816 (Duc Canh Le).
  • Функции bitTest, bitTestAll и bitTestAny теперь возвращают ошибку, если указанный индекс бита выходит за пределы допустимого диапазона #65818 (Pablo Marcos).
  • Настройка join_any_take_last_row поддерживается во всех запросах с хеш-соединением. #65820 (vdimir).
  • Улучшена обработка условий соединения, включающих проверки IS NULL (например, выражение ON (a = b AND (a IS NOT NULL) AND (b IS NOT NULL) ) OR ( (a IS NULL) AND (b IS NULL) ) переписывается в ON a <=> b), исправлена некорректная оптимизация, возникавшая при наличии условий, помимо IS NULL. #65835 (vdimir).
  • Исправлен рост потребления памяти в S3Queue. #65839 (Kseniia Sumarokova).
  • Исправлена обработка совпадающих значений в arrayAUC для соответствия реализации sklearn. #65840 (gabrielmcg44).
  • Исправлены возможные проблемы с TLS-соединениями по протоколу MySQL-сервера. #65917 (Azat Khuzhin).
  • Исправлены возможные проблемы с TLS‑соединениями клиентского протокола MySQL. #65938 (Azat Khuzhin).
  • Исправлена обработка SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE с нулевым тайм-аутом. #65941 (Azat Khuzhin).
  • Добавлены отсутствующие настройки input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines/input_format_csv_try_infer_numbers_from_strings/input_format_csv_try_infer_strings_from_quoted_tuples в кэш определения схемы, поскольку они могут влиять на результирующую схему. Это предотвращает некорректное определение схемы при изменении этих настроек. #65980 (Kruglov Pavel).
  • Column _size в движке S3 и табличной функции S3 обозначает размер файла внутри архива, а не размер самого архива. #65993 (Daniil Ivanik).
  • Устранена проблема с разрешением динамических подстолбцов в анализаторе, чтобы избежать необходимости чтения всего столбца при доступе к динамическому подстолбцу. #66004 (Kruglov Pavel).
  • Исправлено объединение конфигурации для from_env при переопределениях replace. #66034 (Azat Khuzhin).
  • Исправлено возможное зависание в GRPCServer при завершении работы. #66061 (Vitaly Baranov).
  • Исправлено несколько ошибок в работе функции has при использовании неконстантных аргументов типа LowCardinality. #66088 (Anton Popov).
  • Исправлена работа groupArrayIntersect. Ранее наблюдалось некорректное поведение в функции merge(). Также исправлено поведение deserialise() для числовых и прочих данных. #66103 (Yarik Briukhovetskyi).
  • Исправлена ошибка переполнения буфера в реализации unbin/unhex. #66106 (Nikita Taranov).
  • Отключена оптимизация merge-filters, добавленная в #64760. Она может вызывать исключение, если при объединении двух выражений фильтра не используется короткое‑замыкательное вычисление. #66126 (Nikolai Kochetov).
  • Исправлена проблема, из-за которой сервер не удавалось разобрать файлы Avro с массивами, закодированными с отрицательным размером блока, что теперь допускается спецификацией Avro. #66130 (Serge Klochkov).
  • Исправлена ошибка в клиенте ZooKeeper: сессия могла застрять в неработоспособном состоянии после получения аппаратной ошибки от ZooKeeper. Например, это могло произойти из‑за «soft memory limit» в ClickHouse Keeper. #66140 (Alexander Tokmakov).
  • Исправлена ошибка в SumIfToCountIfVisitor при работе со знаковыми целыми числами. #66146 (Raúl Marín).
  • Исправлен редкий случай, при котором в результате распределённого запроса могли отсутствовать данные. #66174 (vdimir).
  • Исправлен порядок разбора полей метаданных в StorageDeltaLake. #66211 (Kseniia Sumarokova).
  • Не выбрасывать ошибку TIMEOUT_EXCEEDED в режиме none_only_active параметра distributed_ddl_output_mode. #66218 (Alexander Tokmakov).
  • Исправлена обработка LIMIT для system.numbers_mt, когда нельзя использовать индекс. #66231 (János Benjamin Antal).
  • Исправлено определение сервером ClickHouse максимального числа доступных ядер CPU, указанного в cgroups v2, когда сервер запущен в контейнере, например в Docker. Подробнее: контейнеры часто запускают свои процессы в корневой cgroup с пустым именем. В таком случае ClickHouse игнорировал ограничения по CPU, заданные cgroups v2. #66237 (filimonov).
  • Исправлена ошибка Not-ready set, возникавшая при использовании подзапроса с IN в ограничении. #66261 (Nikolai Kochetov).
  • Исправлена выдача сообщений об ошибках при копировании в S3 или AzureBlobStorage. #66295 (Vitaly Baranov).
  • Исправлена ошибка, из-за которой watchdog удерживал дескрипторы удалённых (ротированных) файлов журнала. #66334 (Aleksei Filatov).
  • Исправлена ошибка, из-за которой logicalexpressionoptimizerpass терял логический тип константы. #66344 (pn).
  • Исправлена ошибка Column identifier is already registered, возникавшая при использовании group_by_use_nulls=true и нового анализатора. #66400 (Nikolai Kochetov).
  • Исправлен возможный некорректный результат для запросов, которые выполняют JOIN и фильтрацию таблицы с внешним движком (например, PostgreSQL), из‑за слишком агрессивного проталкивания фильтров (filter pushdown). Начиная с текущей версии, условия из предложения WHERE не будут отправляться во внешнюю базу данных при выполнении OUTER JOIN с внешней таблицей. #66402 (vdimir).
  • Добавлена недостающая материализация столбца для CROSS JOIN. #66413 (lgbo).
  • Исправлена ошибка Cannot find column для запросов, содержащих константное выражение в ключе GROUP BY, при включённом новом анализаторе. #66433 (Nikolai Kochetov).
  • Предотвращена возможная логическая ошибка при импорте из формата Npy при некорректном уровне вложенности массива; исправлено тестирование других типов ошибок. #66461 (Yarik Briukhovetskyi).
  • Исправлен неверный результат count() при использовании недетерминированной функции в предикате. #66510 (Duc Canh Le).
  • Исправлено отслеживание использования памяти в Allocator::realloc. #66548 (Antonio Andelic).
  • Исправлено чтение из неинициализированной памяти при хешировании пустых кортежей. #66562 (Alexey Milovidov).
  • Исправлена ошибка, из-за которой запросы с WINDOW могли возвращать некорректные результаты. Она проявлялась, когда столбцы PARTITION имели разреженную сериализацию и оконные функции выполнялись параллельно. #66579 (Nikolai Kochetov).
  • Исправлена ошибка при удалении именованных коллекций в локальном хранилище. #66599 (János Benjamin Antal).
  • Исправлена проблема, из-за которой column_length не обновлялся в ColumnTuple::insertManyFrom. #66626 (lgbo).
  • Исправлены ошибки Unknown identifier и Column is not under aggregate function в запросах с выражением (column IS NULL). Ошибка была спровоцирована изменениями из #65088 и проявлялась только при отключённом анализаторе. #66654 (Nikolai Kochetov).
  • Исправлена ошибка Method getResultType is not supported for QUERY query node, возникавшая при использовании скалярного подзапроса в качестве первого аргумента оператора IN (с новым анализатором). #66655 (Nikolai Kochetov).
  • Исправлена потенциальная ошибка PARAMETER_OUT_OF_BOUND при чтении подстолбца типа Variant. #66659 (Kruglov Pavel).
  • Исправлен редкий случай зависания операции слияния после удаления столбца. #66707 (Raúl Marín).
  • Исправлена ассерция isUniqTypes при выполнении INSERT SELECT из удалённых источников. #66722 (Sema Checherinda).
  • Исправлена логическая ошибка в PrometheusRequestHandler. #66621 (Vitaly Baranov).
  • Исправлен случай использования функции indexHint, обнаруженный фаззером. #66286 (Anton Popov).
  • Исправлено форматирование AST для оператора 'create table b empty as a'. #64951 (Michael Kolupaev).

Релиз ClickHouse 24.6 от 2024-07-01. Презентация, видео

Несовместимые изменения с предыдущими версиями

  • По умолчанию включена асинхронная загрузка баз данных и таблиц. См. async_load_databases в config.xml. Хотя это изменение полностью совместимо, оно может привести к отличиям в поведении. Когда async_load_databases имеет значение false, как в предыдущих версиях, сервер не принимает подключения, пока не будут загружены все таблицы. Когда async_load_databases имеет значение true, как в новой версии, сервер может принимать подключения до загрузки всех таблиц. Если запрос выполняется к таблице, которая ещё не загружена, он будет ожидать завершения загрузки таблицы, что может занять значительное время. Это может изменить поведение сервера, если он является частью крупной распределённой системы под управлением балансировщика нагрузки. В первом случае балансировщик нагрузки может получить отказ в подключении и быстро переключиться на другой сервер. Во втором случае балансировщик нагрузки может подключиться к серверу, который всё ещё загружает таблицы, и запрос будет выполняться с большей задержкой. Более того, если в состоянии ожидания накопится много запросов, это может привести к проблеме «thundering herd», когда они начнут обрабатываться одновременно. Это может иметь значение только для сильно нагруженных распределённых бэкендов. Вы можете установить значение async_load_databases в значение false, чтобы избежать этой проблемы. #57695 (Alexey Milovidov).
  • Настройка replace_long_file_name_to_hash по умолчанию включена для таблиц MergeTree. #64457 (Anton Popov). Эта настройка полностью совместима и не требует каких‑либо действий при обновлении. Новый формат данных поддерживается во всех версиях, начиная с 23.9. После включения этой настройки вы больше не сможете перейти на версию 23.8 или более раннюю.
  • Некоторые некорректные запросы будут завершаться с ошибкой раньше — на этапе парсинга. Примечание: отключена поддержка встроенных выражений KQL (экспериментальный язык Kusto), когда они передаются в табличную функцию kql без строкового литерала, например kql(garbage | trash) вместо kql('garbage | trash') или kql($$garbage | trash$$). Эта возможность была добавлена непреднамеренно и не должна существовать. #61500 (Alexey Milovidov).
  • Переработана параллельная обработка в режиме Ordered хранилища S3Queue. Этот PR обратно несовместим для режима Ordered, если вы использовали настройки s3queue_processing_threads_num или s3queue_total_shards_num. Настройка s3queue_total_shards_num удалена; ранее её было разрешено использовать только при включённой опции s3queue_allow_experimental_sharded_mode, которая теперь устарела. Добавлена новая настройка — s3queue_buckets. #64349 (Kseniia Sumarokova).
  • Добавлены новые функции snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID и dateTime64ToSnowflakeID. В отличие от существующих функций snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake и dateTime64ToSnowflake, новые функции совместимы с функцией generateSnowflakeID, то есть принимают snowflake‑ID, сгенерированные generateSnowflakeID, и возвращают snowflake‑ID того же типа, что и generateSnowflakeID (то есть UInt64). Кроме того, новые функции по умолчанию используют эпоху UNIX (так называемую 1970‑01‑01), так же как generateSnowflakeID. При необходимости можно передать другую эпоху, например эпоху Twitter/X 2010‑11‑04, то есть 1288834974657 мс с начала эпохи UNIX. Старые функции конвертации объявлены устаревшими и будут удалены после переходного периода: чтобы продолжать использовать их, включите настройку allow_deprecated_snowflake_conversion_functions. #64948 (Robert Schulze).

Новая функциональность

  • Добавлена возможность хранения именованных коллекций в ClickHouse Keeper. #64574 (Kseniia Sumarokova).
  • Добавлена поддержка пустых кортежей. #55061 (Amos Bird).
  • Добавлены функции кодирования и декодирования для кривой Гильберта. #60156 (Artem Mustafin).
  • Добавлена поддержка анализа индексов с использованием hilbertEncode. #64662 (Artem Mustafin).
  • Добавлена поддержка чтения геометрии LINESTRING в формате WKT с помощью функции readWKTLineString. #62519 (Nikita Mikhaylov).
  • Добавлена возможность присоединять части с другого диска. #63087 (Unalian).
  • Добавлена новая SQL-функция generateSnowflakeID для генерации идентификаторов Snowflake в стиле Twitter. #63577 (Danila Puzov).
  • Добавлены настройки merge_workload и mutation_workload для регулирования использования ресурсов и их распределения между операциями слияния, мутациями и другими нагрузками. #64061 (Sergei Trifonov).
  • Добавлена поддержка сравнения значений типов IPv4 и IPv6 с помощью оператора =. #64292 (Francisco J. Jurado Moreno).
  • Добавлена поддержка десятичных аргументов в бинарных математических функциях (pow, atan2, max2, min2, hypot). #64582 (Mikhail Gorshkov).
  • Добавлены SQL-функции parseReadableSize (а также варианты OrNull и OrZero). #64742 (Francisco J. Jurado Moreno).
  • Добавлены параметры сервера max_table_num_to_throw и max_database_num_to_throw для ограничения максимального количества баз данных или таблиц в запросах CREATE. #64781 (Xu Jia).
  • Добавлен виртуальный столбец _time для файлоподобных хранилищ (S3/file/HDFS/URL/azureBlobStorage). #64947 (Ilya Golshtein).
  • Добавлены новые функции base64URLEncode, base64URLDecode и tryBase64URLDecode. #64991 (Mikhail Gorshkov).
  • Добавлена новая функция editDistanceUTF8, которая вычисляет редакционное расстояние между двумя строками в кодировке UTF-8. #65269 (LiuNeng).
  • Добавлена конфигурация http_response_headers для поддержки пользовательских заголовков HTTP-ответа в пользовательских HTTP-обработчиках. #63562 (Grigorii).
  • Добавлена новая табличная функция loop для возврата результатов запроса в бесконечном цикле. #63452 (Sariel). Это полезно для тестирования.
  • В журнале system.query_log добавлены два дополнительных столбца: used_privileges и missing_privileges. used_privileges заполняется привилегиями, которые были проверены во время выполнения запроса, а missing_privileges содержит требуемые, но отсутствующие привилегии. #64597 (Alexey Katsman).
  • Добавлена настройка output_format_pretty_display_footer_column_names, которая при включении отображает имена столбцов в конце таблицы для длинных таблиц (по умолчанию от 50 строк), при этом порог минимального числа строк задаётся настройкой output_format_pretty_display_footer_column_names_min_rows. #65144 (Shaun Struwig).

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

  • Введена статистика типа «число различных значений». #59357 (Han Fei).
  • Добавлена поддержка статистики в ReplicatedMergeTree. #64934 (Han Fei).
  • Если для базы данных Replicated настроена «группа реплик», автоматически создаётся кластер, включающий реплики из всех групп. #64312 (Alexander Tokmakov).
  • Добавлены настройки parallel_replicas_custom_key_range_lower и parallel_replicas_custom_key_range_upper для управления тем, как параллельные реплики с динамическими сегментами распараллеливают запросы при использовании фильтра по диапазону. #64604 (josh-hildred).

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

  • Добавлена возможность перетасовывать строки во время вставки, чтобы оптимизировать размер, не нарушая порядка, заданного PRIMARY KEY. Поведение управляется настройкой optimize_row_order (по умолчанию выключена). #63578 (Igor Markelov).
  • Добавлен нативный ридер Parquet, который может напрямую читать бинарные данные Parquet в столбцы ClickHouse. Он управляется настройкой input_format_parquet_use_native_reader (по умолчанию отключена). #60361 (ZhiHong Zhang).
  • Добавлена поддержка частичной тривиальной оптимизации операции подсчёта, если фильтр запроса позволяет выбирать точные диапазоны из таблиц MergeTree. #60463 (Amos Bird).
  • Снижено максимальное потребление памяти при многопоточных операциях INSERT за счёт объединения фрагментов из нескольких потоков в одном преобразовании. #61047 (Yarik Briukhovetskyi).
  • Снижено потребление памяти при использовании объектного хранилища Azure за счёт использования фиксированного объёма памяти, без выделения дополнительного буфера. #63160 (SmitaRKulkarni).
  • Уменьшено количество вызовов виртуальных функций в ColumnNullable::size. #60556 (HappenLee).
  • Ускорена работа splitByRegexp, когда аргументом регулярного выражения является одиночный символ. #62696 (Robert Schulze).
  • Ускорена агрегация по 8- и 16-битным ключам за счёт отслеживания минимального и максимального значений ключей. Это позволяет сократить количество ячеек, которые необходимо проверять. #62746 (Jiebin Sun).
  • Оптимизирован оператор IN в случае, когда левая часть имеет тип LowCardinality, а правая — множество констант. #64060 (Zhiguo Zhou).
  • Теперь для инициализации и уничтожения хеш-таблиц внутри ConcurrentHashJoin используется пул потоков. #64241 (Nikita Taranov).
  • Оптимизированы вертикальные слияния в таблицах с разреженными столбцами. #64311 (Anton Popov).
  • Включена предвыборка данных из удалённой файловой системы во время вертикальных слияний. Это снижает задержку вертикальных слияний в таблицах с данными, хранящимися на удалённой файловой системе. #64314 (Anton Popov).
  • Сокращено число избыточных вызовов isDefault в ColumnSparse::filter для повышения производительности. #64426 (Jiebin Sun).
  • Ускорены команды keeper-client find_super_nodes и find_big_family путём отправки нескольких асинхронных запросов getChildren. #64628 (Alexander Gololobov).
  • Улучшена работа функций least и greatest для аргументов числовых типов Nullable. #64668 (KevinyhZou).
  • Позволяет объединять два последовательных этапа фильтрации в плане запроса. Это улучшает оптимизацию проталкивания фильтра, если условие фильтрации можно протолкнуть вниз с родительского этапа. #64760 (Nikolai Kochetov).
  • Удалена неудачная оптимизация в реализации вертикального FINAL, и по умолчанию снова включён алгоритм вертикального FINAL. #64783 (Duc Canh Le).
  • Удалены узлы ALIAS из выражения фильтрации. Это слегка повышает производительность запросов с PREWHERE (при использовании нового анализатора). #64793 (Nikolai Kochetov).
  • Повторно включено кэширование сеансов OpenSSL. #65111 (Robert Schulze).
  • Добавлены настройки, позволяющие отключить материализацию пропускающих индексов и статистики при вставке (materialize_skip_indexes_on_insert и materialize_statistics_on_insert). #64391 (Anton Popov).
  • Использует размер выделенной памяти для вычисления размера группы строк и уменьшения пикового потребления памяти при записи в формат Parquet в однопоточном режиме. #64424 (LiuNeng).
  • Улучшен итератор разреженного столбца для сокращения числа вызовов size. #64497 (Jiebin Sun).
  • Обновлено условие для использования серверного копирования при резервном копировании в Azure Blob Storage. #64518 (SmitaRKulkarni).
  • Оптимизировано использование памяти при вертикальных слияниях для таблиц с большим числом skip-индексов. #64580 (Anton Popov).

Улучшения

  • SHOW CREATE TABLE, выполненный для системных таблиц, теперь отображает уникальный, очень полезный комментарий для каждой таблицы, объясняющий, для чего она нужна. #63788 (Nikita Mikhaylov).
  • Второй аргумент (scale) функций round(), roundBankers(), floor(), ceil() и trunc() теперь может быть неконстантным выражением. #64798 (Mikhail Gorshkov).
  • Горячее обновление политики хранения для таблиц Distributed при добавлении нового диска. #58285 (Duc Canh Le).
  • Избегается возможная взаимоблокировка во время анализа индекса MergeTree при планировании потоков в условиях высокой загрузки сервиса. #59427 (Sean Haynes).
  • Несколько мелких исправлений крайних случаев в поддержке S3-прокси и туннелирования. #63427 (Arthur Passos).
  • Улучшена видимость повторных отправок io_uring. Переименовано событие профилирования IOUringSQEsResubmits -> IOUringSQEsResubmitsAsync и добавлено новое IOUringSQEsResubmitsSync. #63699 (Tomer Shafir).
  • Добавлена новая настройка metadata_keep_free_space_bytes для резервирования свободного места на диске хранилища метаданных. #64128 (MikhailBurdukov).
  • Добавлены метрики для отслеживания количества каталогов, создаваемых и удаляемых хранилищем метаданных plain_rewritable, а также количества записей в карте сопоставления локальных и удалённых объектов в памяти. #64175 (Julia Kartseva).
  • Кэш запросов теперь рассматривает идентичные запросы с различающимися настройками как разные запросы. Это повышает надежность в случаях, когда разные настройки (например, limit или additional_table_filters) могут повлиять на результат запроса. #64205 (Robert Schulze).
  • Добавлена поддержка нестандартного кода ошибки QpsLimitExceeded в объектном хранилище, рассматриваемого как повторяемая ошибка. #64225 (Sema Checherinda).
  • Запрещено преобразование таблицы MergeTree в реплицируемую, если путь в ZooKeeper для этой таблицы уже существует. #64244 (Kirill).
  • Добавлена новая настройка input_format_parquet_prefer_block_bytes для управления средним размером выходного блока (в байтах) и изменено значение по умолчанию настройки input_format_parquet_max_block_size на 65409. #64427 (LiuNeng).
  • Добавлена возможность обходить прокси для хостов, указанных в переменной окружения no_proxy и в конфигурации прокси ClickHouse. #63314 (Arthur Passos).
  • Всегда запускайте Keeper с достаточным количеством потоков в глобальном пуле потоков. #64444 (Duc Canh Le).
  • Настройки из конфигурации пользователя не влияют на слияния и мутации для MergeTree на объектном хранилище. #64456 (alesapin).
  • Добавлена поддержка нестандартного кода ошибки TotalQpsLimitExceeded в объектном хранилище; эта ошибка теперь считается повторяемой. #64520 (Sema Checherinda).
  • Обновлена расширенная панель мониторинга как для open-source версии, так и для ClickHouse Cloud, добавлен график «Максимальное число одновременных сетевых подключений». #64610 (Thom O'Connor).
  • Улучшено отображение прогресса для zeros_mt и generateRandom. #64804 (Raúl Marín).
  • Добавлена асинхронная метрика jemalloc.profile.active, показывающая, включено ли в данный момент сэмплирование. Это механизм активации в дополнение к prof.active; для того, чтобы вызывающий поток выполнял сэмплирование, обе должны быть включены. #64842 (Unalian).
  • Удалена пометка о важности allow_experimental_join_condition. Эта пометка могла мешать успешному выполнению распределённых запросов в кластере со смешанными версиями. #65008 (Nikita Mikhaylov).
  • Добавлены асинхронные серверные метрики DiskGetObjectThrottler* и DiskGetObjectThrottler*, отражающие ограничение на число запросов в секунду, заданное настройками диска s3_max_get_rps и s3_max_put_rps, а также текущее доступное количество запросов, которые могут быть отправлены, не достигая лимита ограничения скорости на диске. Метрики определяются для каждого диска, для которого настроен лимит. #65050 (Sergei Trifonov).
  • Инициализирован глобальный сборщик трассировок для Poco::ThreadPool (необходим для Keeper и т.д.). #65239 (Kseniia Sumarokova).
  • Добавлена проверка при создании пользователя с использованием bcrypt_hash. #65242 (Raúl Marín).
  • Добавлены события профилирования для количества строк, прочитанных во время/после выполнения PREWHERE. #64198 (Nikita Taranov).
  • Выводить текст запроса в EXPLAIN PLAN при использовании параллельных реплик. #64298 (vdimir).
  • Параметр allow_deprecated_functions переименован в allow_deprecated_error_prone_window_functions. #64358 (Raúl Marín).
  • Теперь настройка max_read_buffer_size учитывается также для файловых дескрипторов в табличной функции file. #64532 (Azat Khuzhin).
  • Отключить транзакции для неподдерживаемых хранилищ, в том числе для materialized view. #64918 (alesapin).
  • Запрещено использовать оператор QUALIFY в старом анализаторе. Старый анализатор игнорировал QUALIFY, что могло приводить к неожиданному удалению данных при выполнении мутаций. #65356 (Dmitry Novik).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Исправлена ошибка в библиотеке Apache ORC: скорректен расчет статистики ORC при записи для беззнаковых типов на всех платформах и для Int8 на ARM. #64563 (Michael Kolupaev).
  • Восстановлено прежнее поведение ClickHouse при работе с кортежами (Tuples) в формате CSV. Это изменение фактически откатывает https://github.com/ClickHouse/ClickHouse/pull/60994 и оставляет его доступным только при включении нескольких настроек: output_format_csv_serialize_tuple_into_separate_columns, input_format_csv_deserialize_separate_columns_into_tuple и input_format_csv_try_infer_strings_from_quoted_tuples. #65170 (Nikita Mikhaylov).
  • Исправлена ошибка проверки прав доступа, из-за которой пользователь в определённых условиях мог повысить свои привилегии в базе данных default без необходимых GRANT. #64769 (pufit).
  • Исправлена ошибка, приводившая к сбою при использовании UniqInjectiveFunctionsEliminationPass и uniqCombined. #65188 (Raúl Marín).
  • Исправлена ошибка в ClickHouse Keeper, которая приводила к несовпадению дайджеста при закрытии сессии. #65198 (Aleksei Filatov).
  • Использовано корректное выравнивание памяти для комбинатора Distinct. Ранее мог произойти сбой из‑за некорректного выделения памяти при использовании этого комбинатора. #65379 (Antonio Andelic).
  • Исправлено падение при использовании DISTINCT и оконных функций. #64767 (Igor Nikonov).
  • Исправлена проблема, из-за которой пропускающий индекс set не работал с IN и функцией indexHint(). #62083 (Michael Kolupaev).
  • Поддерживается выполнение функции при присвоении значения параметризованному представлению. #63502 (SmitaRKulkarni).
  • Исправлено отслеживание использования памяти для формата Parquet. #63584 (Michael Kolupaev).
  • Исправлено чтение столбцов типа Tuple(Map(LowCardinality(String), String), ...). #63956 (Anton Popov).
  • Исправлена ошибка Cyclic aliases для циклических псевдонимов разных типов (выражение и функция). #63993 (Nikolai Kochetov).
  • Это исправление использует корректно переопределённый контекст с правильным определителем для каждого отдельного представления в конвейере запросов. #64079 (pufit).
  • Исправлен анализатор: при использовании INTERPOLATE больше не возникает ошибка "Not found column". #64096 (Yakov Olkhovskiy).
  • Исправлена ошибка при создании резервных копий в бакеты S3 с другими учетными данными, чем у диска, на котором хранится файл. #64153 (Antonio Andelic).
  • Кэш запросов теперь рассматривает два идентичных запроса к разным базам данных как разные запросы. Предыдущее поведение могло использоваться для обхода отсутствия привилегий на чтение таблицы. #64199 (Robert Schulze).
  • Исправлена возможная аварийная остановка при возникновении необработанного исключения в ~WriteBufferFromFileDescriptor в StatusFile. #64206 (Kruglov Pavel).
  • Исправлена ошибка duplicate alias в распределённых запросах с ARRAY JOIN. #64226 (Nikolai Kochetov).
  • Исправлено неожиданное преобразование с помощью accurateCast из string в integer. #64255 (wudidapaopao).
  • Исправлено упрощение КНФ в случае, когда какая-либо группа OR содержит взаимоисключающие атомы. #64256 (Eduard Karacharov).
  • Исправлена проверка размера дерева запросов. #64377 (Dmitry Novik).
  • Исправлена ошибка Logical error: Bad cast, возникавшая для таблицы Buffer при использовании PREWHERE. #64388 (Nikolai Kochetov).
  • Предотвращено рекурсивное логирование в blob_storage_log при его хранении в объектном хранилище. #64393 (vdimir).
  • Исправлены запросы CREATE TABLE AS для таблиц, содержащих выражения по умолчанию. #64455 (Anton Popov).
  • Исправлено поведение optimize_read_in_order для ORDER BY ... NULLS FIRST / LAST в таблицах с ключами типа Nullable. #64483 (Eduard Karacharov).
  • Исправлены ошибки Expression nodes list expected 1 projection names и Unknown expression or identifier для запросов, использующих псевдонимы для GLOBAL IN. #64517 (Nikolai Kochetov).
  • Исправлена ошибка Cannot find column в распределённых запросах при использовании константного CTE в качестве ключа GROUP BY. #64519 (Nikolai Kochetov).
  • Исправлен цикл перезапусков, возникавший при восстановлении из резервной копии, когда операция блокировалась созданием материализованного представления (MV) с пользователем-определителем (DEFINER), который ещё не был восстановлен. #64595 (pufit).
  • Исправлен результат работы функции formatDateTimeInJodaSyntax в случае, когда форматтер генерирует нечётное количество символов и последний символ — 0. Например, SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D') теперь корректно возвращает 150 вместо прежнего значения 15. #64614 (LiuNeng).
  • Не переписывать агрегацию, если уже используется комбинатор -If. #64638 (Dmitry Novik).
  • Исправлен вывод типа для float (при небольшом размере буфера, то есть при --max_read_buffer_size 1). #64641 (Azat Khuzhin).
  • Исправлена ошибка, которая могла приводить к некорректной работе TTL с выражениями. #64694 (alesapin).
  • Исправлена ошибка удаления выражений WHERE и PREWHERE, которые всегда истинны (для нового анализатора). #64695 (Nikolai Kochetov).
  • Исправлено чрезмерное отсечение данных токен‑ориентированными текстовыми индексами (ngrambf , full_text) при фильтрации по результатам функций startsWith, endsWith, match, multiSearchAny. #64720 (Eduard Karacharov).
  • Исправлена некорректная обработка управляющих последовательностей ANSI CSI в функции UTF8::computeWidth. #64756 (Shaun Struwig).
  • Исправлена ошибка некорректного удаления ORDER BY / LIMIT BY в подзапросах. #64766 (Raúl Marín).
  • Исправлено (экспериментально) неравенственное соединение с подзапросами для Set, которые участвуют в смешанных условиях соединения. #64775 (lgbo).
  • Исправлена ошибка в локальном кэше на диске plain_rewritable. #64778 (Julia Kartseva).
  • Исправление в Keeper: команда mntr теперь возвращает корректное значение zk_latest_snapshot_size. #64784 (Antonio Andelic).
  • Исправлена ошибка Cannot find column в распределённом запросе с ARRAY JOIN по столбцу Nested. Устраняет #64755. #64801 (Nikolai Kochetov).
  • Исправлена утечка памяти в политике кеширования SLRU. #64803 (Kseniia Sumarokova).
  • Исправлено возможное некорректное отслеживание памяти в нескольких видах запросов: запросах, читающих данные из S3, запросах по протоколу HTTP и при асинхронных вставках. #64844 (Anton Popov).
  • Исправлена ошибка Block structure mismatch для запросов, читающих с использованием PREWHERE из materialized view, если materialized view содержит столбцы типов, отличающихся от типов столбцов исходной таблицы. Исправляет #64611. #64855 (Nikolai Kochetov).
  • Исправлен редкий сбой, возникавший при использовании у таблицы TTL с подзапросом в сочетании с реплицируемой базой данных, параллельными репликами и analyzer. Это действительно редкий случай, но, пожалуйста, не используйте TTL с подзапросами. #64858 (alesapin).
  • Исправлено дублирование событий Delete в blob_storage_log при удалении большого набора. #64924 (vdimir).
  • Исправлена ошибка Session moved to another server из [Zoo]Keeper, которая могла возникать после запуска сервера, если в конфигурации используются включения из [Zoo]Keeper. #64986 (Alexander Tokmakov).
  • Исправлена команда ALTER MODIFY COMMENT, некорректно работавшая для параметризованных VIEW в https://github.com/ClickHouse/ClickHouse/pull/54211. #65031 (Nikolay Degterinsky).
  • Исправлен host_id в DatabaseReplicated при включённом параметре cluster_secure_connection. Ранее все соединения внутри кластера, создаваемые DatabaseReplicated, были незащищёнными, даже если параметр был включён. #65054 (Nikolay Degterinsky).
  • Исправлена ошибка Not-ready Set, возникавшая после оптимизации PREWHERE для StorageMerge. #65057 (Nikolai Kochetov).
  • Предотвращена запись в финализированный буфер в файловых хранилищах (file-like storages). #65063 (Kruglov Pavel).
  • Исправлена возможная бесконечная длительность выполнения запроса при циклических псевдонимах. Устраняет проблему #64849. #65081 (Nikolai Kochetov).
  • Исправлена ошибка Unknown expression identifier в удалённых запросах с INTERPOLATE (alias) (новый анализатор). Исправляет проблему #64636. #65090 (Nikolai Kochetov).
  • Исправлена оптимизация вынесения арифметических операций за пределы агрегации. В новом анализаторе она выполнялась только один раз. #65104 (Dmitry Novik).
  • Исправлено изменение имени агрегатной функции в новом анализаторе. #65110 (Dmitry Novik).
  • Возвращать код ответа 5xx вместо 200 OK в случае тайм-аута при чтении (части) тела запроса из клиентского сокета. #65118 (Julian Maicher).
  • Исправлен потенциальный сбой при выполнении hedged-запросов. #65206 (Azat Khuzhin).
  • Исправлена ошибка в механизме короткого замыкания при вычислении словарей Hashed и Hashed_Array, из-за которой могло происходить чтение неинициализированного числа, приводящее к различным ошибкам. #65256 (jsc0218).
  • Этот PR гарантирует, что тип константы (второй параметр оператора IN) всегда доступен во время процесса приведения типов оператором IN. В противном случае потеря информации о типе может привести к сбоям некоторых преобразований, например преобразования из DateTime в Date. Это исправляет проблему (#64487). #65315 (pn).

Улучшения сборки/тестирования/упаковки

  • Добавлена поддержка LLVM XRay. #64592 #64837 (Tomer Shafir).
  • Объединены реализации хранилищ S3/HDFS/Azure в один класс, работающий с IObjectStorage. То же самое сделано для *Cluster, озер данных и хранилищ очередей (Queue). #59767 (Kseniia Sumarokova).
  • Рефакторинг компонента записи частей данных (data part writer) для удаления зависимостей от MergeTreeData и DataPart. #63620 (Alexander Gololobov).
  • Рефакторинг KeyCondition и анализа ключей для улучшения PartitionPruner и тривиальной оптимизации подсчетов. Это выделено отдельно от #60463. #61459 (Amos Bird).
  • Добавлены утверждения (assertions), чтобы убедиться, что все функции вызываются со столбцами правильного размера. #63723 (Raúl Marín).
  • Сервис network сделан обязательным при использовании init-скрипта rc для запуска демона сервера ClickHouse. #60650 (Chun-Sheng, Li).
  • Уменьшен размер некоторых медленных тестов. #64387 #64452 (Raúl Marín).
  • Воспроизведение логов ZooKeeper с использованием keeper-bench. #62481 (Antonio Andelic).

Релиз ClickHouse 24.5 от 2024-05-30. Презентация, Видео

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

  • «Инвертированные индексы» переименованы в «полнотекстовые индексы» — это менее техническое и более удобное для пользователей название. Это также изменяет внутренние метаданные таблицы и делает неработоспособными таблицы с существующими (экспериментальными) инвертированными индексами. Перед обновлением обязательно удалите такие индексы и создайте их заново после обновления. #62884 (Robert Schulze).
  • Использование функций neighbor, runningAccumulate, runningDifferenceStartingWithFirstValue, runningDifference объявлено устаревшим (так как они легко приводят к ошибкам). Вместо них следует использовать корректные оконные функции. Чтобы снова их включить, установите allow_deprecated_error_prone_window_functions = 1 или задайте compatibility = '24.4' или ниже. #63132 (Nikita Taranov).
  • Запросы к system.columns будут работать быстрее, если имеется большое количество столбцов, но для многих баз данных или таблиц не выданы права SHOW TABLES. Обратите внимание, что в предыдущих версиях, если вы выдавали SHOW COLUMNS для отдельных столбцов без выдачи SHOW TABLES для соответствующих таблиц, таблица system.columns отображала эти столбцы, но в новой версии такая таблица будет полностью пропущена. Удалены сообщения трассировочного лога «Access granted» и «Access denied», которые замедляли выполнение запросов. #63439 (Alexey Milovidov).

Новая функция

  • Добавлен формат Form для чтения и записи одной записи в формате application/x-www-form-urlencoded. #60199 (Shaun Struwig).
  • Добавлена возможность сжимать данные в CROSS JOIN. #60459 (p1rattttt).
  • Добавлена возможность выполнять операцию CROSS JOIN во временных файлах, если размер превышает допустимые пределы. #63432 (p1rattttt).
  • Поддерживается JOIN с неравенствами в условии соединения, которые используют столбцы как из левой, так и из правой таблицы, например t1.y < t2.y. Чтобы включить, выполните SET allow_experimental_join_condition = 1. #60920 (lgbo).
  • Теперь в типе Map в качестве ключей можно использовать Float32, Float64, Array(T), Map(K, V) и Tuple(T1, T2, ...). Закрывает #54537. #59318 (李扬).
  • Реализована поддержка массовой загрузки данных в EmbeddedRocksDB путём создания и приёма SST-файла вместо использования встроенной memtable RocksDB. Это повышает скорость импорта, особенно для длительно выполняющихся запросов INSERT в таблицы StorageEmbeddedRocksDB. Также добавлены настройки таблиц EmbeddedRocksDB. #59163 #63324 (Duc Canh Le).
  • Теперь можно парсить CRLF в формате TSV с помощью настройки input_format_tsv_crlf_end_of_line. Закрывает #56257. #59747 (Shaun Struwig).
  • Новая настройка input_format_force_null_for_omitted_fields, которая принудительно устанавливает значения NULL для пропущенных полей. #60887 (Constantine Peresypkin).
  • Ранее хранилище S3 и табличная функция s3 не поддерживали выборку из файлов‑контейнеров архивов, таких как tarball, zip, 7z. Теперь в них можно перебирать файлы внутри архивов в S3. #62259 (Daniil Ivanik).
  • Добавлена поддержка условной функции clamp. #62377 (skyoct).
  • Добавлен формат вывода NPy. #62430 (豪肥肥).
  • Формат Raw добавлен как синоним формата TSVRaw. #63394 (Unalian).
  • Добавлена новая SQL‑функция generateUUIDv7 для генерации UUID версии 7, то есть так называемых UUID на основе временной метки со случайным компонентом. Также добавлена функция UUIDToNum для извлечения байтов из UUID и функция UUIDv7ToDateTime для извлечения компонента временной метки из UUID версии 7. #62852 (Alexey Petrunyaka).
  • В Linux и macOS, если стандартный вывод программы перенаправлен в файл с расширением, обозначающим сжатие, используется соответствующий метод сжатия вместо его отсутствия (что делает поведение аналогичным INTO OUTFILE). #63662 (v01dXYZ).
  • Изменён текст предупреждения при большом количестве подключённых таблиц, чтобы различать таблицы, представления и словари. #64180 (Francisco J. Jurado Moreno).
  • Добавлена поддержка функции azureBlobStorage в сервере ClickHouse для использования Azure Workload Identity при аутентификации в Azure Blob Storage. Если в конфигурации установлен параметр use_workload_identity, для аутентификации используется workload identity. #57881 (Vinay Suryadevara).
  • В таблицу system.parts_columns добавлена информация о TTL. #63200 (litlig).

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

  • Реализован тип данных Dynamic, который позволяет хранить значения любых типов без необходимости знать все возможные типы заранее. Тип Dynamic доступен при включении настройки allow_experimental_dynamic_type. См. #54864. #63058 (Kruglov Pavel).
  • Разрешено создавать базу данных MaterializedMySQL без подключения к MySQL. #63397 (Kirill).
  • Автоматически помечать реплику реплицируемой базы данных как потерянную и запускать восстановление, если некоторая DDL‑задача завершается сбоем более чем max_retries_before_automatic_recovery (по умолчанию 100) раз подряд с одной и той же ошибкой. Также исправлена ошибка, которая могла приводить к пропуску DDL‑записей при возникновении исключения на раннем этапе исполнения записи. #63549 (Alexander Tokmakov).
  • Учитывать файлы, обработка которых завершилась с ошибкой, в s3queue_tracked_file_ttl_sec и s3queue_traked_files_limit для StorageS3Queue. #63638 (Kseniia Sumarokova).

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

  • Меньше конфликтов при доступе к кэшу файловой системы (часть 4). Позволяет не заполнять кэш файловой системы до предела за счёт дополнительного вытеснения данных в фоне (управляется параметром keep_free_space_size(elements)_ratio). Это снижает нагрузку при резервировании места для запросов (в методе tryReserve). Также это реализовано по возможности без блокировок, т.е. не должно блокировать обычное использование кэша. #61250 (Kseniia Sumarokova).
  • Пропуск объединения (merge) вновь созданных блоков проекций во время операций INSERT. #59405 (Nikita Taranov).
  • Обработка строковых функций ...UTF8 в «ASCII-режиме», если все входные строки состоят только из ASCII-символов. Идея вдохновлена https://github.com/apache/doris/pull/29799. Общее ускорение 1.07x~1.62x. Обратите внимание, что в некоторых случаях пиковое потребление памяти уменьшилось. #61632 (李扬).
  • Улучшена производительность выбора ({}) glob-шаблонов в StorageS3. #62120 (Andrey Zvonov).
  • HostResolver содержит каждый IP-адрес несколько раз. Если у удалённого хоста несколько IP, и по какой-то причине (например, правила брандмауэра) доступ по части IP разрешён, а по другим запрещён, то только первая запись с запрещённым IP помечается как неудачная, и при каждой попытке эти IP могут снова выбираться (и снова приводить к ошибке). Даже если это исправить, каждые 120 секунд кэш DNS сбрасывается, и IP могут быть выбраны вновь. #62652 (Anton Ivashkin).
  • Добавлен новый конфигурационный параметр prefer_merge_sort_block_bytes для управления потреблением памяти и двукратного ускорения сортировки при слиянии, когда много столбцов. #62904 (LiuNeng).
  • clickhouse-local теперь будет запускаться быстрее. В предыдущих версиях он по ошибке не удалял временные директории. Теперь будет. Это закрывает задачу #62941. #63074 (Alexey Milovidov).
  • Микрооптимизации для нового анализатора. #63429 (Raúl Marín).
  • Анализ индексов будет работать, если DateTime сравнивается с DateTime64. Это закрывает задачу #63441. #63443 #63532 (Alexey Milovidov).
  • Небольшое ускорение индексов типа set (примерно в 1.5 раза) за счёт удаления «мусора». #64098 (Alexey Milovidov).
  • Убрано копирование данных при записи в кэш файловой системы. #63401 (Kseniia Sumarokova).
  • Теперь бэкапы с использованием Azure Blob Storage будут использовать multicopy. #64116 (alesapin).
  • Разрешено использовать native copy для Azure даже при разных контейнерах. #64154 (alesapin).
  • Наконец включён native copy для Azure. #64182 (alesapin).

Улучшения

  • Теперь можно использовать clickhouse-local и его сокращения clickhouse и ch с запросом или файлом запросов в качестве позиционного аргумента. Примеры: ch "SELECT 1", ch --param_test Hello "SELECT {test:String}", ch query.sql. Это закрывает #62361. #63081 (Alexey Milovidov).
  • Включена поддержка метаданных plain_rewritable для локальных объектных хранилищ и azure_blob_storage. #63365 (Julia Kartseva).
  • Поддерживаются английские кавычки Unicode, например “Hello”, 'world'. В целом это спорное решение, но полезно, если вы набираете запрос в текстовом редакторе, таком как Google Docs. Закрывает #58634. #63381 (Alexey Milovidov).
  • Разрешены завершающие запятые в списке столбцов в запросе INSERT. Например, INSERT INTO test (a, b, c, ) VALUES .... #63803 (Alexey Milovidov).
  • Более информативные сообщения об исключениях для формата Regexp. #63804 (Alexey Milovidov).
  • Теперь в формате Values разрешены завершающие запятые. Например, допускается такой запрос: INSERT INTO test (a, b, c) VALUES (4, 5, 6,);. #63810 (Alexey Milovidov).
  • Сделать так, чтобы RabbitMQ отправлял nack для некорректных сообщений. Закрывает #45350. #60312 (Kseniia Sumarokova).
  • Исправлена ошибка, приводившая к аварийному завершению при асинхронной раскрутке стека (например, при использовании семплирующего профилировщика запросов) во время интерпретации отладочной информации. Закрывает #60460. #60468 (Alexey Milovidov).
  • Для ошибки S3 «no key» добавлены разные сообщения для диска и хранилища. #61108 (Sema Checherinda).
  • Индикатор прогресса будет работать для простых запросов с LIMIT из system.zeros, system.zeros_mt (он уже работает для system.numbers и system.numbers_mt) и табличной функции generateRandom. В качестве бонуса, если общее число записей больше лимита max_rows_to_read, исключение будет сгенерировано раньше. Это закрывает #58183. #61823 (Alexey Milovidov).
  • Поддержка «Merge Key» в YAML-конфигурациях (это странная особенность YAML, можете не обращать внимания). #62685 (Azat Khuzhin).
  • Улучшено сообщение об ошибке, возникающее при использовании недетерминированной функции с источником типа Replicated. #62896 (Grégoire Pineau).
  • Исправлен межсерверный секрет для схемы Distributed поверх Distributed при использовании remote. #63013 (Azat Khuzhin).
  • Добавлена поддержка include_from для YAML-файлов. Тем не менее предпочтительнее использовать config.d #63106 (Eduard Karacharov).
  • Сохранять ранее введённые данные в терминале после выбора варианта из подсказок skim. #63261 (FlameFactory).
  • При вычислении ширины полей (в форматах Pretty или функции visibleWidth) управляющие последовательности ANSI теперь корректно игнорируются. #63270 (Shaun Struwig).
  • Использование кода ошибки NUMBER_OF_ARGUMENTS_DOESNT_MATCH заменено более точными кодами ошибок, где это уместно. #63406 (Yohann Jardin).
  • os_user и client_hostname теперь корректно задаются в запросах, используемых для подсказок командной строки в clickhouse-client. Тем самым закрывается #63430. #63433 (Alexey Milovidov).
  • Автоматически устанавливать max_block_size в значение по умолчанию, если он равен нулю. #63587 (Antonio Andelic).
  • Добавлен столбец build_id ALIAS в trace_log для упрощения автоматического переименования при обнаружении изменений бинарного файла. Это решает проблему #52086. #63656 (Zimu Li).
  • Включена поддержка операции усечения (truncate) для дисков объектного хранилища. #63693 (MikhailBurdukov).
  • Загрузка списка ключевых слов теперь зависит от ревизии сервера и будет отключена в старых версиях сервера ClickHouse. CC @azat. #63786 (Nikita Mikhaylov).
  • Диски ClickHouse должны прочитать параметр сервера, чтобы получить актуальную версию формата метаданных. #63831 (Sema Checherinda).
  • Отключать ограничения формата Pretty (output_format_pretty_max_rows/output_format_pretty_max_value_width), если stdout не является TTY. #63942 (Azat Khuzhin).
  • Обработка исключений теперь корректно работает при использовании ClickHouse внутри AWS Lambda. Автор: Alexey Coolnev. #64014 (Alexey Milovidov).
  • Выбрасывать исключение CANNOT_DECOMPRESS вместо CORRUPTED_DATA при передаче некорректных сжатых данных через HTTP. #64036 (vdimir).
  • Всплывающая подсказка для одного большого числа в форматах Pretty теперь работает и для Nullable, и для LowCardinality. Это закрывает #61993. #64084 (Alexey Milovidov).
  • Добавлены метрики, логи и имена потоков при фильтрации частей по индексам. #64130 (Alexey Milovidov).
  • Игнорировать параметр allow_suspicious_primary_key при ATTACH и проверять его при ALTER. #64202 (Azat Khuzhin).

Улучшения сборки/тестирования/упаковки

  • ClickHouse теперь собирается с помощью clang-18. Включено множество новых проверок из clang-tidy-18. #60469 (Alexey Milovidov).
  • Экспериментально добавлена поддержка loongarch64 как новой платформы для ClickHouse. #63733 (qiangxuhui).
  • Dockerfile был проверен официальной библиотекой Docker: https://github.com/docker-library/official-images/pull/15846. #63400 (Mikhail f. Shiryaev).
  • Информация о каждом символе в каждом модуле трансляции будет собираться в базе данных CI для каждого билда в CI. Это закрывает #63494. #63495 (Alexey Milovidov).
  • Обновлена библиотека Apache Datasketches. Это решает #63858. #63923 (Alexey Milovidov).
  • Включена поддержка gRPC для aarch64 linux при кросс-компиляции бинарного файла. #64072 (alesapin).
  • Исправлена раскрутка стека при SIGSEGV на aarch64 (из-за малого стека для сигнала). #64058 (Azat Khuzhin).

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

  • Настройка enable_vertical_final по умолчанию отключена. Эту возможность не следует использовать, так как в ней есть ошибка: #64543. #64544 (Alexander Tokmakov).
  • Исправлено создание резервной копии при использовании нескольких сегментов #57684 (Vitaly Baranov).
  • Исправлена ошибка передачи проекций/индексов/первичного ключа из списка столбцов запроса CREATE во внутреннюю таблицу материализованного представления (MV) #59183 (Azat Khuzhin).
  • Исправлено некорректное слияние параметра boundRatio #60532 (Tao Wang).
  • Исправлена ошибка, приводившая к сбою при вызове некоторых функций для константных столбцов с низкой кардинальностью #61966 (Michael Kolupaev).
  • Исправлена ошибка, из-за которой запросы с FINAL возвращали неверные результаты, если в таблице не использовалась адаптивная гранулярность #62432 (Duc Canh Le).
  • Улучшено обнаружение поддержки cgroups v2 контроллерами памяти #62903 (Robert Schulze).
  • Исправлено повторное использование внешних таблиц в клиенте #62964 (Azat Khuzhin).
  • Исправлена ошибка, приводившая к сбою при использовании функции untuple с неразрешённым лямбда-выражением #63131 (Raúl Marín).
  • Исправлена проблема, из-за которой сервер преждевременно начинал слушать входящие подключения #63181 (alesapin).
  • Исправлена проблема с пересечением частей при перезапуске после выполнения команды DROP PART #63202 (Han Fei).
  • Обеспечена корректная загрузка значений параметров безопасности SQL по умолчанию при запуске #63209 (pufit).
  • Исправлено применение pushdown-фильтра в JOIN #63234 (Maksim Kita).
  • Исправлен бесконечный цикл в методе AzureObjectStorage::listObjects #63257 (Julia Kartseva).
  • CROSS JOIN игнорировал настройку join_algorithm #63273 (vdimir).
  • Исправлены проблемы с финализацией WriteBufferToFileSegment и StatusFile #63346 (vdimir).
  • Исправлена логическая ошибка, возникавшая при выполнении запроса SELECT после ALTER в редких случаях #63353 (alesapin).
  • Исправлено формирование заголовка X-ClickHouse-Timezone с использованием session_timezone #63377 (Andrey Zvonov).
  • Исправлен debug assert при использовании группировки WITH ROLLUP и типов LowCardinality #63398 (Raúl Marín).
  • Небольшие исправления параметра group_by_use_nulls #63405 (vdimir).
  • Исправлено резервное копирование и восстановление части с проекцией в случае, когда проекция была удалена из метаданных таблицы, но сама часть всё ещё содержит проекцию #63426 (Kseniia Sumarokova).
  • Исправлен источник словаря MySQL #63481 (vdimir).
  • Добавлена запись QueryFinish при AsyncInsertFlush без данных #63483 (Raúl Marín).
  • Исправлена проблема с пустыми used_dictionaries в system.query_log #63487 (Eduard Karacharov).
  • MergeTreePrefetchedReadPool сделан безопаснее #63513 (Antonio Andelic).
  • Исправлен сбой при завершении работы при включённом Sentry (из-за того, что OpenSSL уничтожался раньше Sentry) #63548 (Azat Khuzhin).
  • Исправлена поддержка типов Array и Map при использовании Keyed hashing #63628 (Salvatore Mesoraca).
  • Исправлено проталкивание фильтра (filter pushdown) для Parquet и, возможно, для StorageMerge #63642 (Michael Kolupaev).
  • Запрещено преобразование в Replicated, если путь в ZooKeeper уже существует #63670 (Kirill).
  • Analyzer: представления читают только необходимые столбцы #63688 (Maksim Kita).
  • Analyzer: запретить переопределение WINDOW #63694 (Dmitry Novik).
  • Настройка flatten_nested была неисправна при использовании экспериментальной базы данных Replicated. #63695 (Nikolai Kochetov).
  • Исправлены ошибки #63653 #63722 (Nikolai Kochetov).
  • Разрешено приведение типов из Array(Nothing) в Map(Nothing, Nothing) #63753 (Nikolai Kochetov).
  • Исправлена ошибка ILLEGAL_COLUMN в partial_merge join #63755 (vdimir).
  • Исправлено: удалено лишнее DISTINCT при использовании оконных функций #63776 (Igor Nikonov).
  • Исправлен возможный сбой при выполнении команды SYSTEM UNLOAD PRIMARY KEY #63778 (Raúl Marín).
  • Исправлена обработка запросов с дублирующимся циклическим псевдонимом. #63791 (Nikolai Kochetov).
  • Сделан TokenIterator ленивым, как и должно быть #63801 (Alexey Milovidov).
  • Добавлена настройка endpoint_subpath для URI S3 #63806 (Julia Kartseva).
  • Исправлена взаимоблокировка в ParallelReadBuffer #63814 (Antonio Andelic).
  • Исправление проталкивания фильтра в JOIN для эквивалентных столбцов #63819 (Maksim Kita).
  • Удалять данные со всех дисков после выполнения DROP для базы данных Lazy. #63848 (MikhailBurdukov).
  • Исправлен некорректный результат при чтении из MV с параллельными репликами и новым анализатором #63861 (Nikita Taranov).
  • Исправления в командах find_super_nodes и find_big_family в утилите keeper-client #63862 (Alexander Gololobov).
  • Обновлено имя выполнения lambda #63864 (Nikolai Kochetov).
  • Исправлен SIGSEGV, возникавший из-за профилировщика CPU/Real #63865 (Azat Khuzhin).
  • Исправлена работа запроса EXPLAIN CURRENT TRANSACTION #63926 (Anton Popov).
  • Исправлен анализатор: там одни черепахи до самого низа... #63930 (Yakov Olkhovskiy).
  • Разрешены некоторые команды ALTER TABLE для диска plain_rewritable #63933 (Julia Kartseva).
  • Исправлена работа рекурсивных CTE в распределённых запросах #63939 (Maksim Kita).
  • Analyzer: исправлено разрешение конструкции COLUMNS #63962 (Dmitry Novik).
  • LIMIT BY и skip_unused_shards в анализаторе #63983 (Nikolai Kochetov).
  • Исправление чернового кода для experimental Kusto #63992 (Yong Wang).
  • Десериализовать недоверенные бинарные данные более безопасно #64024 (Robert Schulze).
  • Исправлен анализ запросов с настройкой final = 1 для Distributed таблиц, построенных над таблицами, не относящимися к семейству MergeTree. #64037 (Nikolai Kochetov).
  • Добавлены недостающие настройки для функции recoverLostReplica #64040 (Raúl Marín).
  • Исправлены проверки прав доступа SQL в анализаторе #64079 (pufit).
  • Исправлен анализатор: для DAG теперь используются только выражения интерполяции #64096 (Yakov Olkhovskiy).
  • Исправлена запись multipart-блоков резервных копий в Azure порциями по 1 МиБ (по размеру буфера чтения) вместо использования max_upload_part_size (в случае ненативного копирования) #64117 (Kseniia Sumarokova).
  • Корректный откат при копировании резервной копии #64153 (Antonio Andelic).
  • Предотвращена ошибка LOGICAL_ERROR при выполнении CREATE TABLE как materialized view #64174 (Raúl Marín).
  • Query Cache: считать идентичные запросы к разным базам данных разными #64199 (Robert Schulze).
  • Не учитывается text_log для Keeper #64218 (Antonio Andelic).
  • Исправлена логическая ошибка: неверное приведение типов в таблице Buffer при использовании PREWHERE. #64388 (Nikolai Kochetov).

Релиз ClickHouse 24.4 от 2024-04-30. Презентация, Видео

Заметки по обновлению

  • clickhouse-odbc-bridge и clickhouse-library-bridge теперь являются отдельными пакетами. Это закрывает #61677. #62114 (Alexey Milovidov).
  • Больше нельзя устанавливать max_parallel_replicas (для экспериментального параллельного чтения с реплик) в значение 0, поскольку это не имеет смысла. Закрывает #60140. #61201 (Kruglov Pavel).
  • Удалена поддержка запроса INSERT WATCH (часть устаревшей функциональности LIVE VIEW). #62382 (Alexey Milovidov).
  • Удалена настройка optimize_monotonous_functions_in_order_by. #63004 (Raúl Marín).
  • Удалён экспериментальный статус у движка базы данных Replicated. Теперь он находится в стадии Beta. #62937 (Justin de Guzman).

Новая возможность

  • Добавлена поддержка рекурсивных CTE. #62074 (Maksim Kita).
  • Добавлена поддержка конструкции QUALIFY. Закрывает #47819. #62619 (Maksim Kita).
  • Табличные движки теперь можно выдавать через GRANT, и это не повлияет на поведение существующих пользователей. #60117 (jsc0218).
  • Добавлен перезаписываемый диск S3, который поддерживает операции INSERT и не требует локально хранимых метаданных. #61116 (Julia Kartseva). Основной сценарий использования — системные таблицы.
  • Подсветка синтаксиса при вводе в клиенте теперь работает на уровне синтаксического анализа (ранее она работала на уровне лексера). #62123 (Alexey Milovidov).
  • Поддерживается удаление нескольких таблиц одновременно, как в запросе DROP TABLE a, b, c;. #58705 (zhongyuankai).
  • Теперь поддерживается изменение настроек таблиц Memory с помощью ALTER MODIFY SETTING. Пример: ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;. #62039 (zhongyuankai).
  • В HTTP-интерфейс добавлен параметр запроса role. Он работает аналогично SET ROLE x, применяя роль до выполнения команды. Это позволяет обойти ограничение HTTP-интерфейса, в котором не допускается выполнение нескольких команд, и невозможно одновременно отправить и SET ROLE x, и саму команду. Можно задать несколько ролей таким образом, например, ?role=x&role=y, что будет эквивалентно SET ROLE x, y. #62669 (Serge Klochkov).
  • Добавлена команда SYSTEM UNLOAD PRIMARY KEY для освобождения памяти, используемой первичным ключом таблицы. #62738 (Pablo Marcos).
  • В system.text_log добавлены столбцы value1, value2, ..., value10. Эти столбцы содержат значения, которые использовались для форматирования сообщения. #59619 (Alexey Katsman).
  • Добавлен постоянный виртуальный столбец _block_offset, который хранит исходный номер строки в блоке, назначенный при вставке. Постоянное хранение столбца _block_offset может быть включено настройкой MergeTree enable_block_offset_column. Добавлен виртуальный столбец _part_data_version, который содержит либо минимальный номер блока, либо версию мутации части. Постоянный виртуальный столбец _block_number больше не считается экспериментальным. #60676 (Anton Popov).
  • Добавлена настройка input_format_json_throw_on_bad_escape_sequence; если её отключить, можно сохранять некорректные escape-последовательности во входных JSON-форматах. #61889 (Kruglov Pavel).

Улучшения производительности

  • Улучшено проталкивание фильтров JOIN с использованием эквивалентных множеств. #61216 (Maksim Kita).
  • Добавлена оптимизация преобразования OUTER JOIN в INNER JOIN, если фильтр после JOIN всегда отфильтровывает строки со значениями по умолчанию. Оптимизацией можно управлять с помощью настройки query_plan_convert_outer_join_to_inner_join, включённой по умолчанию. #62907 (Maksim Kita).
  • Улучшение работы с AWS S3. Клиент должен отправлять серверу заголовок 'Keep-Alive: timeout=X'. Если клиент получает от сервера ответ с этим заголовком, он должен использовать значение, указанное сервером. Также клиенту лучше не использовать соединение, срок действия которого почти истёк, чтобы избежать гонки при закрытии соединения. #62249 (Sema Checherinda).
  • Снижены накладные расходы мутаций при выполнении запросов SELECT (v2). #60856 (Azat Khuzhin).
  • Чаще вызываемые функции в PODArray теперь принудительно встраиваются (force-inline). #61144 (李扬).
  • Ускорена обработка JSON за счёт прекращения чтения объекта после того, как все необходимые столбцы прочитаны. #62210 (lgbo).
  • Улучшена обработка простых запросов INSERT SELECT из файлов через табличные функции file/s3/hdfs/url/.... Добавлена отдельная настройка max_parsing_threads для управления числом потоков, используемых при параллельном разборе. #62404 (Kruglov Pavel).
  • Функции to_utc_timestamp и from_utc_timestamp теперь примерно вдвое быстрее. #62583 (KevinyhZou).
  • Функции parseDateTimeOrNull, parseDateTimeOrZero, parseDateTimeInJodaSyntaxOrNull и parseDateTimeInJodaSyntaxOrZero теперь выполняются значительно быстрее (в 10–1000 раз), когда во входных данных в основном содержатся значения, которые нельзя разобрать. #62634 (LiuNeng).
  • SELECT-запросы по system.query_cache теперь заметно быстрее, когда кэш запросов содержит много записей (например, более 100 000). #62671 (Robert Schulze).
  • Меньше конкуренции за кэш файловой системы (часть 3): выполнение удаления из файловой системы без блокировки при попытке зарезервировать место. #61163 (Kseniia Sumarokova).
  • Ускорено динамическое изменение размера кэша файловой системы. #61723 (Kseniia Sumarokova).
  • Источник словаря с INVALIDATE_QUERY больше не перезагружается дважды при запуске. #62050 (vdimir).
  • Исправлена проблема, когда при добавлении избыточного = 1 или = 0 после логического выражения с участием первичного ключа не использовался первичный индекс. Например, и SELECT * FROM <table> WHERE <primary-key> IN (<value>) = 1, и SELECT * FROM <table> WHERE <primary-key> NOT IN (<value>) = 0 выполняли полное сканирование таблицы, хотя в этих случаях мог быть использован первичный индекс. #62142 (josh-hildred).
  • Возвращает поток фрагментов из system.remote_data_paths вместо накопления всего результата в одном большом фрагменте. Это позволяет использовать меньше памяти, показывать промежуточный прогресс выполнения и отменять запрос. #62613 (Alexander Gololobov).

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

  • Добавлена поддержка параллельного буфера записи для Azure Blob Storage, который включается с помощью настройки azure_allow_parallel_part_upload. #62534 (SmitaRKulkarni).
  • Пользовательский кэш страниц (userspace page cache) теперь работает со статическими веб-хранилищами (disk(type = web)). Используйте клиентскую настройку use_page_cache_for_disks_without_file_cache=1 для включения. #61911 (Michael Kolupaev).
  • Типы Bool и числовые варианты больше не рассматриваются как подозрительные в типе Variant. #61999 (Kruglov Pavel).
  • Реализовано улучшенное преобразование из String в Variant на основе парсинга. #62005 (Kruglov Pavel).
  • Добавлена поддержка типа Variant в функциях JSONExtract. #62014 (Kruglov Pavel).
  • Тип Variant помечен как сравнимый, поэтому он может использоваться в первичном ключе. #62693 (Kruglov Pavel).

Улучшения

  • Для удобства SELECT * FROM numbers() будет работать так же, как и SELECT * FROM system.numbers — без лимита. #61969 (YenchangChan).
  • Добавлены отдельные теги consumer/producer для конфигурации Kafka. Это позволяет избежать предупреждений от librdkafka (неудачной C‑библиотеки с множеством ошибок) о том, что свойства consumer были указаны для экземпляров producer и наоборот (например, Configuration property session.timeout.ms is a consumer property and will be ignored by this producer instance). Закрывает: #58983. #58956 (Aleksandr Musorin).
  • Функции date_diff и age теперь вычисляют результат с наносекундной, а не с микросекундной точностью. Также они поддерживают nanosecond (или nanoseconds, или ns) как допустимое значение параметра unit. #61409 (Austin Kothig).
  • Добавлены единицы времени — наносекунды, микросекунды и миллисекунды — для функции date_trunc. #62335 (Misz606).
  • При перезагрузке сертификата также перезагружать цепочку сертификатов. #61671 (Pervakov Grigorii).
  • Попытка предотвратить ошибку #60432, запрещая подключение таблицы, если для этого пути реплики уже существует активная реплика. #61876 (Arthur Passos).
  • Добавлена поддержка input для clickhouse-local. #61923 (Azat Khuzhin).
  • Движок таблицы Join со строгим режимом ANY ведет себя детерминированно после перезагрузки. Когда вставляется несколько строк с одинаковым ключом, первая будет иметь более высокий приоритет (ранее при загрузке таблицы строка выбиралась случайным образом). Закрывает #51027. #61972 (vdimir).
  • Автоматически определять типы столбцов Nullable на основе схемы Apache Arrow. #61984 (Maksim Kita).
  • Добавлена возможность отменять параллельное слияние агрегатных состояний во время агрегации. Пример: uniqExact. #61992 (Maksim Kita).
  • Используйте system.keywords для формирования подсказок, а также во всех внутренних механизмах. #62000 (Nikita Mikhaylov).
  • OPTIMIZE FINAL для ReplicatedMergeTree теперь будет ждать завершения текущих активных слияний, а затем повторно пытаться запланировать финальное слияние. Это сделает его поведение более похожим на поведение обычного MergeTree. #62067 (Nikita Taranov).
  • При чтении данных из текстового файла Hive первая строка файла использовалась для определения количества входных полей, и иногда количество полей в первой строке не совпадало с определением таблицы Hive. Например, таблица Hive определена как имеющая 3 столбца, test_tbl(a Int32, b Int32, c Int32), но первая строка текстового файла содержит только 2 поля. В этой ситуации количество входных полей будет установлено равным 2, и если следующая строка текстового файла уже имеет 3 поля, то третье поле не будет прочитано, а вместо него будет установлено значение по умолчанию — 0, что неверно. #62086 (KevinyhZou).
  • Оператор CREATE AS копирует комментарий таблицы. #62117 (Pablo Marcos).
  • Добавлено отображение прогресса выполнения запросов в таблицу zookeeper. #62152 (JackyWoo).
  • Добавлена возможность включать сборщик трассировки (Real и CPU) на уровне сервера. #62189 (alesapin).
  • Добавлена настройка lightweight_deletes_sync (значение по умолчанию: 2 — синхронно ожидать выполнения на всех репликах). Аналогична настройке mutations_sync, но влияет только на поведение легковесного удаления. #62195 (Anton Popov).
  • Различать логические значения и целые числа при разборе значений для пользовательских настроек: SET custom_a = true; SET custom_b = 1;. #62206 (Vitaly Baranov).
  • Реализована поддержка доступа к S3 через интерфейсные конечные точки AWS PrivateLink. Закрыты задачи #60021, #31074 и #53761. #62208 (Arthur Passos).
  • Не создавать каталог для UDF в clickhouse-client, если он не существует. Это исправляет проблему #59597. #62366 (Alexey Milovidov).
  • Теперь кэш запросов не сохраняет результаты запросов к системным таблицам (system.*, information_schema.*, INFORMATION_SCHEMA.*). #62376 (Robert Schulze).
  • MOVE PARTITION TO TABLE запрос может быть отложен или завершиться исключением TOO_MANY_PARTS, чтобы не превысить лимиты на количество частей. Применяются те же настройки и ограничения, что и для запроса INSERT (см. настройки max_parts_in_total, parts_to_delay_insert, parts_to_throw_insert, inactive_parts_to_throw_insert, inactive_parts_to_delay_insert, max_avg_part_size_for_too_many_parts, min_delay_to_insert_ms и max_delay_to_insert). #62420 (Sergei Trifonov).
  • Каталог установки по умолчанию в macOS изменён с /usr/bin на /usr/local/bin. Это необходимо, поскольку функция System Integrity Protection компании Apple, появившаяся в macOS El Capitan (2015), запрещает запись в /usr/bin даже при использовании sudo. #62489 (haohang).
  • Функция transform теперь всегда возвращает первое совпадение. #62518 (Raúl Marín).
  • В системную таблицу blob_storage_log добавлен отсутствовавший столбец hostname. #62456 (Jayme Bird).
  • Для согласованности с другими системными таблицами в системной таблице system.backup_log теперь появился столбец event_time. #62541 (Jayme Bird).
  • Таблица system.backup_log теперь имеет ключ сортировки по умолчанию event_date, event_time, такой же, как у других таблиц с движком _log. #62667 (Nikita Mikhaylov).
  • Не вычислять выражения DEFAULT таблиц при выполнении RESTORE. #62601 (Vitaly Baranov).
  • Хранилище и резервные копии в S3 также должны использовать те же значения параметров keep-alive по умолчанию, что и диск S3. #62648 (Sema Checherinda).
  • В сообщения журнала добавлен идентификатор клиента из библиотеки librdkafka (той самой печально известной библиотеки на C с множеством багов), чтобы можно было различать сообщения от разных потребителей одной таблицы. #62813 (János Benjamin Antal).
  • Разрешено использовать специальные макросы {uuid} и {database} в пути ZooKeeper реплицируемой базы данных. #62818 (Vitaly Baranov).
  • Добавлена поддержка использования ключа QUOTA с иной схемой аутентификации в HTTP-запросах. #62842 (Kseniia Sumarokova).
  • Сокращена подробность вывода справки (--help) в clickhouse client и clickhouse local. Прежний подробный вывод теперь доступен через --help --verbose. #62973 (Yarik Briukhovetskyi).
  • log_bin_use_v1_row_events был удалён в MySQL 8.3, и мы адаптировали под это экспериментальный движок MaterializedMySQL #60479. #63101 (Eugene Klimov). Автор: Nikolay Yankin.

Улучшения процессов сборки/тестирования/упаковки

Исправление ошибки (ошибка, заметная пользователю, в официальном стабильном релизе)

  • Исправлена логическая ошибка при откате транзакции вставки с кворумом. #61953 (Han Fei).
  • Исправлена ошибка парсера при использовании COUNT(*) с конструкцией FILTER #61357 (Duc Canh Le).
  • Исправлена логическая ошибка при использовании group_by_use_nulls с grouping sets, analyzer и materialize/constant #61567 (Kruglov Pavel).
  • Отменять операции слияния перед удалением перемещённых частей #61610 (János Benjamin Antal).
  • Исправлена ошибка, приводившая к аварийному завершению в Apache Arrow #61720 (Kruglov Pavel).
  • Поиск флага convert_to_replicated выполняется по корректному пути, соответствующему конкретному диску #61769 (Kirill).
  • Исправлена возможная гонка данных при работе с подключениями для distributed_foreground_insert/distributed_background_insert_batch #61867 (Azat Khuzhin).
  • Пометить ошибку CANNOT_PARSE_ESCAPE_SEQUENCE как ошибку разбора, чтобы можно было пропускать её в форматах ввода по строкам #61883 (Kruglov Pavel).
  • Исправлена запись сообщения об исключении в HTTP-выходном формате при использовании http_wait_end_of_query #61951 (Kruglov Pavel).
  • Корректное исправление для LowCardinality совместно с функциями JSONExtract #61957 (Nikita Mikhaylov).
  • Сбой в движке Merge, если у ROW POLICY отсутствует выражение #61971 (Ilya Golshtein).
  • Исправлено неперехваченное исключение в деструкторе WriteBufferAzureBlobStorage #61988 (SmitaRKulkarni).
  • Исправлена проблема с использованием CREATE TABLE без определения столбцов для ReplicatedMergeTree #62040 (Azat Khuzhin).
  • Исправлено поведение optimize_skip_unused_shards_rewrite_in при использовании составного ключа сегментирования #62047 (Azat Khuzhin).
  • ReadWriteBufferFromHTTP корректно устанавливает заголовок Host при перенаправлении #62068 (Sema Checherinda).
  • Исправлена ошибка, из-за которой во внешней таблице не удавалось разобрать тип данных Bool #62115 (Duc Canh Le).
  • Analyzer: исправлена обработка параметров запроса #62186 (Dmitry Novik).
  • Исправлено восстановление частей в режиме только для чтения #62207 (Vitaly Baranov).
  • Исправлено падение при определении индекса, содержащего SQL UDF #62225 (vdimir).
  • Исправлена ошибка использования NULL в качестве случайного seed для generateRandom при работе анализатора. #62248 (Nikolai Kochetov).
  • Исправлена обработка константных столбцов в Distinct Transform #62250 (Antonio Andelic).
  • Исправлен Parts Splitter в запросах с модификатором FINAL #62268 (Nikita Taranov).
  • Analyzer: Исправлено разрешение алиаса на параметризованное представление #62274 (Dmitry Novik).
  • Analyzer: исправлено разрешение имён в родительских областях видимости #62281 (Dmitry Novik).
  • Исправлена работа argMax с Nullable-столбцом ненативного числового типа #62285 (Raúl Marín).
  • Исправлены операции BACKUP и RESTORE для materialized view в базе данных типа Ordinary #62295 (Vitaly Baranov).
  • Исправлена гонка данных при работе со скалярами в Context #62305 (Kruglov Pavel).
  • Исправлен первичный ключ в materialized view #62319 (Murat Khairulin).
  • Не создавать многопоточный конвейер вставки для таблиц, не поддерживающих его #62333 (vdimir).
  • Исправлена работа анализатора с позиционными аргументами в распределённом запросе #62362 (flynn).
  • Исправлено проталкивание фильтров из additional_table_filters в движке Merge в анализаторе #62398 (Kruglov Pavel).
  • Исправлены запросы к таблицам с GLOBAL IN в анализаторе. #62409 (Nikolai Kochetov).
  • Учитывать настройки truncate_on_insert/create_new_file_on_insert в движках S3/HDFS/Azure при партиционированной записи #62425 (Kruglov Pavel).
  • Исправлен путь восстановления резервных копий для AzureBlobStorage #62447 (SmitaRKulkarni).
  • Исправлена ошибка в SimpleSquashingChunksTransform #62451 (Nikita Taranov).
  • Исправлен захват вложенной лямбда-функции. #62462 (Nikolai Kochetov).
  • Исправлен сбой при чтении protobuf с рекурсивными типами #62506 (Raúl Marín).
  • Исправлена ошибка при попытке переместить партицию саму в себя #62524 (helifu).
  • Исправлена работа скалярного подзапроса в LIMIT #62567 (Nikolai Kochetov).
  • Исправлен segfault в экспериментальном и неподдерживаемом движке Hive, который нам, впрочем, всё равно не нравится #62578 (Nikolay Degterinsky).
  • Устранена утечка памяти в функции groupArraySorted #62597 (Antonio Andelic).
  • Исправлена ошибка, приводившая к сбою в largestTriangleThreeBuckets #62646 (Raúl Marín).
  • Исправлены tumble[Start,End] и hop[Start,End] для работы с более крупными разрешениями #62705 (Jordi Villar).
  • Исправлено состояние комбинаторов argMin/argMax #62708 (Raúl Marín).
  • Исправлена проблема, из‑за которой работа с временными данными в кэше могла завершаться сбоем из‑за оптимизации, связанной с конкуренцией за блокировку кэша #62715 (Kseniia Sumarokova).
  • Исправлено падение в функции mergeTreeIndex #62762 (Anton Popov).
  • исправление: обновление вложенных материализованных столбцов: исправлена проверка размера #62773 (Eliot Hautefeuille).
  • Исправлена ошибка, из-за которой модификатор FINAL не учитывался в CTE при использовании analyzer #62811 (Duc Canh Le).
  • Исправлен сбой (crash) в функции formatRow при использовании формата JSON и HTTP‑интерфейса #62840 (Anton Popov).
  • Azure: исправлено формирование конечного URL из объекта endpoint #62850 (Daniel Pozo Escalona).
  • Исправлен кодек GCD #62853 (Nikita Taranov).
  • Исправлен ключ LowCardinality(Nullable) в гиперпрямоугольнике #62866 (Amos Bird).
  • Исправлена функция fromUnixtimestamp в синтаксисе Joda для входных значений, выходящих за пределы диапазона UInt32 #62901 (KevinyhZou).
  • Отключено optimize_rewrite_aggregate_function_with_if для sum(Nullable) #62912 (Raúl Marín).
  • Исправлена обработка PREWHERE для StorageBuffer при различных типах столбцов в исходной таблице. #62916 (Nikolai Kochetov).
  • Исправлена некорректная обработка ошибки при создании директории ключей кэша для временных данных в кэше #62925 (Kseniia Sumarokova).
  • gRPC: исправлен сбой при установлении соединения с узлом-пиром по IPv6 #62978 (Konstantin Bogdanov).
  • Исправлена возможная ошибка CHECKSUM_DOESNT_MATCH (и другие) во время реплицированной загрузки данных #62987 (Azat Khuzhin).
  • Исправлена аварийная остановка с неперехваченным исключением при работе с временными данными в кэше #62998 (Kseniia Sumarokova).
  • Исправлено неявное приведение типов в оптимизации optimize_rewrite_aggregate_function_with_if #62999 (Raúl Marín).
  • Исправлена проблема с необработанным исключением в ~RestorerFromBackup #63040 (Vitaly Baranov).
  • Серверные константы больше не удаляются из ключа GROUP BY для вторичного запроса. #63047 (Nikolai Kochetov).
  • Исправлено некорректное определение монотонности функции abs #63097 (Duc Canh Le).
  • Задано имя сервера для SSL-рукопожатия в движке MongoDB #63122 (Alexander Gololobov).
  • Использовать заданную пользователем базу данных вместо "config" при проверке версии сетевого протокола MongoDB #63126 (Alexander Gololobov).

Выпуск ClickHouse 24.3 LTS, 2024-03-27. Презентация, видео

Примечания по обновлению

  • Настройка allow_experimental_analyzer включена по умолчанию и переключает анализ запросов на новую реализацию, которая обладает лучшей совместимостью и более полной поддержкой возможностей. Возможность «analyzer» считается beta, а не experimental. Вы можете вернуть прежнее поведение, задав параметру compatibility значение 24.2 или отключив настройку allow_experimental_analyzer. Посмотрите видео на YouTube.
  • ClickHouse допускает произвольные бинарные данные в типе данных String, который обычно используется для UTF-8. Строки типа String в форматах Parquet/ORC/Arrow поддерживают только UTF-8. Поэтому вы можете выбрать, какой тип данных Arrow использовать для типа данных ClickHouse String — String или Binary. Это контролируется настройками output_format_parquet_string_as_string, output_format_orc_string_as_string, output_format_arrow_string_as_string. Хотя Binary был бы более корректным и совместимым вариантом, использование String по умолчанию в большинстве случаев будет соответствовать ожиданиям пользователей. Parquet/ORC/Arrow поддерживают множество методов сжатия, включая lz4 и zstd. ClickHouse поддерживает каждый из этих методов сжатия. Некоторые менее совершенные инструменты не поддерживают более быстрый метод сжатия lz4, поэтому по умолчанию мы устанавливаем zstd. Это контролируется настройками output_format_parquet_compression_method, output_format_orc_compression_method и output_format_arrow_compression_method. Мы изменили значение по умолчанию на zstd для Parquet и ORC, но не для Arrow (так как он используется преимущественно в низкоуровневых сценариях). #61817 (Alexey Milovidov).
  • В новой версии ClickHouse функции geoDistance, greatCircleDistance и greatCircleAngle будут использовать 64-битный числовой тип с плавающей запятой двойной точности для внутренних вычислений и в качестве типа возвращаемого значения, если все аргументы имеют тип Float64. Это закрывает #58476. В предыдущих версиях функция всегда использовала Float32. Вы можете переключиться на прежнее поведение, установив параметр geo_distance_returns_float64_on_float64_arguments в значение false или параметр compatibility в 24.2 или более раннее значение. #61848 (Alexey Milovidov). Совместно с Geet Patel.
  • Устаревшие части данных в памяти были признаны устаревшими, начиная с версии 23.5, а их поддержка прекращена с версии 23.10. Теперь оставшийся код удалён. Продолжение #55186 и #45409. Маловероятно, что вы использовали части данных в памяти, поскольку они были доступны только до версии 23.5 и только при их явном включении через указание соответствующих SETTINGS для таблицы MergeTree. Чтобы проверить, есть ли у вас части данных в памяти, выполните следующий запрос: SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type. Чтобы отключить использование частей данных в памяти, выполните ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT. Перед обновлением со старых релизов ClickHouse сначала убедитесь, что у вас нет частей данных в памяти. Если есть части данных в памяти, сначала отключите их, затем дождитесь, пока не останется ни одной такой части данных в памяти, и продолжайте обновление. #61127 (Alexey Milovidov).
  • Изменено имя столбца с duration_ms на duration_microseconds в таблице system.zookeeper, чтобы отразить тот факт, что длительность измеряется с микросекундной точностью. #60774 (Duc Canh Le).
  • Отклонять входящие запросы INSERT, если настройки уровня запроса async_insert и deduplicate_blocks_in_dependent_materialized_views включены одновременно. Это поведение контролируется настройкой throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert и по умолчанию включена. Это продолжение https://github.com/ClickHouse/ClickHouse/pull/59699, необходимое, чтобы разблокировать https://github.com/ClickHouse/ClickHouse/pull/59915. #60888 (Nikita Mikhaylov).
  • Утилита clickhouse-copier перенесена в отдельный репозиторий на GitHub: https://github.com/ClickHouse/copier. Она больше не входит в поставку, но по-прежнему доступна для отдельного скачивания. Тем самым закрывается задача: #60734 Тем самым закрывается задача: #60540 Тем самым закрывается задача: #60250 Тем самым закрывается задача: #52917 Тем самым закрывается задача: #51140 Тем самым закрывается задача: #47517 Тем самым закрывается задача: #47189 Тем самым закрывается задача: #46598 Тем самым закрывается задача: #40257 Тем самым закрывается задача: #36504 Тем самым закрывается задача: #35485 Тем самым закрывается задача: #33702 Тем самым закрывается задача: #26702.
  • Для повышения совместимости с MySQL алиас функции locate, совместимый с MySQL, теперь по умолчанию принимает аргументы в порядке (needle, haystack[, start_pos]). Предыдущее поведение (haystack, needle[, start_pos]) можно вернуть, установив настройку function_locate_has_mysql_compatible_argument_order = 0. #61092 (Robert Schulze).
  • По умолчанию запрещено использование SimpleAggregateFunction в ORDER BY таблиц MergeTree (как и AggregateFunction; они запрещены, потому что их значения не сравнимы). Используйте allow_suspicious_primary_key, чтобы разрешить их. #61399 (Azat Khuzhin).
  • Движок базы данных Ordinary объявлен устаревшим. В clickhouse-client вы получите предупреждение, если ваш сервер его использует. Это закрывает #52229. #56942 (shabroo).

New Feature

  • Поддержка чтения и записи резервных копий в формате tar (в дополнение к zip). #59535 (josh-hildred).
  • Реализована поддержка бакетов S3 Express. #59965 (Nikita Taranov).
  • Возможность прикреплять части с другого диска (с использованием копирования вместо жёстких ссылок). #60112 (Unalian).
  • Ограниченные по размеру таблицы Memory: управляются настройками min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep и max_rows_to_keep. #60612 (Jake Bamrah).
  • Раздельные лимиты на количество ожидающих и выполняющихся запросов. Добавлена новая серверная настройка max_waiting_queries, которая ограничивает число запросов, ожидающих из-за async_load_databases. Существующие лимиты на число выполняющихся запросов больше не учитывают ожидающие запросы. #61053 (Sergei Trifonov).
  • Добавлена таблица system.keywords, которая содержит все ключевые слова из парсера. В основном необходима и будет использоваться для улучшенного фаззинга и подсветки синтаксиса. #51808 (Nikita Mikhaylov).
  • Добавлена поддержка ATTACH PARTITION ALL. #61107 (Kirill Nikiforov).
  • Добавлена новая функция getClientHTTPHeader. Это закрывает задачу #54665. Соавтор — @lingtaolf. #61820 (Alexey Milovidov).
  • Добавлена generate_series как табличная функция (псевдоним совместимости с PostgreSQL для существующей функции numbers). Эта функция генерирует таблицу с арифметической прогрессией натуральных чисел. #59390 (divanik).
  • Добавлен режим работы topK/topkWeighed, который возвращает количество значений и оценку погрешности. #54508 (UnamedRus).
  • Добавлена функция toMillisecond, которая возвращает компоненту миллисекунд для значений типа DateTime или DateTime64. #60281 (Shaun Struwig).
  • Добавлена возможность настраивать обработчики HTTP‑редиректов для clickhouse-server. Например, можно сделать так, чтобы / перенаправлял на Play UI. #60390 (Alexey Milovidov).

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

  • Оптимизирована функция dotProduct для исключения ненужных и дорогостоящих операций копирования памяти. #60928 (Robert Schulze).
  • Вывод 256-битных целых чисел стал в 30 раз быстрее. #61100 (Raúl Marín).
  • Если первичный ключ таблицы содержит в основном бесполезные столбцы, не храните их в памяти. Это контролируется новой настройкой primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns со значением 0.9 по умолчанию, что означает: для составного первичного ключа, если столбец меняет своё значение как минимум в 90% случаев, последующие за ним столбцы не будут загружаться в память. #60255 (Alexey Milovidov).
  • Повышена производительность сериализованных методов агрегирования при работе с несколькими столбцами типа Nullable. #55809 (Amos Bird).
  • Ленивое формирование вывода JSON для повышения производительности операции ALL JOIN. #58278 (LiuNeng).
  • Подключения HTTP/HTTPS к внешним сервисам, таким как AWS S3, теперь повторно используются для всех вариантов использования — даже если ответ имеет код состояния 3xx или 4xx. #58845 (Sema Checherinda).
  • Внесены улучшения в агрегатные функции argMin / argMax / any / anyLast / anyHeavy, а также в запросы ORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1. #58640 (Raúl Marín).
  • Простая оптимизация фильтрации по столбцу. В некоторых случаях пиковое потребление памяти можно снизить до 44 % от исходного значения. #59698 (李扬).
  • Выполнять функцию multiIf столбцовым образом, когда базовый тип результата — числовой. #60384 (李扬).
  • Более быстрые мьютексы (почти в 2 раза). #60823 (Azat Khuzhin).
  • Параллельное освобождение нескольких подключений при завершении распределённого запроса. #60845 (lizhuoyu5).
  • Оптимизировано перемещение данных между столбцами числового и строкового типов Nullable, что улучшает результаты некоторых микробенчмарков. #60846 (李扬).
  • Операции с кэшем файловой системы будут меньше подвержены конкуренции за блокировки. #61066 (Alexey Milovidov).
  • Оптимизированы операции ARRAY JOIN и другие JOIN за счёт предотвращения некорректной оптимизации со стороны компилятора. Закрыт #61074. #61075 (李扬).
  • Если запрос с синтаксической ошибкой содержал сопоставитель COLUMNS с регулярным выражением, регулярное выражение компилировалось каждый раз во время бэктрекинга парсера вместо однократной компиляции. Это была фундаментальная ошибка. Скомпилированное регулярное выражение помещалось в AST. Но буква A в AST означает «abstract» («абстрактное»), что подразумевает, что он не должен содержать тяжеловесных объектов. Части AST могут создаваться и уничтожаться в процессе парсинга, включая большое количество бэктрекинга. Это приводит к замедлению разбора и, как следствие, позволяет пользователю с правами только на чтение устроить DoS. Но основная проблема в том, что это мешает прогрессу фаззеров. #61543 (Alexey Milovidov).
  • Добавлен новый проход анализатора для оптимизации оператора IN в случае одного значения. #61564 (LiuNeng).
  • DNSResolver перемешивает набор разрешенных IP‑адресов, что необходимо для равномерного распределения нагрузки между несколькими эндпоинтами AWS S3. #60965 (Sema Checherinda).

Экспериментальная функциональность

  • Добавлена поддержка параллельного чтения для Azure Blob Storage. Это повышает производительность экспериментального объектного хранилища Azure. #61503 (SmitaRKulkarni).
  • Добавлен асинхронный WriteBuffer для Azure Blob Storage, аналогично S3. Это повышает производительность экспериментального объектного хранилища Azure. #59929 (SmitaRKulkarni).
  • Реализовано использование managed identity для операций ввода-вывода резервных копий при использовании Azure Blob Storage. Добавлена настройка, предотвращающая попытку ClickHouse создать несуществующий контейнер, что требует прав на уровне учетной записи хранилища. #61785 (Daniel Pozo Escalona).
  • Добавлена настройка parallel_replicas_allow_in_with_subquery = 1, которая разрешает использование подзапросов в IN при работе с параллельными репликами. #60950 (Nikolai Kochetov).
  • Изменение для репликации «zero-copy»: все блокировки zero-copy, относящиеся к таблице, должны быть сняты при удалении таблицы. Каталог, содержащий эти блокировки, также должен быть удален. #57575 (Sema Checherinda).

Улучшения

  • По умолчанию используется движок таблиц MergeTree. #60524 (Alexey Milovidov)
  • Теперь параметр output_format_pretty_row_numbers включен по умолчанию. Это улучшает удобство использования. #61791 (Alexey Milovidov).
  • В предыдущей версии некоторые числа в форматах Pretty выглядели недостаточно красиво. #61794 (Alexey Milovidov).
  • Длинное значение в Pretty-форматах не будет обрезано, если оно единственное в результирующем наборе, например в результате выполнения запроса SHOW CREATE TABLE. #61795 (Alexey Milovidov).
  • Подобно clickhouse-local, clickhouse-client будет принимать параметр --output-format как синоним параметра --format. Это закрывает #59848. #61797 (Alexey Milovidov).
  • Если stdout — терминал и формат вывода не задан, clickhouse-client и аналогичные инструменты по умолчанию будут использовать формат PrettyCompact, как и в интерактивном режиме. clickhouse-client и clickhouse-local будут единообразно обрабатывать аргументы командной строки, задающие форматы ввода и вывода. Это закрывает #61272. #61800 (Alexey Milovidov).
  • Группы цифр в форматах Pretty теперь отделяются подчёркиванием для лучшей читаемости. Это поведение управляется новым параметром output_format_pretty_highlight_digit_groups. #61802 (Alexey Milovidov).
  • Добавлена возможность переопределять начальные настройки оператора INSERT с помощью SYSTEM FLUSH DISTRIBUTED. #61832 (Azat Khuzhin).
  • По умолчанию включено профилирование процессоров (время выполнения, объём входящих и исходящих данных при сортировке, агрегации и т. п.). #61096 (Azat Khuzhin).
  • Добавлена поддержка файлов без расширения в базе данных Filesystem. #60795 (Kruglov Pavel).
  • Сделали все имена форматов регистронезависимыми — например, Tsv, TSV, tsv или даже rowbinary. #60420 (豪肥肥). Я буду признателен, если вы и дальше будете писать их правильно, например JSON 😇, а не Json 🤮, но мы не возражаем, если вы будете писать так, как вам удобнее.
  • Добавлен режим none_only_active для настройки distributed_ddl_output_mode. #60340 (Alexander Tokmakov).
  • В расширенной панели мониторинга немного улучшена цветовая схема многолинейных графиков. #60391 (Alexey Milovidov).
  • На панели Advanced элементы управления теперь всегда остаются видимыми при прокрутке страницы. Это позволяет добавить новый график, не прокручивая страницу вверх. #60692 (Alexey Milovidov).
  • При выполнении запроса MODIFY COLUMN для materialized view теперь проверяется структура внутренней таблицы, чтобы убедиться, что все столбцы существуют. #47427 (sunny).
  • Типы String и Enum можно использовать в одном и том же контексте, например в массивах, запросах UNION, условных выражениях. Это закрывает #60726. #60727 (Alexey Milovidov).
  • Разрешено объявлять Enum в структуре внешних данных для обработки запросов (это временная таблица, создаваемая на лету, которую вы можете передать в запрос). #57857 (Duc Canh Le).
  • Учитывать строки с легковесным удалением при выборе частей для слияния, чтобы более точно оценивать размер результирующей части на диске. #58223 (Zhuo Qiu).
  • Добавлены комментарии к столбцам в большем числе системных таблиц. Продолжение https://github.com/ClickHouse/ClickHouse/pull/58356. #59016 (Nikita Mikhaylov).
  • Теперь мы можем использовать виртуальные столбцы в PREWHERE. Это полезно для неконстантных виртуальных столбцов, таких как _part_offset. #59033 (Amos Bird). Улучшено общее удобство использования виртуальных столбцов. Теперь разрешено использовать виртуальные столбцы в PREWHERE (это полезно для неконстантных виртуальных столбцов, таких как _part_offset). Теперь встроенная документация для виртуальных столбцов доступна как комментарий столбца в запросе DESCRIBE при включённой настройке describe_include_virtual_columns. #60205 (Anton Popov).
  • Вместо использования фиксированного ключа объектное хранилище теперь генерирует ключ, определяющий возможность удаления объектов. #59495 (Sema Checherinda).
  • Разрешено использовать тип хранилища объектов "local" вместо "local_blob_storage". #60165 (Kseniia Sumarokova).
  • Параллельный сброс ожидающих блоков INSERT движка Distributed при выполнении DETACH/остановке сервера и SYSTEM FLUSH DISTRIBUTED (параллелизм будет работать только в том случае, если для таблицы используется многодисковая политика хранения (как и всё в движке Distributed сейчас)). #60225 (Azat Khuzhin).
  • Добавлена настройка для принудительного использования read-through-кэша при слияниях. #60308 (Kseniia Sumarokova).
  • Улучшение протокола совместимости с MySQL. В задаче #57598 описано отличающееся поведение при обработке транзакций: выполнение COMMIT/ROLLBACK при отсутствии активной транзакции приводило к ошибке, в отличие от поведения MySQL. #60338 (PapaToemmsn).
  • Функция substring получила новый псевдоним byteSlice. #60494 (Robert Schulze).
  • Переименована серверная настройка dns_cache_max_size в dns_cache_max_entries для устранения неоднозначности. #60500 (Kirill Nikiforov).
  • SHOW INDEX | INDEXES | INDICES | KEYS больше не сортирует по столбцам первичного ключа (что было неинтуитивно). #60514 (Robert Schulze).
  • Улучшение в Keeper: прерывать запуск, если обнаружен некорректный снапшот, чтобы избежать потери данных. #60537 (Antonio Andelic).
  • Обновлено tzdata до версии 2024a. #60768 (Raúl Marín).
  • Улучшения в Keeper: добавлена поддержка параметра leadership_expiry_ms в настройках Keeper. #60806 (Brokenice0415).
  • Всегда интерпретировать числа в экспоненциальной форме в JSON-форматах независимо от настройки input_format_try_infer_exponent_floats. Добавлена настройка input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects, которая позволяет использовать тип String для неоднозначных путей вместо генерации исключения при выводе типов для именованных Tuple из JSON-объектов. #60808 (Kruglov Pavel).
  • Добавлена поддержка синтаксиса START TRANSACTION, обычно используемого в MySQL, что решает проблему, описанную в обсуждении https://github.com/ClickHouse/ClickHouse/discussions/60865. #60886 (Zach Naimon).
  • Добавлен флаг для алгоритма merge join с полной сортировкой, позволяющий трактовать null как наибольшее или наименьшее значение. Это позволяет сделать поведение совместимым с другими SQL-системами, такими как Apache Spark. #60896 (loudongfeng).
  • Добавлена поддержка автоматического определения выходного формата по расширению файла в clickhouse-client и clickhouse-local. #61036 (豪肥肥).
  • Лимит памяти теперь обновляется во время выполнения при изменении значения cgroups в Linux. #61049 (Han Fei).
  • Добавлена функция toUInt128OrZero, которая по ошибке ранее была пропущена (ошибка связана с https://github.com/ClickHouse/ClickHouse/pull/945). Псевдонимы совместимости FROM_UNIXTIME и DATE_FORMAT (они не являются встроенными в ClickHouse и существуют только для совместимости с MySQL) сделаны нечувствительными к регистру, как и положено псевдонимам для совместимости с SQL. #61114 (Alexey Milovidov).
  • Улучшены проверки доступа: теперь можно отзывать права, полученные косвенно, даже если целевой пользователь не имеет соответствующих явных грантов. Пример: GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;. #61115 (pufit).
  • Исправлена функция has() для столбца типа Nullable (устраняет #60214). #61249 (Mikhail Koviazin).
  • Теперь можно указывать атрибут merge="true" в подстановках конфигурации для поддеревьев <include from_zk="/path" merge="true">. Если этот атрибут задан, ClickHouse будет объединять поддерево с существующей конфигурацией, иначе поведение по умолчанию — добавление нового содержимого к конфигурации. #61299 (alesapin).
  • Добавлены асинхронные метрики для отображений виртуальной памяти: VMMaxMapCount и VMNumMaps. Закрывает #60662. #61354 (Tuan Pham Anh).
  • Используйте настройку temporary_files_codec везде, где создаются временные данные, например при сортировке с использованием внешней памяти и GROUP BY с использованием внешней памяти. До этого она работала только в алгоритме JOIN partial_merge. #61456 (Maksim Kita).
  • Добавлена новая настройка max_parser_backtracks, которая позволяет ограничивать сложность разбора запросов. #61502 (Alexey Milovidov).
  • Меньше блокировок при динамическом изменении размера кэша файловой системы. #61524 (Kseniia Sumarokova).
  • Запрещён сегментированный режим очереди StorageS3, так как он будет реализован заново. #61537 (Kseniia Sumarokova).
  • Исправлена опечатка: use_leagcy_max_leveluse_legacy_max_level. #61545 (William Schoeffel).
  • Некоторые дублирующиеся записи в system.blob_storage_log были удалены. #61622 (YenchangChan).
  • Добавлена функция current_user в качестве псевдонима для совместимости с MySQL. #61770 (Yarik Briukhovetskyi).
  • Исправлены неконсистентные состояния агрегатных функций с плавающей точкой в смешанных кластерах x86-64 / ARM #60610 (Harry Lee).

Улучшение сборки/тестирования/упаковки

  • Профилировщик запросов в реальном времени теперь работает на AArch64. В предыдущих версиях он работал только если программа не выполняла системных вызовов. #60807 (Alexey Milovidov).
  • Версия ClickHouse добавлена в docker-метки. Закрывает #54224. #60949 (Nikolay Monkov).
  • Обновлён prqlc до 0.11.3. #60616 (Maximilian Roos).
  • Добавлен обобщённый фаззер текстов запросов в clickhouse-local. #61508 (Alexey Milovidov).

Исправление ошибки (некорректное поведение, заметное пользователям, в официальном стабильном релизе)

  • Исправлен параметр finished_mutations_to_keep=0 для MergeTree (поскольку согласно документации 0 означает сохранять всё) #60031 (Azat Khузин).
  • Была проблема с оптимизацией FINAL; автор описывает её так: «PartsSplitter invalid ranges for the same part». #60041 (Maksim Kita).
  • В Apache Hive, который является экспериментальным и не поддерживается, были проблемы. #60262 (shanfengp).
  • Улучшение для экспериментальных параллельных реплик: принудительно выполнять повторный анализ при изменении параллельных реплик #60362 (Raúl Marín).
  • Исправлено использование типа метаданных plain metadata с новой опцией настройки дисков #60396 (Kseniia Sumarokova).
  • Попытка исправить логическую ошибку 'Cannot capture column because it has incompatible type' в функции mapContainsKeyLike #60451 (Kruglov Pavel).
  • Избегается вычисление скалярных подзапросов при CREATE TABLE. #60464 (Nikolai Kochetov).
  • Исправлена взаимная блокировка при параллельном парсинге, когда из‑за ошибок пропускается много строк #60516 (Kruglov Pavel).
  • Некорректно работала экспериментальная поддержка KQL (Kusto): исправлен параметр max_query_size_for_kql_compound_operator: #60534 (Yong Wang).
  • Исправление в Keeper: добавлены таймауты при ожидании commit-логов #60544 (Antonio Andelic).
  • Не выводить числовые подсказки для типов Date #60577 (Raúl Marín).
  • Исправлена проблема чтения из MergeTree с недетерминированными функциями в фильтре #60586 (Kruglov Pavel).
  • Исправлена логическая ошибка при некорректном типе значения настройки совместимости #60596 (Kruglov Pavel).
  • fix(prql): Надёжный обработчик паники #60615 (Maximilian Roos).
  • Исправлена работа функции intDiv для аргументов типов Decimal и Date #60672 (Yarik Briukhovetskyi).
  • Исправление: разворачивать CTE в запросе ALTER ... MODIFY #60682 (Yakov Olkhovskiy).
  • Исправлена таблица system.parts для не-Atomic/Ordinary движков баз данных (например, Memory) #60689 (Azat Khuzhin).
  • Исправлена ошибка "Invalid storage definition in metadata file", возникавшая для параметризованных представлений #60708 (Azat Khuzhin).
  • Исправлено переполнение буфера в CompressionCodecMultiple #60731 (Alexey Milovidov).
  • Удалён мусор из SQL/JSON #60738 (Alexey Milovidov).
  • Удалена некорректная проверка assert в агрегатной функции quantileGK #60740 (李扬).
  • Исправлена ошибка insert-select + insert_deduplication_token за счёт установки числа потоков равным 1 #60745 (Jordi Villar).
  • Запрещена установка пользовательских заголовков метаданных для неподдерживаемых операций multipart-загрузки #60748 (Francisco J. Jurado Moreno).
  • Исправлена функция toStartOfInterval #60763 (Andrey Zvonov).
  • Исправлена ошибка, приводившая к сбою в arrayEnumerateRanked #60764 (Raúl Marín).
  • Исправлена ошибка, приводившая к аварийному завершению при использовании input() в INSERT SELECT JOIN #60765 (Kruglov Pavel).
  • Исправлен сбой при использовании разных значений настройки allow_experimental_analyzer в подзапросах #60770 (Dmitry Novik).
  • Удалена рекурсия при чтении из S3 #60849 (Antonio Andelic).
  • Исправлена возможная ситуация зависания при ошибке в HashedDictionaryParallelLoader #60926 (vdimir).
  • Исправлена работа асинхронного RESTORE с базой данных Replicated (экспериментальная функция) #60934 (Antonio Andelic).
  • Исправлен дедлок при асинхронных вставках в таблицы типа Log через нативный протокол #61055 (Anton Popov).
  • Исправлено отложенное вычисление значения по умолчанию в dictGetOrDefault для RangeHashedDictionary #61196 (Kruglov Pavel).
  • Исправлены несколько ошибок в groupArraySorted #61203 (Raúl Marín).
  • Исправлено переконфигурирование Keeper для отдельного бинарника #61233 (Antonio Andelic).
  • Исправлена работа с session_token в движке S3 #61234 (Kruglov Pavel).
  • Исправлен возможный некорректный результат агрегатной функции uniqExact #61257 (Anton Popov).
  • Исправлены ошибки в команде SHOW DATABASE #61269 (Raúl Marín).
  • Исправлена логическая ошибка в хранилище RabbitMQ при использовании MATERIALIZED столбцов #61320 (vdimir).
  • Исправлена команда CREATE OR REPLACE DICTIONARY #61356 (Vitaly Baranov).
  • Исправлена обработка запроса ATTACH с внешним ON CLUSTER #61365 (Nikolay Degterinsky).
  • Исправлена оптимизация последовательных Nullable-ключей #61393 (Anton Popov).
  • исправлена проблема с разбиением DAG действий #61458 (Raúl Marín).
  • Исправлена обработка завершения неуспешной операции RESTORE #61466 (Vitaly Baranov).
  • Параметр async_insert_use_adaptive_busy_timeout теперь корректно отключается при использовании настроек совместимости #61468 (Raúl Marín).
  • Разрешить постановку операций в очередь в пуле восстановления #61475 (Nikita Taranov).
  • Исправлена несогласованность при чтении таблицы system.parts по UUID. #61479 (Dan Wu).
  • Исправлена работа команды ALTER QUERY MODIFY SQL SECURITY #61480 (pufit).
  • Исправлен сбой в экспериментальной функции window view #61526 (Alexey Milovidov).
  • Исправлена ошибка в работе функции repeat с целыми числами нестандартных типов #61527 (Antonio Andelic).
  • Исправлен аргумент клиента -s #61530 (Mikhail f. Shiryaev).
  • Исправлен сбой при выполнении arrayPartialReverseSort #61539 (Raúl Marín).
  • Исправлен поиск в строке с константной позицией #61547 (Antonio Andelic).
  • Исправлена проблема, из-за которой функция addDays приводила к ошибке при использовании с DateTime64 #61561 (Shuai Li).
  • Запрещён тип аргумента LowCardinality для JSONExtract #61617 (Julia Kartseva).
  • Исправлено поведение system.part_log при асинхронной вставке с дедупликацией #61620 (Antonio Andelic).
  • Исправлено исключение Non-ready set в system.parts. #61666 (Nikolai Kochetov).
  • Исправлено поле actual_part_name для REPLACE_RANGE (Entry actual part isn't empty yet) #61675 (Alexander Tokmakov).
  • Исправлен отчёт санитайзера в multiSearchAllPositionsCaseInsensitiveUTF8 при обработке некорректного UTF-8 #61749 (pufit).
  • Исправлено сообщение о том, что фрейм RANGE не поддерживается для столбцов типа Nullable. #61766 (YuanLiu).

Релиз ClickHouse 24.2, 2024-02-29. Презентация, Видео

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

  • Проверять подозрительные/экспериментальные типы во вложенных типах. Ранее мы не проверяли такие типы (кроме JSON) во вложенных типах, таких как Array/Tuple/Map. #59385 (Kruglov Pavel).
  • Добавлена sanity check-проверка для количества потоков и размеров блоков. #60138 (Raúl Marín).
  • По умолчанию не выводить тип с плавающей запятой для чисел в экспоненциальной нотации. Добавлена настройка input_format_try_infer_exponent_floats, которая позволяет восстановить прежнее поведение (по умолчанию отключена). Закрывает #59476. #59500 (Kruglov Pavel).
  • Разрешить заключать операции ALTER в скобки. Генерацией скобок можно управлять с помощью настройки format_alter_operations_with_parentheses. По умолчанию в отформатированных запросах скобки выводятся, так как мы храним отформатированные операции ALTER в некоторых местах как метаданные (например, мутации). Новый синтаксис проясняет некоторые запросы, где операции ALTER заканчиваются списком. Например, ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c не может быть корректно разобран со старым синтаксисом. В новом синтаксисе запрос ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c) однозначен. Старые версии не могут прочитать новый синтаксис, поэтому использование нового синтаксиса может привести к проблемам, если новые и старые версии ClickHouse используются вместе в одном кластере. #59532 (János Benjamin Antal).
  • Исправлена проблема безопасности с materialized view, которая позволяла пользователю выполнять INSERT в таблицу без необходимых привилегий. Исправление проверяет, что пользователь имеет права на INSERT не только в materialized view, но и во все лежащие в её основе таблицы. Это означает, что некоторые запросы, которые работали ранее, теперь могут завершаться ошибкой Not enough privileges. Для решения этой проблемы в релизе добавлена новая возможность SQL security для представлений: https://clickhouse.com/docs/sql-reference/statements/create/view#sql_security. #54901 #60439 (pufit).

Новая возможность

  • Добавлен новый синтаксис, позволяющий указывать пользователя-определителя (definer user) для view/materialized view. Это позволяет выполнять SELECT/INSERT из представлений без явной выдачи прав на базовые таблицы. Таким образом, view инкапсулирует права доступа. #54901 #60439 (pufit).
  • Пробовать автоматически определять формат файла при выводе схемы, если он не указан, для движков file/s3/hdfs/url/azureBlobStorage. Закрывает #50576. #59092 (Kruglov Pavel).
  • Реализована автоматическая подстройка тайм-аутов асинхронных вставок. Введены следующие настройки: async_insert_poll_timeout_ms, async_insert_use_adaptive_busy_timeout, async_insert_busy_timeout_min_ms, async_insert_busy_timeout_max_ms, async_insert_busy_timeout_increase_rate, async_insert_busy_timeout_decrease_rate. #58486 (Julia Kartseva).
  • Добавлена возможность настройки квоты на максимальное количество последовательных неудачных попыток входа. #54737 (Alexey Gerasimchuck).
  • Новая агрегатная функция groupArrayIntersect. Продолжение задачи: #49862. #59598 (Yarik Briukhovetskyi).
  • Добавлена поддержка резервного копирования и восстановления для AzureBlobStorage. Решает #50747. #56988 (SmitaRKulkarni).
  • Теперь пользователь может указывать строку шаблона напрямую в запросе, используя format_schema_rows_template в качестве альтернативы format_template_row. Закрывает #31363. #59088 (Shaun Struwig).
  • Реализовано автоматическое преобразование таблиц различных типов семейства MergeTree на реплицированный движок. Создайте пустой файл convert_to_replicated в каталоге данных таблицы (/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/), и эта таблица будет автоматически преобразована при следующем запуске сервера. #57798 (Kirill).
  • Добавлен запрос ALTER TABLE table FORGET PARTITION partition, который удаляет узлы ZooKeeper, связанные с пустой партицией. #59507 (Sergei Trifonov). Эта возможность предназначена для опытных пользователей.
  • Добавлена поддержка файла учетных данных JWT для движка таблиц NATS. #59543 (Nickolaj Jepsen).
  • Добавлена таблица system.dns_cache, которая может быть полезна для отладки проблем с DNS. #59856 (Kirill Nikiforov).
  • Кодек LZ4HC теперь поддерживает новый уровень 2, который быстрее, чем прежний минимальный уровень 3, за счёт меньшего сжатия. В предыдущих версиях LZ4HC(2) и ниже трактовались так же, как LZ4HC(3). Автор: Cyan4973. #60090 (Alexey Milovidov).
  • Добавлена таблица system.dns_cache, которая может быть полезна для отладки проблем с DNS. Добавлена новая настройка сервера dns_cache_max_size. #60257 (Kirill Nikiforov).
  • Добавлена поддержка одноаргументной формы табличной функции merge в виде merge(['db_name', ] 'tables_regexp'). #60372 (豪肥肥).
  • Поддержка отрицательных позиционных аргументов. Закрывает #57736. #58292 (flynn).
  • Реализована поддержка указания набора разрешённых пользователей для определённых настроек S3 в конфигурации с использованием ключа user. #60144 (Antonio Andelic).
  • Добавлена табличная функция mergeTreeIndex. Она предоставляет доступ к содержимому файлов индексов и меток таблиц MergeTree и может использоваться для интроспекции. Синтаксис: mergeTreeIndex(database, table, [with_marks = true]), где database.table — это существующая таблица с движком MergeTree. #58140 (Anton Popov).

Экспериментальная функция

  • Добавлена функция seriesOutliersDetectTukey для обнаружения выбросов в данных рядов с использованием алгоритма Tukey's fences. #58632 (Bhavna Jindal). Имейте в виду, что поведение будет изменено в следующем патч-релизе.
  • Добавлена функция variantType, которая возвращает Enum с именем варианта типа для каждой строки. #59398 (Kruglov Pavel).
  • Добавлена поддержка LEFT JOIN, ALL INNER JOIN и простых подзапросов для параллельных реплик (только с analyzer). Новый параметр parallel_replicas_prefer_local_join выбирает локальное выполнение JOIN (по умолчанию) вместо GLOBAL JOIN. Все таблицы должны существовать на каждой реплике из cluster_for_parallel_replicas. Новые параметры min_external_table_block_size_rows и min_external_table_block_size_bytes используются для объединения небольших блоков, которые отправляются для временных таблиц (только с analyzer). #58916 (Nikolai Kochetov).
  • Разрешено параллельное создание таблиц в базе данных Replicated при добавлении или восстановлении новой реплики. #59277 (Konstantin Bogdanov).
  • Реализован оператор сравнения для значений Variant и корректная вставка значений типа Field в столбец Variant. По умолчанию запрещено создавать тип Variant с похожими вариантами типов (разрешено при включённом параметре allow_suspicious_variant_types). Закрывает #59996. Закрывает #59850. #60198 (Kruglov Pavel).
  • Отключён JOIN с параллельными репликами при использовании CTE (без analyzer). #59239 (Raúl Marín).

Улучшения производительности

  • Первичный ключ будет потреблять меньше памяти. #60049 (Alexey Milovidov).
  • Оптимизировано использование памяти для первичного ключа и некоторых других операций. #60050 (Alexey Milovidov).
  • Первичные ключи таблиц будут лениво загружаться в память при первом обращении. Это контролируется новой настройкой MergeTree primary_key_lazy_load, которая по умолчанию включена. Это дает несколько преимуществ: - первичный ключ не будет загружаться для таблиц, которые не используются; - если памяти недостаточно, исключение будет выброшено при первом использовании, а не при запуске сервера. Это дает несколько недостатков: - задержку на загрузку первичного ключа придется оплатить при выполнении первого запроса, а не до начала приема подключений; теоретически это может привести к проблеме thundering herd. Это закрывает #11188. #60093 (Alexey Milovidov).
  • Векторизованные функции вычисления расстояния, используемые при векторном поиске. #58866 (Robert Schulze).
  • Векторизованная функция dotProduct, предназначенная для векторного поиска. #60202 (Robert Schulze).
  • Добавлена поддержка короткого вычисления (short-circuit) для функции dictGetOrDefault. Закрывает #52098. #57767 (jsc0218).
  • Улучшение в Keeper: кэшировать только ограниченный объём логов в памяти, контролируемый параметрами latest_logs_cache_size_threshold и commit_logs_cache_size_threshold. #59460 (Antonio Andelic).
  • Улучшение Keeper: еще больше сокращен размер узла данных. #59592 (Antonio Andelic).
  • Продолжена оптимизация промахов предсказания ветвления в функции if для случая, когда тип результата — Float*/Decimal*/*Int*, развитие https://github.com/ClickHouse/ClickHouse/pull/57885. #59148 (李扬).
  • Оптимизирована функция if для входного типа Map, ускорение — до ~10 раз. #59413 (李扬).
  • Улучшена производительность типа Int8 за счёт использования строгого алиасинга (он уже применяется для UInt8 и всех остальных целочисленных типов). #59485 (Raúl Marín).
  • Оптимизирована производительность условных вычислений sum/avg для типов bigint и big decimal за счёт уменьшения числа промахов предсказателя ветвлений. #59504 (李扬).
  • Повышена производительность запросов SELECT при активных мутациях. #59531 (Azat Khuzhin).
  • Оптимизирована функция isNotNull с использованием AVX2. #59621 (李扬).
  • Повышена производительность ASOF JOIN для отсортированных или почти отсортированных данных. #59731 (Maksim Kita).
  • Предыдущее значение по умолчанию параметра async_insert_max_data_size, равное 1 МБ, оказалось слишком маленьким. Новое значение — 10 МиБ. #59536 (Nikita Mikhaylov).
  • Теперь при выполнении команды RESTORE для чтения метаданных таблиц из резервной копии используется несколько потоков. #60040 (Vitaly Baranov).
  • Теперь, если в StorageBuffer больше одного сегмента (num_layers > 1), фоновый сброс данных будет выполняться одновременно для всех сегментов в нескольких потоках. #60111 (alesapin).

Улучшения

  • Когда используется формат вывода Pretty и блок состоит из одного числового значения, превышающего один миллион, его удобочитаемое представление будет выведено в правой части таблицы. #60379 (rogeryk).
  • Добавлены настройки split_parts_ranges_into_intersecting_and_non_intersecting_final и split_intersecting_parts_ranges_into_layers_final. Эти настройки нужны, чтобы отключить оптимизации для запросов с FINAL и в первую очередь предназначены для отладки. #59705 (Maksim Kita). На самом деле не только для этого — они также могут снизить потребление памяти ценой снижения производительности.
  • Переименована настройка extract_kvp_max_pairs_per_row в extract_key_value_pairs_max_pairs_per_row. Проблема (необоснованное сокращение в имени настройки) была допущена в https://github.com/ClickHouse/ClickHouse/pull/43606. Исправлена документация для этой настройки. #59683 (Alexey Milovidov). #59960 (jsc0218).
  • Операция ALTER COLUMN MATERIALIZE для столбца с выражением DEFAULT или MATERIALIZED теперь строго соответствует семантике. #58023 (Duc Canh Le).
  • Реализована логика экспоненциального бэкоффа при ошибках мутаций. Это снижает загрузку CPU, потребление памяти и размер файлов журналов. #58036 (MikhailBurdukov).
  • Улучшен подсчёт события профилирования ProfileEvent InitialQuery. #58195 (Unalian).
  • Добавлена возможность задавать volume_priority в storage_configuration. #58533 (Andrey Zvonov).
  • Добавлена поддержка типа данных Date32 в кодеке T64. #58738 (Hongbin Ma).
  • Разрешены завершающие запятые в определениях типов с несколькими элементами. #59119 (Aleksandr Musorin).
  • Параметры движка таблиц Distributed теперь можно указывать в конфигурационном файле сервера (аналогично настройкам MergeTree), например: <distributed> <flush_on_detach>false</flush_on_detach> </distributed>. #59291 (Azat Khuzhin).
  • Повторять попытки при разрывах соединения и истечении срока действия сессий при чтении из system.zookeeper. Это полезно при чтении большого количества строк из таблицы system.zookeeper, особенно при наличии разрывов соединения, возникающих из‑за инъекции сбоев. #59388 (Alexander Gololobov).
  • Не интерпретировать числа с ведущими нулями как числа в восьмеричной системе счисления при input_format_values_interpret_expressions=0. #59403 (Joanna Hulboj).
  • При запуске и при каждом изменении файлов конфигурации ClickHouse обновляет жёсткие лимиты памяти своего общего трекера памяти. Эти лимиты вычисляются на основе различных серверных настроек и ограничений cgroups (в Linux). Ранее путь /sys/fs/cgroup/memory.max (для cgroups v2) был жёстко прописан в коде. В результате лимиты памяти cgroup v2, настроенные для вложенных групп (иерархий), например /sys/fs/cgroup/my/nested/group/memory.max, игнорировались. Теперь это исправлено. Поведение лимитов памяти v1 осталось без изменений. #59435 (Robert Schulze).
  • Добавлены новые события профилировщика для наблюдения за временем, затрачиваемым на вычисление PK/проекций/вторичных индексов при выполнении операций INSERT. #59436 (Nikita Taranov).
  • Добавлена возможность задать стартовую точку для S3Queue в режиме Ordered при создании с использованием настройки s3queue_last_processed_path. #59446 (Kseniia Sumarokova).
  • Комментарии к системным таблицам теперь также доступны в system.tables в clickhouse-local. #59493 (Nikita Mikhaylov).
  • Таблица system.zookeeper: раньше весь результат накапливался в памяти и возвращался одним большим фрагментом. Это изменение должно помочь снизить потребление памяти при чтении множества строк из system.zookeeper, позволить отображать промежуточный прогресс (сколько строк уже прочитано) и избежать таймаута соединения при большом объёме результата. #59545 (Alexander Gololobov).
  • Теперь дашборд корректно обрабатывает как сжатое, так и несжатое состояние фрагмента URL #hash (обратная совместимость). Продолжение #59124. #59548 (Amos Bird).
  • Обновлена Intel QPL (используется кодеком DEFLATE_QPL) с v1.3.1 до v1.4.0. Также исправлена ошибка в механизме тайм-аута опроса: в некоторых случаях тайм-аут работал некорректно, и при его наступлении IAA и CPU могли обрабатывать буфер одновременно. На данный момент мы предпочитаем дополнительно проверять, что статус кодека IAA не равен QPL_STS_BEING_PROCESSED, а затем переходить к программному (SW) кодеку. #59551 (jasperzhu).
  • Не отображать предупреждение о версии сервера в ClickHouse Cloud, так как ClickHouse Cloud автоматически выполняет обновления без простоя. #59657 (Alexey Milovidov).
  • После самораспаковки временный бинарный файл теперь перемещается, а не копируется. #59661 (Yakov Olkhovskiy).
  • Исправлена раскрутка стека на Apple macOS. Это исправление закрывает #53653. #59690 (Nikita Mikhaylov).
  • Проверять переполнение стека в парсерах, даже если пользователь неправильно настроил параметр max_parser_depth, установив его на слишком большое значение. Это закрывает #59622. #59697 (Alexey Milovidov). #60434
  • Унифицировано поведение именованных коллекций в хранилище Kafka, создаваемых с помощью XML и SQL. #59710 (Pervakov Grigorii).
  • Если merge_max_block_size_bytes слишком мал и таблицы содержат широкие строки (строки или кортежи), фоновые слияния могли попадать в бесконечный цикл. Это поведение исправлено. Продолжение к https://github.com/ClickHouse/ClickHouse/pull/59340. #59812 (Nikita Mikhaylov).
  • Разрешено использовать uuid в replica_path, если он явно указан в CREATE TABLE. #59908 (Azat Khuzhin).
  • Добавлен столбец metadata_version для таблиц типа ReplicatedMergeTree в системную таблицу system.tables. #59942 (Maksim Kita).
  • Улучшение в Keeper: в Prometheus теперь отправляются только метрики и события, относящиеся к Keeper. #59945 (Antonio Andelic).
  • Панель мониторинга будет отображать метрики для разных версий ClickHouse, даже если структура системных таблиц изменилась после обновления. #59967 (Alexey Milovidov).
  • Добавлена возможность загружать информацию о зонах доступности (AZ) из файла. #59976 (Konstantin Bogdanov).
  • Улучшение в Keeper: добавлены повторные попытки при сбоях для операций, связанных с дисками (Disk). #59980 (Antonio Andelic).
  • Добавлен новый параметр конфигурации backups.remove_backup_files_after_failure: <clickhouse> <backups> <remove_backup_files_after_failure>true</remove_backup_files_after_failure> </backups> </clickhouse>. #60002 (Vitaly Baranov).
  • Для операции копирования файла S3 в GCP добавлен резервный вариант — копирование в буфер на случай, если GCP возвращает Internal Error с HTTP-кодом ошибки GATEWAY_TIMEOUT. #60164 (Maksim Kita).
  • Реализовано раннее завершение вычислений в ULIDStringToDateTime. #60211 (Juan Madurga).
  • Добавлен столбец query_id в таблицы system.backups и system.backup_log. В столбец error добавлен стек-трейс ошибки. #60220 (Maksim Kita).
  • Подключения через порт MySQL теперь автоматически выполняются с настройкой prefer_column_name_to_alias = 1, чтобы обеспечить поддержку QuickSight «из коробки». Также настройки mysql_map_string_to_text_in_show_columns и mysql_map_fixed_string_to_text_in_show_columns теперь включены по умолчанию и, как и прежде, затрагивают только подключения MySQL. Это повышает совместимость с бóльшим количеством BI-инструментов. #60365 (Robert Schulze).
  • Исправлена гонка (race condition) в JavaScript-коде, приводившая к появлению дублирующихся графиков, накладывающихся друг на друга. #60392 (Alexey Milovidov).

Улучшения сборки/тестирования/пакетирования

  • Добавлены сборки и тесты со сбором покрытия и интроспекцией. Продолжение #56102. #58792 (Alexey Milovidov).
  • Обновлена цепочка инструментов Rust в corrosion-cmake, когда задана переменная цепочки инструментов кросс-компиляции CMake. #59309 (Aris Tritas).
  • Добавлен фаззинг для ASTLiterals. #59383 (Raúl Marín).
  • Если вы хотите запускать скрипты initdb каждый раз при старте контейнера ClickHouse, нужно установить переменную окружения CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS. #59808 (Alexander Nikolaev).
  • Удалена возможность отключать общие компоненты ClickHouse (такие как server/client/...), но сохранена для некоторых, которые требуют дополнительных библиотек (таких как ODBC или keeper). #59857 (Azat Khuzhin).
  • Query fuzzer теперь будет выполнять фаззинг SETTINGS внутри запросов. #60087 (Alexey Milovidov).
  • Добавлена поддержка сборки ClickHouse с использованием clang-19 (master). #60448 (Alexey Milovidov).

Исправление ошибки (некорректное поведение, заметное пользователю, в официальном стабильном релизе)

  • Исправлена ошибка "Non-ready set" в выражении TTL WHERE. #57430 (Nikolai Kochetov).
  • Исправлена ошибка в функции quantilesGK #58216 (李扬).
  • Исправлено некорректное поведение intDiv для аргументов типа Decimal #59243 (Yarik Briukhovetskyi).
  • Исправлена обработка функции translate при использовании входных данных типа FixedString #59356 (Raúl Marín).
  • Исправлен подсчёт дайджеста в Keeper #59439 (Antonio Andelic).
  • Исправлены стек-трейсы для бинарных файлов без отладочных символов #59444 (Azat Khuzhin).
  • Исправлен ASTAlterCommand::formatImpl при использовании настроек, задаваемых для отдельных столбцов... #59445 (János Benjamin Antal).
  • Исправлена обработка SELECT * FROM [...] ORDER BY ALL анализатором #59462 (zhongyuankai).
  • Исправлено возможное необработанное исключение при отмене распределённого запроса #59487 (Azat Khuzhin).
  • Привести MAX к тем же правилам обработки сложных типов, что и permutation #59498 (Raúl Marín).
  • Исправлен пограничный случай при передаче update_insert_deduplication_token_in_dependent_materialized_views #59544 (Jordi Villar).
  • Исправлен некорректный результат функций arrayElement и map на пустом значении #59594 (Raúl Marín).
  • Исправлена ошибка, приводившая к сбою функции topK при слиянии пустых состояний #59603 (Raúl Marín).
  • Исправлена работа distributed таблицы с постоянным ключом сегментации #59606 (Vitaly Baranov).
  • Исправлена ошибка в KQL, обнаруженная WingFuzz #59626 (Yong Wang).
  • Исправлена ошибка «Read beyond last offset» для AsynchronousBoundedReadBuffer #59630 (Vitaly Baranov).
  • Сохраняется псевдоним функции в RewriteSumFunctionWithSumAndCountVisitor #59658 (Raúl Marín).
  • Исправлено определение времени начала для неинициирующих запросов #59662 (Raúl Marín).
  • Добавлена проверка типов аргументов для пропускающего индекса minmax #59733 (Anton Popov).
  • Исправлены функции leftPad и rightPad при использовании аргумента типа FixedString #59739 (Raúl Marín).
  • Исправлена ошибка AST fuzzer в функции countMatches #59752 (Robert Schulze).
  • RabbitMQ: исправлена проблема, из-за которой сообщения не получали ни подтверждения (ack), ни отрицательного подтверждения (nack) #59775 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой StorageURL выполнял часть выполнения запроса в одном потоке #59833 (Michael Kolupaev).
  • S3Queue: исправлена проблема с неинициализированным значением #59897 (Kseniia Sumarokova).
  • Исправлен разбор выражений партиционирования, заключённых в скобки #59901 (János Benjamin Antal).
  • Исправлена ошибка, приводившая к аварийному завершению работы в формате JSONColumnsWithMetadata при работе по HTTP #59925 (Kruglov Pavel).
  • Не переписывать функцию sum в count в Analyzer, если возвращаемое значение отличается #59926 (Azat Khuzhin).
  • Исправлено падение при чтении из UniqExactSet #59928 (Maksim Kita).
  • Исправление ошибки с некорректным значением metadata_version в ReplicatedMergeTree #59946 (Maksim Kita).
  • Исправлена гонка данных в StorageDistributed #59987 (Nikita Taranov).
  • Docker: запускать init-скрипты, если опция включена, а не отключена #59991 (jktng).
  • Исправлен оператор INSERT в SQLite с одинарной кавычкой (путём экранирования одинарных кавычек кавычкой вместо обратной косой черты) #60015 (Azat Khuzhin).
  • Исправлены несколько логических ошибок в arrayFold #60022 (Raúl Marín).
  • Исправлена ошибка в optimize_uniq_to_count, из‑за которой удалялся псевдоним столбца #60026 (Raúl Marín).
  • Исправлено возможное возникновение исключения при удалении таблицы S3Queue #60036 (Kseniia Sumarokova).
  • Исправлено форматирование NOT при использовании с одиночными литералами #60042 (Raúl Marín).
  • Использовать max_query_size из контекста в DDLLogEntry вместо жёстко заданного значения 4096 #60083 (Kruglov Pavel).
  • Исправлено некорректное форматирование запросов, содержащих таблицу с именем table. Исправлено неверное форматирование запросов с UNION ALL, INTERSECT и EXCEPT, когда их структура была нелинейной. Это закрывает #52349. Исправлено неверное форматирование запросов SYSTEM, включая SYSTEM ... DROP FILESYSTEM CACHE, SYSTEM ... REFRESH/START/STOP/CANCEL/TEST VIEW, SYSTEM ENABLE/DISABLE FAILPOINT. Исправлено форматирование параметризованных DDL-запросов. Исправлено форматирование запроса DESCRIBE FILESYSTEM CACHE. Исправлено некорректное форматирование SET param_... (запроса, устанавливающего параметр). Исправлено некорректное форматирование запросов CREATE INDEX. Исправлено непоследовательное форматирование запросов CREATE USER и похожих. Исправлено непоследовательное форматирование CREATE SETTINGS PROFILE. Исправлено некорректное форматирование ALTER ... MODIFY REFRESH. Исправлено непоследовательное форматирование оконных функций, если смещения рамок задавались выражениями. Исправлено непоследовательное форматирование RESPECT NULLS и IGNORE NULLS, если они использовались после функции, реализующей оператор (например, plus). Исправлено идиотское форматирование SYSTEM SYNC REPLICA ... LIGHTWEIGHT FROM .... Исправлено непоследовательное форматирование некорректных запросов с GROUP BY GROUPING SETS ... WITH ROLLUP/CUBE/TOTALS. Исправлено непоследовательное форматирование GRANT CURRENT GRANTS. Исправлено непоследовательное форматирование CREATE TABLE (... COLLATE). Дополнительно исправлено некорректное форматирование EXPLAIN в подзапросах (#60102). Исправлено некорректное форматирование лямбда-функций (#60012). Добавлена проверка, чтобы в будущем подобные уродства было невозможно пропустить. #60095 (Alexey Milovidov).
  • Исправлено непоследовательное форматирование EXPLAIN в подзапросах #60102 (Alexey Milovidov).
  • Исправлена ошибка, приводившая к сбою cosineDistance с Nullable #60150 (Raúl Marín).
  • Разрешено приводить булевы значения в строковом представлении к булевому типу #60160 (Robert Schulze).
  • Исправлен журнал system.s3queue_log #60166 (Kseniia Sumarokova).
  • Исправлена ошибка в arrayReduce при nullable имени агрегатной функции #60188 (Raúl Marín).
  • Скрытие конфиденциальных данных в S3Queue #60233 (Kseniia Sumarokova).
  • Исправлены коды исключений HTTP. #60252 (Austin Kothig).
  • S3Queue: исправлена ошибка (также устранён нестабильный тест _storage_s3_queue/test.py::test_shards_distributed) #60282 (Kseniia Sumarokova).
  • Исправлены use-of-uninitialized-value и некорректные результаты в хеш-функциях для IPv6 #60359 (Kruglov Pavel).
  • Исправлена работа OptimizeDateOrDateTimeConverterWithPreimageVisitor с аргументами NULL #60453 (Raúl Marín).
  • Исправлена незначительная ошибка, из-за которой запросы к distributed таблицам, отправленные клиентами, использующими диалекты KQL или PRQL, не выполнялись на репликах. #59674. #60470 (Alexey Milovidov) #59674 (Austin Kothig).

Выпуск ClickHouse 24.1, 2024-01-30. Презентация, Видео

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

  • Настройка print_pretty_type_names теперь по умолчанию включена. Вы можете отключить её, чтобы сохранить старое поведение, или выполнить SET compatibility = '23.12'. #57726 (Alexey Milovidov).
  • Настройка MergeTree clean_deleted_rows объявлена устаревшей и больше ни на что не влияет. Ключевое слово CLEANUP для OPTIMIZE по умолчанию не разрешено (если только не включена настройка allow_experimental_replacing_merge_with_cleanup). #58316 (Alexander Tokmakov).
  • Функция reverseDNSQuery больше недоступна. Это закрывает #58368. #58369 (Alexey Milovidov).
  • Включены различные изменения для улучшения управления доступом в конфигурационном файле. Эти изменения влияют на поведение, и вам следует проверить config.xml в разделе access_control_improvements. Если вы не уверены, оставьте значения в конфигурационном файле такими же, как в предыдущей версии. #58584 (Alexey Milovidov).
  • Улучшена работа sumMapFiltered со значениями NaN. Значения NaN теперь помещаются в конец (вместо случайного порядка) и считаются отличными от любых других значений. -0 теперь также считается равным 0; так как нулевые значения отбрасываются, значения -0 также отбрасываются. #58959 (Raúl Marín).
  • Функция visibleWidth теперь ведёт себя в соответствии с документацией. В предыдущих версиях она просто считала кодовые точки после сериализации строки, как функция lengthUTF8, но не учитывала символы нулевой и комбинируемой ширины, полноширинные символы, табуляции и символы удаления. Теперь поведение изменено соответствующим образом. Если вы хотите сохранить старое поведение, установите function_visible_width_behavior в 0 или задайте compatibility равным 23.12 или ниже. #59022 (Alexey Milovidov).
  • Диалект Kusto отключён до тех пор, пока не будут исправлены следующие две ошибки: #59037 и #59036. #59305 (Alexey Milovidov). Любая попытка использовать Kusto приведёт к исключению.
  • Более эффективная реализация модификатора FINAL больше не гарантирует сохранение порядка даже при max_threads = 1. Если вы рассчитывали на предыдущее поведение, установите enable_vertical_final в 0 или compatibility в 23.12.

Новая возможность

  • Добавлен тип данных Variant, представляющий собой объединение (union) других типов данных. Тип Variant(T1, T2, ..., TN) означает, что каждая строка такого типа может содержать значение либо типа T1, либо T2, ... либо TN, либо не содержать ни одного из них (значение NULL). Тип Variant доступен при включённой настройке allow_experimental_variant_type. Ссылка: #54864. #58047 (Kruglov Pavel).
  • Некоторые настройки (в настоящее время min_compress_block_size и max_compress_block_size) теперь могут задаваться на уровне столбца; в этом случае они имеют приоритет над соответствующей настройкой на уровне таблицы. Пример: CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();. #55201 (Duc Canh Le).
  • Добавлена агрегатная функция quantileDD, а также соответствующие функции quantilesDD и medianDD. Она основана на алгоритме DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf. ### Запись в документации об изменениях, видимых пользователям. #56342 (Srikanth Chekuri).
  • Позволяет настраивать любое объектное хранилище с любым типом метаданных. #58357 (Kseniia Sumarokova).
  • Добавлены режимы null_status_on_timeout_only_active и throw_only_active для distributed_ddl_output_mode, позволяющие не ждать неактивные реплики. #58350 (Alexander Tokmakov).
  • Добавлена функция arrayShingles для вычисления подмассивов фиксированной длины, например arrayShingles([1, 2, 3, 4, 5], 3) возвращает [[1,2,3],[2,3,4],[3,4,5]]. #58396 (Zheng Miao).
  • Добавлены функции punycodeEncode, punycodeDecode, idnaEncode и idnaDecode, которые полезны для преобразования международных доменных имён в ASCII‑представление в соответствии со стандартом IDNA. #58454 (Robert Schulze).
  • Добавлены функции вычисления схожести строк dramerauLevenshteinDistance, jaroSimilarity и jaroWinklerSimilarity. #58531 (Robert Schulze).
  • Добавлены два SETTING: output_format_compression_level для изменения уровня сжатия выходных данных и output_format_compression_zstd_window_log для явного указания размера окна сжатия и включения режима long-range для сжатия zstd, если метод сжатия вывода — zstd. Применяются для INTO OUTFILE и при записи в табличные функции file, url, hdfs, s3 и azureBlobStorage. #58539 (Duc Canh Le).
  • Автоматически отключать управляющие (escape) последовательности ANSI в форматах Pretty, если вывод не является терминалом. Добавлен новый режим auto для параметра output_format_pretty_color. #58614 (Shaun Struwig).
  • Добавлена функция sqidDecode для декодирования Sqids. #58544 (Robert Schulze).
  • Добавлена возможность считывать значения Bool как строки (String) во входных JSON-форматах. Это управляется настройкой input_format_json_read_bools_as_strings, которая включена по умолчанию. #58561 (Kruglov Pavel).
  • Добавлена функция seriesDecomposeSTL, которая разлагает временной ряд на сезонную, трендовую и остаточную составляющие. #57078 (Bhavna Jindal).
  • Добавлен MySQL Binlog Client для MaterializedMySQL: одно binlog-соединение для нескольких баз данных. #57323 (Val Doroshchuk).
  • Технология Intel QuickAssist (QAT) обеспечивает аппаратно-ускоренное сжатие и криптографию. В ClickHouse появился новый кодек сжатия ZSTD_QAT, который использует QAT для сжатия в формате zstd. Кодек использует Intel's QATlib и Intel's QAT ZSTD Plugin. В данный момент только сжатие может быть ускорено аппаратно (если QAT не удалось инициализировать, используется резервная программная реализация), декомпрессия всегда выполняется программно. #57509 (jasperzhu).
  • Реализован новый способ генерации ключей в объектном хранилище для дисков S3. Теперь формат может быть задан в терминах синтаксиса регулярных выражений re2 с помощью параметра key_template в описании диска. #57663 (Sema Checherinda).
  • Таблица system.dropped_tables_parts содержит части таблиц system.dropped_tables (удалённых, но ещё не физически удалённых). #58038 (Yakov Olkhovskiy).
  • Добавлена настройка max_materialized_views_size_for_table для ограничения числа materialized views, привязанных к таблице. #58068 (zhongyuankai).
  • Улучшения в clickhouse-format: поддержка запросов INSERT с VALUES; поддержка комментариев (используйте --comments для их вывода); поддержка опции --max_line_length для форматирования в несколько строк только длинных запросов. #58246 (vdimir).
  • Подключены все системные таблицы в clickhouse-local, включая system.parts. Это закрывает #58312. #58359 (Alexey Milovidov).
  • Добавлена поддержка типов данных Enum в функции transform. Исправляет #58241. #58360 (Alexey Milovidov).
  • Добавлена таблица system.database_engines. #58390 (Bharat Nallan). Добавлена возможность независимой регистрации движков баз данных в коде. #58365 (Bharat Nallan). Добавлена возможность независимой регистрации интерпретаторов. #58443 (Bharat Nallan).
  • Добавлен модификатор FROM <Replicas> для запроса SYSTEM SYNC REPLICA LIGHTWEIGHT. Модификатор FROM гарантирует, что мы ожидаем завершения операций fetch и drop-ranges только для указанных исходных реплик, а также для любых реплик, отсутствующих в ZooKeeper или с пустым source_replica. #58393 (Jayme Bird).
  • Добавлена настройка update_insert_deduplication_token_in_dependent_materialized_views. Эта настройка позволяет при вставке данных в зависимые materialized view обновлять токен дедупликации вставки, добавляя в него идентификатор таблицы. Закрывает #59165. #59238 (Maksim Kita).
  • Добавлен оператор SYSTEM RELOAD ASYNCHRONOUS METRICS, который обновляет асинхронные метрики. В основном используется при тестировании и разработке. #53710 (Robert Schulze).

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

  • Механизм координации для параллельных реплик переписан для повышения параллелизма и локальности кэша. Он протестирован и демонстрирует линейную масштабируемость на сотнях реплик. Также добавлена поддержка чтения в заданном порядке. #57968 (Nikita Taranov).
  • Заменена буферизация исходящих HTTP-запросов на встроенные буферы ClickHouse. Добавлены метрики подсчёта объёма байт для интерфейсов. #56064 (Yakov Olkhovskiy).
  • Крупные состояния агрегации функции uniqExact будут объединяться параллельно в распределённых запросах. #59009 (Nikita Taranov).
  • Снижено потребление памяти при чтении из таблиц MergeTree. #59290 (Anton Popov).
  • Снижен расход памяти при вертикальных слияниях. #59340 (Anton Popov).
  • Избегаем чрезмерного потребления памяти при запуске Keeper в большем числе случаев. #58455 (Antonio Andelic).
  • Улучшение Keeper: снижено потребление памяти при хранении узлов. #59002 (Antonio Andelic).
  • Более эффективная с точки зрения использования кэша финальная реализация. Замечание об изменении поведения: ранее запросы с модификатором FINAL, которые выполнялись в одном потоке (например, при max_threads = 1), возвращали отсортированный результат даже без явного указания оператора ORDER BY. Это больше не гарантируется, если enable_vertical_final = true (а по умолчанию он включён). #54366 (Duc Canh Le).
  • Исключено дополнительное копирование в ReadBufferFromIStream, который используется, например, при чтении из S3. #56961 (Nikita Taranov).
  • Оптимизирована функция arrayElement для входных данных типов Array(Map)/Array(Array(Num))/Array(Array(String))/Array(BigInt)/Array(Decimal). Предыдущие реализации выполняли больше выделений памяти, чем требовалось. Оптимизация ускоряет выполнение до ~6 раз, особенно когда типом входных данных является Array(Map). #56403 (李扬).
  • Однократно считывать столбец при чтении из него нескольких подстолбцов в компактных частях. #57631 (Kruglov Pavel).
  • Переписан AST для функции sum(column + constant). Используется как проход оптимизации в Analyzer #57853 (Jiebin Sun).
  • Теперь при вычислении функции match используются пропускающие индексы ngrambf_v1 и tokenbf_v1. #57882 (凌涛).
  • Теперь при вычислении функции match используются инвертированные индексы. #58284 (凌涛).
  • MergeTree FINAL теперь не сравнивает строки из одной и той же части, если она не уровня L0. #58142 (Duc Canh Le).
  • Ускорены вызовы функции iota (заполнение массива последовательными числами). #58271 (Raúl Marín).
  • Ускорена работа функций MIN/MAX для нечисловых типов. #58334 (Raúl Marín).
  • Оптимизирована комбинация фильтров (как в многошаговом PREWHERE) с использованием интринсиков BMI2/SSE #58800 (Zhiguo Zhou).
  • В clickhouse-local используется на один поток меньше. #58968 (Alexey Milovidov).
  • Улучшена производительность функции multiIf, если тип — Nullable. #57745 (KevinyhZou).
  • Добавлена команда SYSTEM JEMALLOC PURGE для очистки неиспользуемых страниц jemalloc, а также SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE для управления профилем jemalloc, если профилировщик включен. В Keeper добавлена связанная с jemalloc 4LW-команда: jmst для выгрузки статистики jemalloc, jmfp, jmep, jmdp для управления профилем jemalloc, если профилировщик включен. #58665 (Antonio Andelic).
  • Снижено потребление памяти при создании резервных копий в S3. #58962 (Vitaly Baranov).

Улучшения

  • Добавлены комментарии (краткие описания) ко всем столбцам системных таблиц. На это есть несколько причин: Мы активно используем системные таблицы, и иногда разработчику бывает очень трудно понять назначение и смысл конкретного столбца. Мы часто изменяем системные таблицы (добавляем новые или модифицируем существующие), и документация по ним часто оказывается неактуальной. Например, посмотрите на страницу документации для system.parts. В ней отсутствует множество столбцов. В перспективе мы хотели бы генерировать документацию непосредственно из ClickHouse. #58356 (Nikita Mikhaylov).
  • Разрешены запросы с подзапросами без алиасов для PASTE JOIN. #58654 (Yarik Briukhovetskyi).
  • Включена интеграция с MySQL/MariaDB на macOS. Это закрывает #21191. #46316 (Alexey Milovidov) (Robert Schulze).
  • По умолчанию отключена настройка max_rows_in_set_to_optimize_join. #56396 (vdimir).
  • Добавлен конфигурационный параметр <host_name>, который позволяет избежать необходимости разрешать имена хостов в запросах DDL с ON CLUSTER, а также в реплицируемых движках баз данных. Это снижает риск зависания очереди в случае изменения конфигурации кластера. Закрывает #57573. #57603 (Nikolay Degterinsky).
  • Увеличено значение настройки load_metadata_threads до 16 для кэша файловой системы. Это позволит серверу запускаться быстрее. #57732 (Alexey Milovidov).
  • Добавлена возможность ограничивать пропускную способность слияний/мутаций (max_mutations_bandwidth_for_server/max_merges_bandwidth_for_server). #57877 (Azat Khuzhin).
  • В системной таблице system.server_settings недокументированный логический столбец is_hot_reloadable заменён на столбец типа Enum8 changeable_without_restart с возможными значениями No, Yes, IncreaseOnly и DecreaseOnly. Также этот столбец задокументирован. #58029 (skyoct).
  • Обнаружение кластера теперь поддерживает указание имени пользователя и пароля; закрыта задача #58063. #58123 (vdimir).
  • Добавлена поддержка параметров запроса в ALTER TABLE ... PART. #58297 (Azat Khuzhin).
  • Создавать потребителей для таблиц Kafka на лету (но сохранять их в течение некоторого времени — kafka_consumers_pool_ttl_ms с момента последнего использования). Это должно исправить проблему со статистикой для system.kafka_consumers (для которой статистика не собирается, когда никто не читает из таблицы Kafka, что приводит к утечке оперативной памяти и медленному отсоединению таблицы). Кроме того, этот PR снова включает статистику для system.kafka_consumers по умолчанию. #58310 (Azat Khuzhin).
  • sparkBar в качестве алиаса для sparkbar. #58335 (凌涛).
  • Не отправляйте запросы ComposeObject после загрузки в GCS. #58343 (Azat Khuzhin).
  • Теперь корректно обрабатываются ключи с точкой в имени в XML-конфигурациях. #58354 (Azat Khuzhin).
  • Функция format теперь возвращает константу при константных аргументах. Это закрывает #58355. #58358 (Alexey Milovidov).
  • Добавлена настройка max_estimated_execution_time для раздельного управления max_execution_time и max_estimated_execution_time. #58402 (Zhang Yifan).
  • Выводить подсказку при указании некорректного имени движка базы данных. #58444 (Bharat Nallan).
  • Добавлены настройки для более точного управления типом индексов в словаре Arrow. По умолчанию для индексов используется знаковый целочисленный тип в соответствии с рекомендациями Arrow. Закрывает #57401. #58519 (Kruglov Pavel).
  • Добавлена #58575 поддержка переменной окружения CLICKHOUSE_PASSWORD_FILE при запуске образа Docker. #58583 (Eyal Halpern Shalev).
  • При выполнении некоторых запросов, которые требуют множества потоков для чтения данных, ранее выбрасывалась ошибка "Paste JOIN requires sorted tables only". Теперь в таком случае число потоков уменьшается до 1. #58608 (Yarik Briukhovetskyi).
  • Улучшено сообщение об ошибке INVALID_IDENTIFIER. #58703 (Yakov Olkhovskiy).
  • Улучшена обработка числовых литералов со знаком в normalizeQuery. #58710 (Salvatore Mesoraca).
  • Добавлена поддержка типа данных Point для MySQL. #58721 (Kseniia Sumarokova).
  • При сравнении столбца типа Float32 с константной строкой интерпретировать строку как Float32 (вместо Float64). #58724 (Raúl Marín).
  • Улучшена совместимость с S3, добавлена поддержка хранилища ECloud EOS. #58786 (xleoken).
  • Разрешена отмена резервных копий и восстановлений с помощью KILL QUERY. Этот PR также делает выполняющиеся резервные копии и восстановления видимыми в system.processes. Кроме того, в конфигурации сервера появилась новая настройка — shutdown_wait_backups_and_restores (по умолчанию=true), которая заставляет сервер при завершении работы либо дожидаться окончания всех выполняющихся резервных копий и восстановлений, либо просто отменять их. #58804 (Vitaly Baranov).
  • Формат Avro получил поддержку кодека ZSTD. Закрывает #58735. #58805 (flynn).
  • Интерфейс MySQL получил поддержку настроек net_write_timeout и net_read_timeout. net_write_timeout сопоставляется с родной настройкой ClickHouse send_timeout, а net_read_timeout — с receive_timeout. Исправлена проблема, из-за которой можно было задать настройку MySQL sql_select_limit только в том случае, если весь оператор был записан в верхнем регистре. #58835 (Serge Klochkov).
  • Улучшено сообщение об исключении при конфликте между словарём и таблицей с одинаковым именем. #58841 (Yarik Briukhovetskyi).
  • Убедитесь, что для пользовательских дисков (созданных с помощью SQL) в конфигурации сервера указано либо filesystem_caches_path (общий префикс каталога для всех файловых кэшей), либо custom_cached_disks_base_directory (общий префикс каталога только для файловых кэшей, создаваемых из пользовательских дисков). custom_cached_disks_base_directory имеет более высокий приоритет для пользовательских дисков по сравнению с filesystem_caches_path, который используется, если первое отсутствует. Путь параметра файлового кэша path должен находиться внутри этого каталога, в противном случае будет выброшено исключение, предотвращающее создание диска. Это не повлияет на диски, созданные в более старой версии, если сервер был обновлён, — в этом случае исключение выбрасываться не будет, чтобы сервер смог успешно запуститься. custom_cached_disks_base_directory добавлен в конфигурацию сервера по умолчанию как /var/lib/clickhouse/caches/. Закрывает #57825. #58869 (Kseniia Sumarokova).
  • Интерфейс MySQL получил поддержку запросов SHOW WARNINGS/SHOW COUNT(*) WARNINGS, хотя возвращаемый результат всегда представляет собой пустой набор. #58929 (Serge Klochkov).
  • Пропускать недоступные реплики при выполнении параллельного распределённого INSERT SELECT. #58931 (Alexander Tokmakov).
  • Отображать человекочитаемый уровень логирования при использовании структурированного формата логов в JSON. #58936 (Tim Liou).
  • Интерфейс MySQL получил поддержку команд CAST(x AS SIGNED) и CAST(x AS UNSIGNED) посредством алиасов типов данных: SIGNED для Int64 и UNSIGNED для UInt64. Это улучшает совместимость с BI‑инструментами, такими как Looker Studio. #58954 (Serge Klochkov).
  • Изменён рабочий каталог на каталог с данными в контейнере Docker. #58975 (cangyin).
  • Добавлен SETTING для Azure Blob Storage azure_max_unexpected_write_error_retries, который также можно задать в конфигурации в разделе azure. #59001 (SmitaRKulkarni).
  • Разрешить запуск сервера при повреждённой таблице в озере данных. Закрывает #58625. #59080 (Kseniia Sumarokova).
  • Позволяет игнорировать эволюцию схемы в движке таблицы Iceberg и читать все данные, используя либо схему, указанную пользователем при создании таблицы, либо последнюю схему, полученную из метаданных при создании таблицы. Это осуществляется с помощью настройки iceberg_engine_ignore_schema_evolution, которая по умолчанию отключена. Обратите внимание, что включение этой настройки может привести к некорректным результатам, так как при эволюции схемы все файлы данных будут читаться по одной и той же схеме. #59133 (Kruglov Pavel).
  • Запрещены изменяющие операции (INSERT/ALTER/OPTIMIZE/...) на хранилищах только для чтения и с однократной записью с выдачей корректной ошибки TABLE_IS_READ_ONLY (чтобы избежать остаточных данных). Исключено появление остаточных файлов на дисках с однократной записью (format_version.txt) при CREATE/ATTACH. Игнорируется DROP для ReplicatedMergeTree (как и для MergeTree). Исправлен обход s3_plain (MetadataStorageFromPlainObjectStorage::iterateDirectory). Примечание: диск только для чтения — это web, а диск с однократной записью — s3_plain. #59170 (Azat Khuzhin).
  • Исправлена ошибка в экспериментальном столбце _block_number, которая могла приводить к логической ошибке при сложной комбинации операций ALTER и merge. Исправляет #56202. Заменяет #58601. #59295 (alesapin).
  • Play UI теперь распознаёт, когда внутри JSON возвращается исключение. Корректировка для #52853. #59303 (Alexey Milovidov).
  • /binary HTTP-обработчик позволяет указать пользователя, хост и, при необходимости, пароль в строке запроса. #59311 (Alexey Milovidov).
  • Добавлена поддержка резервного копирования сжатых in-memory‑таблиц. Это закрывает #57893. #59315 (Alexey Milovidov).
  • Добавлена поддержка предложения FORMAT в запросах BACKUP и RESTORE. #59338 (Vitaly Baranov).
  • Функция concatWithSeparator теперь поддерживает аргументы произвольных типов (а не только аргументы типов String и FixedString). Например, SELECT concatWithSeparator('.', 'number', 1) теперь возвращает number.1. #59341 (Robert Schulze).

Улучшения сборки/тестирования/упаковки

  • Улучшены псевдонимы для исполняемого файла clickhouse (теперь ch/clickhouse — это clickhouse-local или clickhouse в зависимости от аргументов) и добавлено автодополнение в bash для новых псевдонимов. #58344 (Azat Khuzhin).
  • В CI добавлена проверка изменений настроек, чтобы удостовериться, что все изменения настроек отражены в истории изменений настроек. #58555 (Kruglov Pavel).
  • В stateful‑тестах используются таблицы, напрямую подключённые из S3. #58791 (Alexey Milovidov).
  • Теперь весь файл fuzzer.log архивируется вместо сохранения только последних 100 тыс. строк. Команда tail -n 100000 часто удаляет строки с определениями таблиц. Пример: #58821 (Dmitry Novik).
  • Включена поддержка Rust на macOS с Aarch64 (это добавляет нечеткий поиск в клиенте с помощью skim и язык PRQL, хотя я не думаю, что есть люди, которые запускают ClickHouse на darwin, так что в основном это, я бы сказал, ради нечеткого поиска в клиенте). #59272 (Azat Khuzhin).
  • Исправлена проблема агрегации в смешанных кластерах x86_64 и ARM. #59132 (Harry Lee).

Исправление ошибки (некорректное поведение в официальном стабильном релизе, заметное пользователю)

  • Добавлено преобразование ключей JOIN для вложенного типа LowCardinality #51550 (vdimir).
  • Разворачивать только собственно тип Nested при flatten_nested=1, а не все Array(Tuple) #56132 (Kruglov Pavel).
  • Исправлена ошибка с проекциями и настройкой aggregate_functions_null_for_empty при вставке данных. #56944 (Amos Bird).
  • Исправлено потенциальное исключение из-за устаревшего UUID профиля #57263 (Vasily Nemkov).
  • Исправлена обработка буферов чтения в StreamingFormatExecutor #57438 (Kruglov Pavel).
  • Игнорируются материализованные представления с удалённой целевой таблицей при передаче данных в представления #57520 (Kruglov Pavel).
  • Устранено возможное состояние гонки между ALTER_METADATA и MERGE_PARTS #57755 (Azat Khuzhin).
  • Исправлена ошибка порядка выражений в GROUP BY WITH ROLLUP #57786 (Chen768959).
  • A fix for the obsolete "zero-copy" replication feature: Устранена потеря блобов после удаления реплики с повреждёнными отсоединёнными частями #58333 (Alexander Tokmakov).
  • Разрешена работа пользователей с символическими ссылками в user_files_path #58447 (Duc Canh Le).
  • Исправлено аварийное завершение работы при отсутствии агрегирующей функции (agg) в таблице graphite #58453 (Duc Canh Le).
  • Отложено чтение из StorageKafka, чтобы обеспечить многократное чтение в materialized view #58477 (János Benjamin Antal).
  • Исправлен некорректный случай пересекающихся частей #58482 (Alexander Tokmakov).
  • MergeTreePrefetchedReadPool отключен в запросах, содержащих только LIMIT #58505 (Maksim Kita).
  • Разрешить работу обычных баз данных во время восстановления #58520 (Jihyuk Bok).
  • Исправлена обработка пула потоков Apache Hive при чтении ORC/Parquet/... #58537 (sunny).
  • Скрывать учётные данные в столбце base_backup_name таблицы system.backup_log #58550 (Daniel Pozo Escalona).
  • toStartOfInterval для округления значений в милли- и микросекундах #58557 (Yarik Briukhovetskyi).
  • Отключён max_joined_block_rows в ConcurrentHashJoin #58595 (vdimir).
  • Исправлена работа JOIN с использованием Nullable в старом анализаторе #58596 (vdimir).
  • makeDateTime64: Разрешён неконстантный аргумент для дробной части #58597 (Robert Schulze).
  • Исправлено возможное разыменование нулевого указателя при символизации встроенных кадров #58607 (Azat Khuzhin).
  • Улучшена изоляция записей кэша запросов при повторном создании пользователей или переключении ролей #58611 (Robert Schulze).
  • Исправлен ошибочный анализ ключа партиционирования при выполнении оптимизации PROJECTION #58638 (Amos Bird).
  • Кэш запросов: исправлена квота на пользователя #58731 (Robert Schulze).
  • Исправлено разбиение потока на партиции в параллельных оконных функциях #58739 (Dmitry Novik).
  • Исправлен двойной вызов destroy при выбросе исключения в addBatchLookupTable8 #58745 (Raúl Марин).
  • Не обрабатывать запросы в Keeper при завершении работы #58765 (Antonio Andelic).
  • Исправлено разыменование нулевого указателя в методе SlabsPolygonIndex::find #58771 (Yarik Briukhovetskyi).
  • Исправлена ошибка в функции JSONExtract для столбцов LowCardinality(Nullable) #58808 (vdimir).
  • Исправлено непредвиденное накопление потребления памяти при массовом создании и удалении большого количества таблиц с помощью CREATE и DROP. #58831 (Maksim Kita).
  • Поддержка чтения хранилища FileLog несколькими материализованными представлениями #58877 (János Benjamin Antal).
  • Добавлено ограничение для идентификатора ключа доступа S3. #58900 (MikhailBurdukov).
  • Исправлен потенциальный сбой в clickhouse-local при загрузке подсказок #58907 (Kruglov Pavel).
  • Исправлен сбой при использовании indexHint #58911 (Dmitry Novik).
  • Исправлена проблема, из-за которой StorageURL забывал заголовки при перезапуске сервера #58933 (Michael Kolupaev).
  • Analyzer: исправлена замена хранилища на блок вставки #58958 (Yakov Olkhovskiy).
  • Исправлено перемещение указателя (seek) в ReadBufferFromZipArchive #58966 (Michael Kolupaev).
  • Исправление для экспериментальных инвертированных индексов (не используйте в продакшене): операция DROP INDEX для инвертированного индекса теперь удаляет все соответствующие файлы из постоянного хранилища #59040 (mochi).
  • Устранена гонка данных в query_factories_info #59049 (Kseniia Sumarokova).
  • Отключён повторный запрос при ошибке «Слишком много перенаправлений» #59099 (skyoct).
  • Исправлена взаимоблокировка при завершении работы незапущенной базы данных #59137 (Sergei Trifonov).
  • Исправлена обработка LIMIT BY и LIMIT в распределённых запросах #59153 (Igor Nikonov).
  • Исправлено падение при использовании часового пояса типа Nullable в toString #59190 (Yarik Briukhovetskyi).
  • Исправлена ошибка, приводившая к аварийному завершению в метаданных Iceberg при некорректных путях к файлам #59275 (Kruglov Pavel).
  • Исправлено название архитектуры в операторе SELECT для целевой платформы Rust #59307 (p1rattttt).
  • Исправлена логическая ошибка, связанная с состоянием «not-ready set» при выполнении запроса к system.tables с подзапросом в предложении IN. #59351 (Nikolai Kochetov).

Журнал изменений за 2023 год

  • Содержание
  • Релиз ClickHouse 24.12 от 2024-12-19. Презентация, Видео
  • Релиз ClickHouse 24.11, 2024-11-26. Презентация, видео
  • Релиз ClickHouse 24.10 от 31.10.2024. Презентация, Видео
  • Релиз ClickHouse 24.9, 2024-09-26. Презентация, Видео
  • Релиз ClickHouse 24.8 LTS от 2024-08-20. Презентация, Видео
  • Релиз ClickHouse 24.7 от 2024-07-30. Презентация, видео
  • Релиз ClickHouse 24.6 от 2024-07-01. Презентация, видео
  • Релиз ClickHouse 24.5 от 2024-05-30. Презентация, Видео
  • Релиз ClickHouse 24.4 от 2024-04-30. Презентация, Видео
  • Выпуск ClickHouse 24.3 LTS, 2024-03-27. Презентация, видео
  • Релиз ClickHouse 24.2, 2024-02-29. Презентация, Видео
  • Выпуск ClickHouse 24.1, 2024-01-30. Презентация, Видео
  • Журнал изменений за 2023 год