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

Оглавление

Релиз 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. Чтобы сохранить прежнее поведение, установите значение true для настройки least_greatest_legacy_null_behavior (по умолчанию: false). #65519 #73344 (kevinyhzou).
  • Новая интеграция MongoDB теперь используется по умолчанию. Пользователи, которые хотят использовать устаревший драйвер MongoDB (на основе драйвера Poco), могут включить настройку сервера use_legacy_mongodb_integration. #73359 (Kirill Nikiforov.

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

  • Перевели типы JSON/Dynamic/Variant из экспериментальных возможностей в статус бета. #72294 (Pavel Kruglov). Мы также бэкпортировали все исправления и это изменение в 24.11.
  • Эволюция схемы в формате хранения данных Iceberg предоставляет пользователю широкие возможности для изменения схемы таблицы. Можно незаметно изменять порядок столбцов, имена столбцов и выполнять простые расширения типов. #69445 (Daniil Ivanik).
  • Интеграция с Iceberg REST Catalog: новый движок базы данных Iceberg, который подключает к ClickHouse весь каталог. #71542 (Kseniia Sumarokova).
  • Добавлен кэш для первичного индекса таблиц MergeTree (его можно включить с помощью настройки таблицы use_primary_key_cache). Если для первичного индекса включены ленивая загрузка и кэширование, он будет загружаться в кэш по требованию (аналогично mark 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 (площадь под кривой) для кривой 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).
  • Теперь при значении default у настройки join_algorithm будет использоваться алгоритм parallel_hash (если применимо). Две предыдущие альтернативы (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, когда индексируемый столбец приводится к LowCardinality(String) с помощью CAST, что может происходить при выполнении запроса к таблице 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).
  • Реализовано параллельное создание таблиц при восстановлении из резервной копии. До этого в команде RESTORE таблицы всегда создавались в одном потоке, что могло работать медленно в случае резервных копий с большим количеством таблиц. #72427 (Vitaly Baranov).
  • Очистка mark 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).
  • При построении плана для распределённого INSERT ... SELECT учитывается prefer_locahost_replica. #72190 (filimonov).
  • Azure нарушил спецификацию Iceberg, ошибочно обозначив Iceberg v1 как Iceberg v2. Проблема описана здесь. Azure Iceberg Writer создает файлы метаданных Iceberg (а также файлы manifest), нарушающие спецификацию. Теперь мы пытаемся читать метаданные формата Iceberg v1 с помощью средства чтения v2 (поскольку они записаны именно так), и добавили ошибку для случаев, когда в manifest file не созданы соответствующие поля. #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 = при выполнении стартовых скриптов произошла ошибка. Эта метрика нужна, чтобы понимать, успешно ли выполняются стартовые скрипты в облаке, особенно после релизов базовых конфигураций. #72637 (Miсhael Stetsyuk).
  • Добавлена новая метрика MergeTreeIndexGranularityInternalArraysTotalSize в system.metrics. Эта метрика нужна, чтобы находить инстансы с очень большими объёмами данных, подверженные высокому
  • Добавлены ретраи при создании реплицированной таблицы. #72682 (Vitaly Baranov).
  • В system.tables добавлен total_bytes_with_inactive для подсчёта общего числа байтов в неактивных частях. #72690 (Kai Zhu).
  • Добавлены настройки MergeTree в system.settings_changes. #72694 (Raúl Marín).
  • Добавлена поддержка JSON type в функции 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; они используются при разборе ответов API S3 во время создания резервной копии или восстановления. #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, из-за которой в результатах JOIN могли отсутствовать некоторые строки. #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 (Konstantin Bogdanov).
  • Исправлен сбой при синтаксическом разборе запросов BACKUP DATABASE db EXCEPT TABLES db.table. #72429 (Konstantin Bogdanov).
  • Запрещено создание пустого Variant. #72454 (Pavel Kruglov).
  • Исправлено некорректное форматирование result_part_path в system.merges. #72567 (Konstantin Bogdanov).
  • Исправлен разбор шаблона glob с одним элементом (например, {file}). #72572 (Konstantin Bogdanov).
  • Исправлена генерация запроса на ведомом сервере в случае распределённого запроса с ARRAY JOIN. Исправляет #69276. #72608 (Dmitry Novik).
  • Исправлена ошибка, из-за которой выражение DateTime64 IN DateTime64 не возвращало результата. #72640 (Yarik Briukhovetskyi).
  • Исправлена несогласованность метаданных при добавлении новой реплики в базу данных Replicated, содержащую таблицу, созданную с flatten_nested=0. #72685 (Alexander Tokmakov).
  • Исправлена расширенная конфигурация SSL для внутреннего взаимодействия Keeper. #72730 (Antonio Andelic).
  • Исправлена ошибка “No such key” в неупорядоченном режиме 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).
  • Проверка дублирующихся ключей JSON при разборе Tuple. Ранее это могло приводить к логической ошибке 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, что включает поддержку collations, преобразование кодировок и другие возможности локализации. #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 как глобальный переключатель для отключения всех экспериментальных и бета-функций. #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 для проверки того, выдан ли текущему пользователю/роли указанный 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 в памяти, чтобы снизить потребление памяти в семействе движков таблиц 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 в configuration, который позволяет 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) теперь имеют уникальный идентификатор в качестве суффикса. Это позволяет сопоставлять вывод Profiler для процессоров и трассы OpenTelemetry с выводом EXPLAIN. #63518 (qhsong).
  • Добавлена возможность проверять, существует ли объект после записи в Azure Blob Storage; это поведение управляется настройкой check_objects_after_upload. #64847 (Smita Kulkarni).
  • В clickhouse-local база данных Atomic теперь используется по умолчанию. Решены пункты 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).
  • В Advanced dashboard добавлены панели мониторинга для каждого хоста: Overview (host) и Cloud overview (host). #71422 (alesapin).
  • clickhouse-local по умолчанию использует неявный SELECT, что позволяет использовать его как калькулятор. Улучшена подсветка синтаксиса в режиме неявного SELECT. #71620 (Alexey Milovidov).
  • Приложения командной строки будут подсвечивать синтаксис даже для многооператорных запросов. #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 type: если текущий блок для JSON path содержит значения нескольких типов, система попытается выбрать наиболее подходящий тип, перебирая типы в специальном 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, если существует другая реплика с тем же zk path. #70642 (MikhailBurdukov).
  • Исправлены сбой и утечка памяти в AggregateFunctionGroupArraySorted. #70820 (Michael Kolupaev).
  • Добавлена возможность переопределять Content-Type заголовками, заданными пользователем, в движке 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 format при использовании 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).
  • Добавлено недостающее снятие экранирования в named collections. Без этого исправления clickhouse-server не может запуститься. #71308 (MikhailBurdukov).
  • Исправлены async inserts с пустыми блоками через собственный протокол. #71312 (Anton Popov).
  • Исправлено неконсистентное форматирование AST при выдаче некорректных привилегий с подстановочными знаками #71309. #71332 (pufit).
  • В деструкторы частей данных добавлен try/catch, чтобы избежать std::terminate. #71364 (alesapin).
  • Проверка подозрительных и экспериментальных типов в подсказках типов для JSON. #71369 (Pavel Kruglov).
  • Воркер-поток Memory теперь запускается и на ОС, отличных от Linux (исправляет #71051). #71384 (Alexandre Snarskii).
  • Исправлена ошибка «Invalid number of rows in Chunk» в столбце типа Variant. #71388 (Pavel Kruglov).
  • Исправлена ошибка «столбец “attgenerated” не существует» для старых версий 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 при 0 столбцах (старый анализатор). #71494 (Raúl Marín).
  • Исправлена ошибка выхода Date32 за допустимый диапазон, вызванная неинициализированными данными ORC. Подробнее см. https://github.com/apache/incubator-gluten/issues/7823. #71500 (李扬).
  • Исправлен подсчёт размера столбца в wide part для типов 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).
  • Не преобразовывать константное множество в предикатах для столбцов партиции в случае оператора 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-шаблона в URI S3 (например, 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).
  • Теперь в EXPLAIN AST, используемом внутри подзапроса, допускаются только запросы SELECT. Запросы других типов приводят к логической ошибке: ‘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 выводил в stderr сообщение “get_mempolicy: Operation not permitted” из-за ограничений на системные вызовы. #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, 2024-10-31. Презентация, Видео

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

  • Теперь можно указывать 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; с опцией --progress-table связана новая опция --enable-progress-table-toggle, которая включает и выключает отображение таблицы Прогресса по нажатию клавиши управления (Space). #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 готовы к использованию в production. #70550 (Michael Kolupaev). Теперь refreshable materialized views поддерживаются и в базах данных Replicated. #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 format. Для вывода используйте настройку output_format_native_write_json_as_string. Для ввода используйте версию сериализации 1 перед данными столбца. #70312 (Pavel Kruglov).
  • Представлен специальный (экспериментальный) режим селектора слияния для таблиц MergeTree, который делает его более агрессивным для партиций, близких к пределу по числу частей. Он управляется настройкой уровня MergeTree merge_selector_use_blurry_base. #70645 (Nikita Mikhaylov).
  • Реализована универсальная сериализация/десериализация между типами Union в Avro и Variant в ClickHouse. Исправляет #69713. #69712 (Jiří Kozlovský).

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

  • Выполнен рефакторинг IDisk и IObjectStorage для повышения производительности. Таблицы из Объектного хранилища plain и plain_rewritable будут инициализироваться быстрее. #68146 (Alexey Milovidov, Julia Kartseva). При определении существования файла или каталога на диске plain rewritable больше не вызывается API LIST Объектного хранилища, так как это может быть невыгодно по стоимости. #70852 (Julia Kartseva). Уменьшено количество запросов к API HEAD Объектного хранилища на диске plain_rewritable. #70915 (Julia Kartseva).
  • Добавлена возможность напрямую разбирать данные в разреженные столбцы. #69828 (Anton Popov).
  • Повышена производительность при разборе форматов с большим количеством отсутствующих значений (например, JSONEachRow). #69875 (Anton Popov).
  • Поддерживает параллельное чтение групп строк Parquet и предварительную загрузку групп строк в однопоточном режиме. #69862 (LiuNeng).
  • Добавлена поддержка minmax-индекса для pointInPolygon. #62085 (JackyWoo).
  • Используйте bloom-фильтры при чтении 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).
  • В функции replace теперь допускается пустая подстрока; поведение соответствует PostgreSQL. #69918 (zhanglistar).
  • Допускается пустая подстрока поиска в функциях replaceRegexp*. #70053 (zhanglistar).
  • В каталоге data/database_name/ для таблиц теперь создаются символические ссылки на фактические пути к данным таблицы — в зависимости от политики хранения — вместо каталога store/... на диске по умолчанию. #61777 (Kirill).
  • При парсинге поля Enum из JSON строка, содержащая целое число, будет интерпретирована как соответствующий элемент Enum. Это закрывает #65119. #66801 (scanhex12).
  • Разрешено использовать TRIM с пустой строкой в LEADING или TRAILING как no-op. Закрывает #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).
  • В таблицу system.replicas добавлен новый столбец readonly_duration. Это необходимо, чтобы в оповещениях можно было отличать реальные реплики в режиме только для чтения от sentinel-реплик. #69871 (Miсhael Stetsyuk).
  • Тип настройки join_output_by_rowlist_perkey_rows_threshold изменён на беззнаковое целое число. #69886 (kevinyhzou).
  • В логирование span OpenTelemetry добавлены настройки запроса. #70011 (sharathks118).
  • Добавлена диагностическая информация о функциях для работы с массивами высшего порядка на случай, если тип результата лямбда-выражения оказывается неожиданным. #70093 (ttanay).
  • Улучшение Keeper: меньше блокировок при изменении кластера. #70275 (Antonio Andelic).
  • В команду SHOW GRANTS добавлены ключевые слова WITH IMPLICIT и FINAL. Исправлена небольшая ошибка, связанная с неявными привилегиями: #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 page 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).
  • В system.part_log добавлены события MergeStart и MutateStart, что помогает анализировать и визуализировать слияния. #70850 (Alexey Milovidov).
  • Добавлено событие profile о количестве слитых исходных частей. Это позволяет отслеживать ветвление дерева слияний в production. #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 bounds. #69291 (Pavel Kruglov).
  • Экспериментальная zero-copy-репликация, которую не следует использовать в продакшене: исправлен бесконечный цикл после restore replica в ReplicatedMergeTree с zero-copy. #69293 (MikhailBurdukov).
  • Возвращено значение по умолчанию для processing_threads_num: теперь это число ядер CPU в хранилище S3Queue. #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).
  • Исправлена необратимая блокировка отправки из distributed таблицы, если операция DROP для distributed таблицы завершалась ошибкой. #69843 (Azat Khuzhin).
  • Исправлены запросы с предложением WITH FILL и ключами NaN, которые нельзя было отменить. Это закрывает #69261. #69845 (Alexey Milovidov).
  • Исправлено значение по умолчанию анализатора для старого значения совместимости. #69895 (Raúl Marín).
  • Не проверять зависимости при DROP старой таблицы во время CREATE OR REPLACE VIEW. Ранее запрос CREATE OR REPLACE завершался ошибкой, если у пересоздаваемого представления были зависимые таблицы. #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).
  • Исправлено состояние гонки в методе decompress у ColumnObject/ColumnTuple, которое могло приводить к обращению к памяти после её освобождения. #70137 (Pavel Kruglov).
  • Исправлено возможное зависание при ALTER COLUMN с типом Dynamic. #70144 (Pavel Kruglov).
  • Теперь ClickHouse будет считать большее число ошибок допускающими повторную попытку и не будет помечать части данных как повреждённые при таких ошибках. #70145 (alesapin).
  • Исправлено использование параметра max_types при создании типа Dynamic для подстолбца JSON. #70147 (Pavel Kruglov).
  • Исправлена проблема, из-за которой пароль отображался в system.query_log для пользователей с методом аутентификации bcrypt. #70148 (Nikolay Degterinsky).
  • Исправлен счётчик событий для native-интерфейса (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).
  • Исправлена возможная ошибка use-after-free в SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf. #70358 (Azat Khuzhin).
  • Исправлен сбой при GROUP BY по подстолбцу подобъекта JSON. #70374 (Pavel Kruglov).
  • Не выполнять предзагрузку частей для вертикальных слияний, если в части нет строк. #70452 (Antonio Andelic).
  • Исправлено падение при использовании лямбда-функций в WHERE. #70464 (Raúl Marín).
  • Исправлено создание таблиц с CREATE ... AS table_function(...) в базе данных Replicated, когда источник табличной функции недоступен на вторичной реплике. #70511 (Kseniia Sumarokova).
  • Игнорировать любой вывод для async insert с 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 для Distributed и параллельных реплик. #70880 (Nikita Taranov).

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

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

  • Выражения вида a[b].c теперь поддерживаются для именованных Tuple, как и именованный доступ к элементам произвольных выражений, например 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).
  • Добавлен аргумент scale (по умолчанию: true) для функции arrayAUC, позволяющий пропустить этап нормализации (задача #69609). #69717 (gabrielmcg44).

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

  • Добавлена настройка input_format_try_infer_variants, которая позволяет определять тип Variant при определении схемы для текстовых форматов, когда для элементов столбца/массива возможны несколько типов. #63798 (Shaun Struwig).
  • Добавлены агрегатные функции distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes для более удобной интроспекции содержимого типа столбца JSON. #68463 (Kruglov Pavel).
  • Новый алгоритм для определения единицы распределения меток между параллельными репликами с помощью консистентного хеширования. Для разных сценариев чтения выбирается разное количество меток, чтобы повысить производительность. #68424 (Nikita Taranov).
  • Ранее алгоритмическая сложность логики дедупликации частей при обработке объявлений от параллельных реплик составляла 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 partitioning. #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 (李扬).
  • Добавлено параллельное слияние для aggregate function uniq при агрегации по ключу group by, чтобы максимально задействовать CPU. #68441 (Jiebin Sun).
  • Добавлена настройка output_format_orc_dictionary_key_size_threshold, позволяющая включать словарное кодирование для строкового столбца в формате вывода ORC. Это помогает уменьшить размер выходного файла ORC и значительно повысить производительность чтения. #68591 (李扬).
  • Добавлен новый запрос Keeper RemoveRecursive, который удаляет узел вместе со всем его поддеревом. #69332 (Mikhail Artemenko).
  • Ускорена вставка в таблицу с индексом векторного сходства за счёт параллельного добавления данных в векторный индекс. #69493 (flynn).
  • Снижено использование памяти при вставках в JSON за счёт адаптивного размера буфера записи. Многие файлы, создаваемые JSON-столбцом в wide part, содержат мало данных, поэтому выделять для них буфер размером 1 МБ не имеет смысла. #69272 (Kruglov Pavel).
  • Исключён возврат потока в threadpool параллельного хеш-соединения, чтобы запрос не порождал избыточное количество потоков. #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_shell_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/1.1 вместо HTTP/1.0, который используется по умолчанию, для внешних HTTP-аутентификаторов. #68456 (Aleksei Filatov).
  • Добавлен новый набор метрик для диагностики пула потоков, позволяющий глубже понять его производительность и поведение. #68674 (filimonov).
  • Добавлена поддержка параметров запроса в async inserts с форматом 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 (Konstantin Bogdanov).
  • Запросы будут быстрее завершаться с ошибкой, если во время повторных попыток не удаётся установить новое соединение с Keeper. #69148 (Raúl Marín).
  • Обновлена Database Factory: теперь определяемые пользователем движки баз данных могут иметь аргументы, настройки и переопределения таблиц (как в 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 Backend. #69576 (李扬).
  • Добавлена поддержка более продвинутых параметров SSL для внутреннего взаимодействия Keeper (например, закрытых ключей с парольной фразой). #69582 (Antonio Andelic).
  • Анализ индексов может занимать ощутимое время на больших таблицах с множеством частей или партиций. Это изменение должно позволить останавливать ресурсоёмкий запрос на этом этапе. #69606 (Alexander Gololobov).
  • Маскирование чувствительной информации в табличной функции gcs. #69611 (Vitaly Baranov).
  • Перестроение проекции при слияниях, уменьшающих количество строк. #62364 (cangyin).

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

  • Исправлено подключение таблицы, если имя pg-БД содержит ”-”, в экспериментальном и неподдерживаемом движке 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 только если данные содержат информацию о возможности значения NULL. #68298 (Kruglov Pavel).
  • Исправляет #50868. Небольшие константные значения DateTime64, возвращаемые вложенным подзапросом внутри распределённого запроса, ошибочно преобразовывались в NULL, что приводило к ошибкам и потенциально некорректным результатам запроса. #68323 (Shankar).
  • Исправлено отсутствие режима sync replica в запросе SYSTEM SYNC REPLICA. #68326 (Duc Canh Le).
  • Исправлена ошибка в условии по ключу. #68354 (Han Fei).
  • Устранён сбой при удалении или переименовании роли, используемой во внешнем LDAP-каталоге пользователей. #68355 (Andrey Zvonov).
  • Исправлено значение столбца Прогресс в system.view_refreshes, если оно превышало 1 #68377. #68378 (megao).
  • Исправлена обработка флагов regexp. #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, из-за которых в 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).
  • Исправлена логическая ошибка, возникавшая при создании реплицированной MergeTree, изменении столбца и последующем выполнении 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 views при включенной настройке 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).
  • Исправлена логическая ошибка при пустой async insert. #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. Ранее при отправке запроса репликам в s3Cluster могло теряться выражение DEFAULT для столбца. #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).
  • После этой проблемы в production оказалось довольно много реплик таблиц, у которых значение узла metadata_version одновременно равно 0 и отличается от версии узла metadata соответствующей таблицы. Из-за этого на таких репликах запросы alter завершаются ошибкой. #69274 (Miсhael Stetsyuk).
  • Пометить тип Dynamic как небезопасный для использования в качестве первичного ключа, чтобы избежать проблем с Fields. #69311 (Kruglov Pavel).
  • Улучшено восстановление зависимостей объектов доступа. #69346 (Vitaly Baranov).
  • Исправлено неопределённое поведение, возникавшее, когда все попытки установить соединение для вставки завершались неудачей. #69390 (Pablo Marcos).
  • Закрывает #69135. Если попытаться повторно использовать данные JOIN для cross join, сейчас в ClickHouse это невозможно. Лучше оставить have_compressed в reuseJoinedData. #69404 (lgbo).
  • Функция materialize() теперь возвращает полный столбец, когда параметр — разреженный столбец. #69429 (Alexander Gololobov).
  • Исправлена ошибка LOGICAL_ERROR в функции sqidDecode (#69450). #69451 (Robert Schulze).
  • Быстрое исправление проблемы с s3queue в 24.6 или CREATE-запроса для базы данных Replicated. #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)”’. Из-за этого при чтении частей данных, созданных в старых выпусках CH (предположительно 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-запросы в многооператорных выражениях обрабатываются особым образом в зависимости от их предложения FORMAT: если FORMAT — VALUES (наиболее распространенный случай), конец оператора INSERT обозначается завершающей точкой с запятой ; в конце запроса. Для всех остальных форматов (например, CSV или JSONEachRow) конец оператора INSERT обозначается двумя символами новой строки \n\n в конце запроса. #63898 (FFish).
  • В предыдущих версиях можно было использовать альтернативный синтаксис для типов данных LowCardinality, добавляя WithDictionary к имени типа данных. Это была первоначальная рабочая реализация, и она никогда не документировалась и не предназначалась для публичного использования. Теперь этот синтаксис устарел. Если вы его использовали, вам нужно выполнить ALTER для своих таблиц и переименовать типы данных в LowCardinality. #66842 (Alexey Milovidov).
  • Исправлены логические ошибки в хранилище Buffer, используемом с распределенной целевой таблицей. Это обратно несовместимое изменение: запросы, использующие Buffer с распределенной целевой таблицей, могут перестать работать, если таблица встречается в запросе более одного раза (например, в self-join). #67015 (vdimir).
  • В предыдущих версиях вызов функций случайных распределений на основе гамма-функции (таких как Chi-Squared, Student, Fisher) с отрицательными аргументами, близкими к нулю, приводил к долгим вычислениям или бесконечному циклу. В новой версии вызов этих функций с нулевыми или отрицательными аргументами будет приводить к исключению. Это закрывает #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).
  • Добавлена поддержка дополнительных вариантов strictness для 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 для замены внешних движков и движков таблиц на движок 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 для удаления всех партиций в состоянии detached. #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 sketches), который позволяет оценивать селективность для предикатов равенства, таких как col = 'val'. Поддерживаются string, date, datatime и числовые типы данных. #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).
  • Исключено выделение избыточной емкости для столбца типа Array при записи в ORC. Это ускоряет обработку столбца типа Array на 15%. #67879 (李扬).
  • Значительно ускорены мутации для нереплицируемых MergeTree #66911 #66909 (Alexey Milovidov).

Улучшения

  • Настройка allow_experimental_analyzer переименована в enable_analyzer. Старое имя сохранено в виде алиаса. Это означает, что анализатор больше не имеет статуса бета и полностью переведён в production. #66438 (Nikita Mikhaylov).
  • Улучшено определение схемы для значений дата-время. Теперь DateTime64 используется только тогда, когда значение дата-время содержит дробную часть, в противном случае используется обычный DateTime. Определение типов Date/DateTime теперь стало строже, особенно при date_time_input_format='best_effort', чтобы избежать определения значений дата-время по строкам в пограничных случаях. #68382 (Kruglov Pavel).
  • ClickHouse server теперь поддерживает новую настройку max_keep_alive_requests. Для HTTP-соединений с keep-alive на сервере она работает вместе с keep_alive_timeout: если тайм-аут бездействия ещё не истёк, но через данное соединение уже выполнено более max_keep_alive_requests запросов, сервер закроет его. #61793 (Nikita Taranov).
  • Улучшения в панели мониторинга Advanced. Это закрывает #67697. Это закрывает #63407. Это закрывает #51129. Это закрывает #61204. #67701 (Alexey Milovidov).
  • Не требовать grant для REMOTE при создании distributed таблицы: достаточно grant для движка 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, теперь это также может быть 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. Это полезно при передаче файла конфигурации через пайп: 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).
  • В Linux-сборки для Aarch64 добавлен -no-pie, чтобы обеспечить корректную внутреннюю диагностику и символизацию трассировок стека после перезапуска ClickHouse. #67916 (filimonov).
  • Добавлены события профиля для слияний и мутаций, чтобы улучшить интроспекцию. #68015 (Anton Popov).
  • Удалены ненужные записи в журнале для нереплицируемого MergeTree. #68238 (Daniil Ivanik).

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

  • Нестабильная проверка integration tests теперь будет запускать каждый тестовый сценарий несколько раз, чтобы выявлять больше проблем в тестах и повышать их надежность. Для многократного запуска одного и того же тестового сценария в одном окружении используется библиотека pytest-repeat. Для успешного прохождения важно очищать таблицы и другие сущности в конце тестового сценария. Повторные запуски работают значительно быстрее, чем несколько запусков pytest, так как необходимые контейнеры стартуют только один раз. #66986 (Ilya Yatsishin).
  • Сняты ограничения на использование CLion с ClickHouse. В предыдущих версиях CLion зависал на минуту при каждом нажатии клавиши. Это закрывает #66994. #66995 (Alexey Milovidov).
  • getauxval: предотвращено аварийное завершение при повторном запуске под sanitizer из-за высокой энтропии ASLR в новых ядрах Linux. #67081 (Raúl Marín).
  • Некоторые части клиентского кода вынесены в один файл, и к ним применяется максимально возможный уровень оптимизации даже в отладочных builds. Это закрывает: #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).
  • Исправлена ошибка повреждённой части при восстановлении данных на диск s3_plain_rewritable. #66881 (Vitaly Baranov).
  • В редких случаях ClickHouse мог считать части повреждёнными из-за неожиданных проекций на диске. Теперь это исправлено. #66898 (alesapin).
  • Исправлено некорректное определение формата при автоматическом определении схемы, которое могло приводить к логической ошибке: формат не поддерживает автоматическое определение схемы. #66899 (Kruglov Pavel).
  • Исправлена возможная взаимоблокировка при отмене запроса с параллельными репликами. #66905 (Nikita Taranov).
  • Запрещён create as select, даже если установлена настройка database&#95;replicated&#95;allow&#95;heavy&#95;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).
  • Исправлено зависание запроса при использовании пустого кортежа в левой части функции 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).
  • Исправлен JOIN по кортежу с NULL: некоторые запросы с новым анализатором и NULL внутри кортежа в условии JOIN ON возвращали некорректные результаты. #67538 (vdimir).
  • Исправлено избыточное перепланирование FileCache::freeSpaceRatioKeepingThreadFunc() в случае полностью заполненного невытесняемого кэша. #67540 (Kseniia Sumarokova).
  • Исправлена вставка через HTTP-интерфейс в потоковые движки (Kafka, RabbitMQ, NATS). #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() и добавлен код сериализации для конкретных типов данных. Подстановка в parameterized view работала некорректно для нескольких типов данных, когда значением parameter была функция или expression, возвращающая экземпляр типа данных. #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 filter для 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 не считает part повреждённым, если проекция отсутствует на диске, но присутствует в checksums.txt. #68003 (alesapin).
  • Исправлено пропускание незатронутых частей при мутациях с новым анализатором. Ранее при включенном анализаторе данные в части могли быть перезаписаны мутацией, даже если, согласно предикату, мутация не затрагивала эту часть. #68052 (Anton Popov).
  • Удалена некорректная оптимизация, убирающая сортировку в подзапросах с OFFSET. Исправлено #67906. #68099 (Graham Campbell).
  • Попытка устранить Block structure mismatch in AggregatingStep stream: different types при оптимизации агрегатной проекции. #68107 (Nikolai Kochetov).
  • Попытка исправить сбой Postgres при отмене запроса. #68288 (Kseniia Sumarokova).
  • Исправлена ошибка, из-за которой в запросе SYSTEM SYNC REPLICA отсутствовал режим синхронизации реплики. #68326 (Duc Canh Le).

Релиз ClickHouse 24.7, 2024-07-30. Presentation, Video

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

  • Запрещено использовать CRATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ... с базами данных Replicated. #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 view. Исправлено множество случаев, таких как: - в целевой таблице: данные разбиваются на 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).
  • Добавлены системные таблицы с основной информацией обо всех таблицах в состоянии detached. #65400 (Konstantin Morozov).

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

  • Изменена двоичная сериализация типа данных Variant: добавлен режим compact, чтобы не записывать один и тот же дискриминатор многократно для гранул с одним типом варианта или только со значениями NULL. Добавлена настройка MergeTree use_compact_variant_discriminators_serialization, включенная по умолчанию. Обратите внимание, что тип Variant по-прежнему является экспериментальным, поэтому обратно несовместимое изменение сериализации допустимо. #62774 (Kruglov Pavel).
  • Добавлена поддержка backend-хранилища на диске для 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).
  • При Attach таблиц на дисках в режиме только для чтения будет использоваться меньше ресурсов, поскольку устаревшие части не будут загружаться. #65635 (Alexey Milovidov).
  • Добавлена поддержка minmax hyperrectangle для индексов Set. #65676 (AntiTopQuark).
  • Первичный индекс устаревших частей теперь выгружается для уменьшения общего использования памяти. #65852 (Anton Popov).
  • Функции replaceRegexpAll и replaceRegexpOne теперь работают значительно быстрее, если шаблон регулярного выражения тривиален, то есть не содержит метасимволов, классов шаблонов, флагов, символов группировки и т. д. (Спасибо Taiyang Li). #66185 (Robert Schulze).
  • Запросы к S3: уменьшено время повторных попыток для запросов, увеличено количество повторных попыток для резервных копий. Для запросов — 8,5 минут и 100 повторных попыток, для восстановления из резервной копии — 1,2 часа и 1000 повторных попыток. #65232 (Sema Checherinda).
  • Добавлена поддержка оптимизации LIMIT в плане запроса. Добавлена поддержка pushdown LIMIT для хранилища PostgreSQL и табличной функции. #65454 (Maksim Kita).
  • Улучшена балансировка нагрузки в ZooKeeper. Текущий сеанс не истекает, пока оптимальные узлы не станут доступны, несмотря на fallback_session_lifetime. Добавлена поддержка балансировки с учетом AZ. #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 view. Исправлено множество случаев, таких как: - в целевой таблице: данные разбиваются на 2 или более блоков, и эти блоки считаются дубликатами, когда такой блок вставляется параллельно. - в целевой таблице MV: выполняется дедупликация одинаковых блоков; это происходит, когда MV часто формирует одинаковые результирующие данные для разных входных данных из-за агрегации. - в целевой таблице MV: выполняется дедупликация одинаковых блоков, поступающих из разных MV. #61601 (Sema Checherinda).
  • Добавлена поддержка чтения партиционированных данных DeltaLake. Схема DeltaLake теперь определяется по метаданным, а не на основе данных. #63201 (Kseniia Sumarokova).
  • В composable protocols для слоя 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” в столбце 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: из него исключен объем, занимаемый page cache. #65470 (Nikita Taranov).
  • Не создавайте настройки формата для каждой строки при сериализации фрагментов для вставки в таблицу EmbeddedRocksDB. #65474 (Duc Canh Le).
  • Промпт clickhouse-local сокращён до просто :). getFQDNOrHostName() на macOS выполняется слишком долго, а имя хоста в промпте clickhouse-local нам всё равно не нужно. #65510 (Konstantin 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).
  • В Keeper теперь учитывается ограничение CPU в cgroup. #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 теперь позволяет задавать ID машины как параметр, чтобы предотвратить коллизии в крупных кластерах. #66374 (ZAWA_ll).
  • Отключена приостановка по Ctrl+Z в интерактивном режиме. Это распространённая ловушка, и почти все пользователи не ожидают такого поведения. Полагаю, лишь немногие особо продвинутые пользователи могли бы оценить возможность отправлять терминальные приложения в фоновый режим, но лично я таких не знаю. #66511 (Alexey Milovidov).
  • Добавлена опция проверки типа первичного ключа в Dictionaries. Без этой опции в простых структурах любой тип столбца будет неявно преобразован в 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 NOT 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, отменяйте внутренний запрос PostgreSQL, если запрос к ClickHouse уже завершён. В противном случае запрос к 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 поддерживается в любом запросе, использующем hash join. #65820 (vdimir).
  • Улучшена обработка условий JOIN с проверками 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).
  • Столбец _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).
  • Предотвращено сохранение сторожевым процессом дескрипторов удалённых (ротированных) файлов журнала. #66334 (Aleksei Filatov).
  • Исправлена ошибка, из-за которой в logicalexpressionoptimizerpass терялся логический тип константы. #66344 (pn).
  • Исправлена ошибка Column identifier is already registered при использовании group_by_use_nulls=true и нового анализатора. #66400 (Nikolai Kochetov).
  • Исправлен возможный некорректный результат запросов с JOIN и фильтрацией таблицы на external engine (например, PostgreSQL) из-за слишком агрессивного pushdown фильтра. Теперь условия из секции WHERE не будут отправляться во внешнюю базу данных в случае внешнего JOIN с external table. #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).
  • Исправлено чтение из неинициализированной памяти при хешировании пустых Tuple. #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).
  • Исправлен assert 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», когда они начнут обрабатываться одновременно. Это имеет значение только для сильно нагруженных распределенных backend-соединений. Чтобы избежать этой проблемы, можно установить значение 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 ID в формате 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).
  • В файловоподобные хранилища (s3/file/hdfs/url/azureBlobStorage) добавлен виртуальный столбец _time. #64947 (Ilya Golshtein).
  • Добавлены функции base64URLEncode, base64URLDecode и tryBase64URLDecode. #64991 (Mikhail Gorshkov).
  • Добавлена новая функция editDistanceUTF8, которая вычисляет редакционное расстояние между двумя строками UTF-8. #65269 (LiuNeng).
  • Добавлена конфигурация http_response_headers с поддержкой пользовательских заголовков ответа в пользовательских 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, встроенный в ClickHouse, который может напрямую считывать бинарные файлы 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).
  • Удалена неудачная оптимизация в реализации vertical FINAL, и алгоритм vertical FINAL снова включён по умолчанию. #64783 (Duc Canh Le).
  • Из выражения фильтра удалены узлы ALIAS. Это немного повышает производительность запросов с PREWHERE (с новым анализатором). #64793 (Nikolai Kochetov).
  • Снова включено кэширование сеансов OpenSSL. #65111 (Robert Schulze).
  • Добавлены настройки, отключающие материализацию индексов пропуска данных и статистики при вставке (materialize_skip_indexes_on_insert and materialize_statistics_on_insert). #64391 (Anton Popov).
  • Используйте размер выделенной памяти для расчёта размера группы строк и снижения пикового потребления памяти при записи Parquet в однопоточном режиме. #64424 (LiuNeng).
  • Улучшен итератор разреженного столбца для сокращения числа вызовов size. #64497 (Jiebin Sun).
  • Обновлено условие использования серверного копирования для резервных копий в Azure Blob Storage. #64518 (SmitaRKulkarni).
  • Оптимизировано использование памяти при вертикальном слиянии для таблиц с большим количеством индексов пропуска данных. #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, а также количества записей в локально-удалённом отображении local-to-remote, хранящемся в памяти. #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).
  • Обновлена панель мониторинга Advanced Dashboard для версий с открытым исходным кодом и 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, а также текущее доступное количество запросов, которые можно отправить, не достигнув предела throttling для диска. Метрики определены для каждого диска, для которого настроено такое ограничение. #65050 (Sergei Trifonov).
  • Инициализирован глобальный сборщик трассировки для Poco::ThreadPool (необходим для Keeper и т. д.). #65239 (Kseniia Sumarokova).
  • Добавлена проверка при создании пользователя с bcrypt_hash. #65242 (Raúl Marín).
  • Добавлены profile events для количества строк, прочитанных во время и после 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 views. #64918 (alesapin).
  • Запретили клаузу QUALIFY в старом анализаторе. Старый анализатор игнорировал QUALIFY, поэтому это могло привести к неожиданному удалению данных в мутациях. #65356 (Dmitry Novik).

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

  • Исправлена ошибка в библиотеке Apache ORC: исправлен расчёт статистики ORC при записи для беззнаковых типов на всех платформах и для Int8 на ARM. #64563 (Michael Kolupaev).
  • Возвращено прежнее поведение ClickHouse при работе с Tuple в формате 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).
  • Исправлена ошибка проверки прав доступа, из-за которой в определённой ситуации пользователь мог повысить свои привилегии в базе данных по умолчанию без необходимых привилегий. #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).
  • Это исправление будет использовать корректно переопределённый контекст и правильный DEFINER для каждого отдельного представления в конвейере выполнения запроса. #64079 (pufit).
  • Исправление в анализаторе: устранена ошибка “Столбец не найден” при использовании INTERPOLATE. #64096 (Yakov Olkhovskiy).
  • Исправлено создание резервных копий в S3 бакеты с учетными данными, отличными от учетных данных диска, на котором находится файл. #64153 (Antonio Andelic).
  • Кэш запросов теперь считает два одинаковых запроса к разным базам данных разными. Предыдущее поведение можно было использовать для обхода отсутствующих привилегий на чтение из таблицы. #64199 (Robert Schulze).
  • Исправлено возможное аварийное завершение из-за неперехваченного исключения в ~WriteBufferFromFileDescriptor в StatusFile. #64206 (Kruglov Pavel).
  • Исправлена ошибка duplicate alias в распределённых запросах с ARRAY JOIN. #64226 (Nikolai Kochetov).
  • Исправлено некорректное поведение accurateCast при преобразовании строки в целое число. #64255 (wudidapaopao).
  • Исправлено упрощение CNF в случаях, когда какая-либо группа OR содержит взаимоисключающие атомы. #64256 (Eduard Karacharov).
  • Исправлена проверка размера Query Tree. #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 (в случае небольшого buffer, то есть --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).
  • Исправлен (экспериментальный) неравный JOIN с подзапросами для множеств в смешанных условиях JOIN. #64775 (lgbo).
  • Исправлено аварийное завершение при использовании локального кэша поверх диска plain_rewritable. #64778 (Julia Kartseva).
  • Исправление в Keeper: возврат корректного значения для zk_latest_snapshot_size в команде mntr. #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 в запросах, читающих из materialized view с PREWHERE, если в materialized view есть столбцы с типами, отличающимися от типов в исходной таблице. Исправляет #64611. #64855 (Nikolai Kochetov).
  • Исправлено редкое падение в случае, когда у таблицы есть TTL с подзапросом + база данных Replicated + параллельные реплики + 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. #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).
  • Исправлено возможное аварийное завершение при хеджированных запросах. #65206 (Azat Khuzhin).
  • Исправлена ошибка при сокращённом вычислении в словарях Hashed и Hashed_Array, из-за которой могло считываться неинициализированное числовое значение, что приводило к различным ошибкам. #65256 (jsc0218).
  • Этот PR гарантирует, что тип constant(второго параметра оператора IN) всегда остается доступным в процессе преобразования типов оператором IN. В противном случае потеря информации о типе может приводить к сбоям некоторых преобразований, например преобразования из DateTime в Date. Это исправляет проблему (#64487). #65315 (pn).

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

  • Добавлена поддержка LLVM XRay. #64592 #64837 (Tomer Shafir).
  • Реализации хранилищ S3/hdfs/azure объединены в один класс, работающий с IObjectStorage. То же самое — для хранилищ *Cluster, озер данных и Queue. #59767 (Kseniia Sumarokova).
  • Выполнен рефакторинг writer’а data part, чтобы убрать зависимости от MergeTreeData и DataPart. #63620 (Alexander Gololobov).
  • Выполнен рефакторинг KeyCondition и анализа ключей для улучшения PartitionPruner и оптимизации тривиального подсчета. Это изменение выделено из #60463. #61459 (Amos Bird).
  • Добавлены проверки, чтобы убедиться, что все функции вызываются со столбцами правильного размера. #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. Презентация, Видео

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

  • “inverted indexes” переименованы в “full-text indexes” — это менее техническое и более понятное пользователям название. Это также изменяет внутренние метаданные таблиц и нарушает работу таблиц с существующими (экспериментальными) inverted indexes. Обязательно удалите такие индексы перед обновлением и создайте их заново после обновления. #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 показывает эти столбцы, но в новой версии она полностью пропускает такую таблицу. Удалены trace-сообщения лога “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-файла вместо использования встроенной в RocksDB memtable. Это помогает повысить скорость импорта, особенно для долго выполняющихся запросов вставки в таблицы 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 не поддерживали выборку данных из архивов, таких как tar, 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, если stdout программы перенаправлен в файл с расширением, указывающим на сжатие, используйте соответствующий метод сжатия вместо варианта без сжатия (чтобы поведение было аналогично INTO OUTFILE). #63662 (v01dXYZ).
  • Изменено предупреждение о большом числе присоединённых таблиц, чтобы в нём различались таблицы, представления и словари. #64180 (Francisco J. Jurado Moreno).
  • Добавлена поддержка функции azureBlobStorage в ClickHouse server, позволяющая использовать Azure Workload Identity для аутентификации в Azure Blob Storage. Если в конфигурации задан параметр use_workload_identity, для аутентификации используется Azure 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).
  • Реплика базы данных Replicated теперь автоматически помечается как потерянная и запускается восстановление, если какая-либо DDL-задача завершается ошибкой более max_retries_before_automatic_recovery (100 по умолчанию) раз подряд с одной и той же ошибкой. Также исправлена ошибка, из-за которой могли пропускаться DDL-записи, если на раннем этапе выполнения записи генерировалось исключение. #63549 (Alexander Tokmakov).
  • Для StorageS3Queue добавлен учет неудачных файлов в s3queue_tracked_file_ttl_sec и s3queue_traked_files_limit. #63638 (Kseniia Sumarokova).

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

  • Меньше конкуренции в файловом кэше (часть 4). Теперь можно не заполнять файловый кэш до предела, выполняя дополнительное вытеснение в фоне (управляется параметром keep_free_space_size(elements)_ratio). Это снижает нагрузку на резервирование места для запросов (в методе tryReserve). Кроме того, это по возможности реализовано без блокировок, то есть не должно мешать обычному использованию кэша. #61250 (Kseniia Sumarokova).
  • Пропускать слияние вновь созданных блоков проекций во время INSERT. #59405 (Nikita Taranov).
  • Строковые функции ...UTF8 обрабатываются в ASCII-режиме, если все входные строки состоят только из ASCII-символов. Идея вдохновлена https://github.com/apache/doris/pull/29799. В целом ускорение составило 1.07x~1.62x. Обратите внимание, что в некоторых случаях также снизилось пиковое потребление памяти. #61632 (李扬).
  • Улучшена производительность глоб-шаблонов выбора ({}) в StorageS3. #62120 (Andrey Zvonov).
  • HostResolver содержит каждый IP-адрес по нескольку раз. Если у удалённого хоста несколько IP-адресов и по какой-то причине (например, из-за правил firewall) доступ по одним 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 (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).
  • Исправлен межсерверный secret для 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).
  • Исправлен сбой при вызове некоторых функций на константных столбцах LowCardinality #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).
  • Исправлено проталкивание фильтра в 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).
  • Исправлен отладочный assert при использовании группировки WITH ROLLUP с типами LowCardinality #63398 (Raúl Marín).
  • Небольшие исправления в group_by_use_nulls #63405 (vdimir).
  • Исправлено резервное копирование/восстановление части проекции в случае, если проекция была удалена из метаданных таблицы, но в части она по-прежнему присутствует #63426 (Kseniia Sumarokova).
  • Исправлен источник словаря MySQL #63481 (vdimir).
  • Вызов Insert 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 в хешировании по ключу #63628 (Salvatore Mesoraca).
  • Исправлен pushdown фильтра для Parquet и, возможно, для StorageMerge #63642 (Michael Kolupaev).
  • Предотвращено преобразование в Replicated, если путь ZooKeeper уже существует #63670 (Kirill).
  • Анализатор: представления считывают только необходимые столбцы #63688 (Maksim Kita).
  • Анализатор: запрещено переопределение 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).
  • Исправлена deadlock в 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).
  • Анализатор: исправлено разрешение COLUMNS #63962 (Dmitry Novik).
  • LIMIT BY и skip_unused_shards в анализаторе #63983 (Nikolai Kochetov).
  • Исправление кое-какого мусора (экспериментальный 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 MiB (размер буфера чтения) вместо max_upload_part_size (в случае ненативного копирования) #64117 (Kseniia Sumarokova).
  • Корректное переключение на резервный вариант при копировании резервной копии #64153 (Antonio Andelic).
  • Предотвращено возникновение LOGICAL_ERROR при CREATE TABLE для materialized view #64174 (Raúl Marín).
  • Кэш запросов: считать одинаковые запросы к разным базам данных разными #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 снята метка «экспериментальный». Теперь он находится на стадии бета. #62937 (Justin de Guzman).

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

  • Добавлена поддержка рекурсивных CTE. #62074 (Maksim Kita).
  • Добавлена поддержка условия QUALIFY. Закрывает #47819. #62619 (Maksim Kita).
  • Теперь для движков таблиц можно выдавать grant, и это не повлияет на поведение существующих пользователей. #60117 (jsc0218).
  • Добавлен перезаписываемый диск S3, который поддерживает операции INSERT и не требует локально хранимых метаданных. #61116 (Julia Kartseva). Основной сценарий использования — system tables.
  • Подсветка синтаксиса при вводе в клиенте теперь будет работать на уровне синтаксиса (ранее она работала на уровне лексера). #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 interface добавлен query parameter role. Он работает аналогично SET ROLE x, применяя роль до выполнения оператора. Это позволяет обойти ограничение HTTP interface, так как множественные команды не допускаются и невозможно одновременно отправить и 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).
  • Добавлен persistent virtual column _block_offset, который хранит исходный номер строки в block, присвоенный при вставке. Хранение столбца _block_offset можно включить с помощью настройки MergeTree enable_block_offset_column. Добавлен virtual column _part_data_version, который содержит либо минимальный номер блока, либо версию mutation части. Persistent virtual column _block_number больше не считается экспериментальным. #60676 (Anton Popov).
  • Добавлена настройка input_format_json_throw_on_bad_escape_sequence; ее отключение позволяет сохранять некорректные escape-последовательности в JSON input formats. #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, теперь принудительно инлайнятся. #61144 (李扬).
  • Ускорен разбор JSON: после чтения всех необходимых столбцов оставшаяся часть объекта пропускается. #62210 (lgbo).
  • Улучшен простой insert select из файлов в табличных функциях file/s3/hdfs/url/… Добавлена отдельная настройка max_parsing_threads для управления количеством потоков, используемых при параллельном парсинге. #62404 (Kruglov Pavel).
  • Функции to_utc_timestamp и from_utc_timestamp теперь примерно в 2 раза быстрее. #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).
  • Кэш страниц в пространстве пользователя теперь работает со статическим веб-хранилищем (disk(type = web)). Для включения используйте клиентскую настройку use_page_cache_for_disks_without_file_cache=1. #61911 (Michael Kolupaev).
  • В типе Variant варианты Bool и Number больше не считаются подозрительными. #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 со strictness 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 Private Link. Закрывает #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. Это необходимо, поскольку представленная в macOS El Capitan (2015) функция Apple’s System Integrity Protection запрещает запись в /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 для базы данных Replicated. #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.

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

  • Завендорили зависимости Rust, чтобы Rust-код (который мы используем для мелких фич ради хайпа и лулзов) можно было собирать вменяемым образом, как и C++. #62297 (Raúl Marín).
  • Теперь ClickHouse использует OpenSSL 3.2 вместо BoringSSL. #59870 (Robert Schulze). Обратите внимание, что у OpenSSL в целом менее качественная инженерная культура (например, есть некоторое количество отчётов sanitizer, которые нам пришлось исправлять, сложная система сборки с генерируемыми файлами и т. д.), но совместимость у него лучше.
  • Игнорировать запросы DROP в стресс-тесте с вероятностью 1/2; в проверке обновления для таблиц Memory/JOIN использовать TRUNCATE вместо игнорирования DROP. #61476 (Kruglov Pavel).
  • Из Docker-образа Keeper удалены тома /etc/clickhouse-keeper и /var/log/clickhouse-keeper. #61683 (Tristan).
  • Добавлены тесты для всех задач, утративших актуальность после включения анализатора по умолчанию. Closes: #55794 Closes: #49472 Closes: #44414 Closes: #13843 Closes: #55803 Closes: #48308 Closes: #45535 Closes: #44365 Closes: #44153 Closes: #42399 Closes: #27115 Closes: #23162 Closes: #15395 Closes: #15411 Closes: #14978 Closes: #17319 Closes: #11813 Closes: #13210 Closes: #23053 Closes: #37729 Closes: #32639 Closes: #9954 Closes: #41964 Closes: #54317 Closes: #7520 Closes: #36973 Closes: #40955 Closes: #19687 Closes: #23104 Closes: #21584 Closes: #23344 Closes: #22627 Closes: #10276 Closes: #19687 Closes: #4567 Closes: #17710 Closes: #11068 Closes: #24395 Closes: #23416 Closes: #23162 Closes: #25655 Closes: #11757 Closes: #6571 Closes: #4432 Closes: #8259 Closes: #9233 Closes: #14699 Closes: #27068 Closes: #28687 Closes: #28777 Closes: #29734 Closes: #61238 Closes: #33825 Closes: #35608 Closes: #29838 Closes: #35652 Closes: #36189 Closes: #39634 Closes: #47432 Closes: #54910 Closes: #57321 Closes: #59154 Closes: #61014 Closes: #61950 Closes: #55647 Closes: #61947. #62185 (Nikita Mikhaylov).
  • Добавлены дополнительные тесты по задачам, которые больше не актуальны или уже исправлены analyzer. Закрывает: #58985 Закрывает: #59549 Закрывает: #36963 Закрывает: #39453 Закрывает: #56521 Закрывает: #47552 Закрывает: #56503 Закрывает: #59101 Закрывает: #50271 Закрывает: #54954 Закрывает: #56466 Закрывает: #11000 Закрывает: #10894 Закрывает: https://github.com/ClickHouse/ClickHouse/issues/448 Закрывает: #8030 Закрывает: #32139 Закрывает: #47288 Закрывает: #50705 Закрывает: #54511 Закрывает: #55466 Закрывает: #58500 Закрывает: #39923 Закрывает: #39855 Закрывает: #4596 Закрывает: #47422 Закрывает: #33000 Закрывает: #14739 Закрывает: #44039 Закрывает: #8547 Закрывает: #22923 Закрывает: #23865 Закрывает: #29748 Закрывает: #4222. #62457 (Nikita Mikhaylov).
  • Исправлены ошибки сборки при динамической компоновке с OpenSSL (примечание: в целом это не поддерживается и требуется только для платформ IBM s390x). #62888 (Harry Lee).

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

  • Исправлена логическая ошибка при откате транзакции вставки с кворумом. #61953 (Han Fei).
  • Исправлена ошибка парсера при использовании COUNT(*) с предложением FILTER #61357 (Duc Canh Le).
  • Исправлена логическая ошибка в group_by_use_nulls + grouping sets + анализаторе + 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 вместе с функциями JSONExtact #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).
  • Анализатор: исправлена ошибка разрешения параметров запроса #62186 (Dmitry Novik).
  • Исправлено восстановление частей в режиме только для чтения #62207 (Vitaly Baranov).
  • Исправлено падение в определении индекса, содержащем SQL UDF #62225 (vdimir).
  • Исправлена ошибка с NULL в качестве начального значения генератора случайных чисел для generateRandom при использовании анализатора. #62248 (Nikolai Kochetov).
  • Исправлена обработка константных столбцов в Distinct Transfom #62250 (Antonio Andelic).
  • Исправлен Parts Splitter в запросах с модификатором FINAL #62268 (Nikita Taranov).
  • Анализатор: исправлено разрешение псевдонима на параметризованное представление #62274 (Dmitry Novik).
  • Анализатор: исправлено разрешение имён в родительских областях видимости #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).
  • Исправлен pushdown фильтра из 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).
  • Исправлена ошибка сегментации в экспериментальном и неподдерживаемом движке 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).
  • Исправлено: в CTE с анализатором не учитывался модификатор FINAL #62811 (Duc Canh Le).
  • Исправлено аварийное завершение функции formatRow при использовании формата JSON и HTTP-интерфейса #62840 (Anton Popov).
  • Azure: исправлено формирование итогового URL из объекта конечной точки #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” при проверке версии wire protocol в MongoDB #63126 (Alexander Gololobov).

Релиз ClickHouse 24.3 LTS, 2024-03-27. Презентация, Видео

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

  • Параметр allow_experimental_analyzer включен по умолчанию и переключает анализ запросов на новую реализацию, которая обеспечивает лучшую совместимость и более полную функциональность. Возможность “analyzer” теперь считается бета, а не экспериментальной. Вы можете вернуть прежнее поведение, установив для compatibility значение 24.2 или отключив параметр allow_experimental_analyzer. Посмотрите видео на YouTube.
  • ClickHouse допускает произвольные бинарные данные в типе данных String, который обычно подразумевает UTF-8. Строки в Parquet/ORC/Arrow поддерживают только UTF-8. Поэтому для типа данных ClickHouse String можно выбрать, какой тип данных Arrow использовать — 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).
  • Имя столбца в таблице system.zookeeper изменено с duration_ms на duration_microseconds, чтобы отразить, что длительность измеряется с микросекундным разрешением. #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 теперь по умолчанию принимает аргументы (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).

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

  • Поддерживается чтение и запись резервных копий в формате tar (в дополнение к zip). #59535 (josh-hildred).
  • Реализована поддержка бакетов S3 Express. #59965 (Nikita Taranov).
  • Добавлена возможность Attach частей с другого диска (с копированием вместо жёсткой ссылки). #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, содержащая все ключевые слова из parser. В основном она нужна и будет использоваться для улучшения фаззинга и подсветки синтаксиса. #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. #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 по умолчанию, что означает следующее: для составного первичного ключа, если столбец меняет своё значение как минимум в 0.9 всех случаев, последующие за ним столбцы загружаться не будут. #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 могут создаваться и отбрасываться во время разбора, в том числе при большом количестве откатов. Это приводит к замедлению на этапе разбора и, как следствие, позволяет readonly-пользователю устроить 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).
  • Добавлена возможность использовать управляемую идентификацию для операций ввода-вывода резервных копий при работе с Azure Blob Storage. Также добавлена настройка, которая запрещает ClickHouse пытаться создавать несуществующий контейнер, поскольку для этого требуются разрешения на уровне storage account. #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 — терминал и output format не указан, clickhouse-client и похожие инструменты по умолчанию будут использовать PrettyCompact, как и в interactive mode. clickhouse-client и clickhouse-local будут единообразно обрабатывать аргументы командной строки для input and output formats. Это закрывает #61272. #61800 (Alexey Milovidov).
  • В форматах Pretty группы цифр теперь можно разделять символом подчёркивания для лучшей читаемости. Это управляется новой настройкой output_format_pretty_highlight_digit_groups. #61802 (Alexey Milovidov).
  • Добавлена возможность переопределять исходные настройки INSERT через SYSTEM FLUSH DISTRIBUTED. #61832 (Azat Khuzhin).
  • По умолчанию включено профилирование processors (затраченное время, входящие и исходящие байты для сортировки, агрегации и т. д.). #61096 (Azat Khuzhin).
  • Добавлена поддержка файлов без расширения формата в базе данных Filesystem. #60795 (Kruglov Pavel).
  • Сделали все названия форматов регистронезависимыми: Tsv, TSV, tsv или даже rowbinary. #60420 (豪肥肥). Буду признателен, если вы и дальше будете писать их правильно, например JSON 😇, а не Json 🤮, но мы не возражаем, если вы пишете так, как вам удобнее.
  • Добавлен режим none_only_active для параметра distributed_ddl_output_mode. #60340 (Alexander Tokmakov).
  • В панели Advanced dashboard немного улучшены цвета для графиков с несколькими линиями. #60391 (Alexey Milovidov).
  • На панели мониторинга Advanced элементы управления теперь всегда видны при прокрутке. Это позволяет добавлять новый график, не прокручивая страницу вверх. #60692 (Alexey Milovidov).
  • При выполнении запроса MODIFY COLUMN для materialized views проверяйте структуру внутренней таблицы, чтобы убедиться, что все столбцы существуют. #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 cache для слияний. #60308 (Kseniia Sumarokova).
  • Улучшение протокола совместимости с MySQL. В задаче #57598 упоминается отличие в обработке транзакций. Команда COMMIT/ROLLBACK, выполненная при отсутствии активной транзакции, возвращает error, в отличие от поведения 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).
  • Теперь в подстановках конфигурации для поддеревьев <include from_zk="/path" merge="true"> можно указывать атрибут 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_level заменено на use_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 Khuzhin).
  • С оптимизацией FINAL что-то было не так; вот как это описал автор: “PartsSplitter invalid ranges for the same part”. #60041 (Maksim Kita).
  • С Apache Hive была проблема; он имеет экспериментальный статус и не поддерживается. #60262 (shanfengp).
  • Улучшение для экспериментальных параллельных реплик: принудительно выполнять повторный анализ при изменении параллельных реплик #60362 (Raúl Marín).
  • Исправлено использование простого типа метаданных с новым параметром конфигурации дисков #60396 (Kseniia Sumarokova).
  • Попытка исправить логическую ошибку ‘Не удаётся захватить столбец из-за несовместимого типа’ в 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: добавлены тайм-ауты при ожидании журналов коммитов #60544 (Antonio Andelic).
  • Не выводить числовые подсказки для типов даты #60577 (Raúl Marín).
  • Исправлено чтение из MergeTree при использовании недетерминированных функций в фильтре #60586 (Kruglov Pavel).
  • Исправлена логическая ошибка при недопустимом типе значения настройки compatibility #60596 (Kruglov Pavel).
  • fix(prql): Надёжный обработчик паники #60615 (Maximilian Roos).
  • Исправлен intDiv для десятичных аргументов и аргументов типа 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).
  • Удалена некорректная проверка в агрегатной функции 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 actions #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).
  • Исправлен сбой в оконном представлении (экспериментальная возможность) #61526 (Alexey Milovidov).
  • Исправлена работа repeat с целыми числами ненативных типов #61527 (Antonio Andelic).
  • Исправлен аргумент -s в клиенте #61530 (Mikhail f. Shiryaev).
  • Исправлен сбой в функции arrayPartialReverseSort #61539 (Raúl Marín).
  • Исправлен поиск в строках с const position #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).
  • Исправлено срабатывание sanitizer в multiSearchAllPositionsCaseInsensitiveUTF8 при некорректном UTF-8 #61749 (pufit).
  • Исправлено замечание о том, что рамка окна RANGE не поддерживается для столбцов с типом Nullable. #61766 (YuanLiu).

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

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

  • Добавлена проверка подозрительных/экспериментальных типов во вложенных типах. Ранее такие типы (кроме JSON) во вложенных типах, таких как Array/Tuple/Map, не проверялись. #59385 (Kruglov Pavel).
  • Добавлена проверка корректности количества потоков и размеров блоков. #60138 (Raúl Marín).
  • Числа с плавающей точкой в экспоненциальной записи больше не определяются автоматически по умолчанию. Добавлена настройка input_format_try_infer_exponent_floats, которая восстанавливает прежнее поведение (по умолчанию отключена). Закрывает #59476. #59500 (Kruglov Pavel).
  • Теперь операции ALTER можно заключать в скобки. Выводом скобок можно управлять с помощью конфигурации format_alter_operations_with_parentheses. По умолчанию в форматированных запросах скобки выводятся, так как в некоторых местах мы сохраняем форматированные операции ALTER как метаданные (например, mutations). Новый синтаксис делает более понятными некоторые запросы, в которых операции 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, из-за которой пользователь мог выполнять вставку в таблицу без необходимых привилегий. Теперь исправление проверяет, есть ли у пользователя разрешение на вставку не только в materialized view, но и во все базовые таблицы. Это означает, что некоторые запросы, которые раньше работали, теперь могут завершаться ошибкой Not enough privileges. Для решения этой проблемы в релизе представлена новая возможность безопасности SQL для представлений: https://clickhouse.com/docs/sql-reference/statements/create/view#sql&#95;security. #54901 #60439 (pufit).

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

  • Добавлен новый синтаксис, позволяющий указывать пользователя-определителя в представлении/materialized view. Это позволяет выполнять операции SELECT/INSERT из представлений без явных привилегий для базовых таблиц. Таким образом, представление будет инкапсулировать привилегии. #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 различных видов в Replicated-движок. Создайте пустой файл 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. Она отображает содержимое файлов индекса и marks таблиц MergeTree. Ее можно использовать для интроспекции. Синтаксис: mergeTreeIndex(database, table, [with_marks = true]), где database.table — существующая таблица с движком MergeTree. #58140 (Anton Popov).

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

  • Добавлена функция seriesOutliersDetectTukey для обнаружения выбросов в данных временных рядов с использованием метода ограждений Тьюки. #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).
  • Добавлена поддержка короткого замыкания в функции 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; ускорение — до ~10x. #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 MB, оказалось слишком маленьким. Новое значение — 10 MiB. #59536 (Nikita Mikhaylov).
  • Использование нескольких потоков при чтении метаданных таблиц из резервной копии во время выполнения команды RESTORE. #60040 (Vitaly Baranov).
  • Теперь, если у StorageBuffer больше 1 сегмента (num_layers > 1), фоновый сброс будет выполняться одновременно для всех сегментов в нескольких потоках. #60111 (alesapin).

Улучшение

  • Когда в качестве output format используется формат Pretty и block состоит из единственного числового значения, превышающего один миллион, справа от table будет выведено удобочитаемое число. #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).
  • Улучшен подсчет события профиля 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).
  • Теперь панель мониторинга распознаёт как сжатое, так и несжатое состояние #hash в URL (обратная совместимость). Продолжение #59124 . #59548 (Amos Bird).
  • Обновлена Intel QPL (используется кодеком DEFLATE_QPL) с v1.3.1 до v1.4.0. Также исправлена ошибка в механизме опроса тайм-аута: в некоторых случаях тайм-аут работал некорректно, и при его срабатывании IAA и CPU могли одновременно обрабатывать буфер. Пока что лучше удостовериться, что статус кодека IAA не равен QPL_STS_BEING_PROCESSED, а затем переключаться на программный кодек. #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
  • Унифицировано поведение именованных коллекций, созданных в XML и SQL, в хранилище Kafka. #59710 (Pervakov Grigorii).
  • Если merge_max_block_size_bytes достаточно мал, а таблицы содержат широкие строки (например, со значениями String или Tuple), фоновые слияния могут зациклиться. Это поведение исправлено. Дополнение к https://github.com/ClickHouse/ClickHouse/pull/59340. #59812 (Nikita Mikhaylov).
  • Разрешить использование uuid в replica_path, если он явно указан в CREATE TABLE. #59908 (Azat Khuzhin).
  • В системную таблицу system.tables добавлен столбец metadata_version для таблиц ReplicatedMergeTree. #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 добавлено резервное копирование через buffer на случай, если 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).
  • Устранено состояние гонки в коде JavaScript, из-за которого диаграммы дублировались и накладывались друг на друга. #60392 (Alexey Milovidov).

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

  • Добавлены сборки и тесты со сбором покрытия и интроспекцией. Продолжение #56102. #58792 (Alexey Milovidov).
  • Обновлён toolchain Rust в corrosion-cmake, когда задана переменная toolchain 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).
  • Фаззер запросов теперь будет выполнять фаззинг 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-фаззера в функции countMatches #59752 (Robert Schulze).
  • RabbitMQ: исправлена ситуация, при которой сообщения не были ни подтверждены, ни отклонены #59775 (Kseniia Sumarokova).
  • Исправлено: в StorageURL часть выполнения запроса происходила в одном потоке #59833 (Michael Kolupaev).
  • S3Queue: исправлено использование неинициализированного значения #59897 (Kseniia Sumarokova).
  • Исправлен разбор выражений партиционирования в круглых скобках #59901 (János Benjamin Antal).
  • Исправлен сбой в формате JSONColumnsWithMetadata при использовании HTTP #59925 (Kruglov Pavel).
  • Не выполнять переписывание sum в count, если возвращаемое значение отличается, в анализаторе #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).
  • Разрешено приводить строковые представления булевых значений к значениям типа Bool #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: исправлена ошибка (а также нестабильный тест test_storage_s3_queue/test.py::test_shards_distributed) #60282 (Kseniia Sumarokova).
  • Исправлено использование неинициализированного значения и некорректный результат в функциях хеширования для 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 отбрасываются, значения -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, представляющий объединение других типов данных. Тип 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).
  • Добавлены две настройки: 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).
  • Автоматически отключать 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 для MaterializedMySQL: одно binlog-подключение для множества баз данных. #57323 (Val Doroshchuk).
  • Intel QuickAssist Technology (QAT) обеспечивает аппаратное ускорение сжатия и криптографии. В ClickHouse появился новый кодек сжатия ZSTD_QAT, который использует QAT для сжатия zstd. Кодек использует QATlib от Intel и QAT ZSTD Plugin от Intel. Сейчас аппаратно можно ускорять только сжатие (если не удалось инициализировать 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 гарантирует, что мы ждём завершения загрузок и операций drop-range только для указанных исходных реплик, а также для любой реплики, отсутствующей в 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. Обратите внимание на изменение поведения: ранее запросы с модификатором FINAL, читающие данные в один поток (например, max_threads = 1), выдавали отсортированный результат даже без явного указания ORDER BY. Теперь это больше не гарантируется, если enable_vertical_final = true (а по умолчанию это именно так). #54366 (Duc Canh Le).
  • Убрано лишнее копирование в ReadBufferFromIStream, который используется, например, для чтения из S3. #56961 (Nikita Taranov).
  • Оптимизирована функция для элементов массива, когда входные данные имеют тип Array(Map)/Array(Array(Num)/Array(Array(String))/Array(BigInt)/Array(Decimal). В предыдущих реализациях выполнялось больше выделений, чем было необходимо. Ускорение после оптимизации достигает ~6x, особенно для входного типа Array(Map). #56403 (李扬).
  • Столбец читается один раз при чтении из него более чем одного подстолбца в компактных частях. #57631 (Kruglov Pavel).
  • Переписывание AST для функции sum(column + constant). Доступно как проход оптимизации в Analyzer #57853 (Jiebin Sun).
  • Вычисление функции match теперь использует пропускающие индексы ngrambf_v1 и tokenbf_v1. #57882 (凌涛).
  • При вычислении функции match теперь используются инвертированные индексы. #58284 (凌涛).
  • MergeTree FINAL не сравнивает строки из одной и той же non-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 и в движках баз данных Replicated. Это уменьшает вероятность зависания очереди при изменении конфигурации кластера. Закрывает #57573. #57603 (Nikolay Degterinsky).
  • Значение load_metadata_threads для файлового кэша увеличено до 16. Это ускорит запуск сервера. #57732 (Alexey Milovidov).
  • Добавлена возможность регулировать скорость слияний/мутаций (max_mutations_bandwidth_for_server/max_merges_bandwidth_for_server). #57877 (Azat Khuzhin).
  • Заменили недокументированный булев столбец is_hot_reloadable в системной таблице system.server_settings на столбец changeable_without_restart типа Enum8 с возможными значениями No, Yes, IncreaseOnly и DecreaseOnly. Также задокументировали этот столбец. #58029 (skyoct).
  • Cluster Discovery поддерживает указание имени пользователя и пароля, закрыто #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 (default=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).
  • Добавлена настройка для 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 распознаёт случаи, когда в JSON возвращается исключение. Корректировка для #52853. #59303 (Alexey Milovidov).
  • HTTP-обработчик /binary позволяет указывать пользователя, хост и, при необходимости, пароль в параметрах строки запроса. #59311 (Alexey Milovidov).
  • Добавлена поддержка резервного копирования сжатых таблиц в памяти. Это закрывает #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).
  • В тестах с сохранением состояния теперь используются таблицы, напрямую присоединённые из S3. #58791 (Alexey Milovidov).
  • Весь fuzzer.log теперь сохраняется как архив, а не только последние 100k строк. 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).
  • Игнорировать MV с удалённой целевой таблицей при записи в представления #57520 (Kruglov Pavel).
  • Устранено возможное состояние гонки между ALTER_METADATA и MERGE_PARTS #57755 (Azat Khuzhin).
  • Исправлена ошибка в порядке выражений в group by с rollup #57786 (Chen768959).
  • Исправление для устаревшей возможности репликации “zero-copy”: устранена потеря blob-объектов после удаления реплики с повреждёнными отсоединёнными частями #58333 (Alexander Tokmakov).
  • Разрешить пользователям использовать символические ссылки в user_files_path #58447 (Duc Canh Le).
  • Исправлен сбой, возникавший, когда в таблице Graphite отсутствовала agg-функция #58453 (Duc Canh Le).
  • Отложено чтение из StorageKafka, чтобы обеспечить несколько чтений в materialized views #58477 (János Benjamin Antal).
  • Исправлен нелепый случай пересекающихся частей #58482 (Alexander Tokmakov).
  • Отключение MergeTreePrefetchedReadPool для запросов, содержащих только LIMIT #58505 (Maksim Kita).
  • Добавлена поддержка обычных баз данных при восстановлении #58520 (Jihyuk Bok).
  • Исправлено чтение через threadpool 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: разрешено использовать неконстантный аргумент fraction #58597 (Robert Schulze).
  • Исправлено возможное разыменование NULL при символизации инлайн-фреймов #58607 (Azat Khuzhin).
  • Улучшена изоляция записей кэша запросов для повторно созданных пользователей или при переключении ролей #58611 (Robert Schulze).
  • Исправлен некорректный анализ ключа партиционирования при оптимизации проекций #58638 (Amos Bird).
  • Кэш запросов: исправлена квота для каждого пользователя #58731 (Robert Schulze).
  • Исправлено разбиение потока на партиции при параллельном выполнении оконных функций #58739 (Dmitry Novik).
  • Исправлен двойной вызов destroy при выбрасывании исключения в addBatchLookupTable8 #58745 (Raúl Marín).
  • Не обрабатывать запросы в Keeper при завершении работы #58765 (Antonio Andelic).
  • Исправлена ошибка разыменования нулевого указателя в SlabsPolygonIndex::find #58771 (Yarik Briukhovetskyi).
  • Исправлена работа функции JSONExtract для столбцов LowCardinality(Nullable) #58808 (vdimir).
  • Исправлен неожиданный рост использования памяти при создании и удалении огромного количества таблиц с помощью CREATE и DROP. #58831 (Maksim Kita).
  • Хранилище FileLog с многократным чтением в mv #58877 (János Benjamin Antal).
  • Ограничение для идентификатора ключа доступа к S3. #58900 (MikhailBurdukov).
  • Устранён возможный сбой clickhouse-local при загрузке подсказок #58907 (Kruglov Pavel).
  • Исправлен сбой при использовании indexHint #58911 (Dmitry Novik).
  • Исправлена потеря заголовков в StorageURL при перезапуске сервера #58933 (Michael Kolupaev).
  • Анализатор: исправлена замена хранилища блоком вставки #58958 (Yakov Olkhovskiy).
  • Исправлен seek в ReadBufferFromZipArchive #58966 (Michael Kolupaev).
  • Исправление для экспериментальных инвертированных индексов (не используйте в production): DROP INDEX для инвертированного индекса теперь удаляет из постоянного хранилища все связанные файлы #59040 (mochi).
  • Исправлено состояние гонки в query_factories_info #59049 (Kseniia Sumarokova).
  • Отключены повторные попытки при ошибке “Too many redirects” #59099 (skyoct).
  • Исправлена взаимоблокировка при остановке незапущенной базы данных #59137 (Sergei Trifonov).
  • Исправлено: LIMIT BY и LIMIT в распределённом запросе #59153 (Igor Nikonov).
  • Исправлен сбой в toString при nullable timezone #59190 (Yarik Briukhovetskyi).
  • Исправлено аварийное завершение в метаданных Iceberg из-за некорректных путей к файлам #59275 (Kruglov Pavel).
  • Исправлено название архитектуры в списке выбора цели Rust #59307 (p1rattttt).
  • Исправлена логическая ошибка, связанная с “неготовым” множеством, при запросах к system.tables с подзапросом в условии IN. #59351 (Nikolai Kochetov).
Последнее изменение 10 июня 2026 г.